Factorization machine,因子分解机,把所有特征进行高阶组合,减少人工参与特征组合的工作,
在 LR 的基础上考虑交叉项,某些特征经过关联之后,与 label 的相关性会提高,比如球类运动配件和男性这两个特征。所以 FM 解决的问题是1.特征稀疏 2.特征组合
一般线性模型无法学习到高阶组合特征,将特征进行二阶组合的模型如下: (y(mathbf{x})=w_{0}+sum_{i=1}^{n} w_{i} x_{i}+sum_{i=1}^{n} sum_{j=i+1}^{n} w_{i j} x_{i} x_{j})
二次项参数的训练是很困难的,每个参数到的训练都需要大量的非零样本,由于样本本来就稀疏,满足交叉项不为0的样本将非常少,所以将会导致参数不准。泛化能力较弱。
(y(mathbf{x})=w_{0}+sum_{i=1}^{n} w_{i} x_{i}+sum_{i=1}^{n} sum_{j=i+1}^{n} w_{i j} x_{i} x_{j}\ =sigmaleft(vec{w}^{T} cdot vec{x}+vec{x}^{T} cdot W^{(2)} cdot vec{x} ight)\=sigmaleft(vec{w}^{T} cdot vec{x}+vec{x}^{T} cdot V^{T} cdot V cdot vec{x} ight)\=sigma(langlevec{w}, vec{x} angle+langle V cdot vec{x}, V cdot vec{x} angle)\=sigmaleft(langlevec{w}, vec{x} angle+sum_{i=1}^{n} sum_{j=1}^{n}leftlangle x_{i} cdot vec{v}_{i}, x_{j} cdot vec{v}_{j} ight angle ight)\=sigmaleft(langlevec{w}, vec{x} angle+sum_{i=1}^{n} sum_{j=i+1}^{n}leftlanglevec{v}_{i}, vec{v}_{j} ight angle x_{i} cdot x_{j} ight))
这里对每个特征,引入辅助k 维的隐向量(V_{i}=left[v_{i 1}, v_{i 2}, ldots, v_{i k} ight]^{T}) 进行特征分解
FM 通过矩阵分解将W 分解为(VV^T) ,即 ( ilde{y}(x)=w_{0}+sum_{i=1}^{n} w_{i} x_{i}+sum_{i=1}^{n} sum_{j=i+1}^{n}<v_{i}, v_{j}>x_{i} x_{j}) ,
其中(<cdot, cdot>) 是2个 k 维矩阵的内积,(<v_{i}, v_{j}>=sum_{f=1}^{k} v_{i, f} v_{j, f})
简单来说就是为每个特征学习一个 k 维的隐向量 v,然后利用 v 相乘得到参数 w,因为如果直接直接学习 w,如果不存在特征组合的样本,如<男人,化妆品>,就无法学习该参数 w,但是有了隐向量后,w 就等于(<v_{男人},v_{化妆品}>)
- 如何减小参数复杂度
参数的学习可以通过公式变换减小到线性复杂度:
(egin{array}{l}{sum_{i=1}^{n} sum_{j=i+1}^{n}<v_{i}, v_{j}>x_{i} x_{j}} \ {=frac{1}{2} sum_{i=1}^{n} sum_{j=1}^{n}<v_{i}, v_{j}>x_{i} x_{j}-frac{1}{2} sum_{i=1}^{n}<v_{i}, v_{i}>x_{i} x_{i}} \ {=frac{1}{2}left(sum_{i=1}^{n} sum_{j=1}^{n} sum_{f=1}^{k} v_{i, f} v_{j, f} x_{i} x_{j}-sum_{i=1}^{n} sum_{f=1}^{n} v_{i, f} v_{i, f} x_{i} x_{i} ight)} \ {=frac{1}{2} sum_{f=1}^{k}left(left(sum_{i=1}^{n} v_{i, f} x_{i} ight)left(sum_{i=1}^{n} v_{j, f} x_{j} ight)-sum_{i=1}^{n} v_{i, f}^{2} x_{i}^{2} ight)} \ {=frac{1}{2} sum_{f=1}^{k}left(left(sum_{i=1}^{n} v_{i, f} x_{i} ight)^{2}-sum_{i=1}^{n} v_{i, f}^{2} x_{i}^{2} ight)}end{array})
其中的一个小 trick 就是:(sum_{i=1}^{n} sum_{j=i+1}^{n} x_{i} x_{j}=1 / 2 imesleft[left(sum_{i=1}^{n} x_{i} ight)^{2}-sum_{i=1}^{n} x_{i}^{2} ight])
梯度:(frac{partial}{partial heta} hat{y}(mathrm{x})=left{egin{array}{ll}{1,} & { ext { if } heta ext { is } w_{0}} \ {x_{i},} & { ext { if } heta ext { is } w_{i}} \ {x_{i} sum_{j=1}^{n} v_{j, f} x_{j}-v_{i, f} x_{i}^{2},} & { ext { if } heta ext { is } v_{i, f}}end{array} ight.)
- FM模型应用
FM可以应用于很多预测任务,比如回归、分类、排序等等。
1.回归Regression:y(x)直接作为预测值,损失函数可以采用least square error;
2.二值分类Binary Classification:y(x)需转化为二值标签,如0,1。损失函数可以采用hinge loss或logit loss;
3.排序Rank:x可能需要转化为pair-wise的形式如(X^a,X^b),损失函数可以采用pairwise loss
- id类特征为什么有用?
id 类特征会极大地提高模型的个性化能力和实际效果,加入 id 类特征后,尽管不能实现完全的个性化,但是可以把每个用户的行为模式区分开,从而提高模型其他特征的泛化能力。
假设极端情况,一个普通用户一个刷子,普通用户看到广告后的实际点击率是比刷子低的。模型就学到了导致广告点击率高的原因其实是用户 id
如果加了两个特征,设备 id、历史 ctr。因为这个组合特征,LR就能学习到组合的信息。他实际的效果,就相当于对每个设备id建立了一个只有一个历史ctr作为特征的LR模型。那么这个模型,想必是比原始的模型效果更好的了
总结如下:
-
可以使得在学习过程中,每个人的信号更合理地影响整体模型,使得模型泛化能力更好
-
可以使得模型能够对每个id有更细粒度的排序能力,使得模型的个性化效果更好。
- 相比于 SVM 利用核函数进行特征交叉,为什么 FM 更加有效
比如在SVM中,假如(x_i)和(x_j)从来没有一起出现过,(w_{ij})不能被学习出来,就一直是0。但是在FM中,要学习的是单个特征的embedding,并不依赖与谁是否同时出现过,可以自己学习对应的embedding值。这样,即使在train set里(x_i)和(x_j)没有同时出现过,在预测时你依然可以对(x_i)和(x_j)这个特征组合进行预测,因为他们都各自有各自的embedding值。这就是FM泛化能力的来源。