ctr预估之Wide&Deep和DeepFM

之前写了两篇关于graph embedding的文章,这次换个主题,分享两个ctr预估算法。一个是Wide&Deep,是谷歌16年提的算法《Wide & Deep Learning for Recommender Systems》,链接https://arxiv.org/pdf/1606.07792.pdf,这个算法是用在谷歌应用商店做排序的。另外一个是DeepFM,来自于华为17年提出的《DeepFM: A Factorization-Machine based Neural Network for CTR Prediction》,链接https://arxiv.org/pdf/1703.04247.pdf,这个是华为用在应用商店做排序的。这两个算法既可以在广告中做ctr预估,也可以在推荐系统中做排序。

ctr预估算法中最经典的莫过于逻辑回归LR,优势是速度快,便于加特征,可解释。缺点也很明显,就是无法直接拟合高阶特征,无法做特征交叉,因此需要大量的人工特征工程和专家经验来做特征交叉。后来出现的因子分解机FM,可以解决二阶特征交叉问题,但是不能解决高阶特征交叉。比如年轻男性喜欢玩射击游戏,就包括<年龄,性别,游戏>3阶特征。最近几年随着深度学习的快速发展,工程师引入深度学习解决高阶特征交叉问题,并提出了一批算法,比如FNN,AFM,NFM,DeepCrossing以及Wide&Deep和DeepFM等,私以为最后两篇文章比较经典。

最早看这两篇算法的时候,我的感觉是这两个算法有什么差别,不是一样的吗?最近重新细读了一遍,才理解其中的不同。先来介绍一下Wide&Deep,模型结构如下图所示。所谓Wide&Deep就是整个模型结构由wide部分和deep部分共同组成,图中左边是wide模型,一个逻辑回归,右边是deep模型。假设输入的都是类别特征,deep模型的输入是用one-hot表示的Sparse Features。比如,对手机型号这个特征而言,市面上可能存在数千个手机型号,但是每个用户只对应一个手机型号,那么这个稀疏向量有几千个维度,只有一个位置为1,其余位置为0。将每个特征以embedding表示,embedding是一个低维稠密向量。将高维稀疏特征,映射到对应的embedding上去,将所有特征的embedding水平拼接起来,生成图中的Dense Embeddings,最后通过若干层神经网络得到输出。将wide和deep部分组合起来,就是图中间的wide&deep模型。
在这里插入图片描述
公式化表达如下所示。其中,b表示偏置bias,a(l)a^{(l)}表示deep模型最后一层输出,x表示原始的输入特征,注意还有一个ϕ(x)\phi(x),这个是原始特征的特征交叉。原文中提到wide&deep仍然需要做特征工程实现特征交叉,但是相比于原生的逻辑回归,只需要做少量的特征交叉,大大减少了特征工程的工作量,并且效果优于逻辑回归。原文对wide和deep模型的含义做了介绍,wide模型的特征交叉部分主要负责记忆功能,记住样本中出现过的特征交叉。deep部分有泛化功能,学习特征的embedding,泛化到那些未曾出现过的特征交叉。

y^wide_deep=sigmoid(wwideT[x,ϕ(x)]+wdeepTa(l)+b)\hat y_{wide\_deep}=sigmoid ( w_{wide}^T \cdot [x, \phi(x)] + w_{deep} ^T\cdot a^{(l)} + b)

谷歌应用商店实际使用的模型结构如下图所示。最右边的Cross Product Transformation就是wide部分,是曝光app和用户已安装app的交叉特征。剩下的就是deep部分,类别特征都用embedding表示,维度是32。连续特征包括年龄,安装app数量等,经过预处理之后,和所有的embedding水平拼接在一起,作为DNN的输入,总维度是1200。值得一提的是,wide部分用带L1正则化的FTRL优化,deep部分用AdaGrad做优化,两个部分联合训练,惊叹还有这样的骚操作。
在这里插入图片描述
再来介绍一下DeepFM,模型结构如下图所示。黑色线表示带有权重的连接,红色线表示权重为1的连接,蓝色线表示one-hot映射到对应的embedding。图中的Field表示一个特征类别,比如手机型号是一个field,性别是一个field,地理位置是一个field。每个field用one-hot表示,构成最下面的Sparse Features。稀疏特征有两部分输出,一部分是加权求和得到FM Layer中的第一个节点,另一部分索引对应的embedding得到Dense Embeddings。Dense Embeddings也有两部分输出,一部分是两两做点积输出到FM Layer,另外一部分是拼接起来作为Hidden Layer的输入。
在这里插入图片描述

图画的比较复杂,直接看公式反而更简单,公式在下面。也是两部分组成,一部分是因子分解机FM,一部分是DNN,DNN和上面介绍的deep部分是相同的。需要注意的是,FM和DNN共享embedding。论文中做过试验,将FM和DNN的embedding相互独立,效果要差。关于DeepFM论文给出的物理意义是,FM部分负责一阶特征和二阶交叉特征,而DNN部分负责二阶以上的高阶特征交叉。

yFM=&lt;w,x&gt;+ij&lt;vi,vj&gt;xixj+by_{FM}=&lt;w,x&gt; + \sum_i \sum_j &lt;v_i, v_j&gt; x_i x_j+b

y^DeepFM=sigmoid(yFM+YDNN)\hat y_{DeepFM}=sigmoid(y_{FM} + Y_{DNN})

论文中对DeepFM的超参做了调试,并基于他们给出的数据集给出了最优的超参:1)激活函数relu效果好于tanh,这与wide&deep的线上模型一致。2)每个隐层的unit在200到400之间效果最佳,相比wide&deep的unit数量要少一些。3)3层网络效果最佳,这与wide&deep的隐层数量相同。4)在总的神经单元数量固定的情况下,constant结构效果最佳,constant表示每个隐层的unit数量相同;而wide&deep采用的是塔式结构,越往上unit数量越少。5)文中没有说真实场景中embedding维度是多少,但是试验中的embedding维度设置为10,wide&deep中是32维,两个都不大。

总结下wide&deep和DeepFM的异同:

1)两者的DNN部分模型结构相同;

2)wide&deep需要做特征工程,二阶特征交叉需要靠特征工程来实现,通过wide部分发挥作用;

3)DeepFM完全不需要做特征工程,直接输入原始特征即可,二阶特征交叉靠FM来实现,并且FM和DNN共享embedding;

4)从试验结果来看DeepFM效果优于wide&deep。

文章的最后,提出一个我的疑问。前文中提到过field的定义,每一个特征类别叫做field。有些field是单值的,即field里边只能出现一个值,不同值之间是互斥的,比如手机型号,性别,地理位置,这个可以用one-hot表示,只有一个位置是1。但是有些field是多值的,比如安装app,用户会安装多个app,可以用multi-hot表示,多个位置为1。那么对于多值的field,这两个算法是如何表达和处理的,两篇文章都没有提到。

在wide&deep中,不可能将所有app的embedding拼接在一起,因为embedding维度是32,而输入的拼接embedding的维度一共才1200,拼接不到40个app。有一种方式是将所有app的embedding求平均或者求和,但是文中完全没有提到。而在DeepFM中,文章作者直接明确表示,每个field都是单值的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章