(基本矩阵分解)Basic MF
Basic MF是最基础的分解方式,将评分矩阵R分解为用户矩阵U和项目矩阵S, 通过不断的迭代训练使得U和S的乘积越来越接近真实矩阵,矩阵分解过程如图:

预测值接近真实值就是使其差最小,这是我们的目标函数,然后采用梯度下降的方式迭代计算U和S,它们收敛时就是分解出来,的矩阵。我们用损失函数来表示误差(等价于目标函数):i=1∑nj=1∑m(Rij−UiTSj)2
R_ij是评分矩阵中已打分的值,U_i和S_j相当于未知变量。为求得公式1的最小值,相当于求关于U和S二元函数的最小值(极小值或许更贴切)。通常采用梯度下降的方法:Ui←Ui−η∂Ui∂£,Si←Si−η∂Si∂£
η是学习速率,表示迭代的步长。其值为1.5时,通常以震荡形式接近极值点;若<1迭代单调趋向极值点;若>2围绕极值逐渐发散,不会收敛到极值点。具体取什么值要根据实验经验,另外还需要在每一步对学习速率进行衰减,目的是使算法尽快收敛。该方法也叫LFM(latent factor model)。
Slope One
Slope One 算法是由 Daniel Lemire 教授在 2005 年提出的一个Item-Based 的协同过滤推荐算法。和其它类似算法相比, 它的最大优点在于算法很简单, 易于实现, 执行效率高, 同时推荐的准确性相对较高。
Slope One算法是基于不同物品之间的评分差的线性算法,预测用户对物品评分的个性化算法。主要两步:
Step1:计算物品之间的评分差的均值,记为物品间的平均偏差(两物品同时被评分);Rij=∣N(i)∩N(j)∣∑u∈N(i)∩N(j)rui−ruj
其中,rui是用户u对物品i的评分,ruj是用户u对物品j的评分。N(i)是物品i评过分的用户,N(j)是物品j评过分的用户,∣N(i)∩N(j)∣是对物品i和j都评过分的用户数。
Step2:根据物品间的评分偏差和用户的历史评分,预测用户对未评分的物品的评分。 Puj=∑i∈N(u)∣N(i)∩N(j)∣∑i∈N(u)∣N(i)∩N(j)∣(rui−R(ij))其中,N(u)是用户u评过分的物品。
举例:
顾客用餐过后,会有相关的星级评分。假设评分如下:
评分 |
可乐鸡翅 |
红烧肉 |
小明 |
4 |
5 |
小红 |
4 |
3 |
小伟 |
2 |
3 |
小芳 |
3 |
? |
问题:请猜测一下小芳可能会给“红烧肉”打多少分?
思路:把两道菜的平均差值求出来,可乐鸡翅减去红烧肉的平均偏差:[(4−5)+(4−3)+(2−3)]/3=−0.333。一个新客户比如小芳,只吃了可乐鸡翅评分为3分,那么可以猜测她对红烧肉的评分为:3−(−0.333)=3.333
AutoRec:Autoencoders Meet Collaborative Filtering

在基于评分的协同过滤中,有m个用户,n个项目,和一个能看到部分user-item评分的矩阵U∈Rm×n。能部分看到的向量r(u)=(Ru1,……,Run)∈Rn代表每一个useru∈U={1,……,m}。同样地,能部分看到的向量r(i)=(R1i,……,Rmi)代表每一个itemi∈I={1,……,n}。为了达到推荐的目的,设计出了一个基于item(user)的自动编码器,这个编码器可以把部分观察到的r(i)(r(u))作为输入,把它投射到一个低维度的潜在(隐藏)空间,然后在输出空间中重构r(i)(r(u)),从而预测出丢失的评分。
形式上,给定一组Rd中的向量S和一些k∈N+,那自动编码器就是minθr∈S∑∥r−h(r;θ)∥22
其中,h(r;θ)是r∈Rd的重构h(r;θ)=f(W⋅g(Vr+μ)+b)
f(⋅)g(⋅)是**函数。在这里,θ={W,V,μ,b},其中W∈Rd×k和V∈Rk×d是变换(Transformations),μ∈Rk和b∈Rd是偏移量(biases)。这个目标对应于一个单独的、K维隐藏向量的自联想神经网络(Auto-Associative Neural Network )。参数θ使用反向传播来进行学习。
我们对学习的参数进行正则化,以防止对观察到的评分过度拟合。形式上,基于item的自动编码模型的目标函数是,其中,正则化强度( regularisation strength)λ>0:θmini=1∑n∥∥ri−h(ri;θ)∥∥O2+2λ⋅(∥W∥F2+∥V∥F2)
其中∥⋅∥O2意味着我们只考虑观察到的评级的贡献。(∣∣A∣∣F=(∑i=nn∑i=nn∣aij∣2)21)基于user的自动编码模型是由向量{r(u)}u=1m得到的。
NCF
Generalized Matrix Factorization (GMF)
由于输入层是用户(项目)ID中的一个one-hot encoding编码,所获得的嵌入向量可以被看作是用户(项目)的潜在向量。我们用 PvTUu 表示用户的潜在向量pu ,QvTIi 表示项目的潜在向量 qi ,我们定义第一层神经CF层的映射函数为:ϕ1(pu,qi)=pu⊙qi
其中⊙表示向量的逐元素乘积。然后,我们将向量映射到输出层:y^ui=aout(hT(pu⊙qi))其中 aout 和 h 分别表示输出层的**函数和连接权。
Multi-Layer Perceptron (MLP)

简单地对向量的连接不足以说明用户和项目之间的潜在特征,这对协同过滤建模来说是不够的。为了解决这个问题,我们提出在向量连接上增加隐藏层,使用标准的MLP(多层感知机)学习用户和项目潜在特征之间的相互作用。在这个意义上,我们可以赋予模型高水平的灵活性和非线性建模能力,而不是GMF(广义矩阵分解)那样的简单使用逐元素相乘的内积来描述用户和项目之间的潜在交互特征。更确切地说,我们的NCF框架下的MLP模型定义为:
z1=ϕ1(pu,qi)=[puqi]ϕ2(z1)=a2(W2Tz1+b2)……ϕL(zL−1)=aL(WLTzL−1+bL)yui=σ(hTϕL(zL−1))
这里的 Wx,bx 和 ax 分别表示x 层的感知机中的的权重矩阵,偏置向量(神经网络的神经元阈值)和**函数。
Fusion of GMF and MLP
为了使得融合模型具有更大的灵活性,我们允许GMF和MLP学习独立的嵌入,并结合两种模型通过连接他们最后的隐层输出。上图展示了这个方案,公式如下:
ϕGMF=puG⊙qiGphiMLP=aL(WLT(aL−1(...a2(W2T[puMqiM]+b2)...))+bL)widehatyui=σ(hT[ϕGMFϕMLP])
这里的 puG 和 puM 分别表示 GMF 部分和 MLP 部分的用户嵌入(user embedding);同样的,qiG 和 qiM 分别表示项目的嵌入。
Conclusion
Method |
RMSE |
MF |
0.84252±0.00218 |
Slope One |
0.90691±0.00211 |
NCF |
0.84619±0.00231 |
AutoRec |
0.84671±0.00308 |
a) 深度学习方法很难训练
b) 矩阵分解方法依然处于指导地位
c) 可以使用深度学习方法作为特征的预处理