neural collaborative filtering 阅读笔记
本文主要介绍了一种一种基于神经网络的技术,来解决在含有隐形反馈的基础上进行推荐的关键问题————协同过滤。
2.1 Learning from Implicit Data
yui=1,(ifinteraction(useru,itemi)isobserved)y_{ui} = 1,(if interaction (user u, item i) is observed)yui=1,(ifinteraction(useru,itemi)isobserved)
yui=0,otherwisey_{ui} = 0,otherwiseyui=0,otherwise
值为1并不代表用户u对i感兴趣,同样,为0也不代表用户u对i不感兴趣,且作为缺失数据处理
2.2 Matrix Factorization
https://blog.csdn.net/SGDBS233/article/details/125838049
内积函数的缺陷
两行数据的相似度相似度可以用向量的内积来计算
我们计算前三行数据,可以得到s32>s12>s13s_{32}>s_{12}>s_{13}s32>s12>s13,所以可以绘制出如bbb图的形式
但是如果我们计算s4s_4s4,可得s41>s43>s42s_{41}>s_{43}>s_{42}s41>s43>s42,会向量p4p_4p4发现不管怎么放,都无法同时满足这个要求,从而导致误差排名加大。
3. NEURAL COLLABORATIVE FILTERING
3.1 General Framework通用框架
- 将user和item转化为one-hot编码作为Input Layer的输入。
- Embedding Layer是一个全连接层。
- NCF层被称作为神经协作过滤层,它将预测分数。
总体模型如下:
y^ui=f(PTvuU,QTviI∣P,Q,Θf)\hat{y}_{ui}=f(P^Tv_u^U,Q^Tv_i^I|P,Q,\Theta_f)y^ui=f(PTvuU,QTviI∣P,Q,Θf)
其中P,QP,QP,Q分别表示用户和项目的潜在因素矩阵,,Θf,\Theta_f,Θf表示模型fff的参数。
3.1.1 NCF的学习 Learning NCF
为了学习模型参数,现有的pointwise方法大多使用了平方损失的回归。
考虑到隐性反馈的一类性质,我们可以将 yuiy_{ui}yui的值作为一个标签,1表示项目i 和用户u相关,否则为0。这样 y^ui\hat{y}_{ui}y^ui就是一个概率,所以我们可以用似然函数来定义误差:
p(y,y−∣P,Q,Θf)=Π(u,i)∈yy^uiΠ(u,i)∈y−(1−y^ui)\ p(y,y^-|P,Q,\Theta_f)=\mathop{\Pi}\limits_{(u,i)\in y} \hat{y}_{ui}\mathop{\Pi}\limits_{(u,i)\in y^-}(1-\hat{y}_{ui}) p(y,y−∣P,Q,Θf)=(u,i)∈yΠy^ui(u,i)∈y−Π(1−y^ui)
取对数:
L=−∑(u,i)∈y∪y−yuilogy^ui+(1−yui)log(1−y^ui)L=-\sum\limits_{(u,i)\in y\cup y^-}y_{ui}\log\hat{y}_{ui}+(1-y_{ui})\log(1-\hat{y}_{ui})L=−(u,i)∈y∪y−∑yuilogy^ui+(1−yui)log(1−y^ui)
这是NCF方法需要去最小化的目标函数,并且可以通过使用随机梯度下降(SGD)来进行训练优化。
3.2 广义矩阵分解 Generalized Matrix Factorization (GMF)
输入层是一个one-hot编码,所以用PTvuUP^Tv_u^UPTvuU表示用户的潜在向量pup_upu,QTviIQ^Tv_i^IQTviI表示项目潜在向量qiq_iqi
那么第一层CF层映射函数为
ϕ(pu,qi)=pu⊙qi\phi(p_u,q_i)=p_u\odot q_iϕ(pu,qi)=pu⊙qi
其中⊙\odot⊙表示向量逐元素累乘。
然后映射到输出层
y^ui=aout(hT(pu⊙qi))\hat{y}_{ui}=a_{out}(h^T(p_u\odot q_i))y^ui=aout(hT(pu⊙qi))
其中aouta_{out}aout为激活函数,非线性情况下一般为σ(x)=11+e−x\sigma(x)=\frac{1}{1+e^{-x}}σ(x)=1+e−x1,hhh为连接权,通过loss function来学习它。
3.3 多层感知机 Multi-Layer Perceptron (MLP)
简单地对向量的连接不足以说明用户和项目之间的潜在特征,这对协同过滤建模来说是不够的。为了解决这个问题,我们提出在向量连接上增加隐藏层,使用标准的MLP(多层感知机)学习用户和项目潜在特征之间的相互作用。
即假设一共有LLL层
z1=ϕ1(pu,qi)z_1=\phi_1(p_u,q_i)z1=ϕ1(pu,qi)
ϕ2(z1)=a2(W2Tz1+b2)\phi_2(z1)=a_2(W_2^Tz_1+b_2)ϕ2(z1)=a2(W2Tz1+b2)
.........
ϕL(zL−1)=aL(WLTzL−1+bL)\phi_L(z_{L-1})=a_L(W_L^Tz_{L-1}+b_L)ϕL(zL−1)=aL(WLTzL−1+bL)
y^ui=σ(hTϕL(zL−1))\hat{y}_{ui}=\sigma(h^T\phi_L(z_{L-1}))y^ui=σ(hTϕL(zL−1))
对于激活函数axa_xax,文章表示使用ReLu效果最好。
结合GMF和MLP Fusion of GMF and MLP
一个直接的解决方法是让GMF和MLP共享相同的嵌入层(Embedding Layer),然后再结合它们分别对相互作用的函数输出,然而,共享GMF和MLP的嵌入层可能会限制融合模型的性能。例如,GMF和MLP必须使用的大小相同的嵌入;对于数据集,两个模型的最佳嵌入尺寸差异很大,使得这种解决方案可能无法获得最佳的组合。
所以我们让GMF和MLP学习独立的嵌入,并结合两种模型通过连接他们最后的隐层输出。
ϕGMF=PuG⊙qiG\phi^{GMF}=P_u^G\odot q_i^GϕGMF=PuG⊙qiG
ϕMLP=σ(hTϕL(zL−1))\phi^{MLP}=\sigma(h^T\phi_L(z_{L-1}))ϕMLP=σ(hTϕL(zL−1))
y^ui=σ(hT(ϕGMF⊙ϕMLP))\hat{y}_{ui}=\sigma(h^T(\phi^{GMF}\odot\phi^{MLP}))y^ui=σ(hT(ϕGMF⊙ϕMLP))
参考文章
https://blog.csdn.net/qq_44015059/article/details/107441512