论文笔记:Neural Collaborative Filtering(NCF)

时间:2024-04-03 20:15:45

前言

论文链接:https://arxiv.org/abs/1708.05031
github:https://github.com/yihong-chen/neural-collaborative-filtering
参考:https://www.cnblogs.com/HolyShine/p/6728999.html
https://blog.csdn.net/foneone/article/details/103881687

本文主要介绍了一种一种基于神经网络的技术,来解决在含有隐形反馈的基础上进行推荐的关键问题————协同过滤。

最近的一些工作已经把深度学习运用到了推荐中,但是他们主要是用它(深度学习)来对一些辅助信息(auxiliary information)建模,比如描述文字的项目和音乐的声学特征当涉及到建模协同过滤的关键因素(key factor)————用户和项目(item)特征之间的交互的时候,他们仍然采用矩阵分解的方式,并将内积(inner product)做为用户和项目的潜在特征点乘。通过用神经结构代替内积这可以从数据中学习任意函数,据此我们提出一种通用框架,我们称它为NCF(Neural network-based Collaborative Filtering,基于神经网络的协同过滤)。NCF是一种通用的框架,它可以表达和推广矩阵分解。为了提升NFC的非线性建模能力,我们提出了使用多层感知机去学习用户-项目之间交互函数(interaction function)

1. 数据定义

