推荐算法论文:Neural Collaborative Filtering

吹牛逼

  1. 用户和商品的隐向量依然通过MF(矩阵分解)的方式来获取,深度网络仅仅用来抽取side信息,例如商品的文本,语音?等
  2. 提出了NCF框架,NCF可以衍生出矩阵分解,如果使用神经网络可以进一步增强模型的非线性能力
  3. 提出了一个假设,多层神经网络可以学习user-item的交叉函数

1.介绍

第一段

  1. 推荐系统可以有效缓解信息过载,当前已经被应用在,电商,新闻和社交媒体,核心是可以通过用户历史信息建立协同过滤模型
  2. MF可以将用户和商品映射到统一的隐向量空间,使用隐向量表征用户和商品,这样直接可以使用两个隐向量的点积来计算ctr

第二段

  1. MF已经是一个默认的隐向量抽取方法,当前有许多基于MF的改进模型,例如factorization machines
  2. MF虽然有效,但是因为交叉方式使用了简单的点积,这会影响MF的效能
  3. 巴拉巴拉,不知道在说什么

第三段

  1. 本文探索使用神经网络的方式来探索如何构建交叉特征,之前主要还是使用MF或者人工来构建交叉函数。相当于是目标求$y=f(u,i)$,然后使用神经网络拟合$f$函数。大兄弟,这都17年的文章了,竟然还用这么简单粗暴的方法吗?看看google的两篇深度学习的文章。
  2. 深度学习依然在抽取商品的side信息。简直是睁着眼睛说瞎话!!!!
  3. 当前主流还是使用MF来做协同过滤,通过内积的方式将用户隐向量和商品隐向量结合起来。可以直接使用MF得到商品和用户的隐向量,然后上面再嫁接一个MLP

第四段

  1. 显示反馈(评分,评论)相对来说比较难以收集,所以主要关注隐式反馈(点击,购买,收藏)来间接反馈用户的偏好。
  2. 无法直接观测到用户的满意度,并且缺乏负面反馈。 如果直接评分的话可以直接获取用户对这个商品的满意程度,满意+1,不满意-1。正负样本相对来说比较好构建,但是点击购买不可以表达吗?

吹牛逼

  1. 使用神经网络来对用户和商品的隐向量建模
  2. MF 可以被解释为 NCF 的一种特殊化,并利用多层感知器为 NCF 建模赋予高度非线性。

2.现状

先将问题抽象成隐式反馈的协同过滤模型,然后概括一下MF模型,并且说明一下内积带来的局限性。

隐式数据学习

假设有M个用户,N个商品,构成一个user-item矩阵
y u i = { 1 u和i有交互 0 其他 y_{ui}= \begin{cases} 1& \text{u和i有交互}\\ 0& \text{其他} \end{cases} yui={10ui有交互其他

  1. 这里的 y u i = 1 y_{ui}=1 yui=1只是表明用户和商品有交互,但是并不表示用户喜欢i,同样 y u i = 0 y_{ui}=0 yui=0也并不表明用户不喜欢商品,也可能是因为并没有给用户曝光这个商品。
  2. 由于只提供了用户偏好的部分信息(没有评分,只有是否交互),这使得隐式学习变得困难。
  3. 观测到的商品可以部分表征用户的偏好,但是未观测的商品可能只是因为未曝光,并且缺乏用户的负反馈,比如用户直接给这个商品打-1分。在feed流推荐的时候,用户只能点击,或者滑走,不能直接给出负反馈

第二段

  1. 隐式反馈的推荐问题被描述为估计Y中未观测商品的分数,基于这个分数对商品进行排序。召回的商品基本上都是用户为交互过的,通过预估这些商品的ctr,可以对商品进行排序,如果得到完整的u-i矩阵,那么直接去topk也可以作为召回了
  2. 假设数据都是有某个未知的模型生成的, y u i = f ( u , i ∣ Θ ) y_{ui}=f(u,i|\Theta) yui=f(u,iΘ),其中 y u i y_{ui} yui是用户u对商品i的偏好分, Θ \Theta Θ是模型的参数,需要训练才能得到, f f f是函数,例如可以是LR,也可以是NN,因为是推荐是输入用户和商品两部分特征,所以f也可以认为就是交互函数

第三段

  1. 主流训练参数的方法有两种,pointwise loss 和 pairwise loss
  2. 对于pointwise loss,借鉴显示反馈那套方案,使用回归的方式 m i n ( y u i − y ^ u i ) 2 min(y_{ui}-\hat{y}_{ui})^{2} min(yuiy^ui)2。为了得到负样本,通常对未观测到的样本进行随机采样作为负样本。 y u i y_{ui} yui就是是否交互,如果交互则为1,如果未交互则为0,相当于标签, y ^ u i \hat{y}_{ui} y^ui就是模型预估出来的值。
  3. 对于pairwise loss,认为观测到的item的分数应该比未观测的到item分数高,因此,可以最大化margin,即 m a x ( y ^ u i − y ^ u j ) max(\hat{y}_{ui}-\hat{y}_{uj}) max(y^uiy^uj) y ^ u i \hat{y}_{ui} y^ui y ^ u j \hat{y}_{uj} y^uj都是模型预估出来的值。
  4. NCF因为预估的是 y ^ u i \hat{y}_{ui} y^ui,所以支持两种损失函数训练。当前基于神经网络的方法都可以,垃圾

矩阵分解

假设 p u \boldsymbol{p}_{u} pu q i \boldsymbol{q}_{i} qi分别是用户和商品的隐向量,
y ^ u i = f ( u , i ∣ p u , q i ) \hat{y}_{ui}=f(u,i|\boldsymbol{p}_{u},\boldsymbol{q}_{i}) y^ui=f(u,ipu,qi)
MF使用两个隐向量的点积作为函数
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}_{ui}=f(u,i|\boldsymbol{p}_{u},\boldsymbol{q}_{i})=\boldsymbol{p}_{u}^{T}\boldsymbol{q}_{i}=\sum_{k=1}^{K}p_{uk}q_{ik} y^ui=f(u,ipu,qi)=puTqi=k=1Kpukqik
其中K表示隐向量的维度。

  1. MF对隐向量使用点积作为函数,相当于是线性建模,并且每个维度的系数都是相同,即为1.
  2. MF将用户和商品映射到了相同的隐变量空间,因此用户的相似性也可以使用点积衡量,即使用向量夹角的余弦值。
  3. 举一个例子,如果使用jaccd来表示用户相似度的话, s 23 ( 0.66 ) > s 12 ( 0.5 ) > s 13 ( 0.4 ) s_{23}(0.66) > s_{12}(0.5) > s_{13}(0.4) s23(0.66)>s12(0.5)>s13(0.4),如果我们使用二维向量表示,即隐向量维度k=2,可以画出上面(b)图,继续使用jaccd来计算用户u4与其他三个用户的关系 s 41 ( 0.6 ) > s 43 ( 0.4 ) > s 42 ( 0.2 ) s_{41}(0.6) > s_{43}(0.4) > s_{42}(0.2) s41(0.6)>s43(0.4)>s42(0.2),现在你会发现u4的隐向量不管画在哪里都会导致u4与u2更为接近,约束为u4离u1最近。
  4. 作者说这是因为MF使用了低维隐向量(k=2)的点积来估计user-item矩阵导致的,如果使用高维隐向量空间应该可以解决这个问题。但是可能导致过拟合,所以使用DNN的方式来学习交互函数????尼玛,dnn不是更会过拟合吗,这意思应该是说,如果使用高维的隐向量,点积会照成过拟合,但是使用DNN来代替点积,应该就不会,个人觉得文中应该说错了,这种方式是因为欠拟合了,正如二维线性无法区分或关系一样,所以使用NN来提升非线性,MF分解得到本质还是属性线性空间
    在这里插入图片描述

3.神经网络协同过滤

  1. 使用隐式数据的恶二元属性的概率模型学习NCF
  2. 使用MLP来学习用户-商品交互函数
  3. 提出一种新的神经网络的矩阵分解模型
    在这里插入图片描述

3.1 通用框架

  1. 首先是通过建立一个单独embedding层,将onehot编码映射到一个密集向量,这个embedding可以是通过任何方式得到的,这样embedding可以使用MF分解,或者一些改进模型,例如 context-aware,content-based,neighborbased等等,如果是这样的话,我们甚至不需要去通过MF得到隐向量,直接端到端的就可以trian出一个embedding了,这两个就是用户和商品的embedding。但是这这种embedding可以不再同一个隐向量空间,应该没有可比较的特点

  2. 之后就是通用的NN网络了,这个NN网络其实相当于协同过滤中的点积的操作,但点积是线性相乘的,这里使用NN可以代表一个非线性函数,使用NN来表示user-item交互函数,进而提升模型的拟合能力。
    y ^ u i = f ( P T v u U , Q T v i I ∣ P , Q , Θ f ) \hat{y}_{ui}=f(\boldsymbol{P}^{T}\boldsymbol{v}_{u}^{U},\boldsymbol{Q}^{T}\boldsymbol{v}_{i}^{I}|\boldsymbol{P},\boldsymbol{Q},\Theta_f ) y^ui=f(PTvuU,QTviIP,Q,Θf)

    意思非常直接 P \boldsymbol{P} P就是用户的embedding矩阵, Q \boldsymbol{Q} Q就是商品的embedding矩阵, Θ f \Theta_f Θf是NN网络的参数,表示交互函数 f f f

3.11 训练NCF
  1. 使用pointwise loss进行训练,竟然直接使用均方差损失函数,而不是交叉熵,不知道是为什么
    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 \cup y^{-}}w_{ui}(y_{ui}-\hat{y}_{ui})^2 Lsqr=(u,i)yywui(yuiy^ui)2

    其中y是用户交互过的商品,即正样本, y − y^- y是负样本,通常使用随机负采样的方式获得, w u i w_{ui} wui表示的是用户u在i上的权重,我理解是不是点击次数,或者说如果购买的话加权$w_p$,点击的话加权$w_c$,因为我们训练的是一个二值矩阵,用户交互或者未交互,没有融入更多的其他特征

  2. 平方损失函数的假设是数据服从高斯分布,但实际情况并不是这样的,数据明明服从的是二项分布,不是0就是1。显式观测的数据,因为有用户的评分,例如1分,2分,k分等等,所以直接使用的回归的方式来求解,因此使用均方差损失函数,但是隐式反馈的数据,用户没有评分,只有0或者1

  3. 所以使用交叉熵损失函数,呵呵,把人都当成傻子吗,真是脱裤子放屁
    L = − ∑ ( u , i ) ∈ y l o g y ^ u i − ∑ ( u , i ) ∈ y − l o g ( 1 − y ^ u i ) = − ∑ ( u , i ) ∈ y ∪ y − y u i l o g y ^ u i + ( 1 − y u i ) l o g ( 1 − y ^ u i ) \begin{aligned} L&=-\sum_{(u,i)\in y}log\hat{y}_{ui}-\sum_{(u,i)\in y^-}log(1-\hat{y}_{ui})\\ &= -\sum_{(u,i)\in y\cup y^-}y_{ui}log\hat{y}_{ui}+(1-y_{ui})log(1-\hat{y}_{ui}) \end{aligned} L=(u,i)ylogy^ui(u,i)ylog(1y^ui)=(u,i)yyyuilogy^ui+(1yui)log(1y^ui)

3.2 通用矩阵分解模型(GMF)

我觉得是在瞎扯淡

  1. user通过onehot编码可以得到一个稀疏向量 v u U \boldsymbol{v}_{u}^{U} vuU,通过 P T v u U \boldsymbol{P}^{T}\boldsymbol{v}_{u}^{U} PTvuU可以得到用户的隐向量 p u \boldsymbol{p}_{u} pu,在编码的过程中,这其实就是一个embedding的查询操作。同样可以得到商品的隐向量 q i \boldsymbol{q_{i}} qi,然后使用按位想乘的方式得到一个新的向量
    ϕ 1 ( p u , q i ) = p u ⊙ q i \phi_{1}(\boldsymbol{p}_{u} , \boldsymbol{q_{i}})=\boldsymbol{p}_{u} \odot \boldsymbol{q_{i}} ϕ1(pu,qi)=puqi
    其中 ⊙ \odot 表示的是向量按位相乘。
    y ^ u i = a o u t ( h T ( p u ⊙ q i ) ) \hat{y}_{ui}=a_{out}(\boldsymbol{h}^{T}(\boldsymbol{p}_{u} \odot \boldsymbol{q_{i}})) y^ui=aout(hT(puqi))
    这里有点意思的, p u ⊙ q i \boldsymbol{p}_{u} \odot \boldsymbol{q_{i}} puqi现在是用户向量和商品向量的按位乘积,是一个向量。 p u ⊙ q i = [ p 1 q 1 ,   p 2 q 2 ,   . . . ,   p k q k ] \boldsymbol{p}_{u} \odot \boldsymbol{q_{i}}=[p_1q_1,\ p_2q_2,\ ...,\ p_kq_k] puqi=[p1q1, p2q2, ..., pkqk]
    如果我们对这个向量求和的话,那就相当于是点积,所以当 h ^ \hat{h} h^是一个全为1的向量是 h ^ = [ 1 , 1 , 1...1 ] \hat{h}=[1,1,1...1] h^=[1,1,1...1]
    h T ( p u ⊙ q i ) = s u m ( [ 1 ∗ p 1 q 1 , 1 ∗ p 2 q 2 , . . . , 1 ∗ p k q k ] ) = p u q i \boldsymbol{h}^{T}(\boldsymbol{p}_{u} \odot \boldsymbol{q_{i}})=sum([1*p_1q_1,1*p_2q_2,...,1*p_kq_k])=\boldsymbol{p}_u\boldsymbol{q}_i hT(puqi)=sum([1p1q1,1p2q2,...,1pkqk])=puqi
    用户隐向量和商品隐向量点积,这变成了最基本的MF分解了。

