Neural Collaborative Filtering paper

关于协同过滤

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

y ^ u i = f ( u , i ∣ p u , q i ) = p u T q i = ∑ k = 1 K p u k q i k \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} y^ui=f(u,ipu,qi)=puTqi=k=1Kpukqik
其中K是用户/物品向量的维度,即每个维度乘积后的等权线性组合。该种判定方法存在很大的局限性。

如上图所示,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交互矩阵 Y ∈ R M × N \mathbf{Y} \in \mathbb{R}^{M \times N} YRM×N

y u i = { 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. yui={1,0,if interaction(useru,itemi)is observedotherwise
为1表示有交互,为0表示其他。

如图所示NCF的通用框架其实就是embedding后的user和item向量进入DNN模型中得到结果。
NCF的预测模型表达式可以写成:
y ^ u i = f ( P T v u U , Q T v i I ∣ P , 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) y^ui=f(PTvuU,QTviIP,Q,Θf)
其中:

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

所以上式又能写成:
f ( P T v u U , Q T v i I ) = ϕ out ( ϕ X ( … ϕ 2 ( ϕ 1 ( P T v u U , Q T v i I ) ) … ) ) 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) f(PTvuU,QTviI)=ϕout(ϕX(ϕ2(ϕ1(PTvuU,QTviI))))

其中:

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

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

NCF学习

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

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

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

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

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

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

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

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

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

  • W x , b x , a x W_x,b_x,a_x Wx,bx,ax分别为第DNN第 x x x层的权重、偏置项和激活函数
  • 在第一层中,将user向量和item向量进行了拼接
GMF与MLP的融合

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


但是在真实场景中,GMF部分与MLP部分Embedding向量的维度可能不同,所以需要进行预训练,这里分别对两个部分进行Embedding,输入到对应的部分,并将这两部分最终的输出进行连接,公式如下:

ϕ G M F = p u G ⊙ q i G ϕ M L P = a L ( W L T ( a L − 1 ( … a 2 ( W 2 T [ p u M q i M ] + b 2 ) … ) ) + b L ) y ^ u i = σ ( h T [ ϕ G M F ϕ M L P ] ) \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} ϕGMFϕMLPy^ui=puGqiG=aL(WLT(aL1(a2(W2T[puMqiM]+b2)))+bL)=σ(hT[ϕGMFϕMLP])
其中p和q的上标表示他们属于GFM还是MLP的embedding向量。

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

NCF(Neural Collaborative Filtering)——协同过滤与神经网络的结合相关推荐

  1. Collaborative Filtering 协同过滤小结 part-1:CF背景

    最近看了些关于CF的论文,稍微总结整理下. 背景 购物平台上,用户会对商品有评级等信息,如何为用户推荐潜在感兴趣的商品,提供用户体验,增加用户黏度,是推荐系统的目标. what is CF 假设 1: ...

  2. 经典论文阅读(一)--NCF: Neural Collaborative Filtering

    NCF是神经网络版本的协同过滤,推荐算法的经典的方法之一.本文回顾一下NCF论文的要点. 摘要(What) NCF是一种通用的框架,它可以表达和推广矩阵分解. 为了提升NFC的非线性建模能力,我们提出 ...

  3. Spark 2.2.0 文档中文版 Collaborative Filtering 协同过滤 JAVA推荐系统

    协同过滤常用于推荐系统,这项技术旨在填补 丢失的user-item关联矩阵 的条目,spark.ml目前支持基于模型的协同过滤(用一些丢失条目的潜在因素在描述用户和产品).spark.ml使用ALS( ...

  4. 神经协同过滤Neural Collaborative Filtering(NCF)

    Neural Collaborative Filtering 简述 矩阵分解(MF) NCF 1.GMF 广义矩阵分解 2.MLP(多层感知机) 3.NeuMF 实验 简述 这篇论文是何向南博士所写 ...

  5. 【科研导向】Outer Product-based Neural Collaborative Filtering (ConvNCF)基于外积的神经协同过滤<论文理解代码分析>

    Outer Product-based Neural Collaborative Filtering--IJCAI'18 文章简介 一.摘要解析 二.技术要点 三.实验部分 代码解析 一.模型构建 二 ...

  6. 【科研导向】Neural Collaborative Filtering 神经协同过滤 <论文理解代码分析>

    Neural Collaborative Filtering--WWW'17 文章简介 一.摘要解析 二.技术要点 三.实验部分 代码解析 一.模型构建 二.难点问题 未来展望 文章简介 该文由何向南 ...

  7. FedNCF:Federated Neural Collaborative Filtering | 联邦神经协同过滤

    论文信息 标题:FedNCF: Federated Neural Collaborative Filtering 作者:Vasileios Perifanis ∗ ^* ∗, Pavlos S. Ef ...

  8. 论文笔记:Neural Collaborative Filtering(NCF)

    前言 论文链接:https://arxiv.org/abs/1708.05031 github:https://github.com/yihong-chen/neural-collaborative- ...

  9. 推荐系统- NCF(Neural Collaborative Filtering)的推荐模型与python实现

    引言: 本文主要表述隐式反馈的基础上解决推荐算法中的关键问题协同过滤. 尽管最近的一些工作已经将深度学习用于推荐系统中,但他们主要将其用于辅助信息建模,例如物品的文字描述和音乐的声学特征. 当涉及到协 ...

最新文章

  1. OpenAI教GPT-3学会上网,「全知全能」的AI模型上线了
  2. ListView position
  3. C++ Primer 5th笔记(chap 18 大型程序工具)异常处理
  4. 从fread和mmap 谈读文件的性能
  5. MongoDB入门(一)——数据库概述
  6. conda clean -i
  7. edius裁剪快捷键_edius常用的快捷键有哪些-怎么设置快捷键-edius快捷键使用大全...
  8. MemoryBarrier方法
  9. python语言count什么意思_python中count函数是什么意思?
  10. HITWH-PYTHON学习笔记(2)-20170706
  11. Linux 多点电容触摸屏
  12. 【plang 1.4.6】Plang高级编程语言(发布)
  13. 幽夜至,辞夏迎秋月抒怀
  14. 微博插件-微博图片全显示(页面样式本人优化版)
  15. MAP(maximum a posteriori)
  16. 新版H5神偷农场游戏系统
  17. JAVA——JSch
  18. 【NI Multisim 14.0原理图设计基础——元器件分类】
  19. Win10 连接不上局域网共享文件解决方案
  20. ffmpeg screen-capture-recorder快速安装

热门文章

  1. 基础集合论 第一章 集合与集合的运算
  2. 仿生蠕虫机器人制作步骤_SAW 仿生机器人:跟蠕虫一样的运动方式,单靠一个马达就能完成!...
  3. 万姓女孩清秀文雅的名字
  4. 通熟易懂的设计模式(一)
  5. python开发his系统_医院HIS系统调用钉钉开放平台的简单实例
  6. YK线上机器redis配置(没有主从,单点,一致性哈希)
  7. Google论文之一----Bigtable学习翻译
  8. 基于51单片机的语音控制GSM短信报警密码锁proteus仿真原理图PCB
  9. ArcGIS Runtime SDK for Android100.9语音路径导航
  10. 计算机操作的提升,提升电脑操作的利器 鼠标快捷键解析