CTR预估模型——FM、FFM、DeepFM

北战南征 提交于 2019-11-30 21:05:40

一、CTR(Click Through Rate,点击率)

  点击率(click-through rate, CTR) 是点击特定链接的用户与查看页面,电子邮件或广告的总用户数量之比。它通常用于衡量某个网站的在线广告活动是否成功,以及电子邮件活动的有效性,是互联网公司进行流量分配的核心依据之一。

  无论使用什么类型的模型,点击率这个命题可以被归纳到二元分类的问题,我们通过单个个体的特征,计算出对于某个内容,是否点击了,点击了就是1,没点击就是0。对于任何二元分类的问题,最后我们都可以归结到逻辑回归上面。

    • 早期的人工特征工程 + LR(Logistic Regression):这个方式需要大量的人工处理,不仅需要对业务和行业有所了解,对于算法的经验要求也十分的高。
    • GBDT(Gradient Boosting Decision Tree) + LR:提升树短时这方面的第二个里程碑,虽然也需要大量的人工处理,但是由于其的可解释性和提升树对于假例的权重提升,使得计算准确度有了很大的提高。
    • FM-FFM:FM和FFM模型是最近几年提出的模型,并且在近年来表现突出,分别在由Criteo和Avazu举办的CTR预测竞赛中夺得冠军,使得到目前为止,还都是以此为主的主要模型占据主导位置。
    • Embedding模型可以理解为FFM的一个变体。

  CTR预估技术从传统的Logistic回归,到近两年大火的深度学习,新的算法层出不穷:DeepFM, NFM, DIN, AFM, DCN等。其实这些算法都是特征工程方面的模型,无论最后怎么计算,最后一层都是一个二元分类的函数(sigmod为主)。

二、FM(Factorization Machines,因子分解机)

  FM(Factorization Machines,因子分解机)最早由Steffen Rendle于2010年在ICDM上提出,它是一种通用的预测方法,在即使数据非常稀疏的情况下,依然能估计出可靠的参数进行预测。与传统的简单线性模型不同的是,因子分解机考虑了特征间的交叉,对所有嵌套变量交互进行建模(类似于SVM中的核函数),因此在推荐系统和计算广告领域关注的点击率CTR(click-through rate)和转化率CVR(conversion rate)两项指标上有着良好的表现。此外,FM的模型还具有可以用线性时间来计算,以及能够与许多先进的协同过滤方法(如Bias MF、SVD++等)相融合等优点。

  在介绍FM模型之前,来看看稀疏数据的训练问题。以广告CTR(click-through rate)点击率预测任务为例,假设有如下数据:

  第一列Clicked是类别标记,标记用户是否点击了该广告,而其余列则是特征(这里的三个特征都是类别类型),一般的,我们会对数据进行One-hot编码将类别特征转化为数值特征,转化后数据如下:

  经过One-hot编码后,特征空间是十分稀疏的。特别的,某类别特征有m种不同的取值,则one-hot编码后就会被变为m维,当类别特征越多、类别特征的取值越多,其特征空间就更加稀疏。

  同时通过观察大量的样本数据可以发现,某些特征经过关联之后,与label之间的相关性就会提高。例如,“USA”与“Thanksgiving”、“China”与“Chinese New Year”这样的关联特征,对用户的点击有着正向的影响。换句话说,来自“China”的用户很可能会在“Chinese New Year”有大量的浏览、购买行为,而在“Thanksgiving”却不会有特别的消费行为。这种关联特征与label的正向相关性在实际问题中是普遍存在的,如“化妆品”类商品与“女”性,“球类运动配件”的商品与“男”性,“电影票”的商品与“电影”品类偏好等。因此,引入两个特征的组合是非常有意义的。

  如何表示两个特征的组合呢?一种直接的方法就是采用多项式模型来表示两个特征的组合,

为第i个特征的取值,

表示特征

的特征组合,其系数

即为我们学习的参数,也是

