FM分解机及其变种(FFM、DeepFM)原理详解

FM算法

本文先简要总结了FM相关的基本知识,然后转载了FM原理的具体推导。

一、背景

在传统的线性模型如LR中,每个特征都是独立的,如果需要考虑特征与特征直接的交互作用,可能需要人工对特征进行交叉组合;非线性SVM可以对特征进行kernel映射,但是在特征高度稀疏的情况下,并不能很好地进行学习
FM(Factorization Machine)主要是为了解决数据稀疏的情况下,特征怎样组合的问题。
对于普通的线性模型:
y = w 0 + ∑ i = 1 n w i x i y=w_0+\sum^n_{i=1}w_ix_i y=w0+i=1nwixi
将各个特征独立考虑,并没有考虑特征与特征之间的关系。
对于多项式模型:
y = w 0 + ∑ i = 1 n w i x i + ∑ i = 1 n − 1 ∑ j = i + 1 n w i j x i x j y=w_0+\sum^n_{i=1}w_ix_i+\sum^{n-1}_{i=1}\sum^n_{j=i+1}w_{ij}x_ix_j y=w0+i=1nwixi+i=1n1j=i+1nwijxixj
通常情况下只考虑两阶多项式模型,也就是特征两两组合的问题,但对于观察样本中未出现过交互的特征分量,wij=0,即不能对相应的参数进行估计

二、目标函数

FM的思路为,在多项式模型的基础上,通过矩阵分解的方法,为了求解 w i j w_{ij} wij,为每一个特征分量xi引入辅助向量 V i = ( v i 1 , v i 2 , . . . , v i k ) V_i=(v_{i1},v_{i2},...,v_{ik}) Vi=(vi1,vi2,...,vik),然后用 v i v j T v_iv_j^T vivjT w i j w_{ij} wij进行求解。

y = w 0 + ∑ i = 1 n w i x i + ∑ i = 1 n − 1 ∑ j = i + 1 n ( v i v j T ) x i x j y=w_0+\sum^n_{i=1}w_ix_i+\sum^{n-1}_{i=1}\sum^n_{j=i+1}(v_iv_j^T)x_ix_j y=w0+i=1nwixi+i=1n1j=i+1n(vivjT)xixj
从上式可以看出二项式的参数数量由原来的 n ( n − 1 ) 2 \frac{n(n−1)}{2} 2n(n1)个减少为 n k nk nk个,远少于多项式模型的参数数量。

为什么要通过向量v的学习方式而不是简单的wij参数呢?

在稀疏条件下,这样的表示方法打破了特征的独立性,能够更好地挖掘特征之间的相关性。 以电影评分为例,我们要估计用户A和电影ST的关系w(A&ST)以更好地预测y,如果是简单地考虑特征之间的共现情况来估计w(A&ST),从已有的训练样本来看,这两者并没有共现,因此学习出来的w(A&ST)=0。而实际上,A和ST应该是存在某种联系的,从用户角度来看,A和B都看过SW,而B还看过ST,说明A也可能喜欢ST。而通过向量v来表示用户和电影,任意两两之间的交互都会影响v的更新,从前面举的例子就可以看过,A和B看过SW,这样的交互关系就会导致v(ST)的学习更新。即,参数因子化使得 x h x i x_hx_i xhxi的参数和 x h x j x_hx_j xhxj的参数不再相互独立,因为有了 x h x_h xh特征关联。因此我们可以在样本系数的情况下相对合理地估计FM的二次项参数。