3.3 MLP

  1. GMF是将用户隐向量和商品隐向量按位相乘的方式得到一个新的向量,然后将这个向量输入到神经网络中,如果使用MLP的话,则可以直接将两个向量拼接在一起,然后输入到网络中
    z = ϕ 1 ( p u , q i ) = [ p u q i ] \boldsymbol{z}=\phi_{1}(\boldsymbol{p}_{u}, \boldsymbol{q_{i}})=\begin{bmatrix} \boldsymbol{p}_{u} \\ \boldsymbol{q}_{i} \end{bmatrix} z=ϕ1(pu,qi)=[puqi]
  2. 激活函数优先选择ReLU,ReLU可以是模型变得更加稀疏,防止过拟合,网络越往上,神经节点越少,可以学习数据更多的抽象特征。

3.4 联合GMF和MLP

老实讲,看到这个模型感觉跟deepFM实在是太像了,有了GMF和MLP,一个简单直接的想法就是如何进行联合训练,
在这里插入图片描述

  1. 共享embedding层,然后GMF和MLP的最后一层直接拼接在一起,在上层再共享一个网络,这跟神经张量网络类似(NTN)
    h G M F = p u ⊙ q i h M L P = W [ p u q i ] \bold{h}^{GMF}=\boldsymbol{p}_{u} \odot \boldsymbol{q_{i}}\\ \bold{h}^{MLP}=\bold{W}\begin{bmatrix} \boldsymbol{p}_{u} \\ \boldsymbol{q}_{i} \end{bmatrix} \\ hGMF=puqihMLP=W[puqi]
  2. 共享embedding不够灵活,而且由于共享了embedding,导致GMF和MLP必须使用相同的隐向量,对于两个模型最佳嵌入大小变化很大的数据集,这种方法会限制融合模型的性能。
  3. 首先分别训练一个GMF和MLP模型,然后得到各自的用户矩阵和商品矩阵,之后使用这个矩阵作为初始化。
  4. 两个模型都会得到一个输出向量 h G M F \bold{h}^{GMF} hGMF h M L P \bold{h}^{MLP} hMLP,这两个向量直接concat在一起的,并且对每个进行加权, α \alpha α是一个超参数
    h = [ α h G M F ( 1 − α ) h M L P ] h=\begin{bmatrix}\alpha\bold{h}^{GMF} \\ (1-\alpha)\bold{h}^{MLP} \end{bmatrix} h=[αhGMF(1α)hMLP]
  5. 先使用Adam分别训练GMF和MLP,得到预训练参数之后,使用SGD统一训练NCF。Adam训练的时候会使用动量参数

4.实验

  1. 评估指标使用HR(Hit Ratio)和NDCG(Normalized Discounted Cumulative Gain)
  2. NCF主要讨论的是U2I模型,所以没有跟I2I模型进行比较
  3. α = 0.5 \alpha=0.5 α=0.5,GMF和MLP的重要性一致

4.1 Log Loss with Negative Sampling

  1. pointwise loss相对于pairwise loss的一个优势是可以调控负样本的比例,pointwise的损失函数为logloss,pairwise的损失函数为BPR。使用BPR的时候一个正样本只能对应一个负样本,但是使用pointwise的时候,可以随机采样负样本。从实验中可以发现,增加负样本的比例可以一定程度上提升模型性能。
    在这里插入图片描述2. 正负样本比例尽量控制在3到6之间,超过7对模型性能会有影响
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值