1. 基本概念
常见的线性表达式如下:
y = ω 0 + ∑ i = 1 n ω i x i y=\omega_0 + \sum^{n}_{i=1}\omega_ix_i y=ω0+i=1∑nω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=1∑nωixi+i=1∑n−1j=i+1∑nω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(n−1)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 vi∗vj对交叉项的系数 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,f⋅vj,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)=⎩⎪⎨⎪⎧1xixi∑j=1nvj,fxj−vi,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 ∑j−1nvj,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=1∑n−1j=1∑n⟨vi,vj⟩xixj=21i=1∑nj=1∑n⟨vi,vj⟩xixj−21i=1∑n⟨vi,vj⟩xixj=21⎝⎛i=1∑nj=1∑nf=1∑kvi,fvj,fxixj−i=1∑nf=1∑kvi,fvj,fxixj⎠⎞=21f=1∑k((i=1∑nvi,fxi)(j=1∑nvj,fxj)−i=1∑nvi,f2xi2)=21f=1∑k⎝⎛(i=1∑nvi,fxi)2−i=1∑nvi,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,f∂21f=1∑k(i=1∑nvi,fxi)2=f=1∑k(i=1∑nvi,fxi)+∂vi,f∂∑i=1nvi,fxi=(i=1∑nvi,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,f∂21f=1∑k(i=1∑nvi,f2xi2)=−21xi2⋅2vi,f=−xi2⋅vi,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)⋅xi−xi2⋅vi,f
微信扫码关注公众号,后台回复「电子书福利」,35本深度学习、机器学习、自然语言处理、算法领域的经典电子书,我们将一次性统统分享给大家!