机器学习算法(二):因子分解机FM算法(Factorization Machine)

时间:2024-04-11 18:04:19

目录

 

1 背景

2 FM原理


1 背景

Steffen Rendle于2010年提出Factorization Machines(下面简称FM),并发布开源工具libFM。FM的提出主要对比对象是SVM,与SVM相比,有如下几个优势 
(1)对于输入数据是非常稀疏(比如自动推荐系统),FM可以,而SVM会效果很差,因为训出的SVM模型会面临较高的bias。 
(2)FMs拥有线性的复杂度, 可以通过 primal 来优化而不依赖于像SVM的支持向量机。

因子分解机(Factorization Machine, FM)是由Steffen Rendle提出的一种基于矩阵分解的机器学习算法。目前,被广泛的应用于广告预估模型中,相比LR而言,效果强了不少。是一种不错的CTR预估模型,也是我们现在在使用的广告点击率预估模型,比起著名的Logistic Regression, FM能够把握一些组合的高阶特征,因此拥有更强的表现力。

2 FM原理

在做点击率预估时,我们的特征往往来自于用户(user)广告(item)上下文环境(context),在线性模型中,这些特征不进行组合的话,就会发生一个很尴尬的情况,因为:

机器学习算法(二):因子分解机FM算法(Factorization Machine)

所以,对所有用户--我们将得到相同的排序。

因此我们需要引入一些组合特征作为输入模型,然而仅二阶特征组合的可能性就是原始特征的平方之多,但是由于很多特征其实是相互独立的,他们的组合并没有什么价值。FM就是一种能够自动把握一些高阶特征的点击率预估模型,可以自动帮助使用者选择合适的高阶输入。

我们先写出带有所有二阶组合特征的目标函数,其中矩阵W中有n^2个参数,求解非常复杂:

机器学习算法(二):因子分解机FM算法(Factorization Machine)

这里每两个特征有一个参数w要学习。

这里仍有问题,对于二项式回归来说,如果有n个特征,那么要学习到两两之间的关系,有n(n−1)/2个参数要去学习,对于实际中的复杂任务来说,n的值往往特别大,会造成要学习的参数特别多的问题。 同时,又由于实际数据会有稀疏性问题,有些特征两两同时不为0的情况很少,当一个数据中任何一个特征值为0的时候,那么其他特征与此特征的相互关系将没有办法学习。

受到矩阵分解的启发,为了解决上述两个问题,引入了因子分解机。

如果训练的输入数据有n个特征,设i,j两个特征的相互关系用参数wi,j表示,那么有wi,j=wj,i这样所有w的参数值会形成一个对称的矩阵,

none     w1,2     w1,3     w1,4   … w1,n 
w2,1    none       w2,3    w2,4    … w2,n

……
wn,1      wn,2      wn,3     wn,4   …  none

缺失了对角线的矩阵,正因为如此,我们可以通过给对角线任意设定值来保证矩阵为半正定矩阵,自然想到了矩阵分解。

基于矩阵分解的思想,将以上矩阵分解为两个低阶矩阵的乘积,那么在分解过程中,不仅仅减少了数据存储的复杂度,而且多了一个特别神奇的功能,预测功能

矩阵分解基于一个假设,即矩阵中的值等于学习到的两个隐向量的乘积,认为每个特征 xi都可以用一个K维的特征向量vi表示,那么所有特征之前的相关性就也就可以用两个矩阵的相乘进行表示了,即 

机器学习算法(二):因子分解机FM算法(Factorization Machine)

这里vi,vj为学习到的隐向量。

2-way FM(degree = 2)是FM中具有代表性,且比较简单的一种。 那么因子分解机的形式为: 

机器学习算法(二):因子分解机FM算法(Factorization Machine)

机器学习算法(二):因子分解机FM算法(Factorization Machine)

也就是:

机器学习算法(二):因子分解机FM算法(Factorization Machine)

k是定义factorization维度的超参数,是正整数 

通常,由于数据稀疏,本来wi,j是学习不到的,但是我们可以通过i特征与其他特征的数据,j特征与其他特征的数据,分别学习到i,j特征的参数向量vi,vj,这样b通过vivj的乘积便可以预测wi,j的值,神奇地解决了数据稀疏带来的问题。

而且,一般隐向量维度k远远小于特征数量n,那么分解后要学习的参数数量为:n∗k,对比多项式回归的参数数量n(n−1)/2, 从O(n^2)减到了kO(n)的级别。
因子分解机FM也可以推广到高阶的形式,即将更多互异特征分量之间的相互关系考虑进来。

3 时间复杂度

未引入因子分解机之前的时间复杂度为O(kn^2)。引入因子分解机后,本来需要训练的n×n个参数,现在只需要训练n×k个,其中k≪n,时间复杂度就降为O(kn)。

机器学习算法(二):因子分解机FM算法(Factorization Machine)

机器学习算法(二):因子分解机FM算法(Factorization Machine)

机器学习算法(二):因子分解机FM算法(Factorization Machine)

机器学习算法(二):因子分解机FM算法(Factorization Machine)

机器学习算法(二):因子分解机FM算法(Factorization Machine)

时间复杂度就降为O(kn)。

机器学习算法(二):因子分解机FM算法(Factorization Machine)

 

利用SGD(Stochastic Gradient Descent)训练模型,梯度如下

机器学习算法(二):因子分解机FM算法(Factorization Machine)

机器学习算法(二):因子分解机FM算法(Factorization Machine)

机器学习算法(二):因子分解机FM算法(Factorization Machine)

4 代码

http://www.cnblogs.com/zhangchaoyang/articles/7897085.html