1. 基本概念

常见的线性表达式如下:

y = ω 0 + ∑ i = 1 n ω i x i y=\omega_0 + \sum^{n}_{i=1}\omega_ix_i y=ω0+i=1nωixi

其中 ω 0 \omega_0 ω0为初始权值,或者理解为偏置项, ω i \omega_i ωi为每个特征 x i x_i xi对应的权值。可以看到,这种线性表达式只描述了每个特征与输出的关系。FM的表达式如下,可观察到,只是在线性表达式后面加入了新的交叉项特征及对应的权值。

y = ω 0 + ∑ i = 1 n ω i x i + ∑ i = 1 n − 1 ∑ j = i + 1 n ω i j x i x j y=\omega_0 + \sum^{n}_{i=1}\omega_ix_i+\sum^{n-1}_{i=1}\sum^n_{j=i+1}\omega_{ij}x_ix_j y=ω0+i=1nωixi+i=1n1j=i+1nωijxixj

上面公式中, n n n代表特征数量, x i x_i xi是第i个特征得值, ω \omega ω是模型权重,从公式来看,模型得前半部分就是普通得LR线性组合,后半部分是交叉项:特征得组合。单单从模型得表达能力上将,FM得表达能力强于LR,当交叉项参数全部为0得时候退化为普通得LR模型。从公式中,我们可以看出组合特征得参数一共有 1 2 n ( n − 1 ) \frac{1}{2n(n-1)} 2n(n1)1个,任意两个参数都是独立的。然而在数据稀疏性普遍存在的实际场景中,二次项参数的训练是很困难的。原因是:每个参数 ω i j \omega_{ij} ωij的训练都需要大量 x i x_i xi x j x_j xj都非零的样本;由于样本数据本来就比较稀疏,满足 x i x_i xi x j x_j xj都非零的样本将会非常的少。训练样本不足,很容易导致参数 w i j w_{ij} wij不准确,最终将严重影响模型的性能。

矩阵分解提供了一种解决数据稀疏性的思路。在基于模型的协同过滤中,一个评分矩阵可以分解为user矩阵和item矩阵,每个user 和item都可以采用一个隐向量表示。这里,采用的方法是:给每个特征分量 x i x_i xi,引入一个辅助向量 v i = ( v 1 , v 2 , . . . . . . . v k ) vi=(v_1,v_2,.......v_k) vi=(v1,v2,.......vk),然后利用 v i ∗ v j v_i*v_j vivj对交叉项的系数 w i j w_{ij} wij进行估计,即 ω i j = < v i , v j > = ∑ f = 1 k v i , f ⋅ v j , f \omega_{ij}=\left<v_i,v_j\right>=\sum^k_{f=1}v_{i,f} \cdot v_{j,f} ωij=vi,vj=f=1kvi,fvj,f

2. 梯度下降求解