组合的重要程度:

  上式也可以称为Poly2(degree-2 poly-nomial mappings)模型。注意到式中参数的个数是非常多的,一次项有

个,二次项共有

个,而参数与参数之间彼此独立,在稀疏场景下,二次项的训练是很困难的。因为要训练

,需要有大量的

都非零的样本(只有非零组合才有意义)。而样本本身是稀疏的,满足

的样本会非常少,样本少则难以估计参数

,训练出来容易导致模型的过拟合。

  为此,Rendle于2010年提出FM模型,它能很好的求解上式,其特点如下:

    • FM模型可以在非常稀疏的情况下进行参数估计
    • FM模型是线性时间复杂度的,可以直接使用原问题进行求解,而且不用像SVM一样依赖支持向量。
    • FM模型是一个通用的模型,其训练数据的特征取值可以是任意实数。而其它最先进的分解模型对输入数据有严格的限制。FMs可以模拟MF、SVD++、PITF或FPMC模型。

2.1 FM模型原理

  前面提到过,式中的参数难以训练时因为训练数据的稀疏性。对于不同的特征对

,认为是完全独立的,对参数

分别进行训练。而实际上并非如此,不同的特征之间进行组合并非完全独立,如下图所示:

  回想矩阵分解,一个rating可以分解为user矩阵和item矩阵,如下图所示:

  分解后得到user和item矩阵的维度分别为

,(k一般由用户指定),相比原来的rating矩阵,空间占用得到降低,并且分解后的user矩阵暗含着user偏好,Item矩阵暗含着item的属性,而user矩阵乘上item矩阵就是rating矩阵中用户对item的评分。因此,参考矩阵分解的过程,FM模型也将上式的二次项参数

进行分解:

  其中

是第i维特征的隐向量,其长度为

为内积,其乘积为原来的

,即

  为了方便说明,考虑下面的数据集(实际中应该进行one-hot编码,但并不影响此处的说明):

  对于上面的训练集,没有(NBC,Adidas)组合,因此,Poly2模型就无法学习到参数

。而FM模型可以通过特征组合(NBC,Nike)、(EPSN,Adidas) 分别学习到隐向量

,这样使得在测试集中得以进行预测。

  更一般的,经过分解,式中的参数个数减少为

个,对比上式参数个数大大减少。使用小的k,使得模型能够提高在稀疏情况下的泛化性能。此外,将

进行分解,使得不同的特征对不再是完全独立的,而它们的关联性可以用隐式因子表示,这将使得有更多的数据可以用于模型参数的学习。比如

的参数分别为:

,它们都可以用来学习

,更一般的,包含

的所有样本都能用来学习

,很大程度上避免了数据稀疏性的影响。

  此外,复杂度可以从

优化到

  可以看出,FM模型可以在线性的时间做出预测。

2.2 FM模型学习

  把上述两公式合并,得到等价的FM模型公式:

  

  FM模型可以使用梯度下降法进行学习,模型的梯度为:

  

  式中,

只与

有关而与

无关,在每次迭代过程中,可以预先对所有

进行计算,复杂度

,就能在常数时间

内得到

的梯度。而对于其它参数

,显然也是在常数时间内计算梯度。此外,更新参数只需要

, 一共有

个参数,因此FM参数训练的复杂度也是

。所以说,FM模型是一种高效的模型,是线性时间复杂度的,可以在线性的时间做出训练和预测。

2.3 FM总结

