欢迎光临散文网 会员登陆 & 注册

AutoRec算法

2022-11-21 13:04 作者:021usc  | 我要投稿

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


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


自编码器结构

其中输入为x,输出为rS代表所有的输入数据向量,h%3Df(x)表示编码器,r%3Dg(h)%3Dg(f(x))表示解码器,自编码器的目标便是优化损失函数。

%5Coperatorname%7Bargmin%7D%20%5Csum_%7Br%20%5Cin%20S%7D%5C%7Cr-g(f(x))%5C%7C_%7B2%7D%5E%7B2%7D

就是令图中的红色部分的Error的值最小。


在基于评分数据的协同过滤算法当中,假设我们有m个用户,n个物品,则有用户-物品评分矩阵R%20%5Cin%20%5Cmathbb%7BR%7D%5E%7Bm%20%5Ctimes%20n%7D。对于一个用户u来说,他对所有n个物品的评分数据可以形成一个n维的向量r%5E%7B(u)%7D%3D%5Cleft(R_%7Bu%201%7D%2C%20%5Cldots%2C%20R_%7Bu%20n%7D%5Cright)。同理,对于一个物品i来说,他对所有m个物品的评分数据可以形成一个m维的向量r%5E%7B(i)%7D%3D%5Cleft(R_%7B1%20i%7D%2C%20%5Cldots%2C%20R_%7Bm%20i%7D%5Cright)。下面是AutoRec的整体模型框图

AutoRec网络结构

可以看到整个模型只有3层,蓝色的圆点代表的是隐层神经元,红色方框代表的是模型的输入y_i,经过权重矩阵W_EW_D到达输出层,我们的目的是通过训练模型,找到合适的权重矩阵W_EW_D,以及偏置%5Cmub,使得输入值和输出值的误差最小。

%5Carg%20%5Cmin%20_%7B%5Ctheta%7D%20%5Csum_%7By%20%5Cin%20S%7D%20%5C%7C%20y-h(y%20%3B%20%5Ctheta)%5C%7C_%7B2%7D%5E%7B2%7D

h(y%20%3B%20%5Ctheta)%3Df%5Cleft(W_%7BD%7D%20g%5Cleft(W_%7BE%7D%20y%2B%5Cmu%5Cright)%2Bb%5Cright)

为了防止过拟合,可以对权重W_EW_D添加约束

%5Carg%20%5Cmin%20_%7BA%7D%20%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%5Cleft%5C%7Cy_%7Bi%7D-h%5Cleft(y_%7Bi%7D%20%3B%20%5Ctheta%5Cright)%5Cright%5C%7C_%7BF%7D%5E%7B2%7D%2B%5Cfrac%7B%5Clambda%7D%7B2%7D%5Cleft(%5Cleft%5C%7CW_%7BL%7D%5Cright%5C%7C_%7BF%7D%5E%7B2%7D%2B%5Cleft%5C%7CW_%7BD%7D%5Cright%5C%7C_%7BF%7D%5E%7B2%7D%5Cright)%20%5Ctext%20%7B%20%7D

其中%7C%7C%C2%B7%7C%7C_F表示Frobenius范数,定义好损失函数之后,就可以使用反向传播和梯度下降等方法来进行模型训练了。基于物品的AutoRec模型的训练过程如下:

  1. 输入物品i的评分向量y_i,即所有用户对物品i的评分向量

  2. 得到模型的评分预测输出向量h%5Cleft(y_%7Bi%7D%20%3B%20%5Ctheta%5Cright)

  3. 根据评分预测向量和真实评分向量的误差进行训练,最小化损失函数,得到最终的模型参数%5Ctheta

实验对比

视频参考

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


AutoRec算法的评论 (共 条)

分享到微博请遵守国家法律