Neural Collaborative Filtering(神经协同过滤)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Neural Collaborative Filtering(神经协同过滤)相关的知识,希望对你有一定的参考价值。

参考技术A

论文讨论的主要是隐性反馈协同过滤解决方案,先来明确两个概念:显性反馈和隐性反馈:

显性反馈行为包括用户明确表示对物品喜好的行为
隐性反馈行为指的是那些不能明确反应用户喜好

举例来说:

很多应用场景,并没有显性反馈的存在。因为大部分用户是沉默的用户,并不会明确给系统反馈“我对这个物品的偏好值是多少”。因此,推荐系统可以根据大量的隐性反馈来推断用户的偏好值。

根据已得到的隐性反馈数据,我们将用户-条目交互矩阵Y定义为:

但是,Yui为1仅代表二者有交互记录,并不代表用户u真的喜欢项目i,同理,u和i没有交互记录也不能代表u不喜欢i。这对隐性反馈的学习提出了挑战,因为它提供了关于用户偏好的噪声信号。虽然观察到的条目至少反映了用户对项目的兴趣,但是未查看的条目可能只是丢失数据,并且这其中存在自然稀疏的负反馈。
在隐性反馈上的推荐问题可以表达为估算矩阵 Y中未观察到的条目的分数问题(这个分数被用来评估项目的排名)。形式上它可以被抽象为学习函数:

为了处理缺失数据,有两种常见的做法:要么将所有未观察到的条目视作负反馈,要么从没有观察到条目中抽样作为负反馈实例。

传统的求解方法是矩阵分解(MF,Matrix Factorization),为每个user和item找到一个隐向量,问题变为:

这里的 K表示隐式空间(latent space)的维度。正如我们所看到的,MF模型是用户和项目的潜在因素的双向互动,它假设潜在空间的每一维都是相互独立的并且用相同的权重将它们线性结合。因此,MF可视为隐向量(latent factor)的线性模型。

论文中给出了一个例子来说明这种算法的局限性:

1(a)是user-item交互矩阵,1(b)是用户的隐式空间,论文中强调了两点来理解这张图片:
1)MF将user和item分布到同样的隐式空间中,那么两个用户之间的相似性也可以用二者在隐式空间中的向量夹角来确定。
2)使用Jaccard系数来作为真实的用户相似性。
通过MF计算的相似性与Jaccard系数计算的相似性也可以用来评判MF的性能。我们先来看看Jaccard系数

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

论文先提出了一种通用框架:

针对这个通用框架,论文提出了三种不同的实现,三种实现可以用一张图来说明:

GMF
上图中仅使用GMF layer,就得到了第一种实现方式GMF,GMF被称为广义矩阵分解,输出层的计算公式为:

MLP
上图中仅使用右侧的MLP Layers,就得到了第二种学习方式,通过多层神经网络来学习user和item的隐向量。这样,输出层的计算公式为:

NeuMF
结合GMF和MLP,得到的就是第三种实现方式,上图是该方式的完整实现,输出层的计算公式为:

论文的实验用于回答以下研究问题:

RQ1 我们提出的NCF方法是否胜过 state-of-the-art 的隐性协同过滤方法?

RQ2 我们提出的优化框架(消极样本抽样的log loss)怎样为推荐任务服务?

RQ3 更深的隐藏单元是不是有助于对用户项目交互数据的学习?

接下来,首先介绍实验设置,其次是回答上述三个问题。

数据集使用了两个公开的数据集:MovieLens 和 Pinterest 两个数据集,它们的特征总结在表1中

1.MovieLens :这个电影评级数据集被广泛地用于评估协同过滤算法。论文使用的是包含一百万个评分的版本,每个用户至少有20个评分。 虽然这是显性反馈数据集,但论文有意选择它来挖掘(模型)从显式反馈中学习隐性信号的表现。为此,论文将其转换为隐式数据,其中每个条目被标记为0或1表示用户是否已对该项进行评级。

2.Pinterest :这个隐含的反馈数据的构建用于评估基于内容的图像推荐。原始数据非常大但是很稀疏。 例如,超过20%的用户只有一个pin(pin类似于赞一下),使得难以用来评估协同过滤算法。 因此,论文使用与MovieLens数据集相同的方式过滤数据集:仅保留至少有过20个pin的用户。处理后得到了包含55,187个用户和1,580,809个项目交互的数据的子集。 每个交互都表示用户是否将图像pin在自己的主页上。