2.3.1 FM的优势

  • FM降低了因数据稀疏,导致交叉项参数学习不充分的影响。直接用one-hot进行多项式建模,DataSet中没有出现的特征组合的权重是学不出来的,而FM是基于MF的思想或者说是基于latent factor model的思想进行的“曲线救国”:
    • 通过先学习每个特征的隐向量,然后通过隐向量之间的内积来刻画交互项的权重。
    • 一个组合特征的样本数一定比单特征的样本数少 <=> 直接学习交互项的特征一定比学习隐向量要难。且学习隐向量可以避免因数据稀疏导致的学习不充分的缺点。
  • FM提升了参数学习效率,因为FM需要训练的参数更少,一般情况下,隐向量的维度都是比较短的,且肯定原小于直接学习交互项的参数个数。
  • FM模型对稀疏数据有更好的学习能力,通过交互项可以学习特征之间的关联关系,并且保证了学习效率和预估能力。
  • 与其他模型相比,它的优势如下:
    • FM是一种比较灵活的模型,通过合适的特征变换方式,FM可以模拟二阶多项式核的SVM模型、MF模型、SVD++模型等;
    • 相比SVM的二阶多项式核而言,FM在样本稀疏的情况下是有优势的;而且,FM的训练/预测复杂度是线性的,而二项多项式核SVM需要计算核矩阵,核矩阵复杂度就是N平方。
    • MF虽然可以用类似SVD++等方式来增强对交互特征的学习,但是最多只能加两个特征。而FM是可以对任意阶的所有交互项进行学习
  • FM能玩得通的一些巧妙性:
    • FM求解latent factor vector的套路,是基于MF的latent factor model方法来做。
    • 矩阵分解大法用在FM上,以缩减参数个数,处理数据稀疏带来的学习不足问题,还能做embedding;
    • FM 可以看做是 MF 的 generalized 版本,不仅能够利用普通的用户反馈信息,还能融合情景信息、社交信息等诸多影响个性化推荐的因素。

2.3.2 SVM和FM的区别

  • SVM的二元特征交叉参数是独立的,而FM的二元特征交叉参数是两个k维的向量

    ,交叉参数就不是独立的,而是相互影响的。
  • FM可以在原始形式下进行优化学习,而基于kernel的非线性SVM通常需要在对偶形式下进行
  • FM的模型预测是与训练样本独立,而SVM则与部分训练样本有关,即支持向量

  为什么线性SVM在和多项式SVM在稀疏条件下效果会比较差呢?线性svm只有一维特征,不能挖掘深层次的组合特征在实际预测中并没有很好的表现;而多项式svn正如前面提到的,交叉的多个特征需要在训练集上共现才能被学习到,否则该对应的参数就为0,这样对于测试集上的case而言这样的特征就失去了意义,因此在稀疏条件下,SVM表现并不能让人满意。而FM不一样,通过向量化的交叉,可以学习到不同特征之间的交互,进行提取到更深层次的抽象意义。

2.3.3 FM和LR的区别

  • LR是从组合特征的角度去描述单特征之间的交互组合;FM实际上是从模型(latent factor model)的角度来做的。即FM中特征的交互是模型参数的一部分。
  • FM能很大程度上避免了数据系数行造成参数估计不准确的影响。
  • FM是通过MF的思想,基于latent factor,来降低交叉项参数学习不充分的影响
    • 具体而言,两个交互项的参数学习,是基于K维的latent factor
    • 每个特征的latent factor是通过它与其它(n-1)个特征的latent factor交互后进行学习的,这就大大的降低了因稀疏带来的学习不足的问题。
    • latent factor学习充分了,交互项(两个latent factor之间的内积)也就学习充分了。
    • 即FM学习的交互项的参数是单特征的隐向量。

三、FFM

  FFM 是 NTU(国立台湾大学)的 Yu-Chin Juan(阮毓钦,现在美国 Criteo 工作)与其比赛队员,借鉴了来自 Michael Jahrer 的论文中的 field 概念提出了 FM 的升级版模型。

  考虑下面的数据集:

  对于第一条数据来说,FM模型的二次项为:

。每个特征只用一个隐向量来学习和其它特征的潜在影响。对于上面的例子中,Nike是广告主,Male是用户的性别,描述(EPSN,Nike)和(EPSN,Male)特征组合,FM模型都用同一个

