1、FM背景
在计算广告和推荐系统中,CTR预估(click-through rate)是非常重要的一个环节,判断一个商品的是否进行推荐需要根据CTR预估的点击率来进行。在进行CTR预估时,除了单特征外,往往要对特征进行组合。对于特征组合来说,业界现在通用的做法主要有两大类:FM系列(FM,FFM,DeepFM,DeepFFM,wide&deep,xDeepFM)与Tree系列(如GBDT+LR、XGBoost、LightGBM)。今天,我们就来讲讲FM算法。
2、one-hot编码带来的问题
FM(Factorization Machine)分解机 主要是为了解决数据稀疏的情况下,特征怎样组合的问题。已一个广告分类的问题为例,根据用户与广告位的一些特征,来预测用户是否会点击广告。数据如下:(本例来自美团技术团队分享的paper)
clicked是分类值,表明用户有没有点击该广告。1表示点击,0表示未点击。而country,day,ad_type则是对应的特征。对于这种categorical特征,一般都是进行one-hot编码处理。
将上面的数据进行one-hot编码以后,就变成了下面这样 :
因为是categorical特征,所以经过one-hot编码以后,(1)不可避免的样本的数据就变得很稀疏。举个非常简单的例子,假设淘宝或者京东上的item为100万,如果对item这个维度进行one-hot编码,光这一个维度数据的稀疏度就是百万分之一。由此可见,数据的稀疏性,是我们在实际应用场景中面临的一个非常常见的挑战与问题。(2)one-hot编码带来的另一个问题是特征空间变大。同样以上面淘宝上的item为例,将item进行one-hot编码以后,样本空间有一个categorical变为了百万维的数值特征,特征空间一下子暴增一百万。所以大厂动不动上亿维度,就是这么来的。
3、对特征进行组合
普通的线性模型,我们都是将各个特征独立考虑的,并没有考虑到特征与特征之间的相互关系。但实际上,大量的特征之间是有关联的。最简单的以电商为例,一般女性用户看化妆品服装之类的广告比较多,而男性更青睐各种球类装备。那很明显,女性这个特征与化妆品类服装类商品有很大的关联性,男性这个特征与球类装备的关联性更为密切。如果我们能将这些有关联的特征找出来显然是很有意义的。一般的线性模型为:
![](https://i-blog.csdnimg.cn/blog_migrate/b0746e27a30476229ebc4547eced2271.png)
从上面的式子很容易看出,一般的线性模型压根没有考虑特征间的关联。为了表述特征间的相关性,我们采用多项式模型。在多项式模型中,特征xi与xj的组合用xixj表示。为了简单起见,我们讨论二阶多项式模型。具体的模型表达式如下:
![](https://i-blog.csdnimg.cn/blog_migrate/11827dd5274e61030036ad7bb90c1acd.webp?x-image-process=image/format,png)
上式中,n表示样本的特征数量,xi表示第i个特征。与线性模型相比,FM的模型就多了后面特征组合的部分。
3.1、为什么特征组合之后模型效果更好?
以二维空间为例,线性模型的分界线是直线,仅适用于能被直线分开的两类样本。如果两类样本的真实分界线是一个圆,或者一条双曲线(
),在原来的二维空间中,我们能否找到一条直线分开两类样本?答案明显是不能的。但如果我们非要用直线区分样本呢?那就做空间变换吧。对于上面分界线是圆的情况,将原来的(x1,x2)映射到
;对于双曲线的情况,将原来的(x1,x2)映射到
,是不是在新的空间中,又可以用一条直线把两类分来啦。所以提到特征组合,实际上做的就是空间变换,更准确说是把原有的特征空间映射到了一个更加高维的特征空间中。在一个真实问题中,我们并不知道分界线到底是圆还是双曲线还是别的什么,所以对于上面的例子,我们一般会尝试把原来的(x1,x2)映射到(x1,x2,x1^2,x2^2,x1x2),正所谓扩大搜索范围。特征组合增强了特征的表达能力,基本等价于说高维空间比低维空间更有表达力。
下面举个通俗易懂的例子,假设二维平面中有两类样本,他们的分布如下图,显然可以用线性模型将样本分开。可是如果正负样本的分布式图二的状况呐,显然很难找到一条直线将他们分开,但是如果在原线性模型的基础上加上x1、x2两个特征的组合特征
, 就可以轻松将他们分开了。最直观的就是
引入了非线性,非线性体现在
.
也就是上文提到的“把原有的特征空间映射到了一个更加高维的特征空间中”,用x1、x2 无论怎么线性组合都无法将图二的样本分开,但是如果在原来两维的基础上再加一维x1x2,将样本映射到三维(x1, x2, x1x2)空间中就能将样本分开。有同学可能会问“x1x2” 不是可以用x1,x2表示吗? 是的,但是不能线性表示,x1,x2能表示所有的该二维空间上的向量 , 但是他们不能线性表示x1x2,因为x1x2不在该二维空间中,就像三维空间坐标轴(x,y,z)的关系,x,y只能线性表示X-Y平面的向量,不能表示该平面外的向量。说到底特征组合的本质就是构造新特征(该新特征无法用原有特征线性表示),从更多的特征维度对样本进行分析从而完成分类或回归。
通过空间变换进行样本分割最简单的例子就是, 圆内
, 圆外>0, 在二维空间内无法线性可分,如果映射到
三维空间中,利用 z是否>1 就可以分割。
4、FM求解
从公式(1)可以看出,组合特征的参数一共有 n(n−1)/2 个,任意两个参数都是独立的。然而,在数据稀疏性普遍存在的实际应用场景中,二次项参数的训练是很困难的。其原因是,每个参数wij的训练需要大量xi和xj 都非零的样本;由于样本数据本来就比较稀疏,满足“xi和xj都非零”的样本将会非常少。训练样本的不足,很容易导致参数wij不准确,最终将严重影响模型的性能。那么,如何解决二次项参数的训练问题呢?矩阵分解提供了一种解决思路。FM与 svd 有啥区别呐???
![](https://i-blog.csdnimg.cn/blog_migrate/11827dd5274e61030036ad7bb90c1acd.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/9b95317a9b36fda499bbc2165114c788.png)
在model-based的协同过滤中,一个rating矩阵可以分解为user矩阵和item矩阵, 协同过滤的这种处理方法与FM有啥区别??
上式中,n 是样本的总特征数,既包含user特征也包含item特征,比如电影推荐中用户的年龄、性别等,电影的电影名、导演、演员等。
其中二次项参数wij可以认为是一个特征对另一个特征的相关度,wij=wji,所以wij可以组成一个对称阵 W(为了方便说明FM的由来,对角元素可以设置为正实数),那么这个特征矩阵就可以分解为 ,V的第j行便是第j维特征的隐向量。换句话说,每个参数wij=〈vi,vj〉,这就是FM模型的核心思想。 Ref: 深入FFM原理与实践
为了求出ωij,我们对每一个特征分量xi引入辅助向量Vi=(vi1,vi2,⋯,vik)。然后,利用vivj^T对ωij进行求解。
那么ωij组成的矩阵可以表示为: ,n是用户特征数+item特征数,k是隐向量的维度,矩阵
的一行就是某一特征的隐向量。
矩阵的第j行便是第j维特征的隐向量,假设电影评分经过训练后得到的矩阵
如下图,性别男对应的隐向量维(5,-3)与复联对应的隐向量(5,-1)相似度较高,那么W13=25+3=28,表示的含义是性别男和复联的相关度较高。
具体训练计算过程如下:
那么,如何求解vi和vj呢?主要采用了公式:
![](https://i-blog.csdnimg.cn/blog_migrate/854844c04c0a4b7ded91e248ba57bfcb.webp?x-image-process=image/format,png)
经过这样的分解之后,我们就可以通过随机梯度下降SGD求解出 和
,得到训练好的模型。
![](https://i-blog.csdnimg.cn/blog_migrate/9cbbb4d2292245952087d6ed95d87a2d.png)
从公式3直观上看,FM的复杂度是 O(kn^2)=[n*(n-1)/2]*k。但是,通过公式(4)的等式,FM的二次项可以化简,其复杂度可以优化到 O(kn)。由此可见,FM可以在线性时间对新样本作出预测。
在预测任务中,我们只需要取出预测样本特征值为1的特征xi、xj,就可以计算出y(x),再经过sigmoid得到最终结果是点击(1)/不点击(0)。可以结合FM实现最简单电影推荐的项目,来更深入理解。
5、FM与其他模型的对比
FM是一种比较灵活的模型,通过合适的特征变换方式,FM可以模拟二阶多项式核的SVM模型、MF模型、SVD++模型等[7]。
相比SVM的二阶多项式核而言,FM在样本稀疏的情况下是有优势的;而且,FM的训练/预测复杂度是线性的,而二项多项式核SVM需要计算核矩阵,核矩阵复杂度就是N平方。
相比MF而言,我们把MF中每一项的rating分改写为 rui∼βu+γi+xTuyirui∼βu+γi+xuTyi,从公式(2)(2)中可以看出,这相当于只有两类特征 uu 和 ii 的FM模型。对于FM而言,我们可以加任意多的特征,比如user的历史购买平均值,item的历史购买平均值等,但是MF只能局限在两类特征。SVD++与MF类似,在特征的扩展性上都不如FM,在此不再赘述。Ref:https://tech.meituan.com/2016/03/03/deep-understanding-of-ffm-principles-and-practices.html
在传统的线性模型如LR中,每个特征都是独立的,如果需要考虑特征与特征直接的交互作用,可能需要人工对特征进行交叉组合;非线性SVM可以对特征进行kernel映射,但是在特征高度稀疏的情况下,并不能很好地进行学习;现在也有很多分解模型Factorization model如矩阵分解MF、SVD++等,这些模型可以学习到特征之间的交互隐藏关系,但基本上每个模型都只适用于特定的输入和场景。为此,在高度稀疏的数据场景下如推荐系统,FM(Factorization Machine)出现了。Ref:https://www.cnblogs.com/AndyJee/p/7879765.html
SVM和FM的主要区别在于:
SVM的二元特征交叉参数是独立的,而FM的二元特征交叉参数是两个k维的向量vi、vj,交叉参数就不是独立的,而是相互影响的。
FM可以在原始形式下进行优化学习,而基于kernel的非线性SVM通常需要在对偶形式下进行
FM的模型预测是与训练样本独立,而SVM则与部分训练样本有关,即支持向量。Ref: https://blog.csdn.net/hiwallace/article/details/81333604
6、评分矩阵和特征矩阵的对比
6.1、评分矩阵
n是用户数,m是item数,k是隐向量维度,
可以看作是user x对电影的隐藏特质y的热衷程度,U的一行可以看成该用户的隐向量,而
可以看作是特质 y 在电影 z中的体现程度,矩阵
的一行可以看成是该item的隐向量 。 为什么svd 会用这种方式呐? 怎么计算的,怎么和 特征矩阵划清关系。。。
6.2、特征矩阵(系数矩阵)
, n是用户特征数+item特征数 经过onehot之后的总特征数,k是隐向量的维度,矩阵
的一行就是某一特征的隐向量。
参考文章:
1.Factorization Machines: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.393.8529&rep=rep1&type=pdf
2.推荐系统遇上深度学习(一)--FM模型理论和实践: https://www.jianshu.com/p/152ae633fb00
3.https://tech.meituan.com/2016/03/03/deep-understanding-of-ffm-principles-and-practices.html