首发于算法专栏

FM算法解析

应用场景:

点击预估。

准确的估计 ctr, cvr 对于提高流量的价值,增加广告收入有重要的指导作用。业界常用的方法有人工特征工程 + LR(Logistic Regression)、GBDT(Gradient Boosting Decision Tree) + LR[1][2][3]、FM(Factorization Machine)[2][7]和FFM(Field-aware Factorization Machine)[9]模型。在这些模型中,FM和FFM近年来表现突出,分别在由Criteo和Avazu举办的CTR预测竞赛中夺得冠军[4][5]

在进行CTR预估时,除了单特征外,往往要对特征进行组合。对于特征组合来说,业界现在通用的做法主要有两大类:FM系列Tree系列。今天来讲讲FM算法。

目的:

旨在解决稀疏数据下的特征组合问题。

优势:

  • 高度稀疏数据场景;
  • 具有线性的计算复杂度。

FM原理(个人理解属于:个性化特征)

为什么进行特征组合?

下面以一个示例引入FM模型。假设一个广告分类的问题,根据用户和广告位相关的特征,预测用户是否点击了广告。源数据如下:

“Clicked?”是label,Country、Day、Ad_type是特征。由于三种特征都是categorical类型的,需要经过独热编码(One-Hot Encoding)转换成数值型特征。

由上表可以看出,经过One-Hot编码之后,大部分样本数据特征是比较稀疏的。上面的样例中,每个样本有7维特征,但平均仅有3维特征具有非零值。实际上,这种情况并不是此例独有的,在真实应用场景中这种情况普遍存在。例如,CTR/CVR预测时,用户的性别、职业、教育水平、品类偏好,商品的品类等,经过One-Hot编码转换后都会导致样本数据的稀疏性。特别是商品品类这种类型的特征,如商品的末级品类约有550个,采用One-Hot编码生成550个数值特征,但每个样本的这550个特征,有且仅有一个是有效的(非零)。由此可见,数据稀疏性是实际问题中不可避免的挑战。

One-Hot编码的另一个特点就是导致特征空间大。例如,商品品类有550维特征,一个categorical特征转换为550维数值特征,特征空间剧增。

同时通过观察大量的样本数据可以发现,某些特征经过关联之后,与label之间的相关性就会提高。例如,“USA”与“Thanksgiving”、“China”与“Chinese New Year”这样的关联特征,对用户的点击有着正向的影响。换句话说:来自“China”的用户很可能会在“Chinese New Year”有大量的浏览、购买行为;而在“Thanksgiving”却不会有特别的消费行为。这种关联特征与label的正向相关性在实际问题中是普遍存在的,如<“化妆品”类商品,“女”性><“球类运动配件”的商品,“男”性><“电影票”的商品,“电影”>品类偏好等。因此,引入两个特征的组合是非常有意义的。

如何组合?

多项式模型是包含特征组合的最直观的模型。在多项式模型中,特征 x_ix_j 的组合采用 x_ix_j 表示,即x_ix_j都非零时,组合特征 x_ix_j 才有意义。从对比的角度,本文只讨论二阶多项式模型。模型的表达式如下:

y(X)=\omega_0+\sum_{i=1}^{n}{\omega_ix_i}+\sum_{i=1}^{n-1}{\sum_{j=i+1}^{n}{\omega_{ij}x_ix_j}} (1)

其中, n 代表样本的特征数量,x_i是第 i 个特征的值, \omega_0, \omega_i, \omega_{ij} 是模型参数。

从公式来看,模型前半部分就是普通的LR线性组合,后半部分的交叉项即:特征的组合。单从模型表达能力上来看,FM的表达能力是强于LR的,至少不会比LR弱,当交叉项参数全为0时退化为普通的LR模型。

从公式(1)可以看出,组合特征的参数一共有 \frac{n(n-1)}{2} 个,任意两个参数都是独立的。然而,在数据稀疏性普遍存在的实际应用场景中,二次项参数的训练是很困难的。其原因是:每个参数 \omega_{ij} 的训练需要大量x_ix_j都非零的样本;由于样本数据本来就比较稀疏,满足“x_ix_j都非零”的样本将会非常少。训练样本的不足,很容易导致参数 \omega_{ij} 不准确,最终将严重影响模型的性能。

