Wide&Deep模型

1、基础知识

1.1 记忆能力

"记忆能力"可以被理解为模型直接学习并利用历史数据中物品和特征的“共现频率”的能力。“共现频率”越高,组合特征的频率就越大。

举例

逻辑回归:原始数据往往可以直接影响推荐结果

通过学习你的原始数据,模型会知道哪些特征分配权重高,哪些特征分配的权重低最后的推荐结果,跟权重高的特征有很大关系形成了—种“重要特征”跟“推荐结果”的关联比如“如果点击A,就推荐B"相当于模型直接记住了历史数据的分布特点,并利用这些记忆进行推荐。

以谷歌APP推荐场景为例理解一下:

假设在Google Play推荐模型训练过程中, 设置如下组合特征AND:(user_installed_app=netflix,impression_app=pandora), 它代表了用户安装了netflix这款应用, 而且曾在应用商店中看到过pandora这款应用。 如果以“最终是否安装pandora”为标签,可以轻而易举的统计netfilx&pandora这个特征与安装pandora标签之间的共现频率。 比如二者的共现频率高达10%, 那么在设计模型的时候, 就希望模型只要发现这一特征,就推荐pandora这款应用(像一个深刻记忆点一样印在脑海), 这就是所谓的“记忆能力”。 像逻辑回归这样的模型, 发现这样的强特征, 就会加大权重, 对这种特征直接记忆。

但是对于神经网络这样的模型来说, 特征会被多层处理, 不断与其他特征进行交叉, 因此模型这个强特记忆反而没有简单模型的深刻。

共现频率高,--》组合特征与标签结果关联大

例如:“组合特征(安装过Netflix,曝光过Pandora)”跟“安装Pandora”关联十分大

简单理解:线性、权重分配

1.2 泛化能力

"泛化能力“可以被理解为模型传递特征的相关性, 以及发掘稀疏甚至从未出现过的稀有特征与最终标签相关性的能力。

举例:比如矩阵分解, embedding等, 使得数据稀少的用户或者物品也能生成隐向量, 从而获得由数据支撑的推荐得分, 将全局数据传递到了稀疏物品上, 提高泛化能力。再比如神经网络, 通过特征自动组合, 可以深度发掘数据中的潜在模式,提高泛化等。

说白了,泛化能力就是挖掘的过程,去挖掘你看不到、以及背后更深层次,更抽象的这些特征

简单理解:【隐向量】【特征组合】【特征交叉】

2、Wide&Deep提出动机

2.1 提出动机

在CTR预估任务中,使用线性模型仍非常广泛。利用手工构造的交叉组合特征来使线性模型具有“记忆性”,使模型记住共现频率较高的特征组合,往往也能达到一个不错的效果,且可解释性强。但这种方式有着较为明显的缺点:首先,特征工程需要耗费太多精力。其次,因为模型是强行记住这些组合特征的,所以对于未曾出现过的特征组合,权重系数为0,无法进行泛化。

2.2 目标:

为了加强模型的泛化能力

2.3 初步研究:基于Embedding的方式

为了加强模型的泛化能力,研究者引入了DNN结构,将高维稀疏特征编码为低维稠密的Embedding vector,这种基于Embedding的方式能够有效提高模型的泛化能力。

【缺点】基于Embedding的方式可能因为数据【长尾分布】(头部效应),导致长尾的一些特征值无法被充分学习,其对应的Embedding vector是不准确的,这便会造成模型【泛化过度】

什么是长尾分布呢?

长尾分布

例如:【亚马逊是如何成功的?】他就是抓住了冷门的部分

所以说:如果有那么20%的人有一些特殊的癖好,他可能喜欢一些小众的东西,因此在用Embedding的方式给他推荐的时候,给他推荐头部效应的时候(比较火爆的,比较热门的东西)这些并不是它一定喜欢的

 Embedding的缺点 VSlinear model

如果碰到了共现矩阵高度稀疏且高秩(比如user有特殊的爱好,或者item比较小众),很难非常效率的学习出低维度的表示。这种情况下,大部分的query-item都没有什么关系。但是dense embedding会导致几乎所有的query-item预测值都是非0的,这就导致了推荐过度泛化,会推荐一些不那么相关的物品。

