type
status
password
date
slug
summary
category
URL
tags
icon
背景
同时通过观察大量的样本数据可以发现,某些特征经过关联之后,与label之间的相关性就会提高。例如,“USA”与“Thanksgiving”、“China”与“Chinese New Year”这样的关联特征,对用户的点击有着正向的影响。换句话说,来自“China”的用户很可能会在“Chinese New Year”有大量的浏览、购买行为,而在“Thanksgiving”却不会有特别的消费行为。
像 LR/SVM 这样的模型无法建模非线性的特征交互(interaction),我们只能依靠人工进行特征组合,比如通过数据分析发现时间和食谱类的 app 存在比较强的关联关系,然后把这个特征加到线性模型里去。这种方法不仅成本很高,而且很多复杂的特征交互很难发现。
目前针对上述交叉或者组合特征的存在的难题,提出 FM 模型。FM 通过给每个特征引入一个低维稠密的隐向量来减少二阶特征交互的参数个数,同时实现信息共享,使得在非常稀疏的特征向量上的学习更加容易泛化。理论上FM 可以建模二阶以上的特征交互,但是由于计算量急剧增加,实际一般只用二阶的模型。
因为 FM 只能用于二阶模型,所以我们将深度学习模型与FM模型相结合,提出 DeepFM 模型。DeepFM 的思想就是充分利用 FM 在一阶和二阶特征的简洁高效和深度学习在高阶特征交互上的优势,同时通过共享 FM 和 DNN 的 Embedding 来减少参数量和共享信息,从而得到更好的模型。
数据集简介
假设训练数据的个数为 ,每一个训练样本为 ,其中 由 个 field 组成,而 表示用户是否点击。 的 field 可以是 category 的 field,比如性别和地域等;也可以是连续的 field,比如年龄。总的 field 个数可能只有几百个,但是如果用 one-hot 编码展开的话,这个特征向量会非常高维并且稀疏。我们把每一个 记为 ,其中每一个 是其向量表示 ( 连续的field就是1维的,而 Category 的field 则用 one-hot 展开)。
模型结构
其中 是FM模型的输出,而 是 DNN 的输出,最终的预测由两部分输出的相加得到。模型的结构如下图所示,它包含 FM 和 DNN 两个组件。
DeepFM 属于 Wide & Deep 的变形,原始的 Wide & Deep 模型 Wide 部分集成了人工特征工程得到的特征,DeepFM 为了优化这一复杂的人工操作,将 Wide 部分替换成了 FM,使其可以自动学习特征间的2阶组合。FM 部分和 Deep 部分共享相同的输入。
网络结构
deepfm的实际网络结构如下图所示,其网络结构参考 PaddleRec 模块。
FM部分
这个公式非常简单,但是如果用代码实现的话有一些技巧,比如怎么不用 for 循环(在Tensorflow这样的框架里循环是很麻烦而且很低效的)。后面的代码分析会介绍怎么用 Embedding 和矩阵运算不用 for 循环实现上面的计算。
FM背景
如何表示两个特征的组合呢?一种直接的方法就是采用多项式模型来表示两个特征的组合, 为第 个特征的取值, 表示特征 和 的特征组合,其系数 即为我们学习的参数,也是 组合的重要程度:
上式也可以称为Poly2(degree-2 poly-nomial mappings)模型。注意到式中参数的个数是非常多的,一次项有 个,二次项共有 个,而参数与参数之间彼此独立,在稀疏场景下,二次项的训练是很困难的。因为要训练 ,需要有大量的 和 都非零的样本(只有非零组合才有意义)。而样本本身是稀疏的,满足 的样本会非常少,样本少则难以估计参数 ,训练出来容易导致模型的过拟合。为此,Rendle于2010年提出FM模型,它能很好的求解上式。
FM特点如下:
- FM模型可以在非常稀疏的情况下进行参数估计
- FM模型是线性时间复杂度的,可以直接使用原问题进行求解,而且不用像SVM一样依赖支持向量。
- FM模型是一个通用的模型,其训练数据的特征取值可以是任意实数。而其它最先进的分解模型对输入数据有严格的限制。FM可以模拟MF、SVD++、PITF或FPMC模型。
FM原理
前面提到过,式中的参数难以训练时因为训练数据的稀疏性。对于不同的特征对 和 ,认为是完全独立的,对参数 和 分别进行训练。而实际上并非如此,不同的特征之间进行组合并非完全独立,如下图所示:
参考矩阵分解的过程,FM模型也将上式的二次项参数 进行分解:
其中 是第 维特征的隐向量,其长度为 。 为内积,其乘积为原来的 ,即
此外,将 进行分解,使得不同的特征对不再是完全独立的,而它们的关联性可以用隐式因子表示,这将使得有更多的数据可以用于模型参数的学习。比如 与 的参数分别为: 和 ,它们都可以用来学习 ;更一般的,包含 的所有样本都能用来学习 ,很大程度上避免了数据稀疏性的影响。
此外,复杂度可以从 优化到 :
可以看出,FM 模型可以在线性的时间做出预测;实际中会使用Embeding的输出代表,详情可以看网络结构。
FM梯度
FM模型可以使用梯度下降法进行学习,模型的梯度为:
式中, 只与 有关而与 无关,在每次迭代过程中,可以预先对所有 的 进行计算,复杂度 ,就能在常数时间 内得到 的梯度。而对于其它参数 和 ,显然也是在常数时间内计算梯度。此外,更新参数只需要 , 一共有 个参数,因此FM参数训练的复杂度也是 。所以说,FM模型是一种高效的模型,是线性时间复杂度的,可以在线性的时间做出训练和预测。
代码
DNN部分
deepFM中的deep部分是一个前馈神经网络,主要用于学习高阶特征。但是与2016年原生的Wide & Deep相比,其输入大有不同,原生的Wide & Deep中DNN的输入可能极度稀疏,同时连续特征和类别特征夹杂在一起,并以field进行分组,在deepFM里,DNN的输入时连续的数值,并且与Wide部分共享输入。
其中 是隐含层的序号