如何解决二次项参数的训练问题呢?

矩阵分解提供了一种解决思路。在model-based的协同过滤中,一个rating矩阵可以分解为user矩阵和item矩阵,每个user和item都可以采用一个隐向量表示。比如在下图中的例子中,我们把每个user表示成一个二维向量,同时把每个item表示成一个二维向量,两个向量的点积就是矩阵中user对item的打分。

补充:

任意的 N×N 实对称矩阵都有 N 个线性无关的特征向量。并且这些特征向量都可以正交单位化而得到一组正交且模为 1 的向量。故实对称矩阵 A 可被分解成:

A=Q\wedge Q^T

其中Q正交矩阵Λ为实对角矩阵

类似地,所有二次项参数 \omega_{ij} 可以组成一个对称阵 W (为了方便说明FM的由来,对角元素可以设置为正实数),那么这个矩阵就可以分解为 W=V^TVV 的第 j 列( v_j )便是第 j 维特征( x_j )的隐向量。换句话说,特征分量 x_ix_j 的交叉项系数就等于x_i对应的隐向量与x_j对应的隐向量的内积,即每个参数 w_{ij}=⟨v_i,v_j⟩这就是FM模型的核心思想

为了求出 \omega_{ij},我们需要求出特征分量 x_i 的辅助向量 v_i=(v_{i1}, ...,v_{ik}) , x_j 的辅助向量v_j=(v_{j1}, ...,v_{jk}) , k 表示隐向量长度(实际应用中 k<< n ),转换过程如下图所示:

W^\star=\left[ \begin{matrix} \omega_{11} & \omega_{12} & ... & \omega_{1n}\\ \omega_{21} & \omega_{22} & ... & \omega_{2n} \\ ... & ... & ... & ... \\ \omega_{n1} & \omega_{n2} & ... & \omega_{nn} \end{matrix} \right] =V^TV =\left[ \begin{matrix} V_1 \\V_2\\ ... \\V_n \end{matrix} \right]\times \left[ \begin{matrix} V_1, V_2, ... ,V_n \end{matrix} \right]

\ \ \ \ \ \ = \left[ \begin{matrix} v_{11} & v_{12} & ... & v_{1k} \\ v_{21} & v_{22} & ... & v_{2k} \\ ... & ... & ... & ...\\ v_{n1} & v_{n2} & ... & v_{nk} \end{matrix} \right] \times \left[ \begin{matrix} v_{11} & v_{21} & ... & v_{n1} \\ v_{12} & v_{22} & ... & v_{n2} \\ ... & ... & ... & ...\\ v_{1k} & v_{2k} & ... & v_{nk} \end{matrix} \right]


W^\star 矩阵对角线上面的元素即为交叉项的参数。

FM的模型方程为(本文不讨论FM的高阶形式):

\hat{y}(X):=\omega_0+\sum_{i=1}^{n}{\omega_ix_i}+\sum_{i=1}^{n-1}{\sum_{j=i+1}^{n}{<v_i,v_j>x_ix_j}} (2)

<v_i,v_j>:=\sum_{f=1}^{k}{v_{i,f}\cdot v_{j,f}}

其中, v_i 是第 i 维特征的隐向量, ⟨⋅,⋅⟩ 代表向量点积。隐向量的长度为 k(k<<n) ,包含 k 个描述特征的因子。根据公式(2),二次项的参数数量减少为 kn 个,远少于多项式模型的参数数量。另外,参数因子化使得 x_hx_i 的参数和 x_ix_j 的参数不再是相互独立的,因此我们可以在样本稀疏的情况下相对合理地估计FM的二次项参数。具体来说,x_hx_ix_ix_j的系数分别为 ⟨v_h,v_i⟩⟨v_i,v_j⟩ ,它们之间有共同项 v_i 。也就是说,所有包含“ x_i 的非零组合特征”(存在某个 j\ne i ,使得 x_ix_j≠0 )的样本都可以用来学习隐向量v_i,这很大程度上避免了数据稀疏性造成的影响。而在多项式模型中, w_{hi}w_{ij} 是相互独立的。

