推荐算法之FM算法系列

3,168 阅读9分钟

女神图开篇

FM(Factorization Machine),因子分解机,是近几年推荐系统常用的一类算法。

本文讲解FM, FFM, DeepFM 算法,重点要先深刻理解FM算法。

FM

  • 是什么:FM(Factorization Machine)因子分解机,最早是由Konstanz大学Steffen Rendle(现任职于Google)于2010年最早提出的,旨在解决稀疏数据下的特征组合问题。

  • 针对的问题:类别特征是非常常见的,对类别特征一般先One-Hot编码。One-Hot编码的一个特点就是导致特征空间大。例如,商品品类有550维特征,一个categorical特征转换为550维数值特征,特征空间剧增。又比如在腾讯广告2020赛题中,广告所属行业(industry)有326种,(industry)这一个特征在one-hot转化后会变成326个特征,这些特征是非常稀疏的(326个特征只有一个是1,其它是0)。这种情况在真实场景中广泛存在。

  • 解决上面问题的出发点:特征之间是有关系的。通过观察大量的样本数据可以发现,某些特征经过关联之后,与label之间的相关性就会提高。例如,“USA”与“Thanksgiving”、“China”与“Chinese New Year”这样的关联特征,对用户的点击有着正向的影响。引入特征的组合是非常有意义的。多个特征组合复杂度太高,一般用两个特征的组合

  • 多项式模型是包含特征组合的最直观的模型。二阶组合模型如下:

    y(x) = w_{0} + \sum_{i=1}^{n}w_{i}x_{i}+ \sum_{i=1}^{n}\sum_{j=i+1}^{n}w_{ij}x_{i}x_{j}

    其中,n代表样本的特征数量,x_{i} 是第 i 个特征的值,w0、wi、wij 是模型参数。在多项式模型中,特征 xixj 的组合采用 xixj 表示,即 xixj 都非零时,组合特征 xixj 才有意义。

  • 该模型问题:

    1. 特征数量为N,则该模型二次项参数为 \frac{N(N-1)}{2}个,复杂度太高
    2. 在数据稀疏性普遍存在的实际应用场景中,二次项参数的训练是很困难的。因为做One-Hot编码后的大部分特征都是0,xi\ xj同时非0的样本少。训练样本的不足,很容易导致参数wij 不准确,最终将严重影响模型的性能。
  • 解决的思路:数学分析。观察,所有二次项系数可以构成对称矩阵 W,对称矩阵可以分解,W=V^{T}V。每个参数 wij=⟨vi,vj⟩,注意其中w_{ij}是特征x_{i}x_{j}的组合系数,是标量;v_{i} 是表示特征x_{i}向量 。这就是FM模型的核心思想。则FM的模型方程为

    y(x) = w_{0} + \sum_{i=1}^{n}w_{i}x_{i}+ \sum_{i=1}^{n}\sum_{j=i+1}^{n}<V_{i}\cdot V_{j}>x_{i}x_{j}
  • 该分解的物理意义:利用了推荐系统中的矩阵分解思想,实际就是LFM(latent factor model)隐因子模型。其中v_{i}是第i个特征的隐向量,隐向量的长度为k(k<<n),包含 k个描述特征的因子。这样二次项参数从原来的\frac{N(N-1)}{2}个减少到k\cdot n(k<<n)

样本 x_{1}(industry_{[1]}) x_{2} (industry_{[2]}) x_{3}(industry_{[3]}) x_{4}(gender) y_{label}
样本1 1 0 0 0 1
样本2 0 1 0 1 0
样本3 0 0 1 0 1

对于样本2:X_2={0,1,0,2} 的所有二次项组合为:

\begin {align}\sum_{i=1}^{4}\sum_{j=i+1}^{4}w_{ij}x_{i}x_{j} &=w_{12}(x_{1}x_{2})+w_{13}(x_{1}x_{3})+w_{14}(x_{1}x_{4})+w_{23}(x_{2}x_{3})+w_{24}(x_{2}x_{4})+w_{34}(x_{3}x_{4}) = w_{24}(x_2x_4)\end{align}

如果 取k=2,用v_{i}=(v_{i1},v_{i2}),i=1,2,3,4 表示x_{i}, 此时二次项组合可以转化为:

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

\begin{align}\sum_{i=1}^{n}\sum_{j=i+1}^{n}<V_{i}\cdot V_{j}>x_{i}x_{j} &= \frac{1}{2}\left( \sum_{i=1}^{n}\sum_{j=1}^n<V_i\cdot V_j>x_ix_j -\sum_{i=1}^n<V_i\cdot V_i>x_ix_i \right) \\& = \frac{1}{2}\left( \sum_{i=1}^{n}\sum_{j=1}^n(\sum_{f=1}^k v_{if}v_{jf}) x_ix_j -\sum_{i=1}^n (\sum_{f=1}^k v_{if}v_{if})x_ix_i \right) \\& = \frac{1}{2}\sum_{f=1}^k \left[ (\sum_{i=1}^nv_{if}x_i)\cdot (\sum_{j=1}^n v_{jf}x_j)-\sum_{i=1}^nv_{if}^2 x_i^2      \right] \\& = \frac{1}{2}\sum_{f=1}^k \left[ (\sum_{i=1}^nv_{if}x_i)^2 - \sum_{i=1}^n v_{if}^2 x_i^2      \right]\end{align}
  • 该等式原来需要x_i\not = 0,x_j\not=0 才能计算,这样的样本很少。通过隐向量因子分解的思想,等价变形成右式,只用满足x_i\not = 0 即可。解决了原来存在的问题,且参数量变少。

此时样本2: X_2={0,1,0,2} 的特征组合可以表示为:

