您的位置:首页 > 其它

推荐系统学习笔记之四 Factorization Machines 因子分解机 + Field-aware Factorization Machine(FFM) 场感知分解机

2017-10-23 14:32 363 查看

前言

Factorization Machines(FM) 因子分解机是Steffen Rendle于2010年提出,而Field-aware Factorization Machine (FFM) 场感知分解机最初的概念来自于Yu-Chin Juan与其比赛队员,它们借鉴了辣子Michael Jahrer的论文中field概念,提出了FM的升级版模型。

FM的paper中主要对比对象是SVM支持向量机,与SVM相比,有如下几个优势

FM可以实现对于输入数据是非常稀疏(比如自动推荐系统),而SVM会效果很差,因为训出的SVM模型会面临较高的bias。

FMs拥有线性的复杂度, 可以通过 primal 来优化而不依赖于像SVM的支持向量机。

在推荐系统和计算广告领域,点击率CTR(click-through rate)和转化率CVR(conversion rate)是衡量广告流量的两个关键指标。准确的估计CTR、CVR对于提高流量的价值,增加广告收入有重要的指导作用。FM和FFM近年来表现突出,分别在由Criteo和Avazu举办的CTR预测竞赛中夺得冠军。

Factorization Machines 因子分解机

假如在某个电影播放网站有这么一组实时数据:

MoviesClassActorDirectorMoviesIsPlay?
ActionAAA1
RomanticBBB0
ActionABB1
其中MoviesIsPlay?是label,MoviesClass 、UserType、Actor、Director是特征。以上这四种特征都是categorical类型的,需要经过独热编码(One-Hot Encoding)转换成数值型特征。

MoviesClass = ActionMoviesClass = RomanticActor = AActor = BDirector = AADirector = BBMoviesIsPlay = 1MoviesIsPlay = 0
10101010
01010101
10100110
从该独热编码表可以看出矩阵许多值都为0,数据十分稀疏,而且会导致数据维度增大,数量级从n增大到n2。

而我们的目的是从该矩阵中获取到特征的某些关联,比如MovieClass=action 与 actor=A 关联比较大,电影播放量可很客观,从而对用户进行推荐。

先从线性回归和多项式回归开始建模,这里我们以二阶多项式模型(degree = 2时)为例:

xixj表示特征xi和xj的组合,当xi和xj都非零时,组合特征xixj才有意义。

y^(x):=w0+∑i=1nwixi线性回归+∑i=1n∑j=i+1nwijxixj交叉项(组合特征)

其中,n 代表样本的特征数量,xi是第 i 个特征的值,w0、wi、wij是模型参数。

从此公式可以看出组合特征一共有n(n-1)/2个,如果特征n上百个,组合特征上万个,就是任意两个wij相互独立,样本数据很稀疏,xixj为非零的项会非常的少,导致训练样本的不足,很容易导致参数 wij不准确,最终将严重影响模型的性能和稳定性。

那么如何解决这些问题呢?上一篇博客的矩阵分解提供了思路。在一个rating矩阵可以分解为user矩阵和item矩阵,每个user和item都可以采用一个隐向量表示,两个向量的点积就是矩阵中user对item的打分。

类似地,所有二次项参数 wij 可以组成一个对称阵 W,可以分解为W=VTV,V 的第 j 列便是第 j 维特征的隐向量,也就是说每个参数 wij=⟨vi,vj⟩,这就是FM模型的核心思想(不讨论高阶形式)。所以可以得到:

y^(x):=w0+∑i=1nwixi+∑i=1n∑j=i+1n⟨vi,vj⟩xixj

其中<>表示两个向量的点积⟨vi,vj⟩:=∑f=1kvi,f⋅vj,f

直观上看,FM的复杂度是 O(kn2)。但是,通过下列等式,FM的二次项可以化简,其复杂度可以优化到 O(kn)。由此可见,FM可以在线性时间对新样本作出预测。

∑i=1n∑j=i+1n⟨vi,vj⟩xixj=12∑f=1k⎛⎝(∑i=1nvi,fxi)2−∑i=1nv2i,fx2i⎞⎠

下面给出详细证明过程:

====∑i=1n∑j=i+1n⟨vi,vj⟩xixj(1)12∑i=1n∑j=1n⟨vi,vj⟩xixj−12∑i=1n⟨vi,vi⟩xixi(2)12⎛⎝∑i=1n∑j=1n∑f=1kvi,fvj,fxixj−∑i=1n∑f=1kvi,fvi,fxixi⎞⎠(3)12∑f=1k⎧⎩⎪⎪⎪⎪⎪(∑i=1nvi,fxi)⋅⎛⎝∑j=1nvj,fxj⎞⎠−∑i=1nv2i,fx2i⎫⎭⎪⎪⎪⎪⎪(4)12∑f=1k⎧⎩⎪⎪⎪⎪⎪⎪(∑i=1nvi,fxi)2−∑i=1nv2i,fx2i⎫⎭⎪⎪⎪⎪⎪⎪(5)

其中第(1)步到第(2)步,这里用AA表示系数矩阵VV的上三角元素,BB表示对角线上的交叉项系数。由于系数矩阵VV是一个对称阵,所以下三角与上三角相等,有下式成立:

A=12(2A+B)−12B.A=∑i=1n∑j=i+1n⟨vi,vj⟩xixj−−−−−−−−−−−−−−−−−−−;B=12∑i=1n⟨vi,vi⟩xixi−−−−−−−−−−−−−−−−−

之后采用随机梯度下降SGD(Stochastic Gradient Descent)训练模型参数。那么,模型各个参数的梯度如下:

∂∂θy(x)=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪1,xixi∑j=1nvj,fxj−vi,fx2i,ifθisw0(常数项)ifθiswi(线性项)ifθisvi,f(交叉项)

其中,vj,f是隐向量 vj 的第 f 个元素。由于∑nj=1vj,fxj只与 f 有关,而与 i 无关,在每次迭代过程中,只需计算一次所有 f 的∑nj=1vj,fxj就能够方便地得到所有 vi,f 的梯度。因此,FM参数训练的复杂度也是 O(kn)。

FM总结

首先是为什么使用向量的点积可以解决以上问题呢?

参数的数量大幅度缩减,从n×(n−1)/2降低到nk

隐向量的点积可以表示原本两个毫无相关的参数之间的关系

而稀疏数据下学习不充分的问题也能得到充分解决。比如原本的多项式回归的参数w12的学习只能依赖于特征x1和x2;而对参数⟨v1,v2⟩而言就完全不一样了,它由v1和v2组成。而对于每个向量可以通过多个交叉组合特征学习得到,比如可以由x1x2,x1x3,..学习获得,这样可供学习的非零样本就大大增加了。

其次FM与矩阵分解MF与SVM有什么差别呢?

FM是一种比较灵活的模型,通过合适的特征变换方式,FM可以模拟二阶多项式核的SVM模型、MF模型、SVD++模型等。

相比SVM的二阶多项式核而言,FM在样本稀疏的情况下是有优势的;而且,FM的训练/预测复杂度是线性的,而二项多项式核SVM需要计算核矩阵,核矩阵复杂度就是N平方。

相比MF而言,我们把MF中每一项的rating分改写为rui∼βu+γi+xTuyi,从此公式中可以看出,这相当于只有两类特征 β 和 γ 的FM模型。对于FM而言,我们可以加任意多的特征,比如user的历史购买平均值,item的历史购买平均值等,但是MF只能局限在两类特征。SVD++与MF类似,在特征的扩展性上都不如FM。

Field-aware Factorization Machine(FFM) 场感知分解机

场感知说白了可以理解为分类。通过引入field的概念,FFM把相同性质的特征归于同一个field。比如, “MovieClass = romantic”、“MovieClass = action”这2个特征值都是代表电影分类的,可以放到同一个field中。简单来说,同一个类别的特征经过One-Hot编码生成的数值特征都可以放到同一个field。在FFM中,每一维特征 xi,针对其它特征的每一种field fj,都会学习一个隐向量 vi,fj。因此,隐向量不仅与特征相关,也与field相关。也就是说,“MovieClass”这个特征与“UserRate”特征和“PlayTimes”特征进行关联的时候使用不同的隐向量,也是FFM中“field-aware”的由来。

通过修改FM的公式,我们可以得出:

y^(x):=w0+∑i=1nwixi+∑i=1n∑j=i+1n⟨vi,fj,vj,fi⟩xixj

其中,fj是第j个特征所属的field。如果隐向量的长度为k,那么FFM的二交叉项参数就有nfk个,远多于FM模型的nk个。此外,由于隐向量与field相关,FFM的交叉项并不能够像FM那样做化简,其预测复杂度为O(kn2)。

为了使用FFM方法,所有的特征必须转换成“field_id:feat_id:value”格式,field_id代表特征所属field的编号,feat_id是特征编号,value是特征的值。数值型的特征比较容易处理,只需分配单独的field编号,如用户评论得分、商品的历史CTR/CVR等。categorical特征需要经过One-Hot编码成数值型,编码产生的所有特征同属于一个field,而特征的值只能是0或1,如用户的性别、年龄段,商品的品类id等。

除此之外,还有第三类特征,如用户浏览/购买品类,有多个品类id且用一个数值衡量用户浏览或购买每个品类商品的数量。这类特征按照categorical特征处理,不同的只是特征的值不是0或1,而是代表用户浏览或购买数量的数值。按前述方法得到field_id之后,再对转换后特征顺序编号,得到feat_id,特征的值也可以按照之前的方法获得。

参考文献

https://tech.meituan.com/deep-understanding-of-ffm-principles-and-practices.html

http://www.52caml.com/head_first_ml/ml-chapter9-factorization-family/

http://www.csie.ntu.edu.tw/~r01922136/slides/ffm.pdf

https://github.com/guestwalk/libffm FFM C++实现
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: