提出动机
FFM模型是在FM模型的基础上提出的,FM的假设函数如下所示:
y^(x):=w0+i=1∑nwixi+i=1∑nj=i+1∑n⟨vi,vj⟩xixj关注二阶交叉特征部分,vi相当于特征xi的隐向量,可以看到,对于特征xi,不管与其组合的特征是xj还是xk,特征xi使用的隐向量始终是vi,而FFM提出filed的概念,每个特征有其所属的field,比如在电影推荐中,电影名经过one-hot之后生成五个特征,这五个特征就属于moive这个filed,在进行交叉项系数生成时,某个特征会考虑到与其配对特征所属的field,即对于另一半不同的域有不同的隐向量。这样xi的隐向量从原来的一个变成n个,n为filed的个数。
表达式
y(x)=w0+i=1∑nwixi+i=1∑nj=i+1∑n⟨vi,fj,vj,fi⟩xixj其中vi,fj表示特征i与特征j配对时,特征i取的隐向量,fj表示特征j所属的field。
假设有n个特征,每个特征隐向量长度为k,有f个field,那么FFM模型交叉特征系数中有n∗k∗f个参数。
举例
对于数据

这条记录可以编码成5个特征,其中“Genre=Comedy”和“Genre=Drama”属于同一个field,“Price”是数值型,注意这里显示上没有转化为one-hot类型,用index来体现。

该数据中有五个特征YuChin,3ldiots,Comedy,Drama,四个域User,Movie,Genre,Price,下图中绿色样本的取值(对于离散值是01,连续值比如price就是其真实值),红色表示与其配对特征所属的域。这样可以构建是个特征组合如下

参数求解
暂不考虑一阶特征(因为一阶特征系数的求解与线性回归相同),只考虑二阶特征系数,其预测函数如下所示:
ϕFFM(w,x)=j1=1∑nj2=j1+1∑n(wj1,f2⋅wj2,f1)xj1xj2(1)
那么带正则项的损失函数可以写成
L=Lerr+Lreg=L(ϕFFM(w,x))+2λ∥w∥2
其中有n∗f个k维向量w待求,因为式子(1)中有两个w参数,所以分别对这两个参数求偏导,得:gj1,f2≡∇wj1,f2f(w)=λ⋅wj1,f2+κ⋅wj2,f1xj1xj2gj2,f1≡∇wj2,f1f(w)=λ⋅wj2,f1+κ⋅wj1,f2xj1xj2
其中λ是惩罚项系数,κ根据不同的损失函数的表达形式不同,比如对于二分类问题的逻辑函数而言:
κ=∂ϕFFM(w,x)∂log(1+exp(−yϕFFM(w,x)))=1+exp(yϕFFM(w,x))−yκ是链式求导的第一部分,跟预测函数的值和样本的真实值有关,与具体参数无关,所以可以先计算出来然后作为公共部分。
这样可以分别得到wj1,f2和wj2,f1的梯度,用梯度下降更新参数即可,注意这里公式上写的是w向量的形式,但是求解时依据的是向量中的某个值来更新。隐向量中的每个参数都有不同的梯度。
作者在使用梯度下降时用的不是一般的SDG,用了优化的AdaGrad,这里就不介绍了。
参考资料
https://www.csie.ntu.edu.tw/~cjlin/papers/ffm.pdf
https://tech.meituan.com/2016/03/03/deep-understanding-of-ffm-principles-and-practices.html
https://www.jianshu.com/p/781cde3d5f3d