,而实际上,ESPN作为广告商,其对广告主和用户性别的潜在影响可能是不同的。

  因此,Yu-Chin Juan借鉴Michael Jahrer的论文Ensemble of collaborative filtering and feature engineered models for click through rate prediction,将field概念引入FM模型。

  field是什么呢?即相同性质的特征放在一个field。比如EPSN、NBC都是属于广告商field的,Nike、Adidas都是属于广告主field,Male、Female都是属于性别field的。简单的说,同一个类别特征进行one-hot编码后生成的数值特征都可以放在同一个field中,比如最开始的例子中Day=26/11/15 Day=19/2/15可以放于同一个field中。如果是数值特征而非类别,可以直接作为一个field。

  引入了field后,对于刚才的例子来说,二次项变为:

  • 对于特征组合(EPSN,Nike)来说,其隐向量采用的是

    ,对于

    这是因为Nike属于广告主(Advertiser)的field,而第二项w_{Nike,P}则是EPSN是广告商(Publisher)的field。
  • 对于特征组合(EPSN,Male)来说,

    是因为Male是用户性别(Gender)的field,而第二项

    是因为EPSN是广告商(Publisher)的field。

  下面的图来很好的表示了三个模型的区别:

  • For Poly2, a dedicated weight is learned for each feature pair:

  • For FMs, each feature has one latent vector, which is used to interact with any other latent vectors:

  • For FFMs, each feature has several latent vectors, one of them is used depending on the field of the other feature:

3.1 FFM 数学公式

  因此,FFM的数学公式表示为:

  

分别代表第i个特征和第j个特征所属的field。若field有f个,隐向量的长度为k,则二次项系数共有

个,远多于FM模型的dk个。此外,隐向量和field相关,并不能像FM模型一样将二次项化简,计算的复杂度是

  通常情况下,每个隐向量只需要学习特定field的表示,所以有

3.2 FFM 模型学习

  为了方便推导,这里省略FFM的一次项和常数项,公式为:

  FFM模型使用logistic loss作为损失函数,并加上L2正则项:

  采用随机梯度下降来(SGD)来优化损失函数,因此,损失函数只采用单个样本的损失:

  对于每次迭代,选取一条数据

,然后让L对

求偏导(注意,采用SGD上面的求和项就去掉了,只采用单个样本的损失),得:

  

  其中,

  在具体的实现中,这里有两个trick,第一个trick是梯度的分步计算。

  

  注意到

和参数无关,每次更新模型时,只需要计算一次,之后直接调用结果即可。对于总共有

个模型参数的计算来说,使用这种方式能极大提升运算效率。

  第二个trick是FFM的学习率是随迭代次数变化的,具体的是采用AdaGrad算法。Adagrad算法能够在训练中自动的调整学习率,对于稀疏的参数增加学习率,而稠密的参数则降低学习率。因此,Adagrad非常适合处理稀疏数据。

  设

第t轮第j个参数的梯度,则SGD和采用Adagrad的参数更新公式分别如下:

  

  可以看出,Adagrad在学习率η上还除以一项

,这是什么意思呢?

为平滑项,防止分母为0,

为对角矩阵,每个对角线位置

的值为参数

每一轮的平方和,可以看出,随着迭代的进行,每个参数的历史梯度累加到一起,使得每个参数的学习率逐渐减小。

  因此,计算完梯度后,下一步就是更新分母的对角矩阵:

  

  最后,更新模型参数:

  

  这就是论文中算法1描述的过程:

