FM

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}\\ =\sigma\left(\vec{w}^{T} \cdot \vec{x}+\vec{x}^{T} \cdot W^{(2)} \cdot \vec{x}\right)\\=\sigma\left(\vec{w}^{T} \cdot \vec{x}+\vec{x}^{T} \cdot V^{T} \cdot V \cdot \vec{x}\right)\\=\sigma(\langle\vec{w}, \vec{x}\rangle+\langle V \cdot \vec{x}, V \cdot \vec{x}\rangle)\\=\sigma\left(\langle\vec{w}, \vec{x}\rangle+\sum_{i=1}^{n} \sum_{j=1}^{n}\left\langle x_{i} \cdot \vec{v}_{i}, x_{j} \cdot \vec{v}_{j}\right\rangle\right)\\=\sigma\left(\langle\vec{w}, \vec{x}\rangle+\sum_{i=1}^{n} \sum_{j=i+1}^{n}\left\langle\vec{v}_{i}, \vec{v}_{j}\right\rangle x_{i} \cdot x_{j}\right)\)

这里对每个特征,引入辅助k 维的隐向量\(V_{i}=\left[v_{i 1}, v_{i 2}, \ldots, v_{i k}\right]^{T}\) 进行特征分解

FM 通过矩阵分解将W 分解为\(VV^T\) ,即 \(\tilde{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_{化妆品}>\)

  • 如何减小参数复杂度

参数的学习可以通过公式变换减小到线性复杂度:

\(\begin{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}\right)} \\ {=\frac{1}{2} \sum_{f=1}^{k}\left(\left(\sum_{i=1}^{n} v_{i, f} x_{i}\right)\left(\sum_{i=1}^{n} v_{j, f} x_{j}\right)-\sum_{i=1}^{n} v_{i, f}^{2} x_{i}^{2}\right)} \\ {=\frac{1}{2} \sum_{f=1}^{k}\left(\left(\sum_{i=1}^{n} v_{i, f} x_{i}\right)^{2}-\sum_{i=1}^{n} v_{i, f}^{2} x_{i}^{2}\right)}\end{array}\)

其中的一个小 trick 就是:\(\sum_{i=1}^{n} \sum_{j=i+1}^{n} x_{i} x_{j}=1 / 2 \times\left[\left(\sum_{i=1}^{n} x_{i}\right)^{2}-\sum_{i=1}^{n} x_{i}^{2}\right]\)

梯度:\(\frac{\partial}{\partial \theta} \hat{y}(\mathrm{x})=\left\{\begin{array}{ll}{1,} & {\text { if } \theta \text { is } w_{0}} \\ {x_{i},} & {\text { if } \theta \text { is } w_{i}} \\ {x_{i} \sum_{j=1}^{n} v_{j, f} x_{j}-v_{i, f} x_{i}^{2},} & {\text { if } \theta \text { is } v_{i, f}}\end{array}\right.\)

  • 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的形式如(Xa,Xb),损失函数可以采用pairwise loss

  • id类特征为什么有用?

id 类特征会极大地提高模型的个性化能力和实际效果,加入 id 类特征后,尽管不能实现完全的个性化,但是可以把每个用户的行为模式区分开,从而提高模型其他特征的泛化能力。

假设极端情况,一个普通用户一个刷子,普通用户看到广告后的实际点击率是比刷子低的。模型就学到了导致广告点击率高的原因其实是用户 id

如果加了两个特征,设备 id、历史 ctr。因为这个组合特征,LR就能学习到组合的信息。他实际的效果,就相当于对每个设备id建立了一个只有一个历史ctr作为特征的LR模型。那么这个模型,想必是比原始的模型效果更好的了

总结如下:

  1. 可以使得在学习过程中,每个人的信号更合理地影响整体模型,使得模型泛化能力更好

  2. 可以使得模型能够对每个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泛化能力的来源。

posted @ 2020-07-15 22:27  rjxuu  阅读(377)  评论(0编辑  收藏  举报