MMNN 分别表示用户和项目的数量。我们将从用户的隐性反馈得到的用户-项目交互矩阵 YRM×NY \in \mathbb{R}^{M \times N} 定义为:
f(n)={1,if interaction(user u,item i)is observed;0,otherwise. f(n)= \begin{cases} 1, & \text {if interaction(user $u$,item $i$)is observed;} \\ 0, & \text{otherwise.} \end{cases}

这里 yuiy_{ui} 为 1 表示用户 uu 和项目 ii 存在交互记录;然而这并不意味着 uu 真的喜欢 ii。同样的,值 0 也不是表明 uu 不喜欢 ii,也有可能是这个用户根本不知道有这个项目。这对隐性反馈的学习提出了挑战,因为它提供了关于用户偏好的噪声信号。虽然观察到的条目至少反映了用户对项目的兴趣,但是未查看的条目可能只是丢失数据,并且这其中存在自然稀疏的负反馈。

在隐性反馈上的推荐问题可以表达为估算矩阵 YY 中未观察到的条目的分数问题(这个分数被用来评估项目的排名)。基于模型的方法假定这些缺失的数据可以由底层模型生成(或者说描述)。形式上它可以被抽象为学习函数 y^ui=f(u,iΘ)\hat{y}_{ui}=f(u,i|\Theta) ,其中 y^ui\hat{y}_{ui} 表示交互yui{y}_{ui}的预测分数,Θ\Theta 表示模型参数,ff 表示表示模型参数映射到预测分数的函数(我们把它称作交互函数)。

2. 矩阵分解

MF(Matrix Factorization)用一个潜在特征向量实值将每个用户和项目关联起来。令 pup_uqiq_i 分别表示用户 uu 和项目 ii 的潜在向量;MF评估相互作用 yuiy_{ui} 作为 pup_uqiq_i 的内积:
y^u,i=f(u,ipu,qi)=puTqi=k=1Kpukqik\hat{y}_{u,i}=f(u,i|p_u,q_i)=p_u^Tq_i = \sum_{k=1}^Kp_{uk}q_{ik}

这里的 KK 表示潜在空间(latent space)的维度。正如我们所看到的,MF模型是用户和项目的潜在因素的双向互动,它假设潜在空间的每一维都是相互独立的并且用相同的权重将它们线性结合。因此,MF可视为潜在因素(latent factor)的线性模型。
论文笔记:Neural Collaborative Filtering(NCF)
图中展示了的内积函数(inner product function)如何限制MF的表现力。这里有两个背景必须事先说明清楚以便于更好地了解例子。第一点,由于MF将用户和项目映射到同一潜在空间中,两个用户之间的相似性也可以用内积,或者潜在向量之间的角度的余弦值来衡量。第二点,不失一般性,我们使用Jaccard系数作为MF需要恢复的两个用户的真实状况之间的相似度。

假定潜在向量都是单位长度
RuR_u 表示与用户 uu 交互的项目集,那么用户 uujj 之间的Jaccard相似系数就被定义为:
sij=RiRjRiRjs_{ij}=\frac{|R_i|\cap|R_j|}{|R_i|\cup|R_j|}

我们首先关注的图(a)中的前三行(用户)。很容易可以计算出 s23(0.66)>s12(0.5)>s13(0.4)s_{23}(0.66)>s_{12}(0.5)>s_{13}(0.4) 。这样,p1p_1p2p_2p3p_3 在潜在空间中的几何关系可绘制成图(b)。现在,让我们考虑一个新的用户 u4u_4,它的输入在图(a)中的用虚线框出。我们同样可以计算出 s41(0.6)>s43(0.4)>s42(0.2)s_{41}(0.6)>s_{43}(0.4)>s_{42}(0.2) ,表示 u4u_4 最接近 u1u_1,接着是 u3u_3 ,最后是 u2u_2 。然而,如果MF模型将 p4p_4 放在了 最接近 p1p_1 的位置(图1(b) 中的虚线展示了两种不同的摆放 p4p_4 的方式,结果一样),那么会使得 p4p_4 相比与 p3p_3 更接近于 p2p_2 (显然,根据图(a),u4u_4 应该更接近 u3u_3),这会导致很大的排名误差(ranking loss)。

上面的示例显示了MF因为使用一个简单的和固定的内积,来估计在低维潜在空间中用户-项目的复杂交互,从而所可能造成的限制。我们注意到,解决该问题的方法之一是使用大量的潜在因子 KK (就是潜在空间向量的维度)。然而这可能对模型的泛化能力产生不利的影响(e.g. 数据的过拟合问题),特别是在稀疏的集合上。在本文的工作中,通过使用DNNs从数据中学习交互函数,突破了这个限制。

3. Neural Collaborative Filtering(NCF)

提出总体框架NCF,阐述NCF学习强调了隐式数据的二进制属性的概率模型。MF能够表达为NCF 的推广(MF矩阵分解模型是NCF的一个特例)。采用了多层感知器(MLP)来学习用户-项目交互函数。最后,在NCF框架下结合了MF和MLP,提出了一种新的神经矩阵分解模型(neural matrix factorization model);它统一了在建模用户项目潜在结构方面,MF的线性建模优势和MLP的非线性优势。

3.1 框架

论文笔记:Neural Collaborative Filtering(NCF)
为了允许神经网络对协同过滤进行一个完整的处理,我们采用图2展示的多层感知机去模拟一个用户项目交互yuiy_{ui} ,它的一层的输出作为下一层的输入。底部输入层包括两个特征向量 vuUv^U_uviIv^I_i ,分别用来描述用户 uu 和项目 ii 。 他们可以进行定制,用以支持广泛的用户和项目的建模,例如上下文感知,基于内容,和基于邻居的构建方式。由于本文工作的重点是纯的协同过滤模型设置,我们仅使用一个用户和一个项目作为输入特征,它使用one-hot编码将它们转化为二值化稀疏向量。注意到,我们对输入使用这样的通用特征表示,可以很容易地使用的内容特征来表示用户和项目,以调整解决冷启动问题。

输入层上面是嵌入层(Embedding Layer);它是一个全连接层,用来将输入层的稀疏表示映射为一个稠密向量(dense vector)。所获得的用户(项目)的嵌入(就是一个稠密向量)可以被看作是在潜在因素模型的上下文中用于描述用户(项目)的潜在向量。然后我们将用户嵌入和项目嵌入送入多层神经网络结构,我们把这个结构称为神经协作过滤层,它将潜在向量映射为预测分数。NCF层的每一层可以被定制,用以发现用户-项目交互的某些潜在结构。最后一个隐含层 X 的维度尺寸决定了模型的能力。最终输出层是预测分数 y^ui\hat{y}_{ui} ,训练通过最小化 y^ui\hat{y}_{ui} 和其目标值 yuiy_{ui} 之间逐点损失进行。

当前我们制定的NCF预测模型如下:
y^ui=f(PTvuU,QTviIP,Q,Θf)\hat{y}_{ui}=f(P^Tv_u^U,Q^Tv_i^I|P,Q,\Theta_f)

其中 PRM×KP \in \mathbb{R}^{M \times K}QRN×KQ \in \mathbb{R}^{N \times K},分别表示用户和项目的潜在因素矩阵;Θj\Theta_j 表示交互函数 ff 的模型参数。由于函数 ff 被定义为多层神经网络,它可以被定制为:
f(PTvuU,QTviI)=ϕout(ϕX(...ϕ2(ϕ1(PTvuU,QTviI))...))f(P^Tv_u^U,Q^Tv_i^I)=\phi_{out}(\phi_X(...\phi_2(\phi_1(P^Tv^U_u,Q^Tv_i^I))...))

其中 ϕout\phi_{out}ϕx\phi_x 分别表示为输出层和第 xx 个神经协作过滤(CF)层映射函数,总共有 XX 个神经协作过滤(CF)层。

3.2 NCF学习

主要运用均方误差(squared loss)进行回归:
Lsqr=(u,i)yywui(yuiy^ui)2L_{sqr}=\sum_{(u,i) \in y \cup y}-w_{ui}(y_{ui}-\hat{y}_{ui})^2

其中 yy 表示交互矩阵 YY 中观察到的条目(如对电影有明确的评分,评级), yy^− 表示消极实例(negative instances,可以将未观察的样本全体视为消极实例,或者采取抽样的方式标记为消极实例); wuiw_{ui} 是一个超参数,用来表示训练实例 (u,i)(u,i) 的权重。虽然均方误差可以通过假设观测服从高斯分布来作出解释,但是它不适合处理隐性数据(implicit data)。这是因为对于隐含数据来说,目标值 yuiy_{ui} 是二进制值1或0,表示 uu 是否与 ii 进行了互动。在下文中提出了逐点学习NCF的概率学方法,特别注重隐性数据的二进制属性。

考虑到隐性反馈的一类性质,我们可以将 yuiy_{ui} 的值作为一个标签————1表示项目 ii 和用户 uu 相关,否则为0。这样一来预测分数 y^ui\hat{y}_{ui} 就代表了项目 ii 和用户 uu 相关的可能性大小。为了赋予NCF这样的概率解释,我们需要将网络输出限制到[0,1]的范围内,通过使用概率函数(e.g. 逻辑函数sigmoid或者probit函数)作为**函数作用在输出层 ϕout\phi_{out} ,我们可以很容易地实现数据压缩。经过以上设置后,我们这样定义似然函数:
p(y,yP,Q,Θf)=(u,i)yy^ui(u,i)y(1y^ui)p(y,y^{−}|P,Q,Θf)=∏_{(u,i)∈y}\hat{y}_{ui}∏_{(u,i)∈y^−}(1−\hat{y}_{ui})
对似然函数取负对数,我们得到(负对数可以用来表示Loss函数,而且还能消除小数乘法的下溢出问题):
L=(u,i)ylogy^ui(u,i)ylog(1y^ui)L = -\sum_{(u,i)\in y}log\hat{y}_{ui}-\sum_{(u,i)\in y^{-}}log(1-\hat{y}_{ui})
L=(u,i)yyyuilogy^ui+(1yui)log(1y^ui)L = -\sum_{(u,i)\in y \cup y^{-}}y_{ui}log\hat{y}_{ui}+(1-y_{ui})log(1-\hat{y}_{ui})

这是NCF方法需要去最小化的目标函数,并且可以通过使用随机梯度下降(SGD)来进行训练优化。这个函数和二类交叉熵损失函数(binary cross-entropy loss,又被成为log loss)是一样的。通过在NCF上使用这样一个概率处理(probabilistic treatment),我们把隐性反馈的推荐问题当做一个二分类问题来解决。对于消极实例 y− ,我们在每次迭代均匀地从未观察到的相互作用中采样(作为消极实例)并且对照可观察到交互的数量,控制采样比率。

3.3 广义矩阵分解(GMF)

我们现在来证明MF是如何被解释为我们的NCF框架的一个特例。由于MF是推荐领域最流行的模型,并已在众多文献中被广泛的研究,复现它能证明NCF可以模拟大部分的分解模型。由于输入层是用户(项目)ID中的一个one-hot encoding编码,所获得的嵌入向量可以被看作是用户(项目)的潜在向量。我们用 PTvuUP^Tv^U_u 表示用户的潜在向量 pup_uQTviIQ^Tv^I_i 表示项目的潜在向量 qiq_i ,我们定义第一层神经CF层的映射函数为:
ϕ1(pu,qi)=puqi\phi_1(p_u,q_i)=p_u \odot q_i

其中\odot表示向量的逐元素乘积。然后,我们将向量映射到输出层:

y^ui=aout(hT(puqi))\hat{y}_{ui}=a_{out}(h^T(p_u\odot q_i))

其中 aouta_{out}hh 分别表示输出层的**函数和连接权。直观地讲,如果我们将 aouta_{out} 看做一个恒等函数, hh 权重全为1,显然这就是我们的MF模型。在NCF的框架下,MF可以很容易地被泛化和推广。例如,如果我们允许从没有一致性约束(uniform constraint)的数据中学习 hh ,则会形成MF的变体,它允许潜在维度的不同重要性(这句话不好翻译,原文放在这里For example, if we allow h to be learnt from data without the uniform constraint, it will result in a variant of MF that allows varying importance of latent dimensions)。如果我们用一个非线性函数 aouta_{out} ,将进一步推广MF到非线性集合,使得模型比线性MF模型更具有表现力。在NCF下实现一个更一般化的MF,它使用Sigmoid函数 σ(x)=1/(1+ex)σ(x)=1/(1+e^{−x}) 作为**函数,通过log loss学习 h 。称为GMF(Generalized Matrix Factorization,广义矩阵分解)。

3.4 多层感知机(MLP)

由于NCF用两条路线来对用户和项目建模(图2中可以明显看出用户和项目两个输入),自然地,需要通过两个路线,把他们各自的特征连接结合起来。简单地对向量的连接不足以说明用户和项目之间的潜在特征,这对协同过滤建模来说是不够的。为了解决这个问题,我们提出在向量连接上增加隐藏层,使用标准的MLP(多层感知机)学习用户和项目潜在特征之间的相互作用。在这个意义上,我们可以赋予模型高水平的灵活性和非线性建模能力,而不是GMF(广义矩阵分解)那样的简单使用逐元素相乘的内积来描述用户和项目之间的潜在交互特征。更确切地说,我们的NCF框架下的MLP模型定义为:
z1=ϕ1(pu,qi)=[puqi]z1=\phi_1(pu,qi)= \left[ \begin{array}{c} p_u\\ q_i \end{array} \right]

ϕ2(z1)=a2(W2Tz1+b2)\phi_2(z1)=a2(W^T_2z1+b2)
............

ϕL(zL1)=aL(WLTzL1+bL)\phi_L(z_L−1)=a_L(W^T_Lz_L−1+b_L)
y^ui=σ(hTϕL(zL1))\hat{y}_{ui}=\sigma(h^T\phi_L(z_L−1))

这里的 WxW_x, bxb_xaxa_x 分别表示 xx 层的感知机中的的权重矩阵,偏置向量(神经网络的神经元阈值)和**函数。对于MLP层的**函数,可以选择sigmoid,双曲正切(tanh)和ReLU,等等。我们分析一下每个函数:

  • 1)sigmoid函数将每个神经元的输出限制在(0,1),这有可能限制该模型的性能;并且它存在过饱和的问题,当输出接近1或者0的时候,神经元就会陷入停止学习的困境(这里应该指的是“早停的问题”)。
  • 2)虽然双曲正切是一个更好的选择,并已被广泛使用[6,44],但它只是在一定程度上缓和了sigmoid的问题,因为它可以被看作是sigmoid的缩放的版本(tanh(x/2)=2σ(x)1)(tanh(x/2)=2\sigma(x)−1)
  • 3)因此,我们选择ReLU,它更具生物合理性(biologically plausible),并且已经被证明不会导致过饱和;此外,它支持稀疏的**(sparse activations),非常适合稀疏的数据,使模型不至于过拟合。我们的实验结果表明,ReLU的表现略好于双曲正切函数tanh和sigmoid。

