目录
1 FFM算法来源
FFM(Field-aware Factorization Machine)算法是FM(Factorization Machine)算法的升级版,FM算法的公式如下:
其中:样本 是 n 维向量,
是第
个维度上的值。
是
对应的长度为
的隐向量。
FFM则是将隐向量 又进一步细化,引入 field 概念,将特征所在的不同的 field 这个信息也考虑进去。
通过引入field的概念,FFM把相同性质的特征归于同一个field。
假设一个广告分类的问题,根据用户和广告位相关的特征,预测用户是否点击了广告。源数据如下:
Clicked? | Country | Day | Ad_type |
---|---|---|---|
1 | USA | 26/11/15 | Movie |
0 | China | 1/7/14 | Game |
1 | China | 19/2/15 | Game |
"Clicked?"是label,Country、Day、Ad_type是特征。由于三种特征都是categorical类型的,需要经过独热编码(One-Hot Encoding)转换成数值型特征。
Clicked? | Country=USA | Country=China | Day=26/11/15 | Day=1/7/14 | Day=19/2/15 | Ad_type=Movie | Ad_type=Game |
---|---|---|---|---|---|---|---|
1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 |
0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 |
1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
以上面的广告分类为例,“Day=26/11/15”、“Day=1/7/14”、“Day=19/2/15”这三个特征都是代表日期的,可以放到同一个field中。同理,商品的末级品类编码生成了550个特征,这550个特征都是说明商品所属的品类,因此它们也可以放到同一个field中。简单来说,同一个categorical特征经过One-Hot编码生成的数值特征都可以放到同一个field,包括用户性别、职业、品类偏好等。在FFM中,每一维特征 xi,针对其它特征的每一种field fj,都会学习一个隐向量 vi,fj。因此,隐向量不仅与特征相关,也与field相关。也就是说,“Day=26/11/15”这个特征与“Country”特征和“Ad_type"特征进行关联的时候使用不同的隐向量,这与“Country”和“Ad_type”的内在差异相符,也是FFM中“field-aware”的由来。
假设样本的 n个特征属于 f 个field,那么FFM的二次项有 nf个隐向量。而在FM模型中,每一维特征的隐向量只有一个。
FM可以看作FFM的特例,是把所有特征都归属到一个field时的FFM模型。根据FFM的field敏感特性,可以导出其模型方程。
其中, 是第 j个特征所属的field。如果隐向量
的长度为 k,那么FFM的二次参数有 nfk 个,远多于FM模型的 nk个。此外,由于隐向量与field相关,FFM二次项并不能够化简,其预测复杂度是 O(kn2)。
FFM与FM的区别在于隐向量由原来的 变成了
,这意味着每个特征对应的不是唯一的一个隐向量,而是一组隐向量。当
特征与
特征进行交叉时,
特征会从
的一组隐向量中选择出与特征
的域
对应的隐向量
进行交叉。同理,
也会选择与
的域
对应的隐向量
进行交叉。
2 举例说明FFM算法的细节
下面以一个例子简单说明FFM的特征组合方式[9]。输入记录如下
User | Movie | Genre | Price |
---|---|---|---|
YuChin | 3Idiots | Comedy, Drama | $9.99 |
这条记录可以编码成5个特征,其中“Genre=Comedy”和“Genre=Drama”属于同一个field,“Price”是数值型,不用One-Hot编码转换。为了方便说明FFM的样本格式,我们将所有的特征和对应的field映射成整数编号。
此示例中一共有4个fields,5个features,细节如下:
Field name | Field index | Feature name | Feature index |
---|---|---|---|
User | 1 | User=YuChin | 1 |
Movie | 2 | Movie=3Idiots | 2 |
Genre | 3 | Genre=Comedy | 3 |
Price | 4 | Genre=Drama | 4 |
Price | 5 |
那么,FFM的组合特征有10项,如下图所示。
其中,红色是field编号,蓝色是特征编号,绿色是此样本的特征取值。二次项的系数是通过与特征field相关的隐向量点积得到的,二次项共有 n(n−1)/2个。
3 基于FFM的逻辑回归模型
3.1 损失的逻辑回归模型
将域分解机模型写成如下形式:
损失函数:
损失函数求导:
3.2 ∅(w,xp)的求导过程
为了便于理解首先对中的
和
分别的偏导数如下:
训练模型时需要注意的问题:在式(12)和式(13)中会存在
在训练时不需要合并这些项,只要把这些项当成更新参数的多个样本即可,这在编程实现中将非常有用。
3.3 示例
假设有如下的例子,五个特征,两个域
按照式(7),去掉下标p,计算图1中所示的分解模型,如下
从上式中抽取i=1,fj=1和i=3,fj=2
在模型学习时,需要迭代公式,
分别为学习率和梯度向量,则在计算
时有两种方式:
方式1:
方式2:
因为采用的是AdaGrad所以学习率η在方式二中是变化的。
在学习过程中是采用方式2。因为在计算实际问题时可能特征分布在多个域中,如果按照方式1则需要把每个域中的信息累加起来,结果是编程上非常麻烦,如果按照方式2,非常符合SGD的思想,把和
看成两个样本,再带回到
组合时更新下
,当访问到
组合时再次更新下
,在实际编程中,具体更新哪些参数可以通过相应的索引进行访问,非常方便。
4 优化方法:Bi-FFM算法
对于FFM的某个特征来说,会构造出 个隐向量,与其他的
个 fields组合的时候分别使用。FFM有什么特点呢?相对FM来说,参数量扩大了
倍,效果自然也比FM好,但是要想把它用到现实场景中是有问题的,参数量太大导致特别耗内存、训练速度慢,所以微博团队改进了一个新模型,双线性FFM算法(Bi-FFM)。
Bi-FFM二阶表达式如下:
图形表示如下:
Bi-FFM的思想: 分别使用一个隐向量来表达,但是把两个特征交互的信息用一个共享参数矩阵表示。关于共享矩阵
,给出了三种形式:
- (1)共享同一个
,这是参数量最小的一种形式。
的参数量是
,
是特征Embedding的size;
- (2)每个field共享一个
,即每个field各自学各自的
;
- (3)每两个fields对共享一个
,能更加细化地描述特征组合;
FFM与Bi-FFM的参数量比较:
改进的Bi-FFM,它的参数量跟FFM相比是什么情况?如果用Criteo这个4500万的数据集,它有230万个特征,39个Fields,假设Embedding size是10。如果用FFM就会有8.97亿的参数量。Bi-FFM的FM部分是大概2300万的参数,在三个改进版共享矩阵 中,类型(1)100个参数;类型(2)3900个参数;类型(3)15万参数。与FFM相比,参数差了38倍,但性能两者是相当的,这就是Bi-FFM的价值所在。
美团技术团队:https://tech.meituan.com/deep_understanding_of_ffm_principles_and_practices.html
https://blog.csdn.net/zc02051126/article/details/54614230
FFM算法原理及Bi-FFM算法实现:https://zhuanlan.zhihu.com/p/145928996