Neural Collaborative Filtering paper

关于协同过滤

协同过滤简而言之就是物以类聚人以群分,在真实场景中,通常会获得一张用户物品交互表,其实就是一个矩阵M, M [ i ] [ j ] = 1 M[i][j]=1 M[i][j]=1则表示用户 i i i购买了物品 j j j M [ i ] [ j ] = 0 M[i][j]=0 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 ^ u i \hat{\boldsymbol{y}}_{u i} y^ui

y ^ u i = f ( u , i ∣ p u , q i ) = p u T q i = ∑ k = 1 K p u k q i k \hat{y}_{u i}=f\left(u, i | \mathbf{p}_{u}, \mathbf{q}_{i}\right)=\mathbf{p}_{u}^{T} \mathbf{q}_{i}=\sum_{k=1}^{K} p_{u k} q_{i k} y^ui=f(u,ipu,qi)=puTqi=k=1Kpukqik
其中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 ∈ R M × N \mathbf{Y} \in \mathbb{R}^{M \times N} YRM×N

y u i = { 1 ,  if interaction  (  user  u ,  item  i )  is observed  0 ,  otherwise  y_{u i}=\left\{\begin{array}{ll}1, & \text { if interaction }(\text { user } u, \text { item } i) \text { is observed } \\ 0, & \text { otherwise }\end{array}\right. yui={1,0, if interaction ( user u, item i) is observed  otherwise 
为1表示有交互,为0表示其他。
在这里插入图片描述
如图所示NCF的通用框架其实就是embedding后的user和item向量进入DNN模型中得到结果。
NCF的预测模型表达式可以写成:
y ^ u i = f ( P T v u U , Q T v i I ∣ P , Q , Θ f ) \hat{y}_{u i}=f\left(\mathbf{P}^{T} \mathbf{v}_{u}^{U}, \mathbf{Q}^{T} \mathbf{v}_{i}^{I} | \mathbf{P}, \mathbf{Q}, \Theta_{f}\right) y^ui=f(PTvuU,QTviIP,Q,Θf)
其中:

  • P ∈ R M × K \mathbf{P} \in \mathbb{R}^{M \times K} PRM×K and Q ∈ R N × K \mathbf{Q} \in \mathbb{R}^{N \times K} QRN×K:分别表示用户和item的潜在向量,即embedding向量
  • Θ f \Theta_{f} Θf:表示交叉函数 f f f的参数
  • f f f表示交叉函数,在这里 f f f是一个多层神经网络

所以上式又能写成:
f ( P T v u U , Q T v i I ) = ϕ out ( ϕ X ( … ϕ 2 ( ϕ 1 ( P T v u U , Q T v i I ) ) … ) ) f\left(\mathbf{P}^{T} \mathbf{v}_{u}^{U}, \mathbf{Q}^{T} \mathbf{v}_{i}^{I}\right)=\phi_{\text {out}}\left(\phi_{X}\left(\ldots \phi_{2}\left(\phi_{1}\left(\mathbf{P}^{T} \mathbf{v}_{u}^{U}, \mathbf{Q}^{T} \mathbf{v}_{i}^{I}\right)\right) \ldots\right)\right) f(PTvuU,QTviI)=ϕout(ϕX(ϕ2(ϕ1(PTvuU,QTviI))))

其中:

  • ϕ o u t \phi_{o u t} ϕout:表示输出层的映射函数
  • ϕ x \phi_{x} ϕx:表示DNN网络中第 x x 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 ^ u i ∏ ( u , j ) ∈ Y − ( 1 − y ^ u j ) p\left(\mathcal{Y}, \mathcal{Y}^{-} | \mathbf{P}, \mathbf{Q}, \Theta_{f}\right)=\prod_{(u, i) \in \mathcal{Y}} \hat{y}_{u i} \prod_{(u, j) \in \mathcal{Y}^{-}}\left(1-\hat{y}_{u j}\right) p(Y,YP,Q,Θf)=(u,i)Yy^ui(u,j)Y(1y^uj)

戴帽子的y表示模型预测值,当正样本本预测为1负样本被预测为0时,该似然函数是最大的。
按照逻辑回归损失函数的哪一套,将损失函数写成交叉熵的形式,即为NCF的目标函数。
L = − ∑ ( u , i ) ∈ Y log ⁡ y ^ u i − ∑ ( u , j ) ∈ Y − log ⁡ ( 1 − y ^ u j ) = − ∑ ( u , i ) ∈ Y ∪ Y − y u i log ⁡ y ^ u i + ( 1 − y u i ) log ⁡ ( 1 − y ^ u i ) \begin{aligned} L &=-\sum_{(u, i) \in \mathcal{Y}} \log \hat{y}_{u i}-\sum_{(u, j) \in \mathcal{Y}^{-}} \log \left(1-\hat{y}_{u j}\right) \\ &=-\sum_{(u, i) \in \mathcal{Y} \cup \mathcal{Y}^{-}} y_{u i} \log \hat{y}_{u i}+\left(1-y_{u i}\right) \log \left(1-\hat{y}_{u i}\right) \end{aligned} L=(u,i)Ylogy^ui(u,j)Ylog(1y^uj)=(u,i)YYyuilogy^ui+(1yui)log(1y^ui)

Generalized Matrix Factorization (GMF)广义矩阵分解

该部分主要说明MF是NCF的一个特例。

当DNN只有一层,且该层的映射函数为内积,并且输出部分的映射函数为恒等变换时,NCF就退化成了一个MF模型:
DNN部分:
ϕ 1 ( p u , q i ) = p u ⊙ q i \phi_{1}\left(\mathbf{p}_{u}, \mathbf{q}_{i}\right)=\mathbf{p}_{u} \odot \mathbf{q}_{i} ϕ1(pu,qi)=puqi
output部分:
y ^ u i = a o u t ( h T ( p u ⊙ q i ) ) \hat{y}_{u i}=a_{o u t}\left(\mathbf{h}^{T}\left(\mathbf{p}_{u} \odot \mathbf{q}_{i}\right)\right) y^ui=aout(hT(puqi))

a out a_{\text {out}} aout为sigmoid函数时,通过交叉熵损失函数进行学习,这个特殊的MF模型更具有表现里,这里称其为GMF。

Multi-Layer Perceptron(MLP) 多层感知机

如果Neural CF layer部分是个DNN模型,那么NCF会变成一个MLP模型,模型结构如下所示:
z 1 = ϕ 1 ( p u , q i ) = [ p u q i ] ϕ 2 ( z 1 ) = a 2 ( W 2 T z 1 + b 2 ) … y ^ L ( z L − 1 ) = a L ( W L T z L − 1 + b L ) y ^ u i = σ ( h T ϕ L ( z L − 1 ) ) \begin{aligned} \mathbf{z}_{1} &=\phi_{1}\left(\mathbf{p}_{u}, \mathbf{q}_{i}\right)=\left[\begin{array}{l} \mathbf{p}_{u} \\ \mathbf{q}_{i} \end{array}\right] \\ \phi_{2}\left(\mathbf{z}_{1}\right) &=a_{2}\left(\mathbf{W}_{2}^{T} \mathbf{z}_{1}+\mathbf{b}_{2}\right) \\ \ldots & \\ \hat{y}_{L}\left(\mathbf{z}_{L-1}\right) &=a_{L}\left(\mathbf{W}_{L}^{T} \mathbf{z}_{L-1}+\mathbf{b}_{L}\right) \\ \hat{y}_{u i} &=\sigma\left(\mathbf{h}^{T} \phi_{L}\left(\mathbf{z}_{L-1}\right)\right) \end{aligned} z1ϕ2(z1)y^L(zL1)y^ui=ϕ1(pu,qi)=[puqi]=a2(W2Tz1+b2)=aL(WLTzL1+bL)=σ(hTϕL(zL1))
其中:

  • W x , b x , a x W_x,b_x,a_x Wx,bx,ax分别为第DNN第 x x x层的权重、偏置项和激活函数
  • 在第一层中,将user向量和item向量进行了拼接
GMF与MLP的融合

从上面可以看到NCF可以退化为一个GMF和一个MLP,其中GMF考虑到了user和item向量的线性交互,而MLP考虑到了这两者向量的非线性交互。这一部分考虑将两种模型进行融合,来学习到更强的表达能力。
一种做法是让GMF部分和MLP部分共享了Embedding 层,然后这两个部分处理后的结果进行组合后进行输出,以单层MLP为例,公式为:
y ^ u i = σ ( h T a ( p u ⊙ q i + W [ p u q i ] + b ) ) \hat{y}_{u i}=\sigma\left(\mathbf{h}^{T} a\left(\mathbf{p}_{u} \odot \mathbf{q}_{i}+\mathbf{W}\left[\begin{array}{l} \mathbf{p}_{u} \\ \mathbf{q}_{i} \end{array}\right]+\mathbf{b}\right)\right) y^ui=σ(hTa(puqi+W[puqi]+b))

在这里插入图片描述
但是在真实场景中,GMF部分与MLP部分Embedding向量的维度可能不同,所以需要进行预训练,这里分别对两个部分进行Embedding,输入到对应的部分,并将这两部分最终的输出进行连接,公式如下:

ϕ G M F = p u G ⊙ q i G ϕ M L P = a L ( W L T ( a L − 1 ( … a 2 ( W 2 T [ p u M q i M ] + b 2 ) … ) ) + b L ) y ^ u i = σ ( h T [ ϕ G M F ϕ M L P ] ) \begin{aligned} \phi^{G M F} &=\mathbf{p}_{u}^{G} \odot \mathbf{q}_{i}^{G} \\ \phi^{M L P} &=a_{L}\left(\mathbf{W}_{L}^{T}\left(a_{L-1}\left(\ldots a_{2}\left(\mathbf{W}_{2}^{T}\left[\begin{array}{c} \mathbf{p}_{u}^{M} \\ \mathbf{q}_{i}^{M} \end{array}\right]+\mathbf{b}_{2}\right) \ldots\right)\right)+\mathbf{b}_{L}\right) \\ \hat{y}_{u i} &=\sigma\left(\mathbf{h}^{T}\left[\begin{array}{c} \phi^{G M F} \\ \phi^{M L P} \end{array}\right]\right) \end{aligned} ϕGMFϕMLPy^ui=puGqiG=aL(WLT(aL1(a2(W2T[puMqiM]+b2)))+bL)=σ(hT[ϕGMFϕMLP])
其中p和q的上标表示他们属于GFM还是MLP的embedding向量。

GMF和MLP两部分占的权重需要根据具体场景进行trade-off。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