求解 < v i , v j > <v_i,v_j> <vi,vj>,主要采用公式 ( a + b ) 2 − a 2 − b 2 (a+b)^2-a^2-b^2 (a+b)2a2b2来求出交叉项:
∑ i = 1 n − 1 ∑ j = i + 1 n ( v i v j T ) x i x j = 1 2 ∑ l = 1 k [ ( ∑ i = 1 n ( v i l x i ) 2 − ∑ i = 1 n v i l 2 x i 2 ] \sum^{n-1}_{i=1}\sum^n_{j=i+1}(v_iv_j^T)x_ix_j = \frac{1}{2}\sum^k_{l=1}[(\sum^n_{i=1}(v_{il}x_{i})^2-\sum^n_{i=1}v_{il}^2x_{i}^2] i=1n1j=i+1n(vivjT)xixj=21l=1k[(i=1n(vilxi)2i=1nvil2xi2]
FM的复杂度为 O ( k n 2 ) O(kn^2) O(kn2),通过上述等式的改写,可将复杂度降为线性的 O ( k n ) O(kn) O(kn)。因此,FM可以在线性时间对新样本做出预测,复杂度和LR模型一样,且效果提升不少。

前面提到到都是二元交叉,其实可以延伸到多元交叉,目标函数依然可以通过变形在线性时间内完成。

三、训练算法

FM可用于各种预测任务,如回归、分类、排序等。
对于回归问题,损失函数可为最小平方误差。
对于二分类问题,损失函数可为hinge loss( l o s s ( y , y ′ ) = m a x { 0 , 1 − y ′ y } loss(y,y')=max\{ 0,1-y'y\} loss(y,y)=max{0,1yy})或logit loss( l o s s ( y , y ′ ) = − l n σ ( y y ′ ) loss(y,y')=-ln \sigma (yy') loss(y,y)=lnσ(yy) )函数。
对于排序问题,x可能需要转化为pair-wise的形式如 ( X a , X b ) (X^a,X^b) (Xa,Xb),损失函数可以采用pairwise loss。

可以采用随机梯度下降(SGD)来训练优化FM模型。
同时可加入正则项。
对于任意的FM的所有模型参数 θ \theta θ,存在两个与 θ \theta θ取值无关的函数,使得成立
y = g θ ( x ) + θ h θ ( x ) y=g_\theta(x)+\theta h_\theta(x) y=gθ(x)+θhθ(x)

因此可以算得y对θ的偏导数,即各参数的梯度如下:
在这里插入图片描述

四、FM 对比 其他算法

FM对比SVM

  • SVM的二元特征交叉参数是独立的,而FM的二元特征交叉参数是两个k维的向量vi、vj,交叉参数就不是独立的,而是相互影响的。
  • FM可以在原始形式下进行优化学习,而基于kernel的非线性SVM通常需要在对偶形式下进行
  • FM的模型预测是与训练样本独立,而SVM则与部分训练样本有关,即支持向量

为什么线性SVM在和多项式SVM在稀疏条件下效果会比较差呢?
线性svm只有一维特征,不能挖掘深层次的组合特征,在实际预测中并没有很好的表现;而多项式svm正如前面提到的,交叉的多个特征需要在训练集上共现才能被学习到,否则该对应的参数就为0,对于测试集上的case而言,这样的特征就失去了意义,因此在稀疏条件下,SVM表现并不能让人满意。而FM不一样,通过向量化的交叉,可以学习到不同特征之间的交互,进行提取到更深层次的抽象意义。

FM 对比 其他分解模型Fac torization Model

这部分不详述,其他分解模型包括Matrix factorization (MF)、SVD++、PITF for Tag Recommendation、Factorized Personalized Markov Chains (FPMC),这些模型都只在特定场景下使用,输入形式也比较单一(比如MF只适用于categorical variables),而FM通过对输入特征进行转换,同样可可以实现以上模型的功能,而且FM的输入可以是任意实数域的数据,因此FM是一个更为泛化和通用的模型。
详细内容参考:https://www.csie.ntu.edu.tw/~b97053/paper/Rendle2010FM.pdf

总结

FM优点:
主要考虑到,FM模型是SVM模型与factorization模型的结合。

  • FM模型可以在非常稀疏的数据中进行合理的参数轨迹,而SVM做不到这点。
  • FM模型的复杂度是线性的,优化效果很好,而且不需要像SVM一样依赖于支持向量。
  • FM是一个通用模型,它可以用于任何特征值为实值的情况。而其他因式分解模型只能用于一些输入数据比较固定的情况。

FFM算法(Field-aware Factorization Machine)

FFM在FM的基础上进一步改进,在模型中引入类别的概念,即field。将同一个field的特征单独进行one-hot,因此在FFM中,每一维特征都会针对其他特征的每个field,分别学习一个隐变量,该隐变量不仅与特征相关,也与field相关
假设样本的n个特征属于f个field,那么FFM的二次项有nf个隐向量。而在FM模型中,每一维特征的隐向量只有一个。FM可以看做FFM的特例,把所有特征都归属到一个field的FFM模型。其模型方程为:
y ( X ) = w 0 + ∑ i = 1 n w i x i + ∑ i = 1 n < V i , f j , V j , f i > x i x j y(X)=w_0+\sum_{i=1}^nw_ix_i+\sum_{i=1}^n<V_{i,f_j},V_{j,f_i}>x_ix_j y(X)=w0+i=1nwixi+i=1n<Vi,fj,Vj,fi>xixj
如果隐向量的长度为k,那么FFM的二次参数有nfk个,远多于FM模型的nk个。

DeepFM

FM通过对于每一位特征的隐变量内积来提取特征组合,最后的结果也不错,虽然理论上FM可以对高阶特征组合进行建模,但实际上因为计算复杂度原因,一般都只用到了二阶特征组合。对于高阶特征组合来说,我们很自然想到多层神经网络DNN。
在这里插入图片描述
DeepFM目的是同时学习低阶和高阶的特征交叉,主要由FM和DNN两部分组成,底部共享同样的输入。模型可以表示为:
y = s i g m o i d ( y F M + y D N N ) y=sigmoid(y_{FM}+y_{DNN}) y=sigmoid(yFM+yDNN)
FM部分
原理如上,数学表达为
y F M = < w , x > + ∑ i = 1 d ∑ j = i + 1 d < V i , V j > x i ⋅ x j y_{FM}=<w,x>+\sum_{i=1}^d\sum_{j=i+1}^d<V_i,V_j>x_i⋅x_j yFM=<w,x>+i=1dj=i+1d<Vi,Vj>xixj

Deep部分
深度部分是一个前馈神经网络,与图像或语音类的输入不同,CTR的输入一般是极其稀疏的,因此需要重新设计网络结构。在第一层隐藏层之前,引入一个嵌入层来完成输入向量压缩到低位稠密向量:
在这里插入图片描述

嵌入层的结构如上图所示,有两个有趣的特性:
1) 尽管不同field的输入长度不同,但是embedding之后向量的长度均为k
2) 在FM中得到的隐变量 V i k V_{ik} Vik现在作为嵌入层网络的权重

嵌入层的输出为 a ( 0 ) = [ e 1 , e 2 , . . . , e m ] a^{(0)}=[e_1,e_2,...,e_m] a(0)=[e1,e2,...,em],其中ei是嵌入的第i个filed,m是field的个数,前向过程将嵌入层的输出输入到隐藏层为
a ( l + 1 ) = σ ( W ( l ) a ( l ) + b ( l ) ) a^{(l+1)}=σ(W^{(l)}a^{(l)}+b^{(l)}) a(l+1)=σ(W(l)a(l)+b(l))

其中l是层数,σ是激活函数,W(l)是模型的权重,b(l)是l层的偏置。
因此,DNN得预测模型表达为:
y D N N = W ∣ H ∣ + 1 ⋅ a ∣ H ∣ + b ∣ H ∣ + 1 y_{DNN}=W^{|H|+1}⋅a^{|H|}+b^{|H|+1} yDNN=WH+1aH+bH+1
|H|为隐藏层层数。

参考网址
分解机(Factorization Machines)推荐算法原理(非常好,强烈推荐)
FM系列算法解读(FM+FFM+DeepFM)
Factorization Machine 详解(三)—— FM与高阶特征训练(系列文章)
FM算法(一):算法理论

  • 3
    点赞
  • 10
    收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

vivian_ll

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值