利用SGD梯度下降训练模型,模型各个参数的梯度如下:
∂ ∂ θ y ( x ) = { 1 i f   θ   i s   ω 0 x i i f   θ   i s   ω i x i ∑ j = 1 n v j , f x j − v i , f x i 2 i f   θ   i s   v i , f \frac{\partial }{\partial\theta}y\left(x \right ) = \begin{cases} 1 & if  \theta is  \omega_0 \\ x_i & if  \theta  is  \omega_i \\ x_i\sum^n_{j=1}v_{j,f}x_j-v_{i,f}x^2_i & if  \theta  is  v_{i,f} \\ \end{cases} θy(x)=1xixij=1nvj,fxjvi,fxi2if θ is ω0if θ is ωiif θ is vi,f

其中, v j , f v_{j,f} vj,f是隐向量 v j v_j vj的第f个元素。由于 ∑ j − 1 n v j , f v j \sum^n_{j-1}v_{j,f}v_j j1nvj,fvj只与f有关,而和i无关,所以在每次迭代过程中,只需要计算一次所有f的 ∑ j = 1 n v j , f x j \sum^n_{j=1}v_{j,f}x_j j=1nvj,fxj,就能方便地得到所有 v i , f v_{i,f} vi,f的梯度。显然,计算所有f的 ∑ j = 1 n v j , f x j \sum^n_{j=1}v_{j,f}x_j j=1nvj,fxj的复杂度是 O ( k n ) O\left(kn\right) O(kn);已知 ∑ j = 1 n v j , f x j \sum^n_{j=1}v_{j,f}x_j j=1nvj,fxj时,计算每个参数梯度的复杂度是 O ( 1 ) O\left(1\right) O(1);模型参数一共有nk+n+1个。因此,FM参数训练的复杂度也是 O ( k n ) O\left(kn\right) O(kn)。综上可知,FM可以在线性时间训练和预测,是一种非常高效的模型。

前两项的求导非常简单,交叉项求导过程如下:

2.1 化简

∑ i = 1 n − 1 ∑ j = 1 n < v i , v j > x i x j = 1 2 ∑ i = 1 n ∑ j = 1 n < v i , v j > x i x j − 1 2 ∑ i = 1 n < v i , v j > x i x j = 1 2 ( ∑ i = 1 n ∑ j = 1 n ∑ f = 1 k v i , f v j , f x i x j − ∑ i = 1 n ∑ f = 1 k v i , f v j , f x i x j ) = 1 2 ∑ f = 1 k ( ( ∑ i = 1 n v i , f x i ) ( ∑ j = 1 n v j , f x j ) − ∑ i = 1 n v i , f 2 x i 2 ) = 1 2 ∑ f = 1 k ( ( ∑ i = 1 n v i , f x i ) 2 − ∑ i = 1 n v i , f 2 x i 2 ) \begin{aligned} &\sum^{n-1}_{i=1}\sum^{n}_{j=1}\left<v_i,v_j\right>x_ix_j \\ &= \frac{1}{2}\sum^{n}_{i=1}\sum^{n}_{j=1}\left<v_i,v_j\right>x_ix_j - \frac{1}{2}\sum^{n}_{i=1}\left<v_i,v_j\right>x_ix_j\\ &= \frac{1}{2}\left(\sum^{n}_{i=1}\sum^{n}_{j=1}\sum^{k}_{f=1}v_{i,f}v_{j,f}x_ix_j - \sum^{n}_{i=1}\sum^k_{f=1}v_{i,f}v_{j,f}x_ix_j\right)\\ &=\frac{1}{2}\sum^k_{f=1}\left(\left(\sum^n_{i=1}v_{i,f}x_i\right)\left(\sum^n_{j=1}v_{j,f}x_j\right)-\sum^n_{i=1}v^2_{i,f}x^2_i\right) \\ &=\frac{1}{2}\sum^k_{f=1}\left(\left(\sum^n_{i=1}v_{i,f}x_i\right)^2-\sum^n_{i=1}v^2_{i,f}x^2_i\right) \\ \end{aligned} i=1n1j=1nvi,vjxixj=21i=1nj=1nvi,vjxixj21i=1nvi,vjxixj=21i=1nj=1nf=1kvi,fvj,fxixji=1nf=1kvi,fvj,fxixj=21f=1k((i=1nvi,fxi)(j=1nvj,fxj)i=1nvi,f2xi2)=21f=1k(i=1nvi,fxi)2i=1nvi,f2xi2

2. 2 左半部分求导

∂ ∂ v i , f 1 2 ∑ f = 1 k ( ∑ i = 1 n v i , f x i ) 2 = ∑ f = 1 k ( ∑ i = 1 n v i , f x i ) + ∂ ∑ i = 1 n v i , f x i ∂ v i , f = ( ∑ i = 1 n v i , f x i ) ⋅ x i \begin{aligned} &\frac{\partial}{\partial v_{i,f}}\frac{1}{2}\sum^k_{f=1}\left(\sum^n_{i=1}v_{i,f}x_i\right)^2\\ &=\sum^k_{f=1}\left(\sum^n_{i=1}v_{i,f}x_i\right)+\frac{\partial\sum^{n}_{i=1} v_{i,f}x_i}{\partial v_{i,f}}\\ &=\left(\sum^n_{i=1}v_{i,f}x_i\right)\cdot x_i \end{aligned} vi,f21f=1k(i=1nvi,fxi)2=f=1k(i=1nvi,fxi)+vi,fi=1nvi,fxi=(i=1nvi,fxi)xi

2.3 右半部分求导

− ∂ ∂ v i , f 1 2 ∑ f = 1 k ( ∑ i = 1 n v i , f 2 x i 2 ) = − 1 2 x i 2 ⋅ 2 v i , f = − x i 2 ⋅ v i , f \begin{aligned} &-\frac{\partial}{\partial v_{i,f}}\frac{1}{2}\sum^k_{f=1}\left(\sum^n_{i=1}v^2_{i,f}x_i^2\right)\\ &=-\frac{1}{2}x^2_i\cdot 2v_{i,f}\\ &=-x^2_i\cdot v_{i,f}\\ \end{aligned} vi,f21f=1k(i=1nvi,f2xi2)=21xi22vi,f=xi2vi,f

最终 = ( ∑ i = 1 n v i , f x i ) ⋅ x i − x i 2 ⋅ v i , f =\left(\sum^n_{i=1}v_{i,f}x_i\right)\cdot x_i-x^2_i\cdot v_{i,f} =(i=1nvi,fxi)xixi2vi,f

微信扫码关注公众号,后台回复「电子书福利」,35本深度学习、机器学习、自然语言处理、算法领域的经典电子书,我们将一次性统统分享给大家!
推荐系统FM(因子分解机)详细推导

推荐系统FM(因子分解机)详细推导
推荐系统FM(因子分解机)详细推导

相关文章:

  • 2022-01-01
  • 2022-12-23
  • 2022-12-23
  • 2021-04-19
  • 2021-04-04
  • 2021-04-10
  • 2022-12-23
  • 2021-10-16
猜你喜欢
  • 2022-03-03
  • 2021-06-16
  • 2021-10-31
  • 2021-04-20
  • 2021-06-23
  • 2021-11-18
  • 2021-12-10
相关资源
相似解决方案