推荐系统 + 深度学习 2
  谷歌著名的Wide & Deep模型


论文背景

  题目:Wide & Deep Learning for Recommender Systems
  作者:Heng-Tze Cheng, Levent Koc, Jeremiah Harmsen, Tal Shaked, Tushar Chandra,
  Hrishi Aradhye, Glen Anderson, Greg Corrado, Wei Chai, Mustafa Ispir, Rohan Anil, Zakaria Haque, Lichan Hong, Vihan Jain, Xiaobing Liu, Hemal Shah, Google Inc.
  会议信息:DLRS ’16 September 15-15, 2016, Boston, MA, USA

  谷歌引用数量:1324(截至2021年3月2日)

引言 INTRODUCTION

  推荐系统可视为搜索排序系统,输入是用户和上下文信息的查询,输出是物品列表。类似于一般的搜索排序问题,推荐系统中的一大挑战是同时实现记忆(memorization)和泛化(generalization)。
  Memorization可以宽泛地定义为学习物品或特征的共现频率并探索历史数据的相关关系。
  Generalization是基于相关性的传递性并探索过去从未出现过的新的特征组合。
  基于memorization的推荐系统通常更局限于和直接与用户曾有过行为的物品相关。
  基于generalization的推荐系统试图增强推荐物品的多样性。

  例子:如果用户安装了netflix,特征”user_installed_app=netflix”的值为1。
  Memorization:通过使用稀疏特征的跨物品转换实现,例如AND(user_installed_app=netflix, impression_app=pandora”),如果用户安装了netflix,然后显示pandora, AND的值为1。
  Generalization:可以通过使用粒度更小的特性来添加,例如AND(user_installed_category=video,impression_category=music),但是通常需要手动的特征工程。
  叉积变换(cross-product transformations)的一个限制是它们不能推广到没有出现在训练数据中的查询项特征对。基于嵌入的模型,例如FM或者DNN跨域解决这个问题。但是当底层的查询项矩阵是稀疏且高阶的(例如用户具有特定的偏好或小范围的吸引力)时,很难学习查询和项的有效低维表示。在这种情况下,大多数查询项对之间应该没有交互,但密集嵌入将导致所有查询项对的预测非零,因此导致过拟合而产生不相干的推荐。具有叉积特征转换的线性模型可以用更少的参数记住这些“例外规则”。

  在本文中提出了Wide&Deep模型,通过联合训练一个线性模型组件和一个神经网络组件,实现在一个模型中记忆和泛化。

Wide&Deep模型
Wide&Deep模型

贡献点

  • 带有嵌入和带有特征转换的线性模型的前馈神经网络联合训练的Wide&Deep学习框架,用于具有稀疏输入的通用推荐系统。
  • 在谷歌Play上实施和评估,谷歌Play是一个拥有超过10亿活跃用户和超过百万应用的移动应用商店。
  • 在TensorFlow中有开源代码。

推荐系统概述 RECOMMENDER SYSTEM OVERVIEW

概述
概述

  推荐系统一般分为召回(Retrieval)层,排序(Ranking)层。本文在排序层使用Wide & Deep学习框架。

宽 & 深度学习框架 WIDE & DEEP LEARNING

宽度组件 The Wide Component

  宽度组件是广义线性模型$y = w^Tx + b$,y是预测值,$x = [x_1, x_2, …, x_d]$是d维特征,$w = [w_1, w_2, …, w_d]$是模型参数,b是偏置项。特征集包括原始输入特征和转换后的特征。其中最重要的一种变换是叉积变换,定义为:$$\phi_k(x) = \prod_{i=1}^d{x_i}^{c_{ki}}, c_{ki}∈{0,1}$$
  其中,$c_{ki}$是一个布尔变量,如果第i个特征是第k个变换$\phi_k$的一部分,则为1,否则为0。
  对于二进制特征,一个叉积变换“AND(gender=female, language=en),只有当(“gender=female” and “language=en”)时才为1。
  这捕获了二元特征之间的相互作用,并为广义线性模型增加了非线性。

深度组件 The Deep Component

  深度组件是一个前馈神经网络。对于分类特征,原始输入是特征字符串(例如 “language=en”),这些稀疏的、高维的分类特征首先被转换成一个低维的、稠密的实值向量,通常被称为嵌入向量。嵌入的维数通常在O(10)到O(100)之间。在模型训练过程中,先对嵌入向量进行随机初始化,然后对其值进行训练,使最终损失函数最小。这些低维密集嵌入向量然后被馈入前向传递的神经网络的隐藏层。具体来说,每个隐含层计算:
$$\alpha^{l+1} = f(W^{(l)}a^{(l)}) + b^{(l)})$$

模型联合训练 Joint Training of Wide & Deep Model

  将宽度组件和深度组件以其输出对数概率的加权和进行组合作为预测值,然后将其输入一个通用的logistic损失函数进行联合训练。
  Joint training和ensemble是有区别的。
  ensemble:在一个整体中,个体模型在不相互了解的情况下被单独训练,并且它们的预测只在预测时组合,而不是在训练时。由于训练是不连贯的,每个单独的模型尺寸通常需要更大(例如,有更多的特征和转换),以达到一个集成工作的合理精度。
  Joint training:联合训练通过在训练时同时考虑深度和宽度部分以及它们和的权重来同时优化所有参数。另外,宽度部分只需要用少量的叉积特征转换来弥补深度部分的弱点,而不需要一个全量的宽度模型。
  采用小批量随机优化方法,将梯度从输出部分同时反向传播到模型的宽、深部分,从而实现宽、深模型的联合训练。
在实验中,本文使用L1正则化的Follow-the-regularization-leader(FTRL)算法作为模型宽度部分的优化算法,使用AdaGrad作为模型深度部分的优化算法。
  对于逻辑回归问题,模型的预测为:
