FM/FFM原理及其公式详解
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个。