Wide&Deep versus DeepFM

最近在回顾一下深度学习在推荐系统上的应用,重点回顾了两个比较著名的模型:Wide&Deep 和 DeepFM。刚好前者是谷歌研究员提出的,后者是有三位作者来自华为,又刚好最近这两家公司的话题性这么强……emmmmm

推荐系统

推荐系统的一般架构如下,主要包括两部分的算法:

图一 推荐系统一般架构

其一是用户query进来的时候需要对其进行粗过滤,即图中retrieval部分,这个步骤的目的在于过滤不相关的信息,或者去除过时的内容等,可以通过一些机器学习算法或者人工制定的规则实现,这个步骤将过滤掉大部分的item,仅剩下一个相对较小的候选集(例如100条);其二是图中的ranking部分,即精排序过程,这个步骤将retrieval出来的候选集按用户感兴趣的程度或者query相关性进行排序,目的是将最适合的item放在前面。而CTR预测一般就是最终排序的步骤。

Wide&Deep

推荐系统面临的一个重要挑战是对memorizationgenerization的均衡,这个关系跟强化学习中的探索利用的权衡关系很类似。打个比方,比如一个新闻app,我经常在新闻app看NBA新闻,那毫无疑问需要给我推荐更多NBA或者球星之类的方向上高度相关新闻,这是memorization。但只给我推荐篮球新闻会造成用户体验很差,所以需要给我推荐一些别的我可能喜欢的资讯,这就是generization。

Memorization很好解决,例如传统的基于内容的协同过滤就能很棒的解决这个问题,因为在历史训练数据中这些模式很明显,很容易挖掘。但generization并不好处理,因为这些推荐内容的相关性相当隐蔽(例如啤酒尿布这个经典案例),甚至与用户目前的一些特征上很少共现,但generization又很重要,它可以拓宽推荐内容的多样性。

出于易用性、可伸缩性和可解析性,工业上的在线推荐和排序系统广泛采用逻辑回归之类的广义线性模型,而这些模型通常是使用one-hot编码后的二值化特征来训练的。Memorization的实现可以通过特征之间交叉相乘(在二值特征中即相当于二次多项式)得到,而generization可以通过使用粗粒度的特征的交叉相乘来完成。但这种做法的一个天然限制就是对于很少共现的内容很难泛化,试想一下,某两个item的交叉相乘项在大部分用户上基本上都为0,那么这个特征的重要度是十分有限的。

Wide&Deep,顾名思义就是由wide和deep两部分组成:wide部分采用LR负责memorization的学习deep部分采用embedding+DNN负责generization的学习。网络结构图如下

图二 Wide&Deep网络结构

Wide部分

Wide部分其实就是多项式回归,输入特征是one-one编码并交叉乘积后的二值化特征,假设xRdx\in{R^d}
f(x)=w0+i=1dwixi+j[1,d],k>jvj,kxjxkf(x) = w_0+\sum_{i=1}^{d}w_{i}*x_{i}+\sum_{j\in{[1,d]},k>{j}}v_{j,k}*x_j*x_k

Deep部分

Deep部分是传统的前馈神经网络,对于定类特征,会先对其进行嵌入操作,即对每个类别特征嵌入到低维的稠密向量。

Wide&Deep

Wide部分和Deep部分加权汇总再经过一个sigmoid激活函数得到最后的预测值
P(yx)=σ(wwideT[x,ϕ(x)]+wdeepTalf+b)P(y|x)=\sigma(w_{wide}^{T}[x,\phi(x)]+w_{deep}^{T}a^{lf}+b)

式中,σ\sigma是sigmoid函数,wwidew_{wide}代表wide部分的模型权值,wdeepw_{deep}代表deep部分最后一层输出要乘上的权值,bb是偏置值。换句话而言,Wide&Deep这个模型本质上是一个逻辑回归,它的输入特征由两部分组成而已,又或者,可以看成是一个有交叉乘积特征辅助决策的DNN。

Wide&Deep的训练策略是联合训练(joint training),作者特意强调了联合训练和集成学习的区别:

  • 联合训练是将各个部分按一个权值加权汇总得到一个预测结果,并在训练的时候根据同一个误差信号一起更新权值
  • 集成学习是各个基模型独立地训练,它们之间互不干扰,可以自己独立完成自己的训练,只是最终的结果也是汇总或者投票产生

模型结构

图三 Wide&Deep网络结构

Wide部分由已安装的app和曝光的app等特征的交叉乘积组成,Deep部分每个类别特征都映射到32维的向量,然后把连续型特征和嵌入特征拼接起来,用三层DNN来计算。

DeepFM

Wide&Deep模型虽然综合了generization和memorization,但依然没有避免一定的特征工程。DeepFM是Wide&Deep的改进版本,FM(Factorization Machine)作为Wide部分(这部分paper称为FM部分),DNN作为Deep部分。而DeepFM是end-to-end的,也就是它只需要把原始特征丢进去训练得到点击概率值就可以了,Wide部分也不需要额外的特征工程。抽象来说,总体结构还是跟Wide&Deep挺像的。
y^=sigmoid(yFM+yDNN)\hat{y} = sigmoid(y_{FM}+y_{DNN})

FM

跟Wide部分一样,FM部分也是用来学习特征交互信息的。在之前谈及的Wide部分有个比较尴尬的情况,本来one-hot编码之后出来的特征向量已经足够稀疏了,再交叉乘积转换一下出来的特征会更加稀疏(要xix_ixjx_j同时为1时)。FM模型在处理特征交互信息上则更为先进:每个类别特征xix_i都嵌入到一个低维的稠密向量viv_i特征交互就变成了两个稠密向量viv_ivjv_j之间的内积,这样就避免了交互特征过于稀疏的尴尬,而且内积也可以很好的衡量两个特征向量之间的关联度,这一个特性从余弦夹角公式就可以看出来。
yFM=<w,x>+j1=1dj2=j1+1d<vi,vj>xixjy_{FM}= <{w,x}>+\sum_{j_1=1}^{d}\sum_{j_2=j_1+1}^{d}{<{v_i,v_j}>x_{i}\cdot{x_{j}}}

其中,wRdw\in{R^d}vRkv\in{R^k}<..>\lt..\gt代表内积。

图四 FM部分结构

Deep

DeepFM的Deep部分其实跟Wide&Deep的Deep部分没有太大的区别,唯一的区别在于,在DeepFM原始特征会被同时用于Deep和FM两部分,也就是特征是共享(shared)的,而Wide&Deep中并不如此。而FM中用来学习交互信息的嵌入特征向量也会作为Deep中的嵌入向量,这么一来,在迭代优化这个网络的时候,这部分的嵌入特征会在两部分同时得到误差反馈信号而更新,而在Wide&Deep中,这部分的信号只来自于Wide部分的加权误差。

图五 Deep部分结构

模型结构

图六 DeepFM模型结构

DeepFM可以说是Wide&Deep的改进版,但是更好的学习了低阶和高阶特征,也避免了特征交互的稀疏性并且直接用端对端的方式实现模型训练,不需要任何额外的特征工程。

参考资料

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