FM在特征组合中的应用
| 年龄(x1) | 城市(x2) | 性别(x3) | |
| 用户1 | 23 | 北京 | 男 |
| 用户2 | 31 | 上海 | 女 |
如上述特征X有三个维度,年龄是数值型特征,城市和性别是类别型特征,在进行特征组合的使用类别型特征要onehot处理 。
| x1年龄 | x2北京 | x3上海 | x4深圳 | x5男 | x6女 | |
| 用户1 | 23 | 1 | 0 | 0 | 1 | 0 |
| 用户2 | 31 | 0 | 1 | 0 | 0 | 1 |
实际上"北京的男性用户","上海的女性用户 "这种组合特征可能是有用的,即,
,(
,,
都是one_hot特征)同时为1可能是一个很有用的特征,这种组合特征是
,和
的线性组合无法表示的 ,这样一来
就成了一个新特征,为了不错过任何一种可能有用的组合特征,我们穷尽所有的i,j的组合,把
,都加到特征里面去,即使其中某些
不是one-hot特征或者某些
不是有用的特征,都没关系,经过大量样本的训练,模型会把那些无用的特征的系数训练为0。
这样就有人提出了FM模型:
这个公式中,
,
,
都是一个数既不是向量也不是矩阵,它是在计算一个样本的预测输出,
表示某个样本在第i个特征处的值,由于二次项系数
,我们额外引入
/2个参数需要训练。任意两个参数都是独立的,即
与
时毫无关联的。然而在稀疏的场景下,二次项参数的训练是很困难的,其原因:每个参数
的训练需要大量
和
都为非零的样本(因为只有一条样本中
或者
等于0,那么对应的
,那么该二次项就不存在了,永远无法训练该参数),由于样本数据本来就稀疏,满足
不为了0的样本非常少,训练样本不足,很容易导致参数
不准。
有没有什么办法可以减少参数?再来观察二次项系数矩阵,它是对称的方阵
,这里是因为
与
,这两种组合其实是一种组合, 所以可以对
进行矩阵分解
,即
。其中k远远小于n,本来需要训练的n×n个参数,现在只需要训练n×k个。这里
是
的稠密表达,也称为第i个特征的隐向量,
。
现在再来看,
对与这两个系数他们共用一个参数
(这是一个长度为k的一维向量),这两个系数就不再是独立的了,也就是说所有包含
的非零特征组合(前提
)的样本都可以来学习向量
,以前学习
,只能是
与
同时不为0的变量,而现在学习
,只要保证
(因为
只与i相关,这里j可以取任意值).如果还不理解可以看下面的例子。
| x1年龄 | x2北京 | x3上海 | x4深圳 | x5男 | x6女 | |
| 用户1 | 23 | 1 | 0 | 0 | 1 | 0 |
| 用户2 | 31 | 0 | 1 | 0 | 0 | 1 |
| 用户3 | 24 | 1 | 0 | 1 | 0 | 1 |
| 用户4 | 26 | 1 | 0 | 0 | 0 | 1 |
| 用户5 | 29 | 0 | 1 | 0 | 1 | 0 |
| 用户6 | 24 | 0 | 0 | 1 | 1 | 0 |
对于之前要学习参数,只有样本1可以去学习,因为只有样本1,在
与
处同时不为0,而对于进行矩阵分解之后,要学习
,这时候可以分别学
或者
,因为只要
或者
进行参数更新了,那么
也会参数更新,从而达到学习参数的目的,显然样本1,3,4都可以学习
,(其中样本3可以更新参数
和
进而更新参数
,样本4可以更新参数
进而更新
),样本1,5,6可以学习
,(其中样本5通过可以更新参数
进而跟新参数
,样本6可以通过跟新参数
进而更新
)。显然经过矩阵分解后有更多的样本可以用来学习参数
,由上述举例可知,对参数
,因为一条样本不可能只在
=1,一定可以找到一个样本在
与
(k=0,1,2..n)都等于1,因此只要一个样本
!=0,那么就可以学习参数
。
对于公式(2)进行分解运算
构成了一个完整的对称矩阵,
是这个对称矩阵的上三角部分(不包含对角线),所以
等于
减去对角线元素之和再除以2.
用梯度下降法进行训练时需要求 对各个参数的偏导数:
FFM
在FFM(Field-aware Factorization Machines )中每一维特征(feature)都归属于一个特定的field,field和feature是一对多的关系。比如
| field | field1年龄 | field2城市 | field3性别 | |||
| feature | x1年龄 | x2北京 | x3上海 | x4深圳 | x5男 | x6女 |
| 用户1 | 23 | 1 | 0 | 0 | 1 | 0 |
| 用户2 | 31 | 0 | 0 | 1 | 0 | 1 |
1对于连续特征,一个特征就对应于一个Field,
2对于离散特征,采样one_hot编码,同一种属性归到一个Field,不论是连续特征还是离散特征,它们都有一个共同点:同一个field下只有一个feature的值不是0,其他feature的值都是0。FFM模型认为不仅跟
有关系,还跟与
相乘的
所属的Field有关系,即
成了一个二维向量
,F是Field的总个数,设样本一共有n个特征,f个field,那么FFM的二次项有nf个隐向量,每一个特征在每一个field中都会产生一个隐向量,而在FM模型中,每一维特征的隐向量只有一个,FM可以看作FFM的特例,是把所有的特征都归属到同一个field时的FFM模型,
上式是FFM的模型表达式,其中是第j个特征所属的字段,
是某条样本第j个特征的值。以上面的表格数据为例,计算用户1的
中的二次交叉多项式
显然上面x1产生的隐向量为,
,
,
,
,
x2产生的隐向量为,
,
,
,
,
x3产生的隐向量为,
,
,
,
,
x4产生的隐向量为,
,
,
,
,
x5产生的隐向量为,
,
,
,
,
x6产生的隐向量为,
,
,
,
,
你会发现这里每一个变量怎么产生了5个隐向量,而样本数据才3个field,这是不是与之前的结论相违背呢?,其实不是因为f2,f3,f4属于同一个field2,因此f3,f4,f5可以用f2表示,而f5,f6属于同一个field3,因此f5,f6可以由f3表示:
x1产生的隐向量为,
, x2产生的隐向量为
,
,
, x3产生的隐向量为
,
,
, x4产生的隐向量为
,
,
, x5产生的隐向量为
,
,
, x6产生的隐向量为
,
,
, 这里x1并没有产生3个隐向量,这是因为field里面只有一个特征,所以在field内部无法产生交叉特征,因此他会退化到线性部分
中去。 之前我们说了
是一个二维数组shape=(F,k),F为特征总数,可是每次在计算
的时候特征
生成的所有隐向量都有用吗?,No,在前面我们说了,同一个field下只有一个feature的值不是0,其他feature的值都是0,因此
在
中产生的隐向量都没有都不起作用,因为
=0(
是
的其他特征),也就是说每个特征产生的隐向量真正起作用的只有F-1个。