wide&deep深入理解

摘要

  推荐系统的主要挑战之一,就是同时解决,理解这两个概念是理解全文思路的关键,也是理解推荐思路的关键,下面分别进行解释。

  面对拥有大规模离散sparse特征输入的CTR预估问题时,将特征进行非线性转换,比如离散、分桶等操作,然后再使用线性模型是在业界非常普遍的做法,最流行的即[LR+交叉特征]。通过大量的交叉特征和特征工程记忆特征影响,是一种有效,并且可解释的方法,但是泛化需要更有效的特征工程,以及大量的人力投入,并且会出现过拟合,多样能力不够的问题(也就是无法捕捉未曾出现过的特征对)。通过对稀疏特征的低维密集嵌入学习,得到特征的embedding,通过少量的特征工程,DNN网络可以对未见过的特征组合进行有效泛化。但是,当用户项间的交互作用稀疏且高阶时,深层神经网络可以过度泛化并推荐不太相关的项

  • 注:
    为什么embedding比较好: 对于类似类别型的特征,应该包含很多信息,而使用类似one-hot的方式,仅仅是0、1表示,很难体现不同类别之间的差异,使用embedding,每一维都带有信息,可以更好的表征特征的信息,并且无法体现各个特征之间的亲疏远近。
    Wide模型泛化能力不行体现在哪里:
      1、比如在预测一个用户是否喜欢运动的场景, 有特征如下,运动鞋品牌类别 = {耐克, 阿迪达斯}, 年龄 = {30, 50},当训练样本出现’耐克&30’为正样本,当预测样本特征为’阿迪达斯&30’时,这样的特征在训练样本中没有出现,这种情况就会预测为不喜欢运动,但是其实耐克和阿迪达斯都是体育品牌,这个其实也是喜欢运动的,通过embedding,耐克和阿迪达斯就是比较近的语义,即使训练样本没有出现’阿迪达斯&30’,也能预测成为该用户喜欢运动,这个就是泛化性体现,如果通过特征工程,将样本特征抽象为类目’运动鞋’,也能得到一定的泛化性。
      2、无法泛化到历史未出现的行为特征上,例如特征,运动鞋品牌类别 = {耐克, 阿迪达斯}, 性别 = {男, 女},水果 = {苹果, 香蕉},历史特征只出现’耐克&男’和’香蕉&男’,如果使用线性模型,即使做了特征抽象,变成’运动鞋&男’和’水果&男’,也无法准确预测特征’耐克&苹果’,因为这个特征在样本中没有出现,这一维特征所有的样本标签都是0,但是使用FM模型或者DNN模型,每一维特征都有自己的embedding编码,通过出现’耐克&男’和’香蕉&男’特征组合的样本,学习到在这个场景耐克和香蕉是比较接近的,同时运动品类和水果是比较接近的,未同时出现的交叉特征使用embedding交叉之后也是有意义的,对应的预测也是正向的。
    Deep的泛化性体现: 比如 水果类别 = {苹果, 梨}, 年龄 = {30, 50},由于通过特征embedding操作,类似特征之间的语意是会比较接近的,比如 苹果的embedding和梨的embedding就比宝马的embedding更加接近,当历史数据中出现‘苹果&30’这样的特征是,预测样本‘梨&30’的概率就比‘宝马&30’的概率大。
    deep出现过度推荐的原因: 当user-item matrix非常稀疏时,例如有独特爱好的users以及很小众的items,NN很难为users和items学习到有效的embedding。这种情况下,大部分user-item应该是没有关联的,但dense embedding 的方法还是可以得到对所有 user-item pair 的非零预测,因此导致 over-generalize并推荐不怎么相关的物品。此时Memorization就展示了优势,它可以“记住”这些特殊的特征组合。

背景介绍

  推荐系统可以简单地看作是排序问题,输入的query是用户和上下文信息,输出是排序后的item,推荐的任务就是在给定query的情况下在候选集中找到最相关的一些item,根据某些目标(如点击或购买)对项目进行排序。
  推荐系统的一个难点是如何同时兼顾记忆和泛化,记忆可以理解为记忆频繁出现的特征或者是商品,从中学习出相关性,泛化指的是相关性的传递,探索过去从未或很少出现的特征组合,基于记忆的推荐通常更具主题性,并且与用户历史行为直接相关。与模型记忆相比,模型泛化倾向于提高推荐系统的多样性。
  对于大规模的在线推荐和排序系统,逻辑回归等线性模型因其简单、可扩展和可解释性而得到广泛应用。模型通常使用one-hot后的稀疏特征进行训练,对应的标签通常是二值化的。通过交叉特征,可以实现高效记忆,这解释了共现特征与标签的相关性。泛化通过特征特征工程实现,比如泛化成为类别,交叉特征的一个限制是他们无法泛化到quer-item对在训练数据中没有出现的特征上。但是,当底层查询项矩阵是稀疏的、高阶的时,很难学习有效的低维特征表示,例如具有特殊偏好的用户和具有冷门的内容。在这种情况下,对于这些item,对应的query-item对应该没有交互,但是稠密embedding会给所有的query-item生成非零预测,因此会过度推荐并且推荐可能不相关的内容。此时,线性模型使用交叉特征可以实现特殊例子的记忆,并仅仅使用少量的特征,类似于添加了一条特殊的规则。

  • 注:比如一个特征由于出现的次数很少,导致这个特征的embedding学习的不是很好,但是由于embedding是非0的,和其他的特征通过embedding组合是,总是非0的,这个时候就可能进行推荐,但是这两位特征如果通过特征交叉,给定了这个交叉特征是将目标向0拉的,这个时候就给模型添加了特殊的规则。
      在这篇论文中,我们将讲解wide&deep学习算法,该模型能同时兼顾记忆和泛化,通过联合训练线性模型和深度模型。
  • 在wide&deep模型中,联合训练dnn和线性模型,dnn使用embedding作为输入,将稀疏输入通过交叉特征输入线性模型。
  • wide&deep已经在google play,一个移动app商城上进行商用和评估,google app store尝过了10亿活跃用户和超过百亿的app。
  • Google一个开源了wide&deep代码,并集成到tensorflow中了。
    虽然思路简单,但wide&deep在满足训练和服务速度要求的同时,显著提高了移动应用商店的应用获取率。

