0. 导言

最近在参加IJCAI18的pCVR预估比赛,比赛到了复赛也是真正比拼模型和算法的时候了。初赛90%的时间都在做一个勤劳的”挖掘机”,但是到了复赛,光挖特征已经无法做到很好的提升了,这时候就是拼模型了。做CTR模型的人,FFM一定是绕不过去的,因此借此机会,在这里按照论文[1]仔细的推敲(翻译:p)下FFM背后的数学原理。

field-aware factorization machines(FFM)是基于FM和二阶多项式模型的扩展。在大量的CTR预估比赛中大放异彩。FFM在处理海量稀疏数据的分类问题时十分有效。
我们定义数据集为(yi,xi),i=1,...,n,其中xip维特征向量。我们知道带l2正则的Logistic regression可以表示为这样的一个优化问题:

maxwλ2w22+i=1nlog(1+exp(yiϕLM(w,xi)))
其中ϕLM(w,xi)=wxi

然而在CTR预估任务中,特征之间的相互作用是绝不能忽视的,甚至能表达出单个特征无法表达出的信息(见论文中Table 1的例子)。为了学习到特征交互项之前的系数,我们可以用两种方法。第一个方法就是将原始的线性部分ϕLM进行二阶多项式(Poly2)转换,而第二个方法就是用FM模型。如果我们将两个模型做一些适当的结合,当当当~就出来了我们的FFM。接下来我们将详细介绍下这两个方法和他们是如何结合的具体细节。

1. POLY2

多项式模型(二阶)其实我们中学就学过,现在我们用更专业的语言定义一下
ϕPoly2(w,x)=j1=1pj2=j1+1pwh(j1,j2)xj1xj2
用大白话讲就是两个变量的交互项。(一般来说函数h将每对j1,j2映射为一个唯一的自然数,但是由于通常在高维情形下,学习过多的系数会影响模型的性能,因此许多包对其做了一些优化,例如Vowpal Wabbit package用hash的方法来减少所需要学习的参数个数)。计算这个的复杂度为O(p¯2),其中p¯为单个样本非零元素的平均个数。这个方法的缺点在于,若数据集中非零个数有很多,则该模型的复杂度太高;若数据集为稀疏数据,大量的特征的值为0,无法有效的学习到特征交叉项的系数。因此我们引出了FM。

2. FM

ϕFM(w,x)=j1=1pj2=j1+1p(wj1,wj2)xj1xj2,
我们可以看到FM模型将多项式中学习scalar系数问题转换成学习两个k维隐向量问题。再通过一些数学上的一些trick,模型可以化简为
ϕFM(w,x)=12j=1p(swjxj)wjxj,
其中s=j,=1wj,xj,,
这个模型的复杂度为O(p¯k)。FM模型优于Poly2模型的原因之前也提到了一点。更具体可以参考论文以及文中给出的参考文献。

3. FFM

终于进入正题了。我们先用一个例子复习一下FM模型,假设有这样一条CTR数据。
深入理解FFM(一)
FM模型显而易见。那如果用FFM模型呢?公式就变成为
深入理解FFM(一)
这里的A,P,G就代表了三个field,ESPN后面的A代表了与它相乘的Nike是在A这个field里的,Nike后面的P代表了与它相乘的ESPN是在P这个field里的,同理其他的项。
这样FFM模型的数学表达式就呼之欲出了:
ϕFFM(w,x)=j1=1pj2=j1+1p(wj1,f2,wj2,f1)xj1xj2,
计算复杂度为O(p¯2k)

4. 算法

深入理解FFM(一)
先贴图再解释:
1:初始化一个Rn×f×k的张量(三维数组),令其值全为1。
2:运行t次SGD迭代,每次迭代:
3:对于整个训练集
4:随机抽样一个样本点(y,x)
5:计算k=log(1+exp(yϕFFM(w,x)))ϕFFM(w,x)=y1+exp(yϕFFM(w,x))
6:外层循环f1(只看非零项)
7:里层循环f2(只看非零项)
8:计算次梯度(梯度对于不可导函数的推广)
gj1,f2wj1,f2f(w)=λwj1,f2+kwj2,f1xj1xj2
gj2,f1wj2,f1f(w)=λwj2,f1+kwj1,f2xj1xj2
9:对于隐变量的每一个item d(1~k循环)
10:更新梯度和(懒得打字了,贴图了。。)(初始值设为1)
深入理解FFM(一)
11:最后更新模型参数(初始值通过对服从Unif(0,1/k)的随机变量抽样得到)
深入理解FFM(一)

Note:论文说如果对数据进行标准化操作能得到更好的效果。

5. 小结

数学推导部分结束,有兴趣的可以自己拿纸笔动手推导一下。第一次写博文,写的很详细很傻瓜,后续的博文将补充一些细节和自己的实践。Thx for reading!

6. 参考文献

[1] : https://www.csie.ntu.edu.tw/~cjlin/papers/ffm.pdf

相关文章:

  • 2022-12-23
  • 2021-08-27
  • 2021-08-13
  • 2021-11-12
  • 2021-04-06
  • 2022-01-14
  • 2021-08-23
  • 2021-08-16
猜你喜欢
  • 2021-12-21
  • 2021-07-12
  • 2021-07-10
  • 2022-01-18
  • 2021-08-27
相关资源
相似解决方案