神经协同过滤NCF(一)之模型介绍篇
简介
本文是对Neural Collaborative Filtering这篇论文的一个简单概括,着重介绍一下文中提出的基于神经网络的协同过滤框架NCF,以及基于此框架的三种模型GMF、MLP、NeuMF的原理。
原文地址: https://arxiv.org/pdf/1708.05031.pdf
背景知识
由于Netflix Prize的普及,MF(Matrix Factorization)已经成为了潜在因子(latent factor)建模的默认方法。已经有大量的工作致力于增强MF的性能,例如将其与基于领域(相邻user或者item)的模型集成,与基于item内容的主题模型相结合,还有将其扩展到因式分解机(factorization machines),以实现特征的通用建模。尽管MF方法对于协同过滤有效,但是众所周知的是它的性能会被简单选择的交互函数(内积操作)阻碍。而且内积操作只是将潜在特征进行简单的线性组合,它不足以捕获用户交互数据中的复杂结构。
为此,作者提出了一种神经网络结构去对user和item之间的潜在特征进行建模,并设计了基于神经网络的协同过滤方法的通用框架NCF。
1. 准备工作
首先要明确什么是显性反馈和隐性反馈数据。
-
显性反馈
明确反映用户对物品喜好的行为,比如对物品进行点赞、评分、评论等。 -
显性反馈
不能明确反映用户喜好的行为,比如用户观看和浏览的历史记录。
1.1 从隐反馈数据中学习
令和分别代表user和item的数量。我们可以从用户的隐反馈数据中定义用户物品交互矩阵如下:
这里的代表用户对物品是否有过交互。
如果用户和物品发生过交互,则,但是这并不代表用户喜欢物品。同理也并不代表用户不喜欢物品,也许是因为该用户根本就没发现此物品,所以也谈不上喜不喜欢。
这对隐性反馈的学习提出了挑战,因为它提供了关于用户偏好的噪声信号。虽然观察到的条目至少反映了用户对物品的兴趣,但是未观察到的的条目可能只是丢失数据,并且这其中天然就缺乏负反馈数据。因为它只是记录了用户与某些物品之间的正反馈,而未记录用户与物品之间的负反馈。
1.2 矩阵分解(Matrix Factorization)
MF(Matrix Factorization)使用一个潜在特征向量将每个用户和物品之间联系起来。我们令和分别代表用户和物品的潜在特征向量。MF算法使用和的内积来估计:
其中代表隐式空间(latent space)的维度。可以看到,MF是对用户和物品之间的双向交互进行建模,它假设潜在特征空间中的每一维都是彼此独立的,并且使用相同的权重将他们线性组合起来。正因如此,MF可以看做是潜在因素(latent factor)的线性模型。
论文中举了一个例子来说明内积操作会束缚MF的表达效果,如下图。关于MF的原理和代码实现可以参见LFM(Latent factor model)隐语义模型算法原理以及代码实践。
上图中(a)代表的是user-item矩阵,(b)代表的是用户相似度在隐式空间中的分布。
论文使用Jaccard系数来计算两个用户之间的相似度,令代表用户和之间的相似度,可由下式计算:
其中代表的是与用户有过交互的物品的数量。
先关注(a)中的前三行,很容易计算出,即和之间的相似度要大于和,和的相似度大于和。则、、的潜在特征向量、、在隐式空间中的几何关系可以被描述成(b)所示。如果此时增加了一个,我们可以计算得出,这意味着与是最相似的,接着是,然后是。然而在隐式空间中,如果与接近的话(图中给出了两个可能的位置,虚线所示),那就意味着更接近与而不是。然后根据图(a)可知,明显与更为相似,故这将会导致很大的排名误差(ranking loss)。
这个例子显示了由于使用简单且固定的内积操作,来在低维隐式空间中估计用户-物品之间复杂交互,而造成的可能的局限性。解决该问题的一个方法是使用很大的潜在因子,即增大隐式空间的维度,然而这样的解决方法可能会对模型的泛化能力产生不利的影响,比如造成过拟合等。
2. 神经协同过滤(NCF)
2.1 通用框架
论文提出了一个通用的NCF框架,阐述了如何使用一个强调隐反馈数据二值性的概率模型来学习NCF模型参数,并且展示了MF可以是NCF的一个特例。NCF框架图如下: NCF框架图最下面是输入层,分别包含了两个特征向量和,它们分别用来描述用户和物品。输入仅由一个用户向量和一个物品向量构成,它们分别是以one-hot编码的二值化稀疏向量。
输入层上面的是Embedding层,它是一个全连接层,用于将输入层的稀疏表示映射成一个稠密向量。它所获得的用户(物品)稠密向量可以看做就是MF算法中用来描述用户(物品)的潜在特征向量。接着用户和物品的embedding向量被送入多层神经网络架结构中,这一层叫做神经协同过滤层(Neural CF Layer),它用于将潜在特征向量映射成预测分数(Score)。神经协同过滤层中的每一层可以被认为是用来发掘用户-物品交互中的某些隐含结构。神经协同过滤层的输出层(Layer X)的维度决定了模型的能力。最终的输出是预测分数,我们可以通过最小化和目标值之间的均方误差来训练模型。
NCF预测模型如下:
其中,,它们分别代表用户和物品的潜在因子矩阵。代表的是交互函数的参数。在上图中被定义为多层神经网络,故它可有如下表示:
其中和分别代表是输入用户向量和输入物品向量经过Embedding层之后得到的关于用户和物品的潜在特征向量。代表的是神经协同过滤层中的第层的映射函数,代表的是输出层的映射函数,一共有个神经协同过滤层。
2.2 损失函数
为了学习模型参数,现存的逐点学习方法主要是运用均方差误差进行回归:
其中代表交互矩阵中观察到的条目,即用户对物品有评分的,代表负样本,它们可以是交互矩阵中没有出现的全部条目,也可以是从这些条目中采样得到的。是一个超参数,用来代表训练实例的权重。
尽管均方差误差可以通过假设观测值服从高斯分布来做出解释,但是它仍然不适合处理隐反馈数据。因为,对于隐反馈数据来说,目标值是二进制0或者1,代表是否与有交互。因此,针对隐反馈数据的二值性这一属性,论文提出了从概率的角度来学习NCF。
我们可以把当做一个标签,1代表物品与用户有关,0代表无关。预测目标可以认为是代表这物品有多大可能性与用户有关。为了赋予NCF这样一个概率解释,我们需要限制的输出在[0,1]之间,为了达到这个目的,我们可以使用sigmoid函数作为输出层的激活函数。
有了以上设定,我们可以定义似然函数如下:
对似然函数取负对数得到:
这就是NCF模型需要最小化的目标函数,可以使用SGD算法来进行训练优化。通过在NCF上进行概率处理,我们把隐反馈数据的推荐问题转变成了一个二值分类问题。
2.3 广义矩阵分解(GMF)
我们令用户代表,即用户的潜在特征向量;令代表,即物品的潜在特征向量。我们可以定义神经协同过滤层第一层的映射函数为:
其中⊙代表的是向量的逐元素相乘。然后将此向量映射到输出层:
其中代表的是激活函数,代表的是输出层的权重。如果我们把看成是恒等函数,令是全为1的单位向量,那么这就变成了MF模型。
GMF模型的结构框图如下: GMF模型
2.4 多层感知器(MLP)
NCF框架用两条路线来对用户和物品进行建模,因而很自然地想到要将他们聚合起来,这种技术在多模态深度学习中被广泛采用。简单的结合是不足以说明用户和物品之间的潜在特征。为了解决这个问题,我们需要向量连接的基础上增加隐藏层,可以使用标准的MLP来学习用户和物品潜在特征之间的相互作用。在这个场景下,我们赋予了模型更高水平的灵活性和非线性。NCF框架下的MLP模型可以被精确定义为:
其中,和代表第层感知器的权重矩阵,偏置矩阵以及激活函数。对于感知器层的激活函数,我们可以在Sigmoid、tanh以及ReLu中选择,实验证明,ReLU激活函数是一个较好的选择,因为它更具有生物合理性,并且被证明不会导致过饱和。
MLP模型的结构框图如下: MLP模型结构
2.5 NeuMF
到目前为止,我们开发出了NCF的两个实例。GMF应用了线性内核来模拟潜在的特征交互;MLP使用了非线性内核从数据中学习潜在特征,那么自然而然地想到,我们可以将这两个模型融合在NCF框架下。
为了使得融合模型具有更大的灵活性,我们允许GMF和MLP学习独立的Embedding,并结合两种模型的最后的输出。NeuMF的结构图如下:
关于上图的精确定义如下:
其中和分别代表GMF和MLP模型的用户embeding向量;同理,和分别代表GMF和MLP模型的物品embeding向量。正如上面讨论的,这个模型结合了GMF的线性度和MLP的非线性度来对用户-物品之间的潜在结构进行建模。
由于NeuMF目标函数的非凸性,使得基于梯度的优化方法只能找到局部最优解。论文建议使用GMF和MLP的预训练模型来初始化NeuMF。首先训练随机初始化的 GMF 和 MLP 直到模型收敛。然后,我们用它们的模型参数初始化 NeuMF 相应部分的参数。唯一的调整是在输出层,在那里我们将两者用权重连接起来:
这里的和分别代表GMF和MLP模型预训练的向量,是一个超参数,用来权衡两个预训练模型的权重。
3. 评测指标
为了评价项目推荐的性能,论文采用了leave-one-out方法评估,即:对于每个用户,将其最近的一次交互作为测试集(数据集一般都有时间戳),并利用余下的交互作为训练集。由于在评估过程中为每个用户排列所有item花费的时间太多,所以遵循一般的策略,随机抽取100个不与用户进行交互的item,将测试item排列在这100个item中。
排名列表的性能由命中率(HR)和归一化折扣累积增益(NDCG)来衡量。同时,论文将这两个指标的排名列表截断为10。如此一来,HR直观地衡量测试项目是否存在于前10名列表中,而NDCG通过将较高分数指定为顶级排名来计算命中的位置。
4. 代码实战(基于PyTorch)
见下一章。