推荐系统概述

  当用户访问app store时会产生一条Query,包括各个用户特征和上下文特征,推荐系统返回一个app列表,用户可以在其上执行某些操作,如单击或购买,这些用户的行为和query会记录在日志里,作为模型的训练数据。
  因为有超过百万的app在数据库中,在服务延迟要求内,在query来的时候,对每个应用程序进行评分是很难的,因此,接收query的第一步是召回。召回系统使用各种信息返回最匹配query的短列表,通常是机器学习模型和人工定义的规则的组合。在减少候选集之后,排名系统会根据分数对所有项目进行排序。得分通常是P(y | x)、给定特征x计算标签y的概率,包括用户特征(例如,国家、语言、人口统计)、上下文特征(例如,设备、一天中的一小时、一周中的一天)和印象特征(例如,应用程序年龄、应用程序的历史统计)。在本文中,我们重点研究使用wide&deep的排名。

WIDE & DEEP LEARNING

The Wide Component

  Wide部分的模型类似于逻辑回归,特征使用原始的特征和交叉特征,这捕获了两个特征之间的相互作用,并将非线性添加到线性模型中。

The Deep Component

  Deep部分是一个神经网络,类似于类别特征,原始输入是特征字符串,这类特征经过one-hot编码之后会成为一个稀疏、高维度的向量,通过embedding操作,embedding的方法很多,例如word2vec和基于图的embedding,能很好的表征类别之间的语言,以及反应一些相关性,变成了低维、稠密的实值向量,embedding的维度通常在10-100维。在模型训练过程中,对嵌入向量进行随机初始化,然后对值进行训练,使最终损失函数最小。然后将这些低维密集嵌入向量输入到神经网络隐藏层中。具体来说,每个隐藏层执行以下计算:


image.png

其中l是层号,f是激活函数,通常是校正线性单位(ReLUs)。a(l) , b(l) , and W (l) 是激活函数,偏差和模型在第l层的参数。

Joint Training of Wide & Deep Model

  将wide部分和deep部分的输出对数概率进行加权和作为预测值,然后输入到相同的逻辑损失函数中进行联合训练。联合训练和模型集成是不同的。模型集成是将各个模型进行独立训练,各模型之间彼此不感知,仅仅在推理的时候会联合各模型的推理结果。但是联合训练同时优化所有的参数,同时考虑wide和deep部分的参数,以及他们总和的权重。模型大小也有影响,对于集成,各模型训练时不相关的,每个单独的模型大小通常需要更大,从而实现集成的合理精度,相比之下,对于联合训练,wide部分只需要用少量的交叉特征转换来补充deep部分的不足,而不需要全量的wide模型
  联合训练同时后向传播wide和deep部分的梯度,并且采用mini-batch优化,使用FTRL+L1作为wide部分的优化器,使用AdaGrad作为deep部分的优化器

image.png

  在上式中,y表示label,σ(·) 表示sigmod函数,φ(x) 表示交叉特征,x表示原始特征,b表示偏执项,Wwide 中表示wide部分的模型参数,Wdeep表示deep部分的模型参数,模型经过训练和验证之后,将其加载到模型服务中国呢,对于每一个请求,服务器从召回系统接收候选列表,并且使用特征计算每一个内容的概率得分。然后根据得分进行排序,按此顺序对内容进行排序输出。
  为了满足10ms内的推理要求,可以使用多线程并行来优化性能,并行运行多个batch,而不是在一个线程中对所有候选集进行排序。

EXPERIMENT RESULTS

  为了验证wide&deep模型的在真实推荐系统中的效果,通过线上实验评估模型的效果以及性能,观察app的下载量以及性能。

App Acquisitions

  在A/B测试框架中进行了为期3周的在线实验。

image.png

具体实验评估可见论文。
  从实验可见,Wide&Deep的离线AUC略高,但对在线流量的影响更为显著。可见wide&deep的泛化能力相对于其他模型是更高的
  注: 在线系统效果好的原因: 一个可能的原因是离线数据集中的内容和标签是固定的,而在线系统可以通过将泛化和记忆结合起来产生新的探索性建议,并从新的用户响应中学习。

Serving Performance

通过多线程的方式,并行处理多个推理batch,大大减小了单个候选集的推理时间。


image.png

wide&deep额外理解

wide侧重点是关注一些记忆信息,通过特征交叉的方式实现记忆,将一些常用到的组合尝试通过交叉特征的形式进行记忆
deep主要是放一些连续值和embedding的特征,通过这种方法实现模型泛化和发现一些长尾的商品
比较好的的项目代码:
https://github.com/ShaoQiBNU/wide_and_deep
部署代码:
https://github.com/searchlink/wide_deep_model/blob/master/model_server.py
理论:
https://zhuanlan.zhihu.com/p/47293765

4.参考文献

  1. 论文:https://arxiv.org/pdf/1606.07792.pdf
  2. 代码:https://github.com/tensorflow/tensorflow/blob/r1.3/tensorflow/examples/learn/wide_n_deep_tutorial.py
  3. FTRL:https://zhuanlan.zhihu.com/p/32903540
  4. AdaGrad:https://zhuanlan.zhihu.com/p/29920135

你可能感兴趣的:(wide&deep深入理解)