Wide&Deep

8/2/2021 Wide&Deep

# 如何理解Wide&Deep模型的Memorization?

记忆能力(Memorization)可以被理解模型直接学习并利用历史数据中物品或者特征的“共现频率”的能力。像逻辑回归、协同过滤等简单模型的结构较为简单,原始数据往往可以直接影响推荐结果,产生类似于“如果点击过A,就推荐B”这类规则式的推荐,相当于模型直接记住了历史数据的分布特点,并利用这些记忆进行推荐。即一旦发现了“强特征”,相应的权重会在模型(例如逻辑回归)训练过程中被调整的非常大,就实现了对这个特征的记忆。

通过一系列人工的特征叉乘(cross-product)来构造这些非线性特征,捕捉sparse特征之间的高阶相关性,即“记忆” 历史数据中曾共同出现过的特征对。

典型代表是LR模型,使用大量的原始sparse特征和叉乘特征作为输入,很多原始的dense特征通常也会被分桶离散化构造为sparse特征。这种做法的优点是模型可解释高,实现快速高效,特征重要度易于分析,在工业界已被证明是很有效的。

# Memorization存在哪些缺点?

  • 需要更多的人工设计
  • 可能出现过拟合。可以这样理解:如果将所有特征叉乘起来,那么几乎相当于纯粹记住每个训练样本,这个极端情况是最细粒度的叉乘,我们可以通过构造更粗粒度的特征叉乘来增强泛化性;
  • 无法捕捉训练数据中未曾出现过的特征对。泛化能力较差,若两个特征共同出现的频次是0,模型训练后的对应权重也将是0;

# 如何理解Wide&Deep模型的Generalization?

sparse特征学习低维的dense embeddings 来捕获特征相关性,学习到的embeddings 本身带有一定的语义信息。可以联想到NLP中的词向量,不同词的词向量有相关性,因此文中也称Generalization是基于相关性之间的传递。这类模型的代表是DNN和FM。他的优点是需要更少的人工参与,对历史上没有出现的特征组合有更好的泛化性

# Generalization存在哪些缺点?

在推荐系统中,当user-item matrix非常稀疏时,例如有和独特爱好的users以及很小众的items,NN很难为users和items学习到有效的embedding。这种情况下,大部分user-item应该是没有关联的,但dense embedding 的方法还是可以得到对所有 user-item pair 的非零预测,因此导致 over-generalize并推荐不怎么相关的物品。此时Memorization就展示了优势,它可以“记住”这些特殊的特征组合。

Memorization根据历史行为数据,产生的推荐通常和用户已有行为的物品直接相关的物品。而Generalization会学习新的特征组合,提高推荐物品的多样性。

# 请简述Wide&Deep的模型结构。

Wide&Deep包含一个 linear model:LM 部分和一个 neural network:NN 部分。

其中单层的linear model即wide部分擅长处理大量稀疏类id特征;Deep部分利用神经网络表达能力强的特点,进行深层交叉,挖掘藏在特征背后的数据模式。

设模型的输入特征向量为 是一个维的特征向量(经过 one-hot ),仅包含原始特征。表示特征交叉转换函数, 包含转换后的特征。

  • LM 部分:即左侧的 wide 子模型,它是一个线性模型:

    其中表示特征拼接,是模型参数, 为偏置。

  • NN 部分:即右侧的 deep 子模型,它是一个 DNN 模型。

输入层:为了缓解模型的输入大小,DNN 的所有离散特征的输入都是原始特征,而没有经过 one-hot 编码转换。

第一层 embedding 层:将高维稀疏的 categorical 特征转换为低维的 embedding 向量。论文中的embedding 向量维度为 32 维。

第二层特征拼接层:将所有的 embedding 向量拼接成一个 dense feature 向量。论文中该向量维度为 1200维。

后续每一层都是全连接层:

其中为层的编号,为激活函数。

模型联合了 wide 和 deep 的输出:

其中 为 wide 部分的权重, 为 deep 部分的权重, 为全局偏置。

模型的损失函数为负的对数似然,并通过随机梯度下降来训练.

