Factorization Machine(FM,因子分解机)

背景

Steffen Rendle于2012年提出FM模型,旨在解决稀疏矩阵下的特征组合问题。传统机器学习问题,一般仅考虑如何对特征赋予权重,而没有考虑特征间存在相互作用,FM模型的提出较好地解决了该问题。

相比于SVM的优势

  1. 对于稀疏数据有更强的学习能力
  2. 线性时间复杂度,不依赖于支撑向量

应用

  1. 回归问题
  2. 二分类问题
  3. 排序

原理

传统线性回归模型

我们用广告的CTR(点击率)预估问题引出FM模型:根据用户和广告位等相关特征,预测用户是否点击广告。源数据如下

Clicked? Country Day Ad_type
1 USA 26/11/15 Movie
0 China 1/7/14 Game
1 China 19/2/15 Game

由于三种特征Country、Day、Ad_type都是categorical类型的,进行ctr预估的时候往往需要经过独热编码(One-Hot Encoding)转换成数值型特征。

Clicked? Country=USA Country=China Day=26/11/15 Day=1/7/14 Day=19/2/15 Ad_type=Movie Ad_type=Game
1 1 0 1 0 0 1 0
0 0 1 0 1 0 0 1
1 0 1 0 0 1 0 1

再利用传统的线性回归模型

根据训练集训练出模型的参数,进行预测。

该方法存在的问题:

  • 经过One-Hot编码之后,大部分样本数据特征是比较稀疏的,上面的样例中,每个样本有7维特征,但平均仅有3维特征具有非零值。而且在实际情况中,one-hot编码后的特征空间维度很大。
  • 更重要的是,通过One-Hot编码方式输入到传统线性模型中进行训练,各特征分量$x_i$和$x_j$是相互独立的,但在实际应用中,通过观察大量的样本数据可以发现,某些特征经过关联之后,与label之间的相关性就会提高。例如,“USA”与“Thanksgiving”、“China”与“Chinese New Year”这样的关联特征,对用户的点击就极有可能有着正向的影响。

FM模型

由于上述问题,所以引入两个(设置多个)特征之间的组合十分有意义:


前半部分就是传统的线性模型,后半部分引入两个特征之间的关联特征

从上面公式可以看出,组合特征的参数一共有n(n−1)/2个, 任意两个参数都是独立的。但是二次项参数训练很困难,因为:数据稀疏性普遍存在于实际应用场景中,而每个参数$w_{ij}$的训练需要大量 $x_i$和 $x_j$ 都非零的样本,训练样本的不足,很容易导致参数 $x_i$ 和$x_j$训练 不准确,最终将严重影响模型的性能。

那么,如何解决二次项参数的训练问题呢?矩阵分解提供了一种解决思路。
参考在model-based的协同过滤中的做法:一个rating矩阵可以分解为user矩阵和item矩阵,每个user和item都可以采用一个隐向量表示

FM模型中二次项系数构成的矩阵是对称正定的,故可以用上面的分解方式分解成两个低维的矩阵相乘,即$W={V^T}V$,从而解决数据稀疏导致训练不准确的问题。至此,FM模型可以化为如下形式

总结起来一句话就是:FM引入二维组合特征,然后利用矩阵分解降维减少了训练参数,从而能够适应数据的稀疏性
具体解释参考美团技术团队关于FM的介绍需要的时候可以细看


FM模型复杂度

求解复杂度

模型参数已经训练出来,将新的数据输入模型求解:

时间复杂度为$O(kn^2)$

但是如果我们依据公式$ab+ac+bc+\cdots=\frac{(a+b+c+\cdots)^2-(a^2+b^2+c^2+\cdots)}{2}$化简交叉项,具体过程如下:

此时时间复杂度简化为$O(kn)$。由此可见,FM可以在线性时间对新样本作出预测。

模型训练复杂度

  • 多元统计回归问题
  • 训练方法:SGD(随机梯度下降法)
    记FM模型参数为$\Theta={(w_0,w_1,w_2,\cdots,w_n,v_11,v_12,\cdots,v_nk)}^T$,共有$1+n+kn$个参数,模型各个参数的梯度如下:

详细推导过程参考peghoty的博客

时间复杂度为$O(kn)$

开源代码库

libFM

参考文献

因子分解机Factorization Machine

深入FFM原理与实践

peghoty的博客:FM学习算法