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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/vivian_ll/article/details/90371159

FM算法

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

一、背景

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

二、目标函数

FM的思路为,在多项式模型的基础上,通过矩阵分解的方法,为了求解wijw_{ij},为每一个特征分量xi引入辅助向量Vi=(vi1,vi2,...,vik)V_i=(v_{i1},v_{i2},...,v_{ik}),然后用vivjTv_iv_j^Twijw_{ij}进行求解。

y=w0+i=1nwixi+i=1n1j=i+1n(vivjT)xixjy=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
从上式可以看出二项式的参数数量由原来的n(n1)2\frac{n(n−1)}{2}个减少为nknk个,远少于多项式模型的参数数量。

为什么要通过向量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)的学习更新。即,参数因子化使得xhxix_hx_i的参数和xhxjx_hx_j的参数不再相互独立,因为有了xhx_h特征关联。因此我们可以在样本系数的情况下相对合理地估计FM的二次项参数。

求解<vi,vj><v_i,v_j>,主要采用公式(a+b)2a2b2(a+b)^2-a^2-b^2来求出交叉项:
i=1n1j=i+1n(vivjT)xixj=12l=1k[(i=1n(vilxi)2i=1nvil2xi2]\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]
FM的复杂度为O(kn2)O(kn^2),通过上述等式的改写,可将复杂度降为线性的O(kn)O(kn)。因此,FM可以在线性时间对新样本做出预测,复杂度和LR模型一样,且效果提升不少。

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

三、训练算法

FM可用于各种预测任务,如回归、分类、排序等。
对于回归问题,损失函数可为最小平方误差。
对于二分类问题,损失函数可为logit loss函数。
对于排序问题,x可能需要转化为pair-wise的形式如(Xa,Xb)(X^a,X^b),损失函数可以采用pairwise loss。

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

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

四、FM 对比 其他算法

FM对比SVM

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

为什么线性SVM在和多项式SVM在稀疏条件下效果会比较差呢?
线性svm只有一维特征,不能挖掘深层次的组合特征,在实际预测中并没有很好的表现;而多项式svn正如前面提到的,交叉的多个特征需要在训练集上共现才能被学习到,否则该对应的参数就为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)=w0+i=1nwixi+i=1n<Vi,fj,Vj,fi>xixjy(X)=w_0+\sum_{i=1}^nw_ix_i+\sum_{i=1}^n<V_{i,f_j},V_{j,f_i}>x_ix_j
如果隐向量的长度为k,那么FFM的二次参数有nfk个,远多于FM模型的nk个。

DeepFM

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

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

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

嵌入层的输出为a(0)=[e1,e2,...,em]a^{(0)}=[e_1,e_2,...,e_m],其中ei是嵌入的第i个filed,m是field的个数,前向过程将嵌入层的输出输入到隐藏层为
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得预测模型表达为:
yDNN=WH+1aH+bH+1y_{DNN}=W^{|H|+1}⋅a^{|H|}+b^{|H|+1}
|H|为隐藏层层数。

9743044-9819f977796fdffc.png 9743044-39afd8caf7310be5.png 9743044-a503e42062ba33b8.png 9743044-576288891b68e925.png 9743044-7cb92bfe027bd9e2.png 9743044-f7bcf32ddb603afb.png 9743044-dc9d5700bca498d5.png 9743044-71a842ca6031153f.png 9743044-0764d6bac07d4ce8.png 9743044-e1c6cd7fa88477c4.png 9743044-23033b6382220ad4.png 9743044-9b0f4070f6ccb806.png 9743044-477c114d5da0fc87.png 9743044-e6d45df82be80435.png 9743044-13f02bf0dad7462b.png 9743044-74d3463c8c56c2b0.png 9743044-3c3e2a98c4c6be96.png 9743044-af219345905264d7.png **勘误**: Multilinearity部分最后一句,应该是gθ(x)则利用...来计算。 **注释**: 对(2.6)改写,将复杂度降为线性的O(kn)的推导,第一步即求矩阵上三角,相当于求整个矩阵减去对角线再除以2。

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

展开阅读全文

没有更多推荐了,返回首页