AutoRec算法

AutoRec模型是一个单隐层神经网络推荐模型,可以说是最简单的神经网络的模型。它的原理也不复杂,可以看做是MLP(多层感知机)和DNN(深度神经网络)的简化,其中最主要的是结合了自编码器(AutoEncoder)和协同过滤(Collaborative Filtering)的思想。

自编码器是一个能够完成数据“自编码”的模型:将数据以向量的形式作为输入,通过自编码器,得到的输出尽可能和输入接近。这个概念和矩阵分解非常的相似,矩阵分解就是将评分矩阵分解成两个矩阵,通过训练拟合原有的评分,最后通过两个矩阵相乘的形式得到一个满秩的矩阵,也就是可以对未知的评分进行预测。

其中输入为,输出为
,
代表所有的输入数据向量,
表示编码器,
表示解码器,自编码器的目标便是优化损失函数。
就是令图中的红色部分的Error的值最小。

在基于评分数据的协同过滤算法当中,假设我们有个用户,
个物品,则有用户-物品评分矩阵
。对于一个用户
来说,他对所有
个物品的评分数据可以形成一个
维的向量
。同理,对于一个物品
来说,他对所有
个物品的评分数据可以形成一个
维的向量
。下面是AutoRec的整体模型框图

可以看到整个模型只有3层,蓝色的圆点代表的是隐层神经元,红色方框代表的是模型的输入,经过权重矩阵
和
到达输出层,我们的目的是通过训练模型,找到合适的权重矩阵
和
,以及偏置
和
,使得输入值和输出值的误差最小。
为了防止过拟合,可以对权重和
添加约束
其中表示Frobenius范数,定义好损失函数之后,就可以使用反向传播和梯度下降等方法来进行模型训练了。基于物品的AutoRec模型的训练过程如下:
输入物品
的评分向量
,即所有用户对物品
的评分向量
得到模型的评分预测输出向量
根据评分预测向量和真实评分向量的误差进行训练,最小化损失函数,得到最终的模型参数

实验对比
视频参考

代码参考https://gitee.com/youryouth/mc/tree/master
作者分别在MovieLens 1M和10M、以及Netflix数据上进行了对比实验,评测指标为RMSE,即均方根误差。分别与U-RBM、I-RBM、BiasedMF、LLORMA算法进行了对比。结果如下:

作者还做了消融实验,验证选择不同的激活函数对最终实验结果的影响。


代码实践
可以使用基于用户或者基于电影,作为网络的输入。比如基于用户,那么网络的输入就是6040,如果是电影,那么网络的输入3952,然后经过隐藏层,假设是300,得到对应的特征向量,最后的输出跟输入维度保持一致。
使用torch.utils.data.Dataset来加载对应的数据集。
代码中的x_mat矩阵即用户或者电影对应的矩阵,然后每一行作为输入即可。

总结
AutoRec模型是深度学习方法用于推荐系统中的开山之作,它仅仅使用了一个单隐层的自编码器来泛化用户和物品评分,使模型具有一定的泛化和表达能力。但是由于模型过于简单,也让它在实际使用中显得表征能力不足。