评估方案 : 为了评价项目推荐的性能,论文采用了leave-one-out方法(留一法)评估,该方法已被广泛地应用于文献。即:对于每个用户,论文将其最近的一次交互作为测试集(数据集一般都有时间戳),并利用余下的培训作为训练集。由于在评估过程中为每个用户排列所有项目花费的时间太多,所以遵循一般的策略,随机抽取100个不与用户进行交互的项目,将测试项目排列在这100个项目中。排名列表的性能由命中率(HR)和归一化折扣累积增益(NDCG)来衡量。 没有特别说明的话,论文将这两个指标的排名列表截断为10。如此一来,HR直观地衡量测试项目是否存在于前10名列表中,而NDCG通过将较高分数指定为顶级排名来计算命中的位置。论文计算了每个测试用户的这两个指标,并求取了平均分。

−ItemPop 。按项目的互动次数判断它的受欢迎程度,从而对项目进行排名。 这对基于评估推荐性能来说是一种非个性化的方法。
−ItemKNN 。这是基于项目的标准协同过滤方法。
−BPR 。该方法优化了使用公式的MF模型,该模型具有成对排序损失,BPR调整它使其可以从隐式反馈中学习。它是项目推荐基准的有力竞争者。论文使用固定的学习率,改变它并报告了它最佳的性能。
−eALS 。这是项目推荐的 state-of-the-art 的MF方法。

HR(命中率)和 NDCG(归一化折损累计增益),HR直观地衡量测试项目是否存在于前10名列表中,而NDCG通过将较高分数指定为顶级排名来计算命中的位置,重点介绍NDCG

NDCG这个名字可能比较吓人,但背后的思想却很简单.一个推荐系统返回一些item并形成一个列表,我们想要计算这个列表有多好,每一项都有一个相关的评分值,通常这些评分值是一个非负数,这就是gain(增益).此外对于这些没有用户反馈的项我们通常设置起增益为0.

累计增益(CG)

我们将这些增益相加就是Cumulative Gain(累计增益,CG),CG就是将每个推荐结果相关性的分支累加后作为整个推荐列表的得分.

rel i 表示处于位置i的推荐结果的相关性,k表示要考察的推荐列表的大小.

折损累计增益(DCG)

CG的一个缺点是没有考虑每个推荐结果处于不同位置对整个推荐效果的影响,例如我们总是希望相关性高的结果应该排在前面 .显然,如果相关性低的结果排在靠前的位置会严重影响用户的体验,所以在CG的基础上引入位置影响因素,即DCG(Discounted Cumulative Gain),这里指的是对于排名靠后推荐结果的推荐效果进行“打折处理”。假设排序越往后,价值越低。到第i个位置的时候,它的价值是 1/log 2 (i+1),那么第i个结果产生的效益就是 rel i * 1/log 2 (i+1),所以::

从上面的式子可以得到两个结论:
1.推荐结果的相关性越大,DCG越大
2.相关性好的排在推荐列表前面的话,推荐效果越好,DCG越大.

归一化折损累计增益(NDCG)

DCG仍然有不足之处,即 不同的推荐的推荐列表之间,很难进行横向的评估,而我们评估一个推荐系统不可能仅使用一个用户的推荐列表及相应结果进行评估,而是对整个测试机中的用户及其推荐列表结果进行评估 .那么不同的用户的推荐列表的评估分数就需要进行归一化,也即NDCG(Normalized Discounted Cumulative Gain,归一化折损累计增益).
在介绍NDCG之前还需要知道另一个概念,IDCG(Ideal DCG),指推荐系统为某一用户返回的最好推荐结果列表,即假设返回结果按照相关性排序,最相关的结果放在前面,此序列的DCG为IDCG.因此DCG的值介于(0,IDCG],故NDCG的值介于(0,1]。NDCG计算公式:
 

IDCG为理想情况下最大的DCG值。

