Neural Collaborative Filtering paper
关于协同过滤
协同过滤简而言之就是物以类聚人以群分,在真实场景中,通常会获得一张用户物品交互表,其实就是一个矩阵M,M[i][j]=1则表示用户i购买了物品j,M[i][j]=0表示没有购买。
协同过滤主要分为以下两种:
- user-based协同过滤:基于用户做推荐,给相似的用户推荐商品,A和B相似,A购买了itema而B没买,就可以吧itema推荐给B。如何计算A与B的相似性呢,每个用户是否购买商品可以形成一个一维的0-1向量构成用户向量,这样就能计算用户之间的相似性。
- item-based协同过滤:基于商品做推荐,将相似的物品推荐给用户,比如itema和itemb相似,用户买了itema就可以给其推荐itemb;
在实际情况中,商品数量巨大,而每个用户实际购买的商品只占总商品极小一部分,从而造成用户向量稀疏,计算量大,而且当商品增加时需要再次进行用户相似度的计算,而user-based的方法可以预先进行商品相似度的计算,再放到线上使用。
解决痛点
传统的基于矩阵分解的模型,主要用用户向量和物品向量的内积(对应位置乘积求和)来衡量某用户喜欢某物品的可能性y^ui:
y^ui=f(u,i∣pu,qi)=puTqi=k=1∑Kpukqik
其中K是用户/物品向量的维度,即每个维度乘积后的等权线性组合。该种判定方法存在很大的局限性。

如上图所示,user-item的矩阵如(a)所示,可以得到物品和用户向量(因为这是协同过滤,可以由交互矩阵直接得到两类向量),对于一个新向量U4,按道理来说他应该离U1最近U3其次U2最远(真实近似度可以用Jaccard来计算,即交集数除以并集数),但是在内积或者余弦相似度下,无法找到一个满足“离U1最近U3其次U2最远”的位置,这就是局限性所在。
当然解决的该问题可以通过扩大用户向量/物品向量的维度K来解决,但是K太大会降低模型的泛化能力。NCF通过DNN的方式来学习到潜在向量的之间的任意函数关系。
矩阵分解是一种将矩阵分解为其组成部分的方式,可以像图中那样直接抽取行向量列向量,也可以使用类似于SVD分解这些方法
建模背景
NCF主要是对隐式反馈进行建模:
- 显式反馈(explicit feedback):用户对物品反映直接喜好信息,比如电影评分等等
- 隐式反馈(implicit feedback): 用户间接的反映对物品的喜好,比如搜索历史、浏览历史、购买记录等等
在真实场景中,显示反馈比较少,大多都是隐式反馈,所以NCF模型主要是对隐式反馈进行建模。(个人理解是去预测用户是否会对某个物品采取action,这个action可以是搜索、购买或者浏览等)。
通用框架
NCF主要来学习隐式交互数据,用M和N分别表示用户数和商品数,定义user-item交互矩阵Y∈RM×N:
yui={1,0, if interaction ( user u, item i) is observed otherwise
为1表示有交互,为0表示其他。

如图所示NCF的通用框架其实就是embedding后的user和item向量进入DNN模型中得到结果。
NCF的预测模型表达式可以写成:
y^ui=f(PTvuU,QTviI∣P,Q,Θf)
其中:
-
P∈RM×K and Q∈RN×K:分别表示用户和item的潜在向量,即embedding向量
-
Θf:表示交叉函数f的参数
-
f表示交叉函数,在这里f是一个多层神经网络
所以上式又能写成:
f(PTvuU,QTviI)=ϕout(ϕX(…ϕ2(ϕ1(PTvuU,QTviI))…))
其中:
-
ϕout:表示输出层的映射函数
-
ϕx:表示DNN网络中第x层的映射函数(这个映射函数可以是**函数,也可以是内积运算)
该图显示的为NCF的通用框架,其中Neutral CF layer的不同会产生不同的模型,比如下面将要提到的GMF和MLP。
NCF学习
NCFN采用的是point-wise loss学习,即预测函数和label之间的损失,在NCF的场景中label是0/1的二进制结果,所以目标函数可以用似然函数表示,如下:
p(Y,Y−∣P,Q,Θf)=(u,i)∈Y∏y^ui(u,j)∈Y−∏(1−y^uj)
戴帽子的y表示模型预测值,当正样本本预测为1负样本被预测为0时,该似然函数是最大的。
按照逻辑回归损失函数的哪一套,将损失函数写成交叉熵的形式,即为NCF的目标函数。
L=−(u,i)∈Y∑logy^ui−(u,j)∈Y−∑log(1−y^uj)=−(u,i)∈Y∪Y−∑yuilogy^ui+(1−yui)log(1−y^ui)
Generalized Matrix Factorization (GMF)广义矩阵分解
该部分主要说明MF是NCF的一个特例。
当DNN只有一层,且该层的映射函数为内积,并且输出部分的映射函数为恒等变换时,NCF就退化成了一个MF模型:
DNN部分:
ϕ1(pu,qi)=pu⊙qi
output部分:
y^ui=aout(hT(pu⊙qi))
当aout为sigmoid函数时,通过交叉熵损失函数进行学习,这个特殊的MF模型更具有表现里,这里称其为GMF。
Multi-Layer Perceptron(MLP) 多层感知机
如果Neural CF layer部分是个DNN模型,那么NCF会变成一个MLP模型,模型结构如下所示:
z1ϕ2(z1)…y^L(zL−1)y^ui=ϕ1(pu,qi)=[puqi]=a2(W2Tz1+b2)=aL(WLTzL−1+bL)=σ(hTϕL(zL−1))
其中:
-
Wx,bx,ax分别为第DNN第x层的权重、偏置项和**函数
- 在第一层中,将user向量和item向量进行了拼接
GMF与MLP的融合
从上面可以看到NCF可以退化为一个GMF和一个MLP,其中GMF考虑到了user和item向量的线性交互,而MLP考虑到了这两者向量的非线性交互。这一部分考虑将两种模型进行融合,来学习到更强的表达能力。
一种做法是让GMF部分和MLP部分共享了Embedding 层,然后这两个部分处理后的结果进行组合后进行输出,以单层MLP为例,公式为:
y^ui=σ(hTa(pu⊙qi+W[puqi]+b))

但是在真实场景中,GMF部分与MLP部分Embedding向量的维度可能不同,所以需要进行预训练,这里分别对两个部分进行Embedding,输入到对应的部分,并将这两部分最终的输出进行连接,公式如下:
ϕGMFϕMLPy^ui=puG⊙qiG=aL(WLT(aL−1(…a2(W2T[puMqiM]+b2)…))+bL)=σ(hT[ϕGMFϕMLP])
其中p和q的上标表示他们属于GFM还是MLP的embedding向量。
GMF和MLP两部分占的权重需要根据具体场景进行trade-off。