ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

AutoRec 实战指南:用自编码器架构做基于显式反馈的评分预测

AutoRec 实战指南:用自编码器架构做基于显式反馈的评分预测 文档教程人工智能深度学习NLP计算机视觉强化学习【免费下载链接】d2l-enInteractive deep learning book with multi-framework code, math, and discussions. Adopted at 500 universities from 70 countries including Stanford, MIT, Harvard, and Cambridge.项目地址https://gitcode.com/gh_mirrors/d2/d2l-en点击查看免费下载本指南讲解《Dive into Deep Learning》推荐系统章节中的 AutoRec 模型——一种用自编码器Autoencoder架构实现协同过滤的非线性神经网络模型。你将掌握 AutoRec 的模型数学定义、基于 MXNet 的完整实现含梯度掩码、Dropout、专用评估器并能在 MovieLens 100K 数据集上完成端到端训练与 RMSE 评估理解它相比矩阵分解模型提升评分预测能力的关键原理。从矩阵分解到非线性协同过滤AutoRec 的动机推荐系统章节之前介绍的矩阵分解模型matrix factorization将用户-物品交互矩阵分解为两个低秩矩阵的乘积是一种经典的模型驱动协同过滤方法在评分预测任务上表现良好。但矩阵分解本质上是一个线性模型$$ \hat{\mathbf{R}} \mathbf{P}\mathbf{Q}^\top $$其中 $\mathbf{P} \in \mathbb{R}^{m \times k}$、$\mathbf{Q} \in \mathbb{R}^{n \times k}$ 分别是用户与物品的潜因子矩阵。线性模型的表达能力有限难以捕获用户偏好中那些复杂的非线性、细粒度关联模式——例如用户对导演、类型、年代组合的偏好往往是交互式的而非线性加和的。AutoRecSedhain et al., 2015正是为解决这一局限而提出的它把协同过滤Collaborative Filtering, CF问题重新表述为一个自编码器结构将非线性变换引入显式反馈建模。根据万能近似定理神经网络可以逼近任意连续函数因此 AutoRec 能够弥补矩阵分解的线性限制、丰富其表达能力。这与本章 推荐系统概述 中对许多基于模型的 CF 方法可以通过神经网络扩展的论述一脉相承。AutoRec 与经典自编码器的同与异相同之处结构与自编码器一致包含输入层、隐藏层和重建输出层。自编码器是一种学习把输入复制到输出的神经网络从而将输入编码为隐藏通常是低维表示。不同之处传统自编码器关注隐藏表示本身而 AutoRec 聚焦于学习/重建输出层。它以部分观测的交互矩阵为输入目标是重建出一个完整的评分矩阵输入中的缺失条目通过输出层的重建被填充从而用于推荐。AutoRec 有两种变体基于用户的user-based和基于物品的item-based。原书为简洁起见只介绍 item-based 变体user-based 变体可以对称地推导出来本文同样以 item-based 为主线。模型定义从单列输入到整列重建设 $\mathbf{R}_{*i}$ 表示评分矩阵的第 $i$ 列即物品 $i$ 被所有用户评分的向量未知评分默认置零。AutoRec 的神经网络架构定义为$$ h(\mathbf{R}{*i}) f(\mathbf{W} \cdot g(\mathbf{V} \mathbf{R}{*i} \mu) b) $$其中 $f(\cdot)$ 与 $g(\cdot)$ 为激活函数$\mathbf{W}$、$\mathbf{V}$ 为权重矩阵$\mu$、$b$ 为偏置项$h(\cdot)$ 代表 AutoRec 的整个网络。输出 $h(\mathbf{R}_{*i})$ 即评分矩阵第 $i$ 列的重建结果。训练目标是最小化如下重建误差$$ \underset{\mathbf{W},\mathbf{V},\mu, b}{\mathrm{argmin}} \sum_{i1}^M{\parallel \mathbf{R}{*i} - h(\mathbf{R}{*i})\parallel_{\mathcal{O}}^2} \lambda(| \mathbf{W} |_F^2 | \mathbf{V}|_F^2) $$其中 $| \cdot |_{\mathcal{O}}$ 表示只统计已观测评分的贡献在反向传播中只有与已观测输入相关联的权重才会被更新这正是后续代码中梯度掩码mask操作的理论依据。正则项 $\lambda(| \mathbf{W} |_F^2 | \mathbf{V}|_F^2)$ 对两个权重矩阵施加 Frobenius 范数惩罚用于防止过拟合其作用与矩阵分解目标函数中的 $\lambda$ 正则项一致。实现 AutoRec 模型MXNet在编码实现前先导入所需依赖#tab mxnet from d2l import mxnet as d2l from mxnet import autograd, gluon, np, npx from mxnet.gluon import nn import mxnet as mx npx.set_np()一个典型的自编码器由编码器encoder和解码器decoder组成编码器把输入投影为隐藏表示解码器把隐藏层映射到重建层。AutoRec 的 MXNet 实现沿用了这一实践用全连接层构建两者关键设计如下编码器激活函数默认使用sigmoid解码器不施加激活函数输出层直接回归评分值域Dropout在编码变换之后引入用于降低过拟合梯度掩码未观测输入的梯度被掩蔽确保只有已观测评分参与模型学习。#tab mxnet class AutoRec(nn.Block): def __init__(self, num_hidden, num_users, dropout0.05): super(AutoRec, self).__init__() self.encoder nn.Dense(num_hidden, activationsigmoid, use_biasTrue) self.decoder nn.Dense(num_users, use_biasTrue) self.dropout nn.Dropout(dropout) def forward(self, input): hidden self.dropout(self.encoder(input)) pred self.decoder(hidden) if autograd.is_training(): # Mask the gradient during training return pred * np.sign(input) else: return pred逐点拆解这段代码encodernn.Dense(num_hidden, activationsigmoid, use_biasTrue)输入维度自动由首次前向传播推断输出维度为num_hidden隐藏层神经元数对应数学式中的 $g(\mathbf{V} \mathbf{R}_{*i} \mu)$decodernn.Dense(num_users, use_biasTrue)把隐藏表示映射回用户维度的重建向量对应 $f(\mathbf{W} \cdot (\cdot) b)$此处不设激活函数让输出直接逼近 15 的评分forward中pred * np.sign(input)即梯度掩码np.sign(input)在已观测评分处为 ±1、在未知置零处为 0相乘后未知条目对应的梯度恒为 0从实现层面落实了目标函数中仅已观测评分参与反向传播的约束推理非训练阶段则直接返回pred输出完整的重建评分。数据准备MovieLens 100K 的读取、划分与装载AutoRec 的输入是评分矩阵的列物品维度而非矩阵分解那种用户, 物品二元组。因此数据加载流程与 矩阵分解 章节不同分为三步对应的工具函数定义于 d2l/mxnet.py读取d2l.read_data_ml100k()从ml-100k数据集下载u.data文件tab 分隔的四列user_id, item_id, rating, timestamp并统计出num_users与num_items。该数据集包含 943 个用户对 1682 部电影的 10 万条评分15 星详见 MovieLens 数据集划分d2l.split_data_ml100k(df, num_users, num_items)默认使用random模式随机保留 90% 交互作为训练集、其余 10% 作为测试集也支持按时间戳的seq-aware模式装载d2l.load_data_ml100k(train_data, num_users, num_items)在feedbackexplicit模式下构建形状为(num_items, num_users)的交互矩阵inter注意行是物品、列是用户恰好对应 item-based AutoRec 按列取输入的设计inter[item_index, user_index] score填入真实评分其余为 0。随后构造训练/测试 DataLoader并完成模型初始化与训练#tab mxnet devices d2l.try_all_gpus() # Load the MovieLens 100K dataset df, num_users, num_items d2l.read_data_ml100k() train_data, test_data d2l.split_data_ml100k(df, num_users, num_items) _, _, _, train_inter_mat d2l.load_data_ml100k(train_data, num_users, num_items) _, _, _, test_inter_mat d2l.load_data_ml100k(test_data, num_users, num_items) train_iter gluon.data.DataLoader(train_inter_mat, shuffleTrue, last_batchrollover, batch_size256, num_workersd2l.get_dataloader_workers()) test_iter gluon.data.DataLoader(np.array(train_inter_mat), shuffleFalse, last_batchkeep, batch_size1024, num_workersd2l.get_dataloader_workers()) # Model initialization, training, and evaluation net AutoRec(500, num_users) net.initialize(ctxdevices, force_reinitTrue, initmx.init.Normal(0.01)) lr, num_epochs, wd, optimizer 0.002, 25, 1e-5, adam loss gluon.loss.L2Loss() trainer gluon.Trainer(net.collect_params(), optimizer, {learning_rate: lr, wd: wd}) d2l.train_recsys_rating(net, train_iter, test_iter, loss, trainer, num_epochs, devices, evaluator, inter_mattest_inter_mat)几个值得注意的配置细节训练 DataLoadershuffleTrue打乱批次顺序last_batchrollover表示最后不足一个 batch 的剩余样本滚动并入下一个 epochbatch_size256测试 DataLoader以np.array(train_inter_mat)即训练矩阵作为特征输入last_batchkeep保留尾部不足批次的样本batch_size1024隐藏层维度AutoRec(500, num_users)隐藏单元数为 500解码器输出维度为num_users943初始化mx.init.Normal(0.01)用标准差 0.01 的正态分布初始化参数force_reinitTrue强制重新初始化优化配置学习率lr0.002、训练 25 个 epoch、权重衰减wd1e-5、优化器adam、损失gluon.loss.L2Loss()即 $\ell_2$ 损失等价于 MSE配合权重衰减对应目标函数中的 Frobenius 正则。重写评估器基于交互矩阵的掩码 RMSE由于 AutoRec 的输入/输出形态从二元组变成了整列向量无法直接复用矩阵分解章节基于mx.metric.RMSE()的评估器需要重新实现。评估指标仍为 RMSE均方根误差#tab mxnet def evaluator(network, inter_matrix, test_data, devices): scores [] for values in inter_matrix: feat gluon.utils.split_and_load(values, devices, even_splitFalse) scores.extend([network(i).asnumpy() for i in feat]) recons np.array([item for sublist in scores for item in sublist]) # Calculate the test RMSE rmse np.sqrt(np.sum(np.square(test_data - np.sign(test_data) * recons)) / np.sum(np.sign(test_data))) return float(rmse)该评估器的要点遍历inter_matrix传入的是测试 DataLoader逐批取出交互矩阵用gluon.utils.split_and_load分发到多个设备对每个样本一列评分向量执行network(i)得到重建结果并收集计算 RMSE 时用np.sign(test_data)作为掩码测试矩阵中真实评分处为 ±1求和即观测数、未知处为 0从而只统计已观测评分的误差分母np.sum(np.sign(test_data))给出测试观测总数与目标函数中 $| \cdot |_{\mathcal{O}}$ 的仅统计已观测条目思想完全一致。训练流程源码解读train_recsys_rating是本书推荐系统章节共享的训练工具函数实现在 d2l/mxnet.py。它与矩阵分解章节共用同一函数AutoRec 场景的关键差异在评估分支if len(kwargs) 0: # It will be used in section AutoRec test_rmse evaluator(net, test_iter, kwargs[inter_mat], devices) else: test_rmse evaluator(net, test_iter, devices)训练主循环中loss(p, s)计算 $\ell_2$ 损失trainer.step(values[0].shape[0])以该批次样本数为梯度缩放因子更新参数并实时累计train loss与test RMSE到动画曲线d2l.Animator当调用时传入了inter_mattest_inter_mat即本节的写法训练函数会把测试交互矩阵透传给 AutoRec 专属的evaluator完成掩码 RMSE 的逐 epoch 评估训练结束后打印最终训练损失、测试 RMSE 以及吞吐量examples/sec。从源码结构可以推断该函数在设计之初就为 AutoRec 预留了**kwargs扩展位代码注释明确标注 It will be used in section AutoRec说明 AutoRec 评估逻辑与通用训练循环是解耦、可插拔的。实验结果与结论在上述超参数隐藏维度 500、dropout 0.05、lr 0.002、25 epochs、wd 1e-5、Adam下AutoRec 在 MovieLens 100K 测试集上的 RMSE 明显低于矩阵分解模型矩阵分解章节中潜因子维度设为 30训练 20 个 epoch。这一对比印证了神经网络的非线性表达能力在评分预测任务中的有效性同样的显式反馈数据线性模型与非线性自编码器之间的性能差距正是 AutoRec 引入非线性变换与 Dropout 正则化带来的收益。需要注意的是这里的对比结论基于本书章节默认配置下的实验设置具体 RMSE 数值会随随机划分、初始化与硬件环境波动应以实际复现结果为准。小结AutoRec 用自编码器框架重新表述矩阵分解算法在协同过滤中融入非线性层与 Dropout 正则化在 MovieLens 100K 数据集上的实验表明AutoRec 取得了优于矩阵分解模型的测试 RMSE验证了神经网络在评分预测任务上的有效性item-based AutoRec 以评分矩阵的列物品向量为输入、重建完整评分为输出user-based 变体可对称推导。练习与进一步探索动手复现并深入理解 AutoRec可以从以下三个方向切入改变隐藏维度将AutoRec(500, num_users)中的num_hidden从 500 调整为 100、200、1000 等取值观察模型性能变化理解容量与欠/过拟合的权衡增加更多隐藏层在 encoder 与 decoder 之间堆叠额外的全连接层验证加深网络是否有助于提升评分预测精度探索激活函数组合尝试把 encoder 的sigmoid换成tanh、relu等或在 decoder 上施加激活寻找更优的 encoder/decoder 激活组合。以上练习的评判基准正是本文实现的掩码 RMSE 评估器可与矩阵分解模型的结果横向对比。延伸阅读本章完整目录与推荐系统知识体系推荐系统章节索引数据来源与预处理细节MovieLens 数据集线性基线模型矩阵分解协同过滤与显式/隐式反馈的概念基础推荐系统概述数据集读取、划分、装载与训练工具的源码实现d2l/mxnet.py赞分享文档教程人工智能深度学习NLP计算机视觉强化学习【免费下载链接】d2l-enInteractive deep learning book with multi-framework code, math, and discussions. Adopted at 500 universities from 70 countries including Stanford, MIT, Harvard, and Cambridge.项目地址https://gitcode.com/gh_mirrors/d2/d2l-en点击查看免费下载相关推荐《动手学深度学习》AutoRec 实战用自动编码器构建非线性协同过滤评分预测模型《动手学深度学习》AutoRec 实战用自动编码器构建非线性协同过滤评分预测模型 导读 AutoRec 是《动手学深度学习》d2l zh推荐系统章节中用于人工智能深度学习机器学习教程Notepad--免费的跨平台中文编码文本编辑器启动不到 1 秒新手 3 分钟上手Notepad 免费的跨平台中文编码文本编辑器启动不到 1 秒新手 3 分钟上手 Notepad 是一款免费开源的跨平台文本编辑器覆盖 Windows、桌面应用Qwen2-1.5B-Instruct数学推理能力测试GSM8K等数学问题解决指南Qwen2 1.5B Instruct数学推理能力测试GSM8K等数学问题解决指南 Qwen2 1.5B Instruct是一款轻量级AI模型在数学推理任务创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表