其中 |REL| 表示,结果按照相关性从大到小的顺序排序,取前p个结果组成的集合。也就是按照最优的方式对结果进行排序。

实际的例子

假设推荐系统返回来的5个结果,其模型评分分别是 1.2、0.7、0.1、0.2、4.0。

我们首先通过公式4.2计算出DCG值为2.39278,按照公式4.4来计算出iDCG的值为3.6309

最后通过公式4.3计算出NDCG为65%

更多的推荐模型评估方法参考: https://statusrank.coding.me/articles/639f7364.html

图4(Figure 4)显示了 HR@10 和 NDCG@10 相对于预测因素数量的性能。
图5(Figure 5)显示了Top-K推荐列表的性能,排名位置K的范围为1到10。
总的来看论文提出的NeuMF模型(结合GMF和MLP)效果不错,对比其他方法都要好。

Figure 6 表示将模型看作一个二分类任务并使用logloss作为损失函数时的训练效果。
Figure7 表示采样率对模型性能的影响(横轴是采样率,即负样本与正样本的比例)。

上面的表格设置了两个变量,分别是Embedding的长度K和神经网络的层数,使用类似网格搜索的方式展示了在两个数据集上的结果。增加Embedding的长度和神经网络的层数是可以提升训练效果的。

Neural Collaborative Filtering阅读笔记

2017-深度协同过滤
代码地址:pytorch版
https://github.com/hexiangnan/neural_collaborative_filtering
作者何向南
使用神经结构替换矩阵分解的内积

摘要

近几年来,深度学习在推荐系统领域应用不多,本文力争使用深度学习解决推荐系统领域的关键问题:隐式反馈的协同过滤
尽管最近也有一些工作将深度学习应用于推荐领域,但都主要集中在对辅助信息建模上,比如物品的文本描述、音乐的声学特征等等。
但对于协同过滤中的关键点,用户和物品的交互建模上仍然是矩阵分解MF,然后使用用户和物品的隐特征做内积。
本文提出了一种通用框架,NCF(Neural network- based Collaborative Filtering),基于神经网络的协同过滤,它把内积部分替换成了可以拟合任意函数的神经网络结构。
NCF是一个通用框架,可以表达并泛化到矩阵分解。为了提高NCF的非线性,本文提出使用MLP学习用户物品交互函数。最后在两个实际数据集上验证了NCF远优于sota方法。经验表明,使用深度神经网络能提供更好的推荐效果。

深度协同过滤

先说明如何使用强调隐式反馈二值性的概率模型学习NCF,再阐明NCF可以表达MF并泛化到MF。为了探索用于协同过滤的DNN结构,本文提出了一个NCF实例,使用MLP学习用户物品交互函数。
最后,本文提出一个在NCF框架下融合MF和MLP的新的深度矩阵分解模型,既有MF的线性优势,又利用MLP的非线性建模用户物品的隐特征。

通用框架

