因子分解机FM

因子分解机

因子分解机(Factorization Machine,FM),又称分解机,是由Steffen Rendle最早于2010年在ICDM会议Factorization Machines论文中提出,旨在解决大规模稀疏数据下的特征组合问题。传统机器学习方法,假设各特征之间相互独立,没有考虑特征间存在相互作用的情况,主要关注如何对特征赋予权重的问题。

FM 研究背景

在实际应用中,Categorical类型特征经过One-Hot编码之后,大部分样本数据是比较稀疏的。以广告CTR/CVR为例,用户的性别、职业、教育水平、用户偏好、商品品类等,经过One-Hot编码转换后都会导致样本数据的稀疏性。比如商品品类这种类型特征,假设商品末级品类有550个,采用One-Hot编码生成550个数值特征,但每个样本的550个特征中,有且仅有一个数值为非零,由此可见,数据的稀疏性在实际应用中不可避免。而One-Hot编码的另一特点是会导致特征空间剧增。

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

如何刻画特征之间的关联,最直接的方法是构造组合特征,特征之间的关联信息在浅层学习模型(LR、SVM)是做不到的,目前工业界主要有两种手段得到组合特征:

  • 人工特征工程(数据分析 + 人工构造)
  • 通过模型做组合特征的学习(深度学习方法、FM/FFM/DeepFM方法)

多项式模型是包含特征组合的最直观的模型,用 w i j w_ij 表示特征 x i x_i x j x_j 的组合,即 x i x_i x j x_j 都非零时,组合特征 x i x j x_ix_j 才有意义。以二阶组合特征为例,二阶多项式模型表达式如下:
y ( x ) = w 0 + i = 1 n w i x i + i = 1 n j = i + 1 n w i j x i x j y(x)=w_0+\sum_{i=1}^nw_ix_i+\sum_{i=1}^n\sum_{j=i+1}^nw_{ij}x_ix_j 由上式可知,二阶组合特征的参数一共有 C n 2 = n ( n 1 ) 2 C_n^2 = \frac{n(n-1)}{2} 个,任意两个参数都是相互独立的。然而,实际应用场景中数据稀疏性是普遍存在的,二次项系数的训练是非常困难的。其原因在于回归模型的参数 w w 的学习结果是从训练样本中计算充分统计量(凡是符合指数族分布的模型都具有此性质),而在这里交叉项的每一个参数 w i j w_ij 的学习过程需要大量的 x i x_i x j x_j 同时非零的训练样本数据。而实际场景中样本的稀疏性导致能够满足“ x i x_i x j x_j 同时非零”的样本数会更少,训练样本不充分,学到的参数 w i j w_ij 就不是充分统计量的结果, w i j w_ij 不准确严重影响模型预测的效果和稳定性。

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

FM 原理及推导

受矩阵分解(Matrix Factorization,MF)的启发,参考上一篇SVD系列算法浅析,在Model-based的协同过滤中,一个rating矩阵被分解为user矩阵和item矩阵,每个user和item都可以采用一个隐向量表示。如下图所示,将每个user表示成一个二维向量,同时把每个item表示成一个二维向量,两个向量的点积就是矩阵中user对item的评分。
在这里插入图片描述
类似的,所有二次项参数 w i j w_ij 可以组成一个对称矩阵 W W ,那么矩阵可以分解为 W = V T V W=V^TV V V 的第 j j 列就是第 j j 维特征的隐向量。换言之,每个参数表示为 w i j = v i , v j w_{ij}=⟨v_i,v_j⟩ ,这就是FM模型的核心思想。因此FM的二阶模型表达式为:
y ( x ) = w 0 + i = 1 n w i x i + i = 1 n j = i + 1 n v i , v j x i x j      ( 2 ) y(x)=w_0+\sum _{i=1}^nw_ix_i+\sum_{i=1}^n\sum_{j=i+1}^n⟨vi,vj⟩x_ix_j \ \ \ \ (2) 其中, v i v_i 是第 i i 维特征的隐向量, , ⟨⋅,⋅⟩ 代表向量点积运算,计算公式为:
v i , v j = f = 1 k v i , f v j , f ⟨v_i,v_j⟩=\sum_{f=1}^kv_{i,f}·v_{j,f} k k 是隐向量的维度,且 ( k < < n ) (k<<n) ,包含 k k 个描述特征的因子。

模型分析如下:

  • 线性模型 + 交叉项:前两项是线性回归模型的表达式,最后一项是二阶特征交叉项(组合特征项),表示模型将两个互异的特征分量之间的关联信息考虑进来。用交叉项表示组合特征,从而建立特征与结果之间的非线性关系。
  • 交叉项系数 -> 隐向量内积:由于FM模型是在线性回归基础上加入特征交叉项,模型求解时不直接求特征交叉项的系数 w i j w_ij (因为对应的组合特征数据稀疏,参数学习不充分),故而采用隐向量的内积 v i , v j ⟨v_i,v_j⟩ 表示 w i j w_{ij} 。具体的求解过程是FM对每个特征分量 x i x_i 引入隐向量 v i ( v i , 1 , v i , 2 , , v i , k ) v_i=(v_{i,1},v_{i,2},⋯,v_{i,k}) ,利用 v i v j T v_iv^T_j 内积对交叉项系数进行估计。因此二次项的参数数量减少为 k n kn 个,远少于多项式模型的参数数量。

