写在前面
背景
FM算法,全称Factorization Machines,一般翻译为“因子分解机”。2010年,它由当时还在日本大阪大学的Steffen Rendle提出。FM模型以其优雅的数学表达和极强的工业拓展能力,使其在当今的推荐系统、计算广告领域占据十分核心的位置。
此模型的主要作用是解决了线性模型中高阶交叉特征的选择和特征参数的训练问题,工程师可以解放精力寻求新的基本特征或进行模型调优,极大的减少人工参与特征组合和特征选择的工作。相比于传统线性模型,FM模型具有以下优点:
- FM模型极大地压缩参数规模
- 模型训练线性时间复杂度,可以应用于大规模机器学习
- 克服One-Hot编码带来的数据稀疏性问题
- 通过特征对应的隐向量内积表示组合特征系数,对训练集中未出现过的特征组合依旧具有参数学习能力
相关结论:
- FM的特征学习能力至少不弱于人工组合特征+线性模型的结果
- FM在CTR预估、CVR预估等领域的效果经过了工业界的验证
- 在稀疏数据集上FM的效果要好于SVM
符号定义
符号 |
含义 |
xj |
第j维特征 |
x |
一条样本中的特征向量,x=(1,x1,x2,⋯,xn) |
x(i) |
第i条样本 |
xj(i) |
第i条样本的第j维特征 |
y(i) |
第i条样本的标签 |
X |
所有样本的特征全集,即$$X=\left(x^{(1)}, x^{(2)}, \cdots, x{(m)}\right){T}$$ |
Y |
所有样本的label全集,即$$Y=\left(y^{(1)}, y^{(2)}, \cdots, y{(m)}\right){T}$$ |
w |
参数向量,即w=(w0,w1,⋯,wn) |
wj |
第j维参数 |
模型形式
对于特征集合x=(1,x1,x2,⋯,xn)和标签y。我们希望得到x与y的关系,最简单是建立线性回归模型
y^(x)=w0+i=1∑nwixi
但是,对于实际问题,仅仅依靠一阶特征的线性模型拟合效果较差,需要构造高阶的组合特征,在机器学习领域使基本特征构造复杂特征的方法被称为“特征工程”,本文不展开说明。
特征工程的目的之一是根据基本特征生成高阶的组合特征,这里以二阶为例(理论上,FM可以组合任意高阶,但是由于计算复杂度,实际中常用二阶,后面也主要介绍二阶组合的内容)
模型形式为:
y^(x)=w0+i=1∑nwixi+i=1∑nj=i+1∑nwijxixj
相比于模型(1)而言,模型(2)根据基本特征生成了n(n−1)/2个二阶的组合特征,同时也增加了n(n−1)/2个参数
在这里,任意两个组合特征参数wij都是独立的。然而,在数据非常稀疏的实际应用场景中,准确的从样本中学习wij是十分困难的。
原因是因为,数据稀疏场景中回归模型的参数的学习结果就是从训练样本中计算充分统计量(凡是符合指数族分布的模型都具有此性质),而在这里组合特征的每一个参数wij的学习过程需要大量的xi,xj同时非零的训练样本。当某些组合特征在训练样本中不存在时,wij的参数训练结果为0。这样会导致模型存在参数不稳定和泛化能力不足的问题,且$$O(n^2)$$的参数规模也增加了存储和训练的难度。
那么解决问题这个问题我们可以从两个角度考虑,做模型压缩(降低参数规模)和寻找一种方法可以很好的学习到特征参数
很自然的想到(我是想不到)采用矩阵分解技术(MF),于是引出了一个问题:MF和FM的关系是什么?
FM的核心就是通过近似矩阵分解有效的解决了这一问题,FM组合特征参数可以用参数矩阵W表示
W=⎣⎢⎢⎢⎡w11w21⋮wn1w12w22⋮wn2⋯⋱⋯w1nwnn⎦⎥⎥⎥⎤
可以看出W是实对称矩阵,为了方便表述,可以更进一步假定参数矩阵W的对角元素均为正实数,那么W为正定矩阵。根据正定矩阵的性质,W可以进行对角化分解,而且形式非常优雅
W=QΛQT
其中Q是正交单位矩阵,即QQT=I ,Λ是对角矩阵,且对角线元素全部大于0。可以将其对角线元素从大到小排列,即λ1≥λ2≥⋯λn>0,只要Q的进行初等行变换即可。基于这些特性,可以分解Λ=ΛΛT,同时令V=QΛ所以有
W=VVT
这时的V是n×n矩阵,可以用主成分近似的思想,取Λ前f(≪n)个主对角元素
W≈VfVfT
近似的矩阵Vf为n×f矩阵。
Vf=⎣⎢⎢⎢⎡v1,1v2,1⋮vn,1v1,2v2,2⋮vn,2⋯⋯⋮⋯v1,fv2,f⋮vn,f⎦⎥⎥⎥⎤=[v1v2⋯vn]T
为了便于理解我们展开转换细节:
VfVfT=⎣⎢⎢⎡V1V2⋯Vn⎦⎥⎥⎤×[V1,V2,…,Vn]=⎣⎢⎢⎡v11v21⋯vn1v12v22⋯vn2……⋯…v1kv2k⋯vnk⎦⎥⎥⎤×⎣⎢⎢⎡v11v12⋯v1kv21v22⋯v2k……⋯…vn1vn2⋯vnk⎦⎥⎥⎤
将(6)带入(2)我们得到FM的公式:
y^(x)=w0+i=1∑nwixi+i=1∑nj=i+1∑n⟨vi,vj⟩xixj
其中Vi表示特征xi的k维隐向量,⟨⋅,⋅⟩代表向量内积。
⟨vi,vj⟩:=f=1∑kvi,f⋅vj,f
到此为止我们从线性模型推导出了FM模型的表达式(9)(10)
从表达式我们看到FM确实解决了之前提到的一些问题:
- 组合特征的参数规模从2n(n−1)降低到nf,在高阶组合特征情况下更明显
- 参数因子化使得xhxi和xixj不在独立。所有包含“$ x_{i}$ 的非零组合特征”(存在某个j=i,使得 xixj=0)的样本都可以用来学习隐向量vi,在出现新的特征组合时依旧可以通过向量内积表示的参数进行预测,从而缓解了数据稀疏性带来的参数稳定性问题和泛化能力不足问题
FM的参数学习
接下来需要学习模型的参数,首先需要根据实际问题设定对应的损失函数和求解方法。
FM应用场景 |
损失函数 |
说明 |
回归 |
Mean Squre Error Loss |
均方误差 |
二类分类 |
Hinge/Cross-Entopy Loss |
分类时,结果需要做sigmoid变换 |
排序 |
Pairwise Loss |
|
求解算法最常用的是使用SGD求解参数,也可以使用L-BFGS,MCMC或ALS。使用随机梯度下降或L-BFGS均需要计算出损失函数的梯度。
最优化一般需要加上正规化项,避免参数过拟合,FM添加L2正规化,回归问题和二元分类问题的损失函数如下
回归目标函数:
Er(w,v)=2m1h=1∑m(w0+i=1∑nwixi(h)+i=1∑nj=i+1∑nvivjTxi(h)xj(h)−y(h))2+mλ0w02+mλ1i=1∑nwi2+mλ2i=1∑nviTvi
二分类目标函数:
Ec(w,v)=m1h=1∑mln(1+e−y(h)(w0+∑i=1nwixi+∑i=1n∑j=i+1nviTvjxixj))+mλ0w02+mλ1i=1∑nwi2+mλ2i=1∑nviTvi
分类问题标签:yh∈−1,1
模型优化(加速求解)
FM模型的复杂度为O(kn2),但是通过下面的等价转换,可以将FM的二次项化简,其复杂度可优化到O(kn)
i=1∑nj=i+1∑n⟨vi,vj⟩xixj=21f=1∑k⎝⎛(i=1∑nvifxi)2−i=1∑nvi,f2xi2⎠⎞
详细的推导过程如下:
====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,fvifxixi⎠⎞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∑nvif2xi2⎦⎤
解释:
vi,f 是一个具体的值;
第1个等号:对称矩阵 W对角线上半部分;
第2个等号:把向量内积$$v_{i}, v_{j}$$展开成累加和的形式;
第3个等号:提出公共部分;
第4个等号:$i 和 $j 相当于是一样的,表示成平方过程。
采用随机梯度下降法SGD求解参数
∂θ∂y^(x)=⎩⎨⎧1,xi,xi∑j=1nvj,fxj−vi,fxi2 if θ is ω0 if θ is ωiifθisvi,f
训练的伪代码:
待补充
偏导数(12)中,除了∑j=1nvj,kxj,其他是常量复杂度O(1),但是∑j=1nvj,kxj可以复用,复杂度为O(n),需要计算f个,总共复杂度为O(nf)。因为需要计算nf个偏导,所以最后整体的二项组合部分的复杂度仍为O(nf)。
参考资料