为了实现一个全神经网络的协同过滤,引入多层表示来建模用户物品交互,上一层的输出是下一层的输入。如下图所示,

  • 最底层的输入input layer由两个描述用户和物品的特征向量 v u U v^U_u vuU v i I v_i^I viI组成,它们可以被定制成各种各样的用户物品模型,比如上下文感知,基于内容,基于近邻等等
    鉴于本文集中于纯粹的协同过滤场景,只使用用户身份和物品独热编码的二值稀疏向量作为输入特征。使用通用特征表示作为输入的另一个好处是使我们的方法可以通过引入内容特征表示用户和物品来轻易解决冷启动问题。
  • 输入层之上是embedding layer,这是一个全连接层,将稀疏表示映射为稠密向量。得到的用户/物品embedding可以看做是隐因子模型中的隐向量。用户和物品的embedding随后喂给一个多层神经网络结构,本文称之为深度协同过滤层,将隐向量映射到预测分数。
  • Neural CF layers的每一层都可以定制化为挖掘用户物品交互的某种隐式结构。最后一层隐层X的维度决定了模型的表达能力。
  • 最后是输出层output layer,预测分值 y ^ u i \\hat y_ui y^ui,训练也是通过最小化 y ^ u i \\hat y_ui y^ui和目标值 y u i y_ui yui之间的pointwise loss进行的。
    我们注意到训练本文模型的另外一种方式是pairwise学习,比如使用贝叶斯个性化排序BPR和margin-based loss。由于本文的重点是神经网络建模部分,我们把pairwise learning的扩展部分作为未来工作。
    现在NCF的预测模型可以表达为: y ^ u i = f ( P T V u U , Q T V i I ∣ P , Q , ⊝ f ) \\hat y_ui = f(P^T V_u^U, Q^T V_i^I|P, Q, \\circleddash_f) y^ui=f(PTVuU,QTViIP,Q,f),其中 P ∈ R M X K P\\in R^MXK PRMXK Q ∈ R N X K Q\\in R^NXK QRNXK,分别表示用户和物品的隐因子矩阵, ⊝ f \\circleddash_f f表示交互函数f的模型参数。
    函数f是一个多层神经网络,可以描述为 f ( P T V u U , Q T V i I ) = ϕ o u t ( ϕ X ( . . . ϕ 2 ( ϕ 1 ( P T V u U , Q T V i I ) ) . . . ) ) f(P^TV_u^U, Q^TV_i^I) = \\phi_out(\\phi_X(...\\phi_2(\\phi_1(P^T V_u^U, Q^TV_i^I))...)) f(PTVuU,QTViI)=ϕout(ϕX(...ϕ2(ϕ1(PTVuU,QTViI))...)),其中, ϕ o u t \\phi_out ϕout ϕ x \\phi_x ϕx分别表示输出层和第x层深度协同过滤层,Neural CF共有X层。
学习NCF

现有的pointwise方法大部分都是使用平方损失回归学习模型参数: L s q r = ∑ ( u , i ) ∈ y ⋃ y − w u i ( y u i − y ^ u i ) 2 L_sqr=\\sum_(u, i)\\in y\\bigcup y^- w_ui(y_ui - \\hat y_ui)^2 Lsqr=(u,i)yywui(yuiy^ui)2,其中y表示Y中观测到的行为, y − y^- y表示负样本,可以是所有没观测到的行为也是未观测行为的采样, w u i w_ui wui是一个超参数,表示训练实例(u,i)的权重。然后平方损失的前提是观测数据是服从高斯分布的,本文认为这一点可能并不符合隐式反馈数据,因为隐式反馈的目标值 y u i y_ui yui是二分值0或1,表示u是否和i有交互。接下来,我们会提出一种学习pointwise NCF的概率方法,重点关注隐式反馈的二值属性。
鉴于隐式反馈的一元本质,可以把 y u i y_ui yui的值看做是标签,1表示物品i和用户u相关,0则无关。预测分数 y ^ u i \\hat y_ui y^ui表示物品i和用户u的相关度。为了让NCF有这样的概率解释,需要限制输出 y ^ u i \\hat y_ui y^ui的范围在[0,1]内,这一点使用概率函数(如Logistic函数或Probit函数)作为输出层 ϕ o u t \\phi_out ϕout的激活函数非常容易做到。
由此,得到似然函数: p ( y , y − ∣ P , Q , ⊝ f ) = ∏ ( u , i ) ∈ y y ^ u i ∏ ( u , j ) ∈ y − ( 1 − y ^ u j ) p(y, y^-|P, Q, \\circleddash_f) = \\prod_(u,i)\\in y\\hat y_ui \\prod_(u,j)\\in y^-(1-\\hat y_uj) p(y,yP,Q,f)=(u,i)yy^ui(u,j)y(1y^uj)
取负的对数似然,得到: L = − ∑ ( u , i ) ∈ y l o g y ^ u i − ∑ ( u , j ) ∈ y − l o g ( 1 − y ^ u j ) L=-\\sum_(u,i)\\in ylog \\hat y_ui - \\sum_(u,j)\\in y^-log(1-\\hat y_uj) L=(u,i)ylogy论文笔记之Neural Collaborative Filtering

第九周.01.Neural Graph Collaborative Filtering

推荐算法论文:Neural Collaborative Filtering

Neural Collaborative Filtering(神经协同过滤)

论文笔记-Item2Vec- Neural Item Embedding for Collaborative Filtering

DNN论文分享 - Item2vec: Neural Item Embedding for Collaborative Filtering