相信熟悉推荐系统的同学对于协同过滤(Collaborative Filtering)已经熟悉的不能再熟悉了,我也相信很多人心里在想“这么简单的协同,都2020年了,谁还用呀”。
俗话说得好,人不可貌相,海水不可斗量!CF作为最早的推荐算法,基于CF的改进在学术界和工业界应用的十分广泛,就在之前介绍的一篇论文里,介绍了腾讯实时ItemCF的实现和应用,所以说可千万别小瞧协同过滤了。
本篇论文主要介绍新加坡国立大学在17年发表的论文:Neural Collaborative Filtering(神经网络协同过滤),这篇论文主要介绍的点有:
在信息爆炸时代,推荐系统扮演着及其重要的角色,而且在很多在线服务上也应用的十分广泛,比如:电商网站、内容网站、社会媒体网站等。个性化推荐系统的关键是如何基于用户过去一段时间对物品的行为信息进行建模,最著名的属协同过滤(Collaborative Filtering,CF),在各式各样的CF技术中,矩阵分解(Matrix factorzation,MF)是应用的最广泛的。MF将用户和物品映射到同一个潜在的空间中,用一个潜在的向量特征来表示一个用户或者物品,然后将用户与物品的向量内积来表示用户对物品的喜好。
尽管MF对于协同过滤非常有效,但是通过简单的内积计算会影响MF的效果。例如对于显式反馈的评分预测任务,可以通过合并用户和物品的评分偏差来改善MF的内积计算。对于内积计算操作而言,这可能只是一个很小的改动,但它正向的指出了设计一个更好的、专用的交互方式来对用户和物品的行为进行建模。仅仅使用线性相乘的内积计算不足以捕获复杂的用户交互行为。
尽管现在DNN在推荐中应用的比较广泛,但大多数是用户来进行预测建模,在协同过滤方面,仍基于MF来进行计算。本论文主要是利用神经网络来解决MF在协同过滤中的限制,而且论文基于的是用户的隐式反馈数据,与显式反馈相比,隐式反馈可以更加容易的收集用户数据,但也充满了挑战性,因为无法真实的反馈用户满意程度,而且缺乏一些自然的反馈数据。
本篇论文主要探索了如何基于对充满噪声的隐式反馈数据进行建模,主要贡献有以下三点:
用表示用户和物品的数目,用表示用户对物品的隐式反馈,如果用户对物品有行为,则,否则为0。表示用户与物品之间存在交互,但这并不意味着用户喜欢物品,同样也不能表示用户不喜欢物品,可能是用户并没有注意到物品。
使用隐式反馈数据的推荐问题被形式化的用来估计用户对物品的得分,继而使用这些得分进行排序。基于模型的方法则认为数据可以通过一个底层模型来描述,通常这个底层模型被抽象的认为是,表示预测分,表示模型的参数,则表示将模型参数转换为预测分的一个映射。
为了计算模型的参数,现有的一些方法遵循机器学习的规则-优化目标函数。在研究中,主要有两种目标函数:PairWise Loss和PointWise Loss。在PointWise 方式中,通常遵循的是回归框架,即最小化之间的误差。为了处理数据缺失的问题,则将未观察到的条目视为负反馈数据或者将观察到的反馈中负面样例作为负反馈数据。PiarWise 则认为观察到的样例(正样本)应该比未观察到的样例(负样本)得分高。因此代替了pointwise中的最小化方式,pairwise优化的目标是最大化观察到的样例(正样本)和未观察到的样例(负样本)。
而本文提出的NCF框架则利用神经网络求解参数,继而来估计,支持pointwise 和 pairwise。
关于 pointwise、pairwise、listwise可以参考之前发的一篇文章:怎么理解基于机器学习“四大支柱”划分的学习排序方法
MF将每个用户和物品的联系用潜在的向量特征来表示,用和分别表示用户和物品的隐含的向量,MF的计算方式是 的内积,如下所示:
其中表示隐含向量的长度。
如公式所示,假设用户和物品的每个维度的隐含特征都是彼此独立的,并以相同的权重进行线性组合,则MF是对用户和物品的隐含向量进行双向建模。从这个维度理解,MF可以看作是隐含向量的线性模型。
上图展示了MF使用内积进行计算的限制,为了说明示例,有两个限制:
从上图(a)可以看出,,即之间的相似度 > 之间的相似度 > 之间的相似度,可以将他们映射到图(b)所示的空间中,当一个新的用户加入比较时,可以很容易的比较两两用户之间的相似度,,但是如果将在图(b)中展示时,会发现和最接近的顺序为:,和我们计算的结果并不一致。
上图说明了,在低维场景下,使用内积方式的限制。一种解决办法是扩大隐含向量的维度,但是会影响模型的泛化能力,而且也会增大计算量。为了解决这个问题,论文中引入了DNN来解决内积方式的局限性。
一个通用的NCF框架如上图所示,最下面的input为表示的是用户和物品的特征向量(这里是进行了ID的onehot编码),同时这里支持进行自定义继而对用户和物品进行建模,比如:上下文、基于内容、最近邻等。这种通用的内容输入,可以轻易的解决新用户的冷启动问题。
Input Layer输入的是稀疏向量,经过Embedding Layer转转化为稠密向量,之后向量被传入到多层的神经网络,这一整块被称为 Neural CF Layers,最后一层称为 Output Layer,输出层的维度决定了模型的功能,输出的为预测分值,模型训练的目标是最小化之间的误差,基于point wise方式的损失函数进行优化(关于point wise、pair wise、list wise的区别可以参考:怎么理解基于机器学习“四大支柱”划分的学习排序方法)。
定义NCF框架预测模型为:
其中:
函数 被定义为多层神经网络,其表达式为:
其中:
为了计算模型的参数,pointwise中通用的方法是平方损失(Squard loss),对应的表达式如下:
其中:
虽然可以通过假设观测值是从高斯分布中生成的来解释平方损失函数,但对于隐式反馈数据可能无法很好的拟合,因此,论文中提出了一种基于概率的方法来学习 point wise方法的NCF,他能够很好的捕获隐式反馈数据。
对于输出的需要将其限定在[0,1],可以通过概率函数来实现(比如:Logistic 函数 或者 probit 函数)。
定义NCF的似然函数为:
接着取负对数,可以得到最小化NCF的目标函数(参数求解可以通过SGD进行),如下所示:
上述供水和交叉熵损失函数比较相似,也是log loss中的一种,这里通过对NCF进行概率函数映射,可以将隐式反馈转化为二进制分类解决推荐问题。
GMF对应Figure 3 中的左半部分,用表示用户的隐向量,用表示物品的隐向量,可以定义GMF的函数为:
表示内积计算。将结果传到输出层,对应的计算公式为:
其中:
简单的向量内积并不能捕获到用户和物品之间的交互信息,因此本论文通过使用MLP(Multi-Layer Perception)在连接的向量计算过程中增加隐藏层,以捕获用户和物品之间的交互,如Figure 3中的右半部分。
通过这种方式,可以赋予模型较大的灵活度和非线性,在NCF框架下MLP被定义为:
MLP模型的激活函数选用的ReLU(还有sigmoid,tanh可以供选择),原因是:
NeuMF则是GMF和MLP的结合,整体模型的思路如Figure 3所示,整体模型的表达式为:
从图中可以看出,如果共享GMF和MLP的Embedding会限制模型融合的性能,比如必须保证相同长度的隐向量。
因此,GMF和MLP模型分开进行训练,在最后一层时进行连接,整体表达式可以表示为:
MLP层采用的是ReLU激活函数。
由于NeuMF目标函数是非凸的,所以基于梯度的优化方法只能找到局部最优解,而且初始化对于深度学习模型的收敛和性能有着重要的作用,因此这里采用的方法是先对GMF和MLP分开进行参数初始化,接着对两个模型进行训练,基于训练的结果初始化NeuMF的两部分参数。
优化方法采用的Adma。通过对频繁更新的参数进行较小的更新,对于不频繁更新的参数进行较大的更新,来调整参数的学习率。
实验分为三部分进行,分别说明了以下三个问题:
答案肯定都是OK的,否则也不会发表成论文,哈哈 开玩笑!
实验所采用的数据集有两个:
数据集的描述如下:
关于实验的技巧如下:
问题一的实验:
结果如下:
下表则展示了有预训练GMF、MLP和没有预训练的结果对比:
问题二的实验:
基于NCF框架进行的实验中主要是三种算法的对比:GMF 、MLP、NeuMF,在这三种算法中性能对比结果为:NeuMF > MLP > GMF,如Figure 6所示。
在Figure 7 中展示了不同的负采样率和评估指标之间的关系,每个正样本只有一个负样本不足以实现最佳性能,而对更多的负实例进行采样则是有益的。
问题三的实验:
具有不同数量隐藏层的MLP对实验结果的影响如下:
结果表明使用深度模型进行协作推荐的有效性。
至此,论文的内容已经阅读完成,关于文中算法的代码实现可以参考:《Neural Collaborative Filtering》NCF模型的理解以及python代码。
更多论文、报告、资源阅读请戳 “阅读原文”。