3.3 FFM使用技巧

  在FFM原论文中,作者指出,FFM模型对于one-hot后类别特征十分有效,但是如果数据不够稀疏,可能相比其它模型提升没有稀疏的时候那么大,此外,对于数值型的数据效果不是特别的好。在Github上有FFM的开源实现,要使用FFM模型,特征需要转化为“field_id:feature_id:value”格式,相比LibSVM的格式多了field_id,即特征所属的field的编号,feature_id是特征编号,value为特征的值。

  此外,美团点评的文章中,提到了训练FFM时的一些注意事项:

    • 样本归一化。FFM默认是进行样本数据的归一化的 。若不进行归一化,很容易造成数据inf溢出,进而引起梯度计算的nan错误。因此,样本层面的数据是推荐进行归一化的。
    • 特征归一化。CTR/CVR模型采用了多种类型的源特征,包括数值型和categorical类型等。但是,categorical类编码后的特征取值只有0或1,较大的数值型特征会造成样本归一化后categorical类生成特征的值非常小,没有区分性。例如,一条用户-商品记录,用户为“男”性,商品的销量是5000个(假设其它特征的值为零),那么归一化后特征“sex=male”(性别为男)的值略小于0002,而“volume”(销量)的值近似为1。特征“sex=male”在这个样本中的作用几乎可以忽略不计,这是相当不合理的。因此,将源数值型特征的值归一化到[0,1]是非常必要的。
    • 省略零值特征。从FFM模型的表达式(3-1)可以看出,零值特征对模型完全没有贡献。包含零值特征的一次项和组合项均为零,对于训练模型参数或者目标值预估是没有作用的。因此,可以省去零值特征,提高FFM模型训练和预测的速度,这也是稀疏样本采用FFM的显著优势。

四、DeepFM

  近年来深度学习模型在解决NLP、CV等领域的问题上取得了不错的效果,于是有学者将深度神经网络模型与FM模型结合,提出了DeepFM模型。FM通过对于每一位特征的隐变量内积来提取特征组合,最后的结果也不错,虽然理论上FM可以对高阶特征组合进行建模,但实际上因为计算复杂度原因,一般都只用到了二阶特征组合。对于告诫特征组合来说,我们很自然想到多层神经网络DNN。

  FM的结构

  DNN结构

  DeepFM结构(FM和DNN的特征结合)

  DeepFM的架构其实特别清晰:

    • 输入的是稀疏特征的id
    • 进行一层lookup 之后得到id的稠密embedding
    • 这个embedding一方面作为隐向量输入到FM层进行计算
    • 同时该embedding进行聚合之后输入到一个DNN模型(deep)
    • 然后将FM层和DNN层的输入求和之后进行co-train

  DeepFM目的是同时学习低阶和高阶的特征交叉,主要由FM和DNN两部分组成,底部共享同样的输入。模型可以表示为:

FM部分

  原理如上,数学表达为:

Deep部分

  深度部分是一个前馈神经网络,与图像或语音类的输入不同,CTR的输入一般是极其稀疏的,因此需要重新设计网络结构。在第一层隐藏层之前,引入一个嵌入层来完成输入向量压缩到低位稠密向量:

  嵌入层的结构如上图所示,有两个有趣的特性:

    • 尽管不同field的输入长度不同,但是embedding之后向量的长度均为k
    • 在FM中得到的隐变量

      现在作为嵌入层网络的权重

  嵌入层的输出为

,其中

是嵌入的第i个filed,m是field的个数,前向过程将嵌入层的输出输入到隐藏层为:

  

  其中l是层数,

是激活函数,

是模型的权重,

是l层的偏置,因此,DNN得预测模型表达为:y_{DNN}=W^{|H|+1} \cdot a^{|H|}+b^{|H|+1}

  其中,

为隐藏层层数。

DeepFM模型对比

  目前在推荐领域中比较流行的深度模型有FNN、PNN、Wide&Deep。

    • FNN模型是用FM模型来对Embedding层进行初始化的全连接神经网络。
    • PNN模型则是在Embedding层和全连接层之间引入了内积/外积层,来学习特征之间的交互关系。
    • Wide&Deep模型由谷歌提出,将LR和DNN联合训练,在Google Play取得了线上效果的提升。Wide&Deep模型,很大程度上满足了模型同时学习低阶特征和高阶特征的需求,让模型同时具备较好的“memorization”和“generalization”。但是需要人工特征工程来为Wide模型选取输入特征。具体而言,对哪些稀疏的特征进行embedding,是由人工指定的。

  有学者将DeepFM与当前流行的应用于CTR的神经网络做了对比:

  从预训练,特征维度以及特征工程的角度进行对比,发现:

  从实验效果来看,DeepFM的效果较好:

  DeepFM的三大优势:

    • 相对于Wide&Deep不再需要手工构建wide部分;
    • 相对于FNN把FM的隐向量参数直接作为网络参数学习;
    • DeepFM将embedding层结果输入给FM和MLP,两者输出叠加,达到捕捉了低阶和高阶特征交叉的目的。

