FM学习记录
摘要:
本文将要介绍一个在推荐、CTR中很常见的模型,FM(Factorization Machines)。
前言
我们首先回忆一下在推荐或者CTR预估的场景下我们经常用的模型是LR。具体来说我们熟悉的LR即如(0)式。
接触过CTR或者推荐场景的可能很清楚,在这些场景下,我们通常会做一些交叉特征(cross feature)来增强LR的非线性以加强线性模型的表达能力。这种做法可以认为是在特征工程上下功夫。
而我们能否解放特征工程。从模型上下功夫来解决特征交叉的问题呢?
其实可以,比如说,我对(0)进行一点点修改,如(1)式子。
非常的直观,我们直接在线性模型的基础上增加多各个特征的乘积项。其表达的含义就是两个特征之间做交叉的意思。(1)式增加了个参数。通常来说,会用到这种模型下的特征维度都非常的大。所以这种如此暴力的方法(从式子(0)到式子(1)的变化)存在一定优化空间。
其实大量参数并非这种方法的最大问题,最大的问题在于由于推荐和CTR这两种场景下的特征非常的稀疏(sparse data),这会导致有大量的权重将得不到训练。可以直观上理解:当且仅当同时不为0时,权重在进行梯度下降时才会更新。否则每次梯度下降会保持不变。
为了解决这两个问题,第一个缩减参数的规模,第二个让交叉项的权重能够更好的学习,Steffen Rendle在提出了FM。
FM模型
上面提到FM是为了解决直接采用用多项式即式子(1)带来的几个问题所提出的模型。
那么FM到底是如何解决的呢?这里其实可以从多个角度来理解。这里采用一种个人比较理解的角度来说明。
假设我们给每个特征学习一个长度为的向量表达。即向量为特征的维表达。
那么我们在做特征组合的时候,比如组合与时,我们可以把学习的权重转化为学习和的向量点积的结果,,也就是说(1)式改为:
其中:
我们这样做之后能够改善上面所提到部分权重得到不学习的问题。
这里我举一个例子。
比如我们有一个训练集,训练集中只有三个特征。其中一条样本如下
这个时候,我们如果采用式子(1)来学习时,我们需要学习其中的三个参数、、。
由于:仅有不为0,故仅有这个权重在梯度下降时得到了学习。那么在进行预测的时候,我们就利用了根本没有经过学习的、非常不准确的参数、。
而如果我们采用式子(2)来学习,我们有如下(方便起见,向量长度为)
虽然我们只有不为0,但是在梯度下降的时候,都得到了学习。那么这个时候,我们在预测的时候,尽管没有得到学习。但是由于和
中包含了我们学习过的。所以从模型最终的效果上来看,尽管部分交叉特征从来出现过,但是由于其中包含有已经学习过的权重,所以还是能够使得这些交叉特征的权重是一个相对合理的值,而不是一个从未经过训练的值。
上面的权重的学习得到了改善,另外在进行预测时候的复杂度,其实也从降到了线性。
整个FM的复杂度其实来源于交叉特征部分。直观上看复杂度为,但是我们其实可以做一个简单的数学推导:
(这个推导直接摘论文里面的了,敲公式太累了- -!!!)
从式子(5)中可以看到,最外层的求和要计算,里面一共需要计算次。所以总的复杂度为。所以整个复杂度变成了线性。
关于FM的训练
那么,我们对FM模型有了一定的认识之后,我们下一步需要考虑的就是如何进行训练,或者说如何求出上面所涉及到的一些参数。这里我们把式子(5)的推导结果带入式子(2)可以得到:
对于分类任务,一般我们可以选择logloss作为我们的损失函数。那么对于logloss我们有(对于第条样本):
其中:
把(3)式中的所有参数统一记为(6)式对求导有:
最后对于
有了每个参数的梯度之后,就可以利用SGD来对各个参数进行训练了。
可以看到,对于训练过程其复杂度也是线性的。
FM与多项式的SVM对比
在FM的论文里有FM和SVM的一个简单的对比,其实总结起来。主要想表达就是,当SVM的核函数选择多项式核时即的情况,SVM为下式:
可以看到这个式子大体上就和式子(1)类似。所以对比FM和多项式核下的SVM其实就是文中一开始讨论的内容。
总结
到这里,我们可以稍微整理一下前面的内容。其实我们无非做了以下几点事情。
首先,我们阐述通过做特征工程来使得LR非线性表达能力增强的想法。后面,我们希望通过模型本身来做特征的交叉,阐述了直接利用二阶多项式的方法所带来的问题。最后,我们利用FM来解决上述所带来的一些问题。
所以FM其实很好的解决了两个问题
第一,将需要交叉特征部分的参数从个降到了个。
第二,改善了交叉特征部分的权重的学习。
建议参考文章:美团技术点评-FFM