此外,参数因子化表示后,使得 x h x i x_hx_i x i x j x_ix_j 的参数不再相互独立,因此可以在样本系数相对合理的情况下估计FM模型交叉项的参数。具体来说:
v h , v i = f = 1 k v h , f v i , f v i , v j = f = 1 k v i , f v j , f ⟨v_h,v_i⟩=\sum_{f=1}^k v_{h,f}·v_{i,f} \\ ⟨v_i,v_j⟩=\sum_{f=1}^k v_{i,f}·v_{j,f} v h , v i ⟨v_h,v_i⟩ v i , v j ⟨v_i,v_j⟩ 之间有共同项 v i v_i ,也就是说,所有包含 x i x_i 的非零组合特征(存在某个 j i j≠i ,使得 x i x j 0 x_ix_j≠0 )的样本都可以用来学习隐向量 v i v_i ,这在很大程度上避免了数据稀疏行造成参数估计不准确的影响。而在多项式模型中, w h i w_hi w i j w_ij 是相互独立的。

直观上看,FM模型的复杂度是 O ( k n 2 ) O(kn^2) ,通过以下变换可以将复杂度优化到 O ( k n ) O(kn) ,详细推导如下:
i = 1 n j = i + 1 n v i , v j x i x j = 1 2 i = 1 n f = 1 n v i , v j x i x j 1 2 i = 1 n v i , v i x i x i = 1 2 ( i = 1 n j = 1 n f = 1 k v i , f v j , f x i x j i = 1 n f = 1 k v i , f v i , f x i x i ) = 1 2 f = 1 k [ ( i = 1 n v i , f x i ) ( j = 1 n v j , f x j ) i = 1 n v i , f 2 x i 2 ] = 1 2 f = 1 k [ ( i = 1 n v i , f x i ) 2 i = 1 n v i , f 2 x i 2 ] \sum_{i=1}^n\sum_{j=i+1}^n⟨v_i,v_j⟩x_ix_j =\frac{1}{2}\sum_{i=1}^n\sum_{f=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}(\sum_{i=1}^n\sum_{j=1}^n\sum_{f=1}^kv_{i,f}v_{j,f}x_ix_j-\sum_{i=1}^n\sum_{f=1}^kv_{i,f}v_{i,f}x_ix_i) \\ =\frac{1}{2}\sum_{f=1}^k[(\sum_{i=1}^nv_{i,f}x_i)·(\sum_{j=1}^nv_{j,f}x_j)-\sum_{i=1}^nv_{i,f}^2x_i^2] \\ =\frac{1}{2}\sum_{f=1}^k[(\sum_{i=1}^nv_{i,f}x_i)^2- \sum_{i=1}^nv_{i,f}^2x_i^2] 张俊林老师在推荐系统召回四模型之:全能的FM模型给出了Step-by-Step的推导,在此附上我个人的理解,把隐向量 v i v_i 可以看做实数,便于理解矩阵的转换,因为向量点积的结果就是一个实数。这样第一步就很容易理解,由于对称矩阵的性质,将求上三角矩阵转换为全矩阵减去对角线上的元素。第二步很简单,向量点积的展开。第三步可理解为提取公因式,第四步就是一个简单的变量替换。