至于网络结构的设计,一种常见的解决方案是设计一个塔式模型,其中,底层是最宽的,并且每个相继的层具有更少的神经元数量(如图2。(设计这种结构的)前提是,通过在更高层使用少量的隐藏单元,它们可以从数据中学习到更多的抽象特征。根据经验,我们搭建这样的塔结构:对于更高的层,相比于之前一层,缩减一半规模。

3.5 结合GMF和MLP

论文笔记:Neural Collaborative Filtering(NCF)

GMF,它应用了一个线性内核来模拟潜在的特征交互;MLP,使用非线性内核从数据中学习交互函数。接下来的问题是:我们如何能够在NCF框架下融合GMF和MLP,使他们能够相互强化,以更好地对复杂的用户-项目交互建模?

一个直接的解决方法是让GMF和MLP共享相同的嵌入层(Embedding Layer),然后再结合它们分别对相互作用的函数输出。这种方式和著名的神经网络张量(NTN,Neural Tensor Network)有点相似。具体地说,对于结合GMF和单层MLP的模型可以公式化为:
  y^ui=σ(hTa(puq)+W[puqi]+b)\hat{y}_{ui}=\sigma(h^Ta(p_u\odot q_)+W\left[ \begin{array}{c} p_u\\ q_i \end{array} \right] +b)

然而,共享GMF和MLP的嵌入层可能会限制融合模型的性能。例如,它意味着,GMF和MLP必须使用的大小相同的嵌入;对于数据集,两个模型的最佳嵌入尺寸差异很大,使得这种解决方案可能无法获得最佳的组合。

为了使得融合模型具有更大的灵活性,我们允许GMF和MLP学习独立的嵌入,并结合两种模型通过连接他们最后的隐层输出。图公式如下:

ϕGMF=puGqiG\phi^{GMF}=p^G_u\odot q^G_i
ϕMLP=aL(WLT(aL1(...a2(W2T[puMqiM]+b2)...))+bL)\phi^{MLP}=a_L(W^T_L(a_{L−1}(...a_2(W^T_2\left[ \begin{array}{c} p_u^M\\ q_i^M \end{array} \right]+b2)...))+b_L)
y^ui=σ(hT[ϕGMFϕMLP])\hat{y}_{ui}=\sigma(h^T\left[ \begin{array}{c} \phi^{GMF}\\ \phi^{MLP} \end{array} \right])

这里的 puGp^G_upuMp^M_u 分别表示 GMF 部分和 MLP 部分的用户嵌入(user embedding);同样的,qiGq^G_iqiMq^M_i 分别表示项目的嵌入。如之前所讨论的,我们使用ReLU作为 MLP层的**功能。该模型结合MF的线性度和DNNs的非线性度,用以建模用户-项目之间的潜在结构。我们将这一模式称为“NeuMF”,简称神经矩阵分解(Neural Matrix Factorization)。该模型的每个模型参数都能使用标准反向传播(back-propagation)计算。

3.5.1 预训练

由于NeuMF的目标函数的非凸性,使得基于梯度的优化方法只能找到局部最优解(这也是训练一般神经网络所面临的问题)。研究表明,初始化(initialization)在深度学习模型的收敛性和性能的方面起到了重要的作用。由于 NeuMF 是 GMF 和 MLP 的组合,我们建议使用 GMF 和 MLP 的预训练模型来初始化NeuMF。

我们首先训练随机初始化的 GMF 和 MLP 直到模型收敛。然后,我们用它们的模型参数初始化 NeuMF 相应部分的参数。唯一的调整是在输出层,在那里我们将两者用权重连接起来:
h[αhGMF(1α)hMLP]h←\left[ \begin{array}{c} \alpha h^{GMF}\\ (1-\alpha)h^{MLP} \end{array} \right]

这里 hGMFh^{GMF}hMLPh^{MLP} 分别表示 GMF 和 MLP 模型预训练的 hh 向量; α\alpha 是一个超参数,用来权衡两个预训练模型(的比重)。

对于从头开始训练的 GMF 和 MLP ,我们采用自适应矩估计(Adam,Adaptive Moment Estimation),它通过对不频繁的参数进行频繁和更大幅度的更新来适应每个参数的学习速率。Adam方法在两种模型上的收敛速度都比普通SGD快,并缓解了调整学习率的痛苦。在将预先训练的参数输入NeuMF之后,我们用普通SGD而不是Adam进行优化。 这是因为Adam需要保存更新参数的动量信息(momentum information)。因为我们用预先训练的模型参数初始化NeuMF,并且放弃保存动量信息,不适合用基于动量的方法进一步优化NeuMF。

4.实验

Datasets 。 我们尝试了两个可公开访问的数据集: MovieLens 和 Pinterest 两个数据集,它们的特征总结在表1中。
论文笔记:Neural Collaborative Filtering(NCF)
论文笔记:Neural Collaborative Filtering(NCF)
论文笔记:Neural Collaborative Filtering(NCF)
论文笔记:Neural Collaborative Filtering(NCF)
论文笔记:Neural Collaborative Filtering(NCF)