提出动机

FFM模型是在FM模型的基础上提出的,FM的假设函数如下所示:
y^(x):=w0+i=1nwixi+i=1nj=i+1nvi,vjxixj\hat{y}(\mathbf{x}):=w_{0}+\sum_{i=1}^{n} w_{i} x_{i}+\sum_{i=1}^{n} \sum_{j=i+1}^{n}\left\langle\mathbf{v}_{i}, \mathbf{v}_{j}\right\rangle x_{i} x_{j}关注二阶交叉特征部分,viv_{i}相当于特征xix_{i}的隐向量,可以看到,对于特征xix_{i},不管与其组合的特征是xjx_{j}还是xkx_{k},特征xix_{i}使用的隐向量始终是viv_{i},而FFM提出filed的概念,每个特征有其所属的field,比如在电影推荐中,电影名经过one-hot之后生成五个特征,这五个特征就属于moive这个filed,在进行交叉项系数生成时,某个特征会考虑到与其配对特征所属的field,即对于另一半不同的域有不同的隐向量。这样xix_{i}的隐向量从原来的一个变成n个,n为filed的个数。

表达式

y(x)=w0+i=1nwixi+i=1nj=i+1nvi,fj,vj,fixixjy(\mathbf{x})=w_{0}+\sum_{i=1}^{n} w_{i} x_{i}+\sum_{i=1}^{n} \sum_{j=i+1}^{n}\left\langle\mathbf{v}_{i, f_{j}}, \mathbf{v}_{j, f_{i}}\right\rangle x_{i} x_{j}其中vi,fjv_{i,f_{j}}表示特征ii与特征jj配对时,特征ii取的隐向量,fjf_{j}表示特征jj所属的field。
假设有n个特征,每个特征隐向量长度为k,有f个field,那么FFM模型交叉特征系数中有nkfn*k*f个参数。

举例

对于数据
FFM(Field-aware Factorization Machines)模型
这条记录可以编码成5个特征,其中“Genre=Comedy”和“Genre=Drama”属于同一个field,“Price”是数值型,注意这里显示上没有转化为one-hot类型,用index来体现。
FFM(Field-aware Factorization Machines)模型
该数据中有五个特征YuChin,3ldiots,Comedy,DramaYuChin, 3ldiots,Comedy, Drama,四个域User,Movie,Genre,PriceUser, Movie,Genre,Price,下图中绿色样本的取值(对于离散值是01,连续值比如price就是其真实值),红色表示与其配对特征所属的域。这样可以构建是个特征组合如下
FFM(Field-aware Factorization Machines)模型

参数求解

暂不考虑一阶特征(因为一阶特征系数的求解与线性回归相同),只考虑二阶特征系数,其预测函数如下所示:
ϕFFM(w,x)=j1=1nj2=j1+1n(wj1,f2wj2,f1)xj1xj21\phi_{\mathrm{FFM}}(\boldsymbol{w}, \boldsymbol{x})=\sum_{j_{1}=1}^{n} \sum_{j_{2}=j_{1}+1}^{n}\left(\boldsymbol{w}_{j_{1}, f_{2}} \cdot \boldsymbol{w}_{j_{2}, f_{1}}\right) x_{j_{1}} x_{j_{2}} (1)

那么带正则项的损失函数可以写成
L=Lerr+Lreg=L(ϕFFM(w,x))+λ2w2\mathcal{L}=\mathcal{L}_{e r r}+\mathcal{L}_{r e g}=\mathcal{L}(\phi_{\mathrm{FFM}}(\boldsymbol{w,x}))+\frac{\lambda}{2}\|\mathbf{w}\|^{2}
其中有nfn*fkk维向量w待求,因为式子(1)中有两个ww参数,所以分别对这两个参数求偏导,得:gj1,f2wj1,f2f(w)=λwj1,f2+κwj2,f1xj1xj2gj2,f1wj2,f1f(w)=λwj2,f1+κwj1,f2xj1xj2\begin{array}{l} \boldsymbol{g}_{j_{1}, f_{2}} \equiv \nabla_{\boldsymbol{w}_{j_{1}, f_{2}}} f(\boldsymbol{w})=\lambda \cdot \boldsymbol{w}_{j_{1}, f_{2}}+\kappa \cdot \boldsymbol{w}_{j_{2}, f_{1}} x_{j_{1}} x_{j_{2}} \\ \boldsymbol{g}_{j_{2}, f_{1}} \equiv \nabla_{\boldsymbol{w}_{j_{2}, f_{1}}} f(\boldsymbol{w})=\lambda \cdot \boldsymbol{w}_{j_{2}, f_{1}}+\kappa \cdot \boldsymbol{w}_{j_{1}, f_{2}} x_{j_{1}} x_{j_{2}} \end{array}
其中λ\lambda是惩罚项系数,κ\kappa根据不同的损失函数的表达形式不同,比如对于二分类问题的逻辑函数而言:
κ=log(1+exp(yϕFFM(w,x)))ϕFFM(w,x)=y1+exp(yϕFFM(w,x))\kappa=\frac{\partial \log \left(1+\exp \left(-y \phi_{\mathrm{FFM}}(\boldsymbol{w}, \boldsymbol{x})\right)\right)}{\partial \phi_{\mathrm{FFM}}(\boldsymbol{w}, \boldsymbol{x})}=\frac{-y}{1+\exp \left(y \phi_{\mathrm{FFM}}(\boldsymbol{w}, \boldsymbol{x})\right)}κ\kappa是链式求导的第一部分,跟预测函数的值和样本的真实值有关,与具体参数无关,所以可以先计算出来然后作为公共部分。

这样可以分别得到wj1,f2{w}_{j_{1}, f_{2}}wj2,f1{w}_{j_{2}, f_{1}}的梯度,用梯度下降更新参数即可,注意这里公式上写的是ww向量的形式,但是求解时依据的是向量中的某个值来更新。隐向量中的每个参数都有不同的梯度。

作者在使用梯度下降时用的不是一般的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

相关文章: