Factorization Machines(FM) 因子分解机是Steffen Rendle于2010年提出,而Field-aware Factorization Machine (FFM) 场感知分解机最初的概念来自于Yu-Chin Juan与其比赛队员,它们借鉴了辣子Michael Jahrer的论文中field概念,提出了FM的升级版模型。
FM的paper中主要对比对象是SVM支持向量机,与SVM相比,有如下几个优势
在推荐系统和计算广告领域,点击率CTR(click-through rate)和转化率CVR(conversion rate)是衡量广告流量的两个关键指标。准确的估计CTR、CVR对于提高流量的价值,增加广告收入有重要的指导作用。FM和FFM近年来表现突出,分别在由Criteo和Avazu举办的CTR预测竞赛中夺得冠军。
假如在某个电影播放网站有这么一组实时数据:
MoviesClass | Actor | Director | MoviesIsPlay? |
---|---|---|---|
Action | A | AA | 1 |
Romantic | B | BB | 0 |
Action | A | BB | 1 |
其中MoviesIsPlay?是label,MoviesClass 、UserType、Actor、Director是特征。以上这四种特征都是categorical类型的,需要经过独热编码(One-Hot Encoding)转换成数值型特征。
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 |
从该独热编码表可以看出矩阵许多值都为0,数据十分稀疏,而且会导致数据维度增大,数量级从 n 增大到 n2 。
而我们的目的是从该矩阵中获取到特征的某些关联,比如MovieClass=action 与 actor=A 关联比较大,电影播放量可很客观,从而对用户进行推荐。
先从线性回归和多项式回归开始建模,这里我们以二阶多项式模型(degree = 2时)为例:
xixj 表示特征xi和xj的组合,当 xi 和 xj 都非零时,组合特征 xixj 才有意义。
从此公式可以看出组合特征一共有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模型的核心思想(不讨论高阶形式)。所以可以得到:
====∑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)训练模型参数。那么,模型各个参数的梯度如下:
首先是为什么使用向量的点积可以解决以上问题呢?
其次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的概念,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的公式,我们可以得出:
为了使用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,特征的值也可以按照之前的方法获得。