$$P(Y=1|x) = \sigma(w^T_{wide}[x,\phi(x)]+w^T_{deep}a^{(l_f)}+b)$$
  其中Y是二分类标签,$\sigma(·)$是sigmoid函数,$\phi(x)$是原始特征x的叉积变换,b是偏置项。$w_{wide}$是所有宽度模型权重的向量,$w_{deep}$是应用在最终激活$a^{(l_f)}$的权重。

系统实现 SYSTEM IMPLEMENTATION

系统实现
系统实现

数据产生 Data Generation

  通过将一个特征值x映射到其累积分布函数P(X≤x),将连续实值特征归一化为[0,1],并分成$n_q$分位数。对于第i个分位数的值,规范化值为$\frac{i-1}{n_q-1}$。分位数边界i−1在数据生成时计算。

模型训练 Model Training

模型训练
模型训练

  在训练过程中,输入层接收训练数据和词汇,并生成稀疏和密集特征以及标签。宽度组件包括用户安装应用和印象应用的叉积。对于模型的深层部分,每个分类特征学习一个32维的嵌入向量。将所有的嵌入与密集特征连接在一起,得到一个大约1200维的密集向量。然后将连接的矢量送入3个ReLU层,最后送入logistic输出单元。
  Wide & Deep模型训练了超过5000亿个例子。每当一组新的训练数据到达时,模型就需要重新训练。然而,每次重新训练在计算上都是昂贵的,并且延迟了服务时间。为了解决这一挑战,本文实现了一个暖启动系统,该系统使用先前模型的嵌入和线性模型权值来初始化一个新的模型。
在将模型加载到模型服务器之前,需要对模型进行一次演练,以确保在服务实时流量时不会出现问题。本文根据经验来验证模型的质量,作为一个完整的检查。

模型服务 Model Serving

  一旦模型经过训练和验证,就把它加载到模型服务器中。对于每个请求,服务器都会从应用程序检索系统和用户特性中接收一组应用程序候选项来为每个应用程序评分。然后,应用程序从最高分到最低分进行排名,并按照这个顺序向用户展示这些应用程序。分数是通过运行一个采用Wide & Deep模型的正向推理来计算的。
  为了为每个请求提供10毫秒量级的服务,使用多线程并行来优化性能,通过并行运行较小的批处理,来代替在单个批处理推理步骤中对所有候选应用程序进行评分。

实验 EXPERIMENT RESULTS

App Acquisitions

  本文在A/B测试框架下进行了为期3周的在线实时实验。对于对照组,随机选择1%的用户,并向他们展示由上一个版本的排名模型生成的推荐,该模型是一个高度优化的广泛性logistic回归模型,具有丰富的叉积特征转换。在实验组中,1%的用户使用了由相同的一组特征进行训练的Wide & Deep模型生成的推荐。

性能对比
性能对比

  Wide & Deep模式使app store主登陆页面的应用获取率比对照组提高了+3.9%。结果还与另1%组仅使用具有相同特征和神经网络结构的模型的深度部分进行了比较,Wide & deep模式比deep-only模型有+1%的增益。
  除了在线实验,还展示了AUC。Wide & Deep的线下AUC略高,但对线上流量的影响更显著。一个可能的原因是离线数据集中的印象和标签是固定的,而在线系统可以通过混合归纳和记忆生成新的探索性推荐,并从新的用户反应中学习。

服务性能 Serving Performance

  面对我们的商业移动应用商店所面临的高流量,高吞吐量和低延迟的服务具有挑战性。在高峰流量时,我们的推荐服务器每秒可以获得超过1000万个应用。使用单个线程,在一次批处理中为所有候选人打分需要31毫秒。我们实现了多线程,并将每个批处理分成更小的部分,这显著地将客户端延迟减少到14毫秒(包括服务开销),如表所示。

服务性能
服务性能

相关工作 RELATED WORK

  结合带叉积转换的广义线性模型与深层神经网络嵌入的灵感来自以前的工作,比如FM,通过在两个低维嵌入向量之间使用点积分解两个变量间的相互作用,将线性模型了进行推广。在本文中,通过神经网络代替点积来学习嵌入之间高度非线性的相互作用,从而扩展了模型容量。
  在语言模型中,通过学习输入和输出之间的直接权值,提出了使用n元特征的递归神经网络(RNNs)和最大熵模型联合训练,以显著降低RNN的复杂性(例如,隐藏层大小)。在计算机视觉中,深度残差学习已被用于降低训练更深层次模型的难度,并通过跳过一个或多个层次的捷径连接提高准确性。
  神经网络与图形模型的联合训练还被应用于基于图像的人体姿态估计。在这项工作中,探讨了前馈神经网络和线性模型的联合训练,在稀疏特征和输出单元之间直接连接,用于输入数据稀疏的通用推荐和排序问题。
  在推荐系统文献中,将内容信息的深度学习与评分矩阵的协同过滤(CF)相结合来探索协同深度学习。以前的工作也曾致力于手机应用推荐系统,如AppJoy在用户的应用使用记录上使用CF。不同于之前工作中基于cf或基于内容的方法,我们在app推荐系统中,基于用户和印象数据使用Wide & Deep模型联合训练。

总结 CONCLUSION

  宽度线性模型可以通过叉积特征变换有效地记忆稀疏特征交互,而深度神经网络可以通过低维嵌入来泛化之前未见过的特征交互。在线实验结果表明,与Wide-only和Deep-only模型相比,Wide & Deep模型有显著提高。

代码

https://github.com/tensorflow/tensorflow/blob/r1.11/tensorflow/python/estimator/canned/dnn_linear_combined.py