谷歌一出马全都不能打:Wide&Deep以及Deep&Cross

2020-11-22  本文已影响0人  金色暗影
好喜欢金色的女孩子

今天分享一个特出名影响特大的模型:Winde&Deep。 原先因为个人喜好问题不太打算讲这个的,但是这个模型在业界实在是举足轻重,后期很多模型都是在这个基础上发展起来的,因此感觉还是值得好好探讨一下。

这个模型呢,是Google Play的推荐团队在2016年的时候提出来的,Google在互联网圈的影响里大家都懂的,这个模型一公布,就迅速被各大厂商争相应用,迅速成为当时的主流模型,影响甚至延续至今。于是,接下来就来看看这个模型到底做了写什么。仍旧是顾名思义,这个模型就是一个由wide部分和deep部分组合而成的混合模型😂:其中wide部分的主要作用是让模型具有较强的“记忆能力”;而deep部分 的主要作用是让模型具有较强的“泛化能力”,正是这样的结构特点,使模型兼具了逻辑回归和深度神经网络的优点——能够快速处理并记忆大量历史行为特征(快速出效果),并且同时具备了强大的表达能力,能够应对前所未有的情况(具备更好的泛化能力)。

记忆能力和泛化能力

Wide&Deep模型设计的初衷和最大价值便在于让推荐模型能够同时具备较强的“记忆能力”和“泛化能力”。
那么,什么是记忆能力呢? 我愿把他理解为数据统计分析及简单的模式学习能力,形象的来讲就是死记硬背的能力,即同一份试卷,在以前做过有正确答案的情况下,凭借记忆再做一次的话能尽量做对。比如说模型直接去学习历史数据中Item或是Feature的共现频率,并以此作为推荐依据,这是一种相对简单和可解释的特征处理方式,一般来说,协同过滤、逻辑回归等简单的模型都具备较强的记忆能力。这类模型的结构简单,原始的数据特征往往可以直接影响模型的推荐结果,产生类似于“如果点击过A,就推荐B”这类的基于历史数据分析的规则式推荐。从这里可以看出,Google的推荐团队是非常懂推荐的,这种方式往往能够更加快速,并且以人类非常容易理解的方式提升推荐效果。至于什么是泛化能力,对深度学习领域的人来说应该一点都不陌生了,就是解决训练数据之外问题的能力,简言之就是举一反三的能力,不仅要会做已经做过知道答案的试卷,对于同类型的没见过的卷子也需要获得较高分数的能力。

那么,下面我们通过实际的例子来看看什么是wide部分的记忆能力。既然是谷歌应用商店的团队整的模型,那便举拿推荐app举例吧。
假设Google Play推荐模型的训练过程中,有这样一个组合特征AND(user_installed_app=netflix, impression_app=pandora)(简称为netflix&pandora),它代表了用户已经安装了Netflix这个应用,并且在应用商店看到过pandora这个应用,如果以最终是否下载安装pandora这个应用为标签(label),则可以轻而易举的统计出netflix&pandora这个特征和安装pandora这个标签之间的共现频率。假设这两者的共现频率高达10%(而全局的应用安装率仅为1%),那么可以说这是一个很强的特征,以至于提醒我们在我们设计模型的时候,应该着重考虑这个特征,希望模型一发现用户已安装Netflix这个特征,就给用户推荐pandora,这便是所谓的记忆能力,让模型记住了历史中已经发生过的事情。像逻辑回归这类简单的模型,因为使用的基本就是原始的特征输入,因此很容易发现这样的“强特征”,从而把相应的权重训练的特别大,也就是实现了对强特征的记忆。 与之相反的,对于多层的深度神经网络来说,特征会经过多层的交叉处理,因此模型不被这种强特征直接影响,于是记忆也就没那么强了。

模型结构

正如上面所说的,模型的目的已经非常明确了,于是Wide&Deep要做的就是把具有较强记忆能力的简单模型和具有较强泛化能力的深度模型融合到一起:


Wide & Deep 模型结构

根据上面的结构图,很容易看出,模型就是把单层的Wide部分和由Embedding层及多个隐藏层获得的特征一起输入到输出层,最后得出推荐结果。
下面再来看一下具体的特征工程及Wide和Deep部分都输入了哪些特征,这些具体的设计展现了Google Play的推荐团队对业务场景的深刻理解:

Wide&Deep模型详细设计

Wide部分的输入十分简单,仅仅是已安装应用和曝光应用两类特征,其中已安装应用代表了用户的历史行为,而曝光应用代表当前的待推荐应用。使用这两类特征得以充分发挥出Wide部分记忆能力强的优势。这两类特征在经过一个Cross Product Transformation操作之后和Deep部分一起输入到输出层。
这里有必要说一下这个组合了“已安装应用”和“曝光应用”两个特征的交叉积变换(Cross Product Transformation)函数,它的数学定义如下:
\phi_k(X) = \prod^d_{i=1}x_{i}^{c_{ki}} ~~~ c_{ki} \in \{0,1\}
其中,c_{ki} 是0或者1,当第i 个特征属于第k个组合特征时,c_{ki} 的值为1,否则为0.就拿之前的例子来说吧,对于netflix&pandora这个组合特征来说,只有当安装了netflix,曝光了pandora两个特征同时满足时才为1,否则就是0.

Deep部分这是输入了更加全面的特征向量,包括用户的年龄、已安装应用的数量、设备类型、已安装应用、曝光应用等...数值型特征直接进入加入拼接,而一些类别特征这经过embedding之后再拼接,拼接得到的向量再经过3层的全连接层(Relu激活),再输入到输出层,输出层使用Logstic Loss。

这么看下来,容易发现网络结构还是蛮简单的,关键就在于特征工程怎么构建了,这就取决于工程师对推荐场景的理解了,尤其是Wide部分,选取哪些特征好很考验工程师对场景的理解程度。

进化版本:Deep&Cross

自从Wide&Deep公开之后,就有一大波工作围绕着它而展开,要么是魔改Deep部分,要么是魔改Wide部分。其中比较典型的就是2017年由谷歌自己和斯坦福大学提出的Deep&Cross模型(DCN)。
这个模型在Deep部分没啥变化,主要就是修改了Wide部分,增加了特征交叉的力度,给特征使用了一个多层的交叉,我们用x_l表示第l层的特征,那么有:
x_{l+1} = x_0x_l^TW_l+b_l+x_l
跟PNN模型中的外积操作有点像,并且在它的基础上加了权重向量W_l和偏置向量b_l,同时为了减少交叉对原始特征带来过大改变还叠加上了原始特征x_l. 这样的交叉方式,在原先Wide的基础上进行了自动化的特征交叉,避免了更多需要人工理解的特征组合。可以说是Wide部分特征交叉更加智能的Wide&Deep...

总结

Wide&Deep模型可以说是非常成功的,不仅被很多很多的互联网大厂所用,而且也对后续推荐系统的发展做了铺垫,在这之后的DeepFM、NFM模型均可以看作是Wide&Deep的延续。
它成功的原因可以归结为以下几点:

  1. Google 发的。 Google在互联网领域的号召力和影响力不言而喻,常态就是一群菜鸡互啄,然后Google一出马,全都不能打。
  2. 抓住了推荐系统的核心问题,融合了传统模型及深度学习模型的优势,同时模型还不复杂,易于工程实现,一看就是Google的老推荐工程师弄的......

参考

Wide & Deep Learning for Recommender Systems
王喆《深度学习推荐系统》

上一篇下一篇

猜你喜欢

热点阅读