# Wide&Deep在训练的时候采用了Joint Training,有什么好处?

联合训练(Joint Training)和集成(Ensemble)是不同的,集成是每个模型单独训练,再将模型的结果汇合。相比联合训练,集成的每个独立模型都得学得足够好才有利于随后的汇合,因此每个模型的model size也相对更大。而联合训练的wide部分只需要作一小部分的特征叉乘来弥补deep部分的不足,不需要 一个full-size 的wide 模型。

在论文中,作者通过梯度的反向传播,使用 mini-batch stochastic optimization 训练参数,并对wide部分使用带L1正则的Follow- the-regularized-leader (FTRL) 算法,对deep部分使用 AdaGrad算法。

# 论文里作者是如何应用wide&deep来做推荐的?

Google Play商店的app推荐中,当一个user访问Google Play,会生成一个包含user和contextual信息的query,推荐系统的精排模型会对于候选池中召回的一系列apps(即item,文中也称 impression)进行打分,按打分生成app的排序列表返回给用户。Deep&Wide对应这里的精排模型,输入包括<user,contextual,impression>的信息,表示用户下载了impression app,打分即

实验的Deep&Wide模型结构如下:

实验细节

  • 训练样本约5000亿
  • Categorical 特征(sparse)会有一个过滤阈值,即至少在训练集中出现m次才会被加入
  • Continuous 特征(dense)通过CDF被归一化到 [0,1] 之间
  • Categorical 特征映射到32维embeddings,和原始Continuous特征共1200维作为NN输入
  • Wide部分只用了一组特征叉乘,即被推荐的app ☓ 用户下载的app
  • 线上模型更新时,通过“热启动”重训练,即使用上次的embeddings和模型参数初始化

Wide部分设置很有意思,作者为什么这么做呢?结合业务思考,在Google Play商店的app下载中,不断有新的app推出,并且有很多“非常冷门、小众”的app,而现在的智能手机user几乎全部会安装一系列必要的app。联想前面对Memorization和Generalization的介绍,此时的Deep部分无法很好的为这些app学到有效的embeddding,而这时Wide可以发挥了它“记忆”的优势,作者在这里选择了“记忆”user下载的app与被推荐的app之间的相关性,有点类似“装个这个app后还可能会装什么”。对于Wide来说,它现在的任务是弥补Deep的缺陷,其他大部分的活就交给Deep了,所以这时的Wide相比单独Wide也显得非常“轻量级”,这也是Joint training相对于Ensemble的优势。

# 为什么wide&deep模型用ftrl和adagrad两种优化方法?

wide部分是用ftrl做的优化,wide部分可以看做传统的lr,用ftrl优化可以得到稀疏权重,精度也不错,大大压缩了模型的权重,也压缩了特征向量的维度,可以减少特征数量,降低计算复杂度。从而降低serving的复杂度。wide&deep采用L1 FTRL是想让Wide部分变得更加稀疏。

deep部分是神经网络,输入要么是Age,#App Installs这些数值类特征,要么是已经降维并稠密化的Embedding向量,不需要考虑特征稀疏问题,稀疏也降低不了复杂度,可以通过正则化或者dropout,降低过拟合。所以Deep部分不存在严重的特征稀疏问题,自然可以使用精度更好,更适用于深度学习训练的AdaGrad去训练

# Wide&Deep模型的创新和优势是什么?

Wide&Deep应用于多家一线互联网公司,其后续的改进创新工作也一直在持续,DeepFM、NFM等模型都可以看成Wide&Deep模型的延伸。

1)它抓住了业务的本质,能够融合传统模型记忆能力和深度学习模型泛化能力的优势

2)模型的结构不复杂,比较容易在工程上实现、训练和上线,加速了在工业界的应用。

# 在应用场景中,哪些特征适合放在Wide侧,哪些特征适合放在Deep侧,为什么?

根据人工经验、业务背景,将我们认为有价值的、显而易见的特征及特征组合,喂入wide侧

对于一些受上下文影响较大的,简单的规律诸如交叉或许能够反映更大的上下文原因的特征适合放在Deep层。