相反,简单的linear model却可以通过cross-product transformation(特征组合)来记住这些exception rules(特殊的规则)。

2.4 进一步研究

简单的模型,比如协同过滤,逻辑回归等,能够从历史数据中【学习到高频共现的特征组合】能力,但是【泛化能力不足】,只能学习已有特征跟组合特征,不能学习潜在的关联模型。

而对于矩阵分解,embedding再加上深度学习网络能够利用相关性的传递性去【探索】历史数据中【未出现的特征组合】,【挖掘】数据潜在的【关联模式】,而且泛化能力强,但对于某些特定的场景(数据分布长尾,共现矩阵稀疏高秩)很难有效学习低纬度的表示,造成推荐的过渡泛化。

3、Wide&Deep模型的结构原理

经典的W&D的模型如下面中间的图所示(左边的是wide部分, 也就是一个简单的线性模型, 右边是deep部分, 一个经典的DNN模型)

3.1 Wide部分

对于wide部分训练时候使用的优化器是带正则的FTRL算法(Follow-the-regularized-leader),我们可以把FTRL当作一个稀疏性很好,精度又不错的随机梯度下降方法, 该算法是非常注重模型稀疏性质的,也就是说W&D模型采用FTRL是想让Wide部分变得更加的稀疏,即Wide部分的大部分参数都为0,这就大大压缩了模型权重及特征向量的维度。Wide部分模型训练完之后留下来的特征都是非常重要的,那么模型的“记忆能力”就可以理解为发现"直接的",“暴力的”,“显然的”关联规则的能力。 

 例如, Google W&D期望wide部分发现这样的规则:用户安装了应用A,此时曝光应用B,用户安装应用B的概率大。 所以对于稀疏性的规则的考量, 和具体的业务场景有关。

3.2 Deep部分

该部分主要是一个Embedding+MLP的神经网络模型。大规模稀疏特征通过embedding转化为低维密集型特征。然后特征进行拼接输入到MLP中,挖掘藏在特征背后的数据模式。

输入的特征有两类, 一类是数值型特征, 一类是类别型特征(会经embedding)

4、Wide & Deep

W&D模型是将两部分输出的结果结合起来联合训练,将deep和wide部分的输出重新使用一个逻辑回归模型做最终的预测,输出概率值。联合训练的数学形式如下:

模型结构

我们重点看看这两部分的输入特征:

1、Deep部分: 全量的特征向量, 包括用户年龄(age), 已安装应用数量(#app installs), 设备类型(device class), 已安装应用(installed app), 曝光应用impression app)等特征。 其中, 已安装应用, 曝光应用等类别型特征, 需要经过embedding层输入连接层, 而数值型的特征和前面的特征拼接起来直接输入连接层, 经过3层的Relu全连接层。

2、Wide部分:输入仅仅是已安装应用和曝光应用两类特征。 其中已安装应用代表用户的历史行为, 而曝光应用代表当前待推荐应用。 选择这两部分是想发现当前曝光APP和用户已安装APP之间的关联关系, 以充分发挥Wide的记忆能力, 影响最终的得分。 这部分是L1正则化的FTRL优化器, 可能是因为这两个id类特征向量组合, 在维度爆炸的同时, 会让原本已经非常稀疏的multihot特征向量变得更加稀疏。 因此采用FTRL过滤掉那些稀疏特征是非常好的工程经验。

3、两者结合: 最后将两部分的特征再进行一个拼接, 输出到logistics Loss层进行输出。

工业上使用的经验:

1、像上面说的,这个模型的wide和deep端接收的特征是不一样的, wide端一般会接收一些重要的交互特征,高维的稀疏离散特征; 而deep端接收的是一些连续特征

2、这两端用的梯度下降的方式不一样, wide段用的是那种带有L1正则的那种方式,L1有特征选择的作用, 注重稀疏性些; deep端用的就是普通的梯度下降方式

3、wide & deep是一种架构,不是说一定非得是这样的形式, 具体要跟着具体业务来, 还得进行扩展,比如某些特征,既不适合wide也不适合deep,而是适合FM,那就把这部分特征过一个FM【隐向量的引入,使得FM能更好解决数据稀疏性的问题】, 和wide deep端的输出拼起来得到最后的输出,其实是可以任意改造的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容