\sum_{i=1}^{4}\sum_{j=i+1}^{4}<V_{i}\cdot V_{j}>x_{i}x_{j}=\frac{1}{2}\sum_{f=1}^k \left[(v_{2f}+v_{4f} )^2-(v_{2f}^2x_2^2+v_{4f}^2x_4^2) \right]
  • 对比:注意我们是用所有的样本学习这些模型参数。原来学习参数 w_{12} 时样本1,2,3都用不上, w_{12} 就学不出来,代表 x_1x_2 特征无法组合。但是转化后可以间接计算组合特征。
  • 可以利用SGD(Stochastic Gradient Descent)训练模型。FM参数训练的复杂度为O(kn) ,FM可以在线性时间训练和预测,是一种非常高效的模型。
  • 物理意义:转化后计算组合特征的物理意义是什么?注意这里我们公式之所以能这么化简,是因为我们做了假设:即每一个特征都可以用一个k 维的隐向量来表示
  • 这个假设在实际中一定永远成立吗?显然不一定。例如 行业(industry)特征做one-hot后,不同行业都用k 维向量表示还行,但此时性别(gender)特征又怎么能也用k 维向量表示呢?这显然不太合理。若该假设有问题,则公式不成立。
  • FM是一种比较灵活的模型,通过合适的特征变换方式,FM可以模拟二阶多项式核的SVM模型、MF模型、SVD++模型等
  • 碎碎念:跟当初学习理解物理公式差不多,难理解的不是公式的数学推导,而是推导背后的物理意义。

FFM

  • 是什么:FFM(Field-aware Factorization Machine)最初的概念来自Yu-Chin Juan与其比赛队员,是他们借鉴了来自Michael Jahrer的论文[14]中的field概念提出了FM的升级版模型。通过引入field的概念,FFM把相同性质的特征归于同一个field。(FFM原始论文)

  • 碎碎念:深入理解FM算法的假设其实不难发现这个问题,通过我上面的分析自然会想到这种改进。竟然少有博客提到这点,说明理解思考不透彻。 其实应该直接看原始论文的,基本都是对论文的解读。这篇理解还不错美团这篇讲得不太清楚

  • FFM模型方程:

    y(x) = w_{0} + \sum_{i=1}^{n}w_{i}x_{i}+ \sum_{i=1}^{n}\sum_{j=i+1}^{n}<V_{i,f_i}\cdot V_{j,f_j}>x_{i}x_{j}

    FM算法所有特征都用同样长度的隐向量表示,x_i 的隐向量为 \vec{V_{i}}=(v_1,v_2 \cdots,v_k) ;FFM算法把不同种类(即所说的不同filed)的用不同意义的隐向量表示。

  • 简单理解举例:如上样本图。有326个行业(industry)feature,每个行业假如用20维隐向量表示,每一维向量有它的意义,比如某一维的值意义是代表行业工资or行业男女比(举例);但是有2个性别(gender)特征,每种性别如果也用20维向量表示,某一维的值意义和行业(industry)是不同的。所以要分种类,即326个行业(industry)特征 x_{1}(industry_{[1]}) x_{2}(industry_{[2]}) x_{3}(industry_{[3]}) 属于种类(filed),2个性别(gender)特征属于另一个种类(filed)。

  • 特征两两组合时:

    \begin{align}\sum_{i=1}^{n}\sum_{j=i+1}^{n}w_{ij}x_{i}x_{j} &= \sum_{i=1}^{n}\sum_{j=i+1}^{n}<V_{i}\cdot V_{j}>x_{i}x_{j} = \frac{1}{2}\sum_{f=1}^k \left[ (\sum_{i=1}^nv_{if}x_i)^2 - \sum_{i=1}^n v_{if}^2 x_i^2      \right]  \qquad \qquad (FM) \\& = \sum_{i=1}^{n}\sum_{j=i+1}^{n}<V_{i,f_i}\cdot V_{j,f_j}>x_{i}x_{j} \qquad \qquad(FFM)\end{align}
  • 假设样本的 n 个特征属于 f个field,则FFM模型参数量为 nkf 个。当f=1,即所有特征当作同一个种类(filed)时,FFM就变成FM了。

  • FFM核心问题:怎样在计算中体现不同的field?原来一个特征只有一个隐向量,现在一个特征有 f 个隐向量。一个特征使用哪个隐向量看另一个组合特征。

  • FFM原始论文核心方程:

    \phi_{FFM} (\boldsymbol w,\boldsymbol x) = \sum_{j_1=1}^n\sum_{j_2=j_1+1}^n (w_{j_1,f_{j2}} \cdot w_{j_2,f_{j1}})(x_{j1}x_{j2})

    公式中,f_{j1},f_{j2}j_1,j_2 对应的field。如果是特征 j_1,j_3 组合,对应的是 f_{j1},f_{j3} 。懂我意思吧。

  • 原论文有一些训练和具体应用的说明,此处略,解读见 美团这篇

DeepFM

  • DeepFM基于google提出的 wide&deep 模型, 就是wide部分用FM,deep部分仍用DNN。(DeepFM原始论文)

  • 这是wide&deep 模型图

  • 这是DeepFM模型图

对比两图应该不难明白。

  • wide和deep部分分别在学习不同阶的特征交叉,deep部分学到高阶交叉,而wide部分学到的是二阶交叉。
  • 用FM替换了这里wide部分的二阶交叉,是得模型对高度稀疏的特征的建模更加有效,因为高度稀疏特征简单的叉积变换也难以有效地学到二阶交叉
  • 因此,很自然的想法就是,用FM替换这里的二阶交叉,得到DeepFM模型 (参考)