Neural Collaborative Filtering paper

关于协同过滤

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

y^ui=f(u,ipu,qi)=puTqi=k=1Kpukqik\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}
其中K是用户/物品向量的维度,即每个维度乘积后的等权线性组合。该种判定方法存在很大的局限性。
NCF(Neural Collaborative Filtering)——协同过滤与神经网络的结合
如上图所示,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交互矩阵YRM×N\mathbf{Y} \in \mathbb{R}^{M \times N}

yui={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.
为1表示有交互,为0表示其他。
NCF(Neural Collaborative Filtering)——协同过滤与神经网络的结合
如图所示NCF的通用框架其实就是embedding后的user和item向量进入DNN模型中得到结果。
NCF的预测模型表达式可以写成:
y^ui=f(PTvuU,QTviIP,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)
其中:

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

所以上式又能写成:
f(PTvuU,QTviI)=ϕout(ϕX(ϕ2(ϕ1(PTvuU,QTviI))))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)

其中:

  • ϕout\phi_{o u t}:表示输出层的映射函数
  • ϕx\phi_{x}:表示DNN网络中第xx层的映射函数(这个映射函数可以是**函数,也可以是内积运算)

该图显示的为NCF的通用框架,其中Neutral CF layer的不同会产生不同的模型,比如下面将要提到的GMF和MLP。

NCF学习

NCFN采用的是point-wise loss学习,即预测函数和label之间的损失,在NCF的场景中label是0/1的二进制结果,所以目标函数可以用似然函数表示,如下:

p(Y,YP,Q,Θf)=(u,i)Yy^ui(u,j)Y(1y^uj)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)

戴帽子的y表示模型预测值,当正样本本预测为1负样本被预测为0时,该似然函数是最大的。
按照逻辑回归损失函数的哪一套,将损失函数写成交叉熵的形式,即为NCF的目标函数。
L=(u,i)Ylogy^ui(u,j)Ylog(1y^uj)=(u,i)YYyuilogy^ui+(1yui)log(1y^ui)\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}

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

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

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

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

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

如果Neural CF layer部分是个DNN模型,那么NCF会变成一个MLP模型,模型结构如下所示:
z1=ϕ1(pu,qi)=[puqi]ϕ2(z1)=a2(W2Tz1+b2)y^L(zL1)=aL(WLTzL1+bL)y^ui=σ(hTϕL(zL1))\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}
其中:

  • Wx,bx,axW_x,b_x,a_x分别为第DNN第xx层的权重、偏置项和**函数
  • 在第一层中,将user向量和item向量进行了拼接
GMF与MLP的融合

从上面可以看到NCF可以退化为一个GMF和一个MLP,其中GMF考虑到了user和item向量的线性交互,而MLP考虑到了这两者向量的非线性交互。这一部分考虑将两种模型进行融合,来学习到更强的表达能力。
一种做法是让GMF部分和MLP部分共享了Embedding 层,然后这两个部分处理后的结果进行组合后进行输出,以单层MLP为例,公式为:
y^ui=σ(hTa(puqi+W[puqi]+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)

NCF(Neural Collaborative Filtering)——协同过滤与神经网络的结合
但是在真实场景中,GMF部分与MLP部分Embedding向量的维度可能不同,所以需要进行预训练,这里分别对两个部分进行Embedding,输入到对应的部分,并将这两部分最终的输出进行连接,公式如下:

ϕGMF=puGqiGϕMLP=aL(WLT(aL1(a2(W2T[puMqiM]+b2)))+bL)y^ui=σ(hT[ϕGMFϕMLP])\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}
其中p和q的上标表示他们属于GFM还是MLP的embedding向量。

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

相关文章:

  • 2021-10-12
  • 2021-10-15
  • 2021-06-18
  • 2021-06-03
  • 2022-03-10
  • 2022-12-23
  • 2021-11-11
猜你喜欢
  • 2022-12-23
  • 2021-09-22
  • 2021-10-06
  • 2021-09-17
  • 2022-12-23
  • 2021-06-29
  • 2021-12-19
相关资源
相似解决方案