如果采用随机梯度下降SGD来求模型参数,那么各个参数的梯度如下:
θ y ( x ) = { 1 ,    i f   θ   i s   w 0 ( 常数项 ) x i ,   i f   θ   i s   w i ( 线性项 ) x i Σ n j = 1 v j , f x j v i , f x i 2 ,   i f   θ   i s   v i , f ( 交叉项 ) \frac{\partial}{\partial\theta}y\left(x\right)=\left\{\begin{array}{l} 1,\ \ if \ \theta\ is\ w_0\left(\textrm{常数项}\right)\\ x_i,\ if \ \theta\ is\ w_i\left(\textrm{线性项}\right)\\ x_i\underset{j=1}{\overset{n}{\varSigma}}v_{j,f}x_j-v_{i,f}x_{i}^{2},\ if \ \theta\ is\ v_{i,f}\left(\textrm{交叉项}\right)\\ \end{array}\right. 由于 Σ n j = 1 v j , f x j \underset{j=1}{\overset{n}{\varSigma}}v_{j,f}x_j 只和 f f 有关,在参数迭代过程中,只需要计算第一次所有 f f Σ n j = 1 v j , f x j \underset{j=1}{\overset{n}{\varSigma}}v_{j,f}x_j ,就能够方便地得到所有 v j , f v_{j,f} ,显然计算所有 f f Σ n j = 1 v j , f x j \underset{j=1}{\overset{n}{\varSigma}}v_{j,f}x_j 的复杂度是 O ( k n ) O(kn) ;已知 Σ n j = 1 v j , f x j \underset{j=1}{\overset{n}{\varSigma}}v_{j,f}x_j 时,计算每个参数梯度的复杂度是 O ( n ) O(n) ;得到梯度后,更新每个参数的复杂度是 O ( 1 ) O(1) ;模型一共有 n k + n + 1 nk+n+1 个,因此FM参数训练的时间复杂度是 O ( k n ) O(kn)

公式(2)是一个通用的拟合方程,可以用不同的损失函数用于解决回归、二分类问题,比如采用MSE损失函数来求解回归问题,也可以用Hinge、Cross-Entropy损失来求解分类问题,当然进行二分类时,FM的输出需要经过Sigmoid变换,这于Logistic回归是一样的。

FM 模型优点

FM算法可以在线性时间内完成模型训练,以及对新样本做出预测,是一个非常高效的模型。总结来说,FM模型对稀疏数据有更好的学习能力,通过交互项可以学习特征之间的关联关系,并且保证了学习效率和预估能力。

FM降低了交叉项参数学习不充分的影响

通过将每一维特征用 k k 维隐向量表示,交叉项的参数 w i j w_{ij} 用对应特征隐向量的内积表示,降低了因样本数据稀疏,导致交叉项参数学习不充分的影响。如下表:

共现交叉特征 样本数 备注
<女性,汽车> 500 同时出现<女性,汽车>的样本数
<女性,化妆品> 1000 同时出现<女性,化妆品>的样本数
<男性,汽车> 1500 同时出现<男性,汽车>的样本数
<男性,化妆品> 0 样本中无此特征组合项

<女性,汽车>的含义是女性看汽车广告。可以看到,但特征对应的样本数远大于组合特征对应的样本数。训练时,但特征参数相比交叉项特征参数会学习地更充分。因此,可以说FM降低了因数据稀疏,导致交叉项参数学习不充分的影响。

FM提升了模型预估能力

依然看上面的示例,样本中没有没有<男性,化妆品>交叉特征,即没有男性看化妆品广告的数据。如果用多项式模型来建模,对应的交叉项参数 w w_{男性,化妆品} 是学不出来的,因为数据中没有对应的共现交叉特征。由于FM学习的参数就是单特征的隐向量,那么男性看化妆品广告的预估结果可以得到。这样,即便训练集中没有出现男性看化妆品广告的样本,FM模型仍然可以用来预估,提升了预估的能力。

FM提升了参数学习效率

显而易见,模型训练复杂度由 O ( k n 2 ) O(kn^2) 降到 O ( k n ) O(kn) ,其中 n n 为训练样本数。对于训练样本和特征数而言,都是线性复杂度。此外,FM模型是在多项式模型的基础上对参数的计算做了调整,因此也有人称FM模型为多项式的广义线性模型。

FM 应用场景

FM可用于各类预测任务中,包括:

  • 回归问题Regression
  • 二分类问题Binary Classification,可以通过hinge loss或者logit loss来训练二元分类问题。
  • 排序问题Ranking,对于排序学习问题(如pairwise),我们可以利用排序算法相关的loss函数来训练FM模型,利用FM模型来做排序学习。

FM vs 其他模型

FM vs MF
  • FM是一种比较灵活的模型,通过合适的特征变换,FM可以模拟二阶多项式核的SVM模型、MF模型、SVD++模型等。论文中FM是“”general predictor”,而SVD++、PITF、FPMC等都是“specialized models”。
  • 相比MF中把rating评分写为 r u i β u + γ i + x u T y i r_{ui}∼β_u+γ_i+x^T_uy_i ,这其实是只有两类特征user和item的FM模型,即MF只是FM的特例。换言之,MF只能局限于这两类特征,而FM可以加任意多的特征,比如user的历史购买平均值、item的历史购买平均值等等。在扩展性上,FM远胜MF。
FM vs SVM
  • 相比二阶多项式核的SVM来说,FM在样本稀疏情况下是有优势的。而且FM的训练和预测复杂度都是线性的,而二阶多项式核SVM需要计算核矩阵,是 O ( n 2 ) O(n^2) 级别的复杂度。
  • 多项式SVM交叉的多个特征需要在训练集上共现才能被学习到,否则该对应的参数就为0,这样对于测试集上的case而言这样的特征就失去了意义,因此在稀疏条件下,SVM表现并不能让人满意。而FM不一样,通过向量化的交叉,可以学习到不同特征之间的交互,进行提取到更深层次的抽象意义。
  • FM可以在原始形式下进行优化学习,而基于kernel的非线性SVM通常需要在对偶形式下进行
  • FM的模型预测是与训练样本独立,而SVM则与部分训练样本有关,即支持向量。

Reference

发布了11 篇原创文章 · 获赞 2 · 访问量 664

猜你喜欢

转载自blog.csdn.net/liheng301/article/details/105118669