FM 模型推导

FM 模型推导

论文地址:https://www.csie.ntu.edu.tw/~b97053/paper/Rendle2010FM.pdf

在使用 LR 的时候,要进行大量的特征工程,如对离散值进行独热编码,在进行大量的独热编码之后,特征矩阵会变得非常稀疏。在特征创建的时候,两两特征进行组合,由于特征向量过于稀疏,无法学习到很多组合特征的权重,FM 模型在 LR 模型的基础上,多了特征两两组合的部分,需要比 LR 多学习对应参数的权重。

只讨论二阶特征组合的情况

  • LR 多了两两特征组合的形式如下 ,nn 是特征向量的维度:

y^=ω0+i=1nωixi+i=1nj=i+1nωijxixj \hat{y} = \omega_0 + \sum^n_{i=1}\omega_ix_i +\sum^n_{i=1}\sum^n_{j=i+1} \omega_{ij}x_ix_j

  • 假设每个特征有它对应的隐因子向量,那么 ωij\omega_{ij} 就可以用两个特征对应的 kk 纬隐因子向量 viv_i, vjv_j 的内积表示

y^=ω0+i=1nωixi+i=1nj=i+1n<vi,vj>xixj \hat{y} = \omega_0 + \sum^n_{i=1}\omega_ix_i +\sum^n_{i=1}\sum^n_{j=i+1} <v_i,v_j>x_ix_j

  • 这里 i=1nj=i+1n<vi,vj>xixj\sum^n_{i=1}\sum^n_{j=i+1} <v_i,v_j>x_ix_j 的部分可以进行优化,先贴上论文里面的推导,step by step

FM 模型推导

Step 1
FM 模型推导
特征要两两进行组合,肯定是不考虑重复的情况,所以开始的时候 i=1nj=i+1n<vi,vj>xixj\sum^n_{i=1}\sum^n_{j=i+1} <v_i,v_j>x_ix_jjji+1i+1 开始。现在 jj 的下标变为从 11 开始,那么 <vi,vj><v_i, v_j><vj,vi><v_j, v_i> 都要算一遍,这俩计算结果是一样的,只算一遍即可,整体除以 22 ,因为原来 <vi,vi><v_i, v_i> 是不算的,现在算上了,所以要减去 <vi,vi><v_i, v_i>

Step 2
FM 模型推导
这里就是把 kk 纬的隐因子向量展开

Step 3
FM 模型推导

  • f=1k\sum^k_{f=1}

=12f=1k(i=1nj=1nvi,fvj,fxixji=1nvi,fvi,fxixi) =\frac{1}{2} \sum^k_{f=1} \Big( \sum^n_{i=1}\sum^n_{j=1} v_{i,f} v_{j,f} x_ix_j - \sum^n_{i=1}v_{i,f} v_{i,f}x_ix_i \Big)

  • 只看里面的 i=1nj=1nvi,fvj,fxixj\sum^n_{i=1}\sum^n_{j=1} v_{i,f} v_{j,f} x_ix_j
    j=1nvi,fvj,fxixj\sum^n_{j=1} v_{i,f} v_{j,f} x_ix_j 因为里面的 vi,fxiv_{i,f} x_i 对于此处来说相当于常量,提到外面,变为 vi,fxij=1nvj,fxjv_{i,f}x_i \sum^n_{j=1} v_{j,f} x_j ,所以变为:

i=1nj=1nvi,fvj,fxixj=i=1nvi,fxij=1nvj,fxj \sum^n_{i=1}\sum^n_{j=1} v_{i,f} v_{j,f} x_ix_j = \sum^n_{i=1}v_{i,f}x_i\sum^n_{j=1} v_{j,f} x_j

Step 4
FM 模型推导
这里 i=1nvi,fxi\sum^n_{i=1}v_{i,f}x_ij=1nvj,fxj\sum^n_{j=1} v_{j,f} x_j 其实只是下标的名字不一样而已,对应的隐因子向量的每个元素是一样的,so i=1nvi,fxi\sum^n_{i=1}v_{i,f}x_ij=1nvj,fxj\sum^n_{j=1} v_{j,f} x_j 是同一个东西,这样的话,只需要计算一次的 i=1nvi,fxi\sum^n_{i=1}v_{i,f}x_i 就可以了

到这样,计算 i=1nj=i+1n<vi,vj>xixj\sum^n_{i=1}\sum^n_{j=i+1} <v_i,v_j>x_ix_j 的复杂度,就从 O(kn2)O(kn^2) 变为了 O(kn)O(kn)

后面把这个 y^\hat{y} 代入 Sigmoid 函数,使用 logistic 损失函数,然后梯度下降求解 ωi\omega_ivi,fv_{i,f} 即可。