而且隐向量可以表示之前没有出现过的交叉特征,假如在数据集中经常出现 <男,篮球> ,<女,化妆品>,但是没有出现过<男,化妆品>,<女,篮球>,这时候如果用 w_{ij} 表示<男,化妆品> 的系数,就会得到0。但是有了男特征和化妆品特征的隐向量之后,就可以通过来求解 < v 男, v 化妆品> 来求解。

显而易见,公式(2)是一个通用的拟合方程,可以采用不同的损失函数用于解决回归、二元分类等问题,比如可以采用MSE(Mean Square Error)损失函数来求解回归问题,也可以采用Hinge/Cross-Entropy 损失来求解分类问题。当然,在进行二元分类时,FM的输出需要经过sigmoid变换,这与Logistic回归是一样的。直观上看,FM的复杂度是 O(kn^2) 。但是,通过公式(3)的等式,FM的二次项可以化简,其复杂度可以优化到 O(kn) 。由此可见,FM可以在线性时间对新样本作出预测。

公式(2)推导如下:

ab+ac+bc = \frac{1}{2}\left[(a+b+c)^2-(a^2+b^2+c^2) \right]

\begin{align*} \sum_{i=1}^{n-1}{\sum_{j=i+1}^{n}{<v_i,v_j>x_ix_j}} &= \frac{1}{2}\sum_{i=1}^{n}{\sum_{j=1}^{n}{<v_i,v_j>x_ix_j}} - \frac{1}{2} {\sum_{i=1}^{n}{<v_i,v_i>x_ix_i}} \\ &= \frac{1}{2} \left( \sum_{i=1}^{n}{\sum_{j=1}^{n}{\sum_{f=1}^{k}{v_{i,f}v_{j,f}x_ix_j}}} - \sum_{i=1}^{n}{\sum_{f=1}^{k}{v_{i,f}v_{i,f}x_ix_i}} \right) \\ &= \frac{1}{2}\sum_{f=1}^{k}{\left[ \left( \sum_{i=1}^{n}{v_{i,f}x_i} \right) \cdot \left( \sum_{j=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{align*}

解释:
v_{i,f} 是一个具体的值;
第1个等号:对称矩阵 W 对角线上半部分;
第2个等号:把向量内积 v_i,v_j 展开成累加和的形式;
第3个等号:提出公共部分;
第4个等号: ij 相当于是一样的,表示成平方过程。


采用随机梯度下降法SGD求解参数

\begin{equation} \frac{\partial \hat{y}(x) }{\partial \theta} = \left\{ \begin{array}{lr} 1, & if\ \theta\ is\ \omega_0 \\ x_i, & if\ \theta\ is\ \omega_i\\ x_i\sum_{j=1}^{n}{v_{j,f}x_j - v_{i,f}x_i^2} & if\ \theta\ is\ v_{i,f} \end{array} \right. \end{equation}

由上式可知,v_{i,f}的训练只需要样本的 x_i 特征非0即可,适合于稀疏数据

在使用SGD训练模型时,在每次迭代中,只需计算一次所有 f\sum_{j=1}^{n}{v_{j,f}x_j}

就能够方便得到所有v_{i,f}的梯度,上述偏导结果求和公式中没有 i ,即与 i 无关,只与 f 有关,显然计算所有f\sum_{j=1}^{n}{v_{j,f}x_j}的复杂度是 O(kn) ,模型参数一共有 nk + n + 1 个。因此,FM参数训练的复杂度也是 O(kn)。综上可知,FM可以在线性时间训练和预测,是一种非常高效的模型。


关于隐向量V

这里的 v_ix_i 特征的低纬稠密表达,实际中隐向量的长度通常远小于特征维度N,在我做的实验中长度都是4。在实际的CTR场景中,数据都是很稀疏的category特征,通常表示成离散的one-hot形式,这种编码方式,使得one-hot vector非常长,而且很稀疏,同时特征总量也骤然增加,达到千万级甚至亿级别都是有可能的,而实际上的category特征数目可能只有几百维。FM学到的隐向量可以看做是特征的一种embedding表示,把离散特征转化为Dense Feature,这种Dense Feature还可以后续和DNN来结合,作为DNN的输入,事实上用于DNN的CTR也是这个思路来做的。


参考资料:

深入FFM原理与实践 -

blog.csdn.net/asd136912

编辑于 2018-07-09 09:37