提出动机
FM模型主要解决的是系数数据下组合特征权重学习的问题。
以下图为例,场景是用户对电影打分的预测,每行表示一条样本,对于x数据,可分为五个部分,分别用户ID、待打分的电影名、该用户对各个电影的历史打分(归一化)、时间信息、上次打分的电影,y表示对电影的打分,可以看到用User、Movie、Last Move rated都是one-hot的形式,非常稀疏。

现在每一列xi都表示一个特征,假设我们现在需要构建一个x到y的模型,需要用到2阶多项式特征,即需要用到特征x间的两两组合,那么y的表达式可以写成:
y~(x)=w0+i=1∑nwixi+i=1∑nj=i+1∑nwijxixj其中w0是常数项,wi是一阶特征的系数wiwj是二阶特征的系数,对于该模型,我们需要学习到这三类系数的具体值。
如果其实上式可以看成一个线性回归,把一阶特征组合成的二阶特征看成新的特征,那么就是表达式如下线性回归问题,其中xi表示原始特征以及其组成的二阶特征
y~(x)=w0+i=1∑nθixi假设用随机梯度下降法来更新需要求的参数
SGD:θj=θj−α(θTxi−yi)xji可以看到θj的更新依赖于xj,如果xj为0参数就得不到更新,也就是意味着数据中交叉项的值为0是,其交叉参数无法被学习到或者不能被充分学习到。而FM模型可以解决这个问题。
解决方案
将上述模型中交叉特征的系数由常数拆分成两个向量的点积,这样可以在交叉特征不存在的情况下仍能学习到其系数,以应对预测数据中可能出现的特征组合。新的假设函数表达式如下(这里只考虑到最高二阶交叉特征)
y^(x):=w0+i=1∑nwixi+i=1∑nj=i+1∑n⟨vi,vj⟩xixj其中w0∈R,w∈Rn,V∈Rn×kV是一个n∗k的向量矩阵,n是特征x的个数,k是个待确定的参数。
<vi,vj>表示点乘,即向量对应位置乘积的和
⟨vi,vj⟩:=f=1∑kvi,f⋅vj,f
为什么可以解决问题
假设函数部分
对y^的二阶特征部分做如下分解
====i=1∑nj=i+1∑n⟨vi,vj⟩xixj21i=1∑nj=1∑n⟨vi,vj⟩xixj−21i=1∑n⟨vi,vi⟩xixi21⎝⎛i=1∑nj=1∑nf=1∑kvi,fvj,fxixj−i=1∑nf=1∑kvi,fvi,fxixi⎠⎞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⎠⎞
这样,基于FM模型的假设函数就可以写成如形式,这也是预测函数的基本形式:
y^(x):=w0+i=1∑nwixi+21f=1∑k⎝⎛(i=1∑nvi,fxi)2−i=1∑nvi,f2xi2⎠⎞
可以看到,该假设函数的进行预测的时间复杂度为O(kn),其中n是当前待预测样本的特征数
参数求导
之所以能解决稀疏特征交叉问题,因为其在稀疏条件下仍然可以对交叉特征的系数进行求解,如下所示
∂θ∂y^(x)=⎩⎨⎧1,xi,xi∑j=1nvj,fxj−vi,fxi2, if θ is w0 if θ is wi if θ is vi,f
上面第三个式子是对特定的vi,f求导,所以y^表达式中的∑f=1k将不存在。
注意上面的式子只是链式求导法则中的最后一步,对于不同的损失函数,链式求导前面的部分不一样,但后面的部分都是一样的。可以看到V矩阵中的n∗k个系数求解不依赖与交叉特征是否存在,只依赖于单个特征,这样一般线性模型不能解决的交叉项系数求解的问题得到了解决。
效率问题
- 预测效率:上面已经说过,预测的时间复杂度为O(k∗n)
- 训练效率: 对于V矩阵中的每一个参数,在SGD下,其更新方式为xi∑j=1nvj,fxj−vi,fxi2,每次随机一个样本,更新V中的 所有参数,由于这n∗k个参数更新时都会用到∑j=1nvj,fxj−vi,fxi2,所以该式的结果可以提前计算出来作为公共使用的部分,因而每一轮更新中,时间复杂度为O(k∗n+n+1)即O(k∗n)
扩展形式
更泛化的情况下,一个考虑d阶交叉特征的FM模型的表达式如下
y^(x):=w0+i=1∑nwixi+l=2∑di1=1∑n⋯il=il−1+1∑n(j=1∏lxij)⎝⎛f=1∑klj=1∏lvij,f(l)⎠⎞