五、NFM(Neural Factorization Machines)

  NFM(Neural Factorization Machines)又是在FM上的一个改进工作,出发点是FM通过隐向量可以对完成一个很好的特征组合工作,并且还解决了稀疏的问题,但是FM对于它对于non-linear和higher-order 特征交叉能力不足,而NFM则是结合了FM和NN来弥补这个不足。

  DeepFM 是用 Wide & Deep 框架,在 FM 旁边加了一个 NN,最后一并 sigmoid 输出。NFM 的做法则是利用隐向量逐项相乘得到的向量作为 MLP 的输入,构建的 FM + NN 模型。其中:

  • Input Feature Vector层是输入的稀疏向量,可以带权
  • Embedding Layer对输入的稀疏向量look up 成稠密的embedding 向量
  • Bi-Interaction Layer将每个特征embedding进行两两做element-wise product,Bi-Interaction的输出是一个 k维向量(就是隐向量的大小),这层负责了特征之间second-order组合。

    类似FM的式子转换,这里同样可以做如下转换将复杂度降低:

  • Hidden Layers这里是多层学习高阶组合特征学习,其实就是一个DNN模块:

  • Prediction Score层就是输出最终的结果:

  FM可以看做是NFM模型 Hidden Layer层数为0一种特殊形式。最终的实验效果看来NFM也还是可以带来一个不错的效果:

六、AFM(Attentional Factorization Machines)

  AFM(Attentional Factorization Machines)是浙大(Jun Xiao, Hao Ye, Fei Wu)和新加坡国大(Xiangnan He, Hanwang Zhang, Tat-Seng Chua)几位同学提出来的模型。AFM 首先对 FM 做了神经网络改造,而后加入了注意力机制,为不同特征的二阶组合分配不同的权重。在传统的FM中进行特征组合时两两特征之间的组合都是等价的(只能通过隐向量的点积来区别),这里趁着Attention的热度走一波,因为AFM的最大的贡献就是通过Attention建立权重矩阵来学习两两向量组合时不同的权重。下面就是AFM的框架图:

  从图中可以很清晰的看出,AFM比FM就是多了一层Attention-based Pooling,该层的作用是通过Attention机制生成一个

权重矩阵,该权重矩阵将会作用到最后的二阶项中,因此这里

的生成步骤是先通过原始的二阶点积求得各自的组合的一个Score:

  

  其中

,这里t表示Attention网络的大小。然后对其score进行softmax的归一化:

  

  最后该权重矩阵再次用于二阶项的计算(也就是最终的AFM式子):

  

  这里,

是通过注意力机制学习得到的特征

和特征

组合的权重,

 是对隐向量每个维度学习得到的权重, 

表示向量

逐项相乘得到的新向量。显然,当

时,AFM 退化为标准的 FM 模型。

  其实整个算法思路也是很简单,但是在实验上却有一个不错的效果:

 

参考:

  FM算法详解:https://blog.csdn.net/bitcarmanlee/article/details/52143909

  FM计算:https://blog.csdn.net/shenxiaolu1984/article/details/78740481

  CSDN, 推荐算法:https://blog.csdn.net/asd136912/article/details/78318563

  CSDN,FM&FFM&DeepFFM:https://blog.csdn.net/john_xyz/article/details/78933253

  美团,FM&FFM:https://tech.meituan.com/deep_understanding_of_ffm_principles_and_practices.html

  知乎,Kaggle实战——点击率预估:https://zhuanlan.zhihu.com/p/32500652

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!