推荐系统学习笔记之四 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 因子分解机
假如在某个电影播放网站有这么一组实时数据:MoviesClass | Actor | Director | MoviesIsPlay? |
---|---|---|---|
Action | A | AA | 1 |
Romantic | B | BB | 0 |
Action | A | BB | 1 |
MoviesClass = Action | MoviesClass = Romantic | Actor = A | Actor = B | Director = AA | Director = BB | MoviesIsPlay = 1 | MoviesIsPlay = 0 |
---|---|---|---|---|---|---|---|
1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 |
0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 |
而我们的目的是从该矩阵中获取到特征的某些关联,比如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.htmlhttp://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++实现
相关文章推荐
- 推荐系统学习笔记之三 LFM (Latent Factor Model) 隐因子模型 + SVD (singular value decomposition) 奇异值分解
- LensKit<开源推荐系统框架Java>学习笔记
- 推荐系统入门学习笔记(一)
- 《machine learning with spark》学习笔记--推荐模型
- 【学习笔记】读项亮的《推荐系统实践》_第三章推荐系统冷启动问题
- 推荐系统实践学习笔记(一)
- Coursera 机器学习(by Andrew Ng)课程学习笔记 Week 9(二)——推荐系统作业
- 推荐系统学习笔记(三)
- 推荐系统公开课--学习笔记(1)
- 斯坦福机器学习公开课笔记(十三)--推荐系统
- 推荐系统的学习笔记
- 推荐系统学习笔记之一 综述
- 推荐系统学习笔记(1)
- item-based CF 推荐系统学习笔记
- Coursera公开课笔记: 斯坦福大学机器学习第十一课“机器学习系统设计(Machine learning system design)”
- 集体智慧编程学习笔记-推荐系统
- 信息推荐系统学习笔记之概述
- Coursera公开课笔记: 斯坦福大学机器学习第十一课“机器学习系统设计(Machine learning system design)”
- 基于spark mlllib的推荐系统学习笔记
- fedora学习笔记 4:用grub命令行启动系统 推荐