推荐系统笔记——FM 模型
楼主小白一枚还在学习,下面仅是学习笔记,并非教程,文章中如果有问题烦请指正,欢迎一起交流学习。
线性模型及其改进
传统的推荐系统中,比较常用的模型是 LR 模型。LR 模型本质上来说是线性模型,线性模型可以表示为下面的形式:
y^=w0+i=1∑nwixi
线性模型的优点是速度性,并且可解释性强。缺点是表达能力弱。
为了提高普通线性模型的表达能力,可以在线性模型中加入交互项:
y^=w0+i=1∑nwixi+i=1∑nj=i+1∑nwi,jxixj(1)
注意,这里的交互项不包含 xi2 这样的项。
上面的模型,实际上等价于 SVM 在 kernel 为多项式核的情况,因此上面的模型也在原论文中被称为 SVM 模型。也有人称这个模型为 LR 模型。
此模型的矩阵形式为
y^=w0+xTw+xTWx
由于不包含 xi2 ,因此 W 的对角线为0,并且是对称矩阵(至于为什么对称,这应该是线性代数的知识吧?)。
SVM模型的缺点
加入交互项之后,虽然模型的表达能力增强,但是有下面的两个问题:
- 计算复杂度比较高。一共有 n(n-1) / 2 个参数
- 在数据很稀疏的条件下表现并不好。考虑是对类别变量进行 one-hot encoding 的情况,如果有两个类别在样本中没有同时出现过,那么 xixj 在样本中总是为 0,因此 ∂wi,j∂y^≡0,wi,j 完全无法更新。
FM 模型
由于上述的两个问题的存在,因此进行下面的改进,
假设第 i 个特征可以表示为一个 k 维的向量 vi∈Rk 。 k 是隐向量的长度,是一个需要提前给定的超参数。
而 wi,j 是度量第 i 个特征和第 j 个特征的交互作用的参数。 令 wi,j=⟨vi,vj⟩,因此 (1) 式就变成了
y^=w0+i=1∑nwixi+i=1∑nj=i+1∑n⟨vi,vj⟩xixj(2)
此时模型的参数为
- 常数项 w0
- 线性部分的参数,合写成一个向量 w1,…,wn
- 交互项部分的参数 v1,…,vn ,将其按行排列得到一个矩阵 V=⎝⎜⎛v1T⋮vnT⎠⎟⎞∈Rn×k
这个 V 模型看起来貌似比较突兀,其实如果从矩阵的角度来看会比较简单。SVM 模型的问题是 W 的维度过大,是 O(n2) 量级的,并且在许多情况下是稀疏的。因此我们可以假设,W 虽然是高维系数的,但是它可能是由某些低维、稠密的矩阵得到的。我们通常认为
W=VVT
其中 V∈Rn×k 。
vi 的解释
上文中有提到,vi 是特征 i 的一个 k 维表示。FM 是 10 年左右的模型,而那个时候 embedding 还没有 embedding 的概念。所以,从现在的角度来看, vi 实际上是第 i 个特征的一个 k 维的 embedding。
假如有一列变量是 user_id,有 5 个取值,那么在 one-hot encoding 之后就有 5 个特征。每个特征都对应一个隐向量 vi,这个隐向量实际上就是用户在 k 维空间的一个 embedding。
复杂度优化
(2) 式的计算复杂度为 O(kn2) ,主要时间开销在最后一项 ∑i=1n∑j=i+1n⟨vi,vj⟩xixj ,其中计算 ⟨vi,vj⟩xixj 的时间复杂度为 O(k) ,有两个求和号 ∑i=1n∑j=i+1n ,因此最后一项总的计算时间复杂度为 O(kn2)
通过数学变换,可以将时间复杂度降低到 O(kn) ,变换如下
i=1∑nj=i+1∑n⟨vi,vj⟩xixj.=21(i=1∑nj=1∑n⟨vi,vj⟩xixj−i=1∑n⟨vi,vi⟩xi2)=21⎝⎛i=1∑nj=1∑nf=1∑kvi,fvj,fxixj−i=1∑nf=1∑kvi,f2xi2⎠⎞=21f=1∑k(i=1∑nj=1∑nvi,fvj,fxixj−i=1∑nvi,f2xi2)=21f=1∑k⎝⎛(i=1∑nvi,fxi)2−i=1∑nvi,f2xi2⎠⎞
可以看到,变换后的式子的时间复杂度为 O(kn) ,其中计算 (∑i=1nvi,fxi)2−∑i=1nvi,f2xi2 的时间复杂度为 O(n) ,由于最外层的求和号 ∑f=1k ,因此时间复杂度为 O(kn)
求导
根据 chain rule,∂θ∂l(y,y^)=∂y^∂l(y,y^)∂θ∂y^ ,其中 ∂y^∂l(y,y^) 这个取决于具体 Loss 的形式。
而 ∂θ∂y^ 的计算如下:
∂θ∂y^=⎩⎨⎧1,xi,xi∑j=1nvj,fxj−vi,fxi2, if θ is w0 if θ is wi if θ is vi,f
其中 ∑j=1nvj,fxj 可以在计算 y^ 时计算好。因此,w0,w1,…,wn,vi,j 均可在 O(1) 时间复杂度内计算出来。因此使用一个样本去计算梯度的时间复杂度为 O(kn) (因为主要的时间是还是更新 vi,j 因此只计算 vi,j 的时间。有 kn 个 vi,j 因此时间复杂度为 O(kn) )
FM 和 MF 的比较
先给出结论: MF 模型是一种特殊的 FM 模型。
MF 模型
将 FM 模型的常数项和线性项去掉,并取 loss 为 MSE,使用 L2 正则项,并对 user_id 和 item_id 进行 one-hot encoding 作为特征。
MF (matrix factorization) 模型的公式为:
r^ij=uiTvj
其中 rij 是用户 i 对 物品 j 的打分,r^ij 是对 rij 的预测。 ui 是用户 i 的隐向量, vj 是物品 j 的隐向量
MF 常用的 Loss 是如下的 Loss
L=(i,j)∈S∑(rij−r^ij)2+λ(∥ui∥2+∥vj∥2)
FM 推出 MF
而 FM 模型的公式为
y^=w0+i=1∑nwixi+i=1∑nj=i+1∑n⟨vi,vj⟩xixj
其中 n 是总的特征数。 xi 是特征的第 i 个维度。
下面假设我们只有 (user_id, item_id, rating) 这样的三元组,假设用户数为 nu ,物品数为 nv
我们对 user_id 和 item_id 进行 one-hot encoding,
将 user_id encoding 的特征记为 xu∈Rnu ,则用户 i 对应的 xu 满足 xtu={1t=i0t=i
即除了第 i 维为1之外其它维度均为 0。
同样的,将 item_id encoding 得到的特征记为 xv∈Rnv ,则物品 j 对应的 xv 满足 xtv={1t=j0t=j
我们将 xv 和 xu 拼接起来作为特征 x ,即 x=[xu,xv] ,对应于上面的 FM 的公式中的 x。而这里的 x 的维度是 nu+nv 即就于上面的 n 即 n=nu+nv
因此,每个 (i,j,ri,j) 这样的三元组可以对应一个样本点 (x,y) ,其中 x=[xu,xv]∈Rnu+nv,y=ri,j
将 FM 公式中的常数项和线性项去掉,并将 (x,y) 带入,有
y^=t=1∑nu+nvs=t+1∑nu+nv⟨vt,vs⟩xt,xs
由于 (x,y) 表示的是 用户 i 对物品 j 的点击。因此 xu 中只有 xiu=1 , xv 中只有 xjv=1 ,因此,求和号中除了 t=i,v=nu+j 外,其它都为0,即
y^=⟨vi,vnu+j⟩
令 vi=ui,vnu+j=vj,y^=r^ij ,则可以得到
r^ij=⟨ui,vj⟩=uiTvj
上式即是 MF 模型。
上面的叙述比较麻烦,具体可以看下图,图片可以在 References 中找到

FM 的优点
- 可以在线性时间 O(kn) 内完成计算,计算效率高。
- 即使原始数据中不存在的特征组合 ,也可以学习到权重 wi,j=⟨vi,vj⟩,因此泛化能力强。这个也是 embedding 之于 one-hot 的优点
- 和 MF 相比,使用了除 user_id 和 item_id 之外的信息,因此效果更好。
References
- 推荐系统召回四模型之:全能的FM模型 - 知乎
- 因子机深入解析