Wide & Deep Learning for Recommender Systems / 中译文

原文:arxiv

摘要

在输入数据具有稀疏性的大规模回归和分类问题中,广泛使用了带有非线性特征变换的广义线性模型进行求解。通过一组宽泛(a wide set)的外积特征转换(cross-product feature transformation)可实现模型对各特征交互的有效记忆(memorization of feature interactions),但是模型的泛化能力(generalization)仍需更深入的特征工程。在使用较少的特征工程时,深度神经网络(deep neural networks)可对没见过的特征组合有更好的扩展性,这是由于深度网络学习了稀疏特征的低维稠密嵌入(low-dimensional dense embeddings)表示。然而,在用户-物品交互数据是稀疏高维的情况下,深度神经网络可能会变得过于泛化(over-generalize),从而推荐更不相关的物品。

本文中,我们提出了Wide&Deep学习来将记忆与泛化(memorization and generalization)有机结合:联合训练线性模型和深度神经网络。我们在Google Play(一个具有超10亿活跃用户和百万APP的商业移动应用商店)的业务中实践并评估了这一系统。线上实现结果说明,相比于单独的广度模型(wide-only,此处指前文的线性模型)和单独的深度模型,Wide&Deep显著提升了用户获取APP的次数。我们也在TenserFlow中开源了我们对这一模型的代码实现。

关键词

Wide&Deep Learning, 推荐系统

1. 导言

一个推荐系统可被看作是一个搜索排序系统,这一系统的查询输入是一组(用户,上下文信息)的集合,输出是一个排序后的物品列表。接收到一个查询请求,推荐系统会在数据库中找到相关的物品并根据特定的目的进行排序,常见的目的有用户点击、购买。

与广义的搜索排序问题一样,推荐系统也面临这样一个挑战:如何同时实现记忆与扩展/泛化(memorization and generalization)。记忆可不严格地定义为,学习并利用历史数据中的高频共现物体或特征所具有的关系。另一方面,泛化指这一关系的转移能力(transitivity),以及发现在历史数据中罕见或未曾出现过的新的特征组合。基于记忆的推荐通常更集中于用户历史行为所涵盖的特定主题(topical)。而基于泛化的推荐会倾向于提升推荐物品的多样性。在本文中,我们将注意力放在Google Play应用商店的应用推荐问题上,但这一问题的解决方案应适用于广义的推荐系统。

在工业界的大规模线上推荐和排序系统中,广义线性模型如逻辑回归被广泛应用,因为它们简单、可扩展(scalable)且具有可解释性。这些模型常常基于独热编码(one-hot encoding)的二进制化的稀疏特征进行训练。例如,二进制特征“user_installed_app=netflix”在用户安装了Netflix时为1。模型的记忆能力可通过系数特征的外积变换有效实现,如AND(user_installed_app=netflix, impression_app=pandora)在用户安装了Netflix并随后见到过Pandora时值为1。这阐明了一对特征的共现是如何与目标标签产生关联的。使用更粗粒度的特征可实现模型的泛化,如AND(user_installed_category=video, impression_category=music),但常常是需要手工做特征工程的。外积变换的一个局限是,它无法对训练集中未出现过的“查询-物品特征对”进行泛化。

基于嵌入技术的模型,如因子分解机(factorization machines)、深度神经网络等,可对未见过的“查询-物品特征对”进行泛化,这是通过对一个低维稠密嵌入向量的学习来实现的,且这种模型依赖于较少的特征工程。然而,在“查询-物品矩阵”是稀疏、高维的时候,其低维表示是难以有效学习的,例如用户有特定偏好或物品的吸引力较窄(niche/narrow appeal)时。在这种情形下,这一“查询-物品对”应与大部分“查询-物品对”无关,但稠密嵌入会对所有“查询-物品对”给出非零的预测,因而会导致过于泛化并给出不相关的推荐。另一方面,线性模型使用外积特征变换可依赖相当少的参数来记住这些“例外规则”。

本文中,我们呈现Wide&Deep学习框架以在一个模型中同时达到记忆和泛化,这是通过协同训练一个线性模型模块和一个神经网络模块完成的,如图1所示。

image.png

本文的主要贡献包括:

  • Wide&Deep学习框架,用于协同训练带嵌入的前馈神经网络(feed-forward neural networks)和带特征变换的线性模型,以解决稀疏输入的广义推荐系统。
  • 在Google Play(一个具有超10亿活跃用户和百万APP的商业移动应用商店)的业务中对这一Wide&Deep推荐系统的实践与评估。
  • 我们在TensorFlow上开源了我们的代码实现,并提供了高阶API。

尽管想法是简单的,但在满足训练和服务速度的要求下,Wide&Deep框架显著提高了移动应用商店的APP获取指标。

2. 推荐系统概览

在图2中呈现了一个对推荐系统的概览。用户访问应用商店时,将生成一个请求,它可能包括多种用户和上下文特征。推荐系统返回一个APP列表(也可称为"印象"/impression),用户可对这一列表进行点击、购买等行为。这些用户行为和查询、"印象",会被记录在日志中以作为学习训练使用的训练数据。

image.png

考虑到数据库中有超过一百万的APP,在服务延迟需求(通常为O(10)ms)下,难以对每个请求穷尽所有APP的分值计算。因此,在收到请求时的第一步是召回(retrieval)。召回系统通过使用一组信号,返回一个与当前请求最匹配的物品小列表,通常这一组信号是一组机器学习的模型和人工指定的规则的组合。在缩小候选池后,排序系统通过物品的分值进行排序。这些分支通常可表示为P(y|x),在给定特征x时用户行为标签为y的概率,特征x包括了用户特征(如国籍,语言,人口统计数据),上下文特征(如设备,小时数,星期数)以及印象(impression)特征(如APP的“年龄”,APP的历史统计数据)。在本文中,我们着眼于Wide&Deep学习框架所实现的排序模型。

3. WIDE & DEEP LEARNING

3.1 Wide部分

wide部分是一个广义线性模型,具有着y=w^Tx+b的形式,如图1(左)所示。y是模型的预测,x=[x_1, x_2, ..., x_d]d个特征对应的向量,w=[w_1, w_2, ..., w_d]是模型参数,b是模型偏差。特征及和包括原始输入特征(raw input features)和变化得到的特征(transformed features)。其中一个最为重要的变换是外积变换(cross-product transformation),它被定义为:
\phi_k(x) = \prod_{i=1}^{d} x_i^{c_{ki}}, c_{ki} \in \{ 0, 1 \}
其中,c_{ki}是一个bool型变量,在第k个变换\phi_k包含第i个特征时为1,否则为0。对于二进制特征,当且仅当所有组成特征(“gender=female” 和 “language=en”)都为1时值为1,否则为0。这将捕获到二进制特征间的交互,并向广义线性模型中添加非线性项。

3.2 Deep部分

deep部分是一个前馈神经网络,如图1(右)所示。对于类别型特征,原始输入是特征字符串(如“language=en”)。这些稀疏、高维的类别型特征首先被转化为低维稠密实值向量,通常被称为嵌入向量。嵌入向量的维度通常在O(10)O(100)间。在模型训练阶段,嵌入向量被随机初始化并根据最小化最终的损失函数来学习向量参数。这些低维稠密嵌入向量随后在神经网络的前馈通路中被输入到隐藏层中。特别地,每个隐藏层进行了如下计算:
a^{(l+1)} = f(W^{(l)}a^{(l)}+b^{(l)})
其中,l是层的序号,f是激活函数,通常为ReLU。a^{(l)}b^{(l)}W^{(l)}分别为l层的激活、偏差和模型权重。

3.3 Wide和Deep模型的协同训练

wide模块和deep模块的组合依赖于对其输出的对数几率(log odds)的加权求和作为预测,随后这一预测值被输入到一个一般逻辑损失函数(logistic loss function)中进行联合训练。需注意的是,联合训练(joint training)拼装(ensemble)是有区别的。在拼装时,独立模型是分别训练的,它们的预测结果是在最终推断结果时组合在一起的,而不是在训练的时候。作为对比,联合训练是在训练环节同时优化wide模型、deep模型以及它们总和的权重。在模型大小上也有不同:对拼装而言,由于训练是解耦的,独立模型常常需要比较大(如更多的特征和变换)来达到足够合理的准确度用于模型拼装;作为对比,联合训练中wide部分只需要补充deep部分的弱点,即只需要少量的外积特征变换而不是全部的wide模型。

对Wide&Deep模型的联合训练通过同时对输出向模型的wide和deep两部分进行梯度的反向传播(back propagating)来实现的,这其中应用了小批量随机优化(mini-batch stochastic optimization)的技术。在实验中,我们使用了FTRL(Follow-the-regularized-leader)算法以及使用L_1正则化来优化wide部分的模型,并使用AdaGrad优化deep部分。

组合的模型如图1(中)所示。对于逻辑回归问题,模型的预测是:

其中Y是二进制类标签,\sigma (·)是sigmoid函数,\phi (x)是原特征x的外积变换,b是偏差项。w_{wide}是所有wide模型的权重向量,w_{deep}是作用在最终激活a^{l_f}的权重。

4. 系统实现

应用推荐流程的实现由三部分组成:数据生成,模型训练和模型服务,如图3所示。

image.png

4.1 数据泛化

在这一步中,在一段时间中的用户和app的印象(impression)数据被用来生成训练数据集。每项数据对应于一个印象(impression)。标签是app获取与否:如果被印记(impressed)的APP得到了用户的安装则为1,否则为0。

“词汇表”(vocabularies)也在这一步生成,它是类别型特征从字符串向数组ID的映射表。系统计算所有出现了足够多次数的字符串特征的ID空间。连续型特征被归一化到[0, 1]区间,这是通过将特征x的值映射到其累计分布方程P(X≤x)并分成n_q部分来实现的。归一化后的第i部分对应于\frac{i-1}{n_q-1}的值。各部分的边界在数据生成阶段完成计算。

4.2 模型训练

我们在实验中使用的模型结构如图4所示。在训练中,输入层接收输入数据和词汇表(vocabularies),并生成稀疏、稠密特征以及标签。wide部分由对用户安装app和印象(impression)app的外积变换构成。而对于deep部分,模型对每个类别型特征学习了一个32维的嵌入向量。我们将所有的潜入向量与稠密特征拼接在一起,得到了一个约1200维的稠密向量。这一拼接得到的向量随后被输入到三个ReLU层,并最终通过逻辑输出单元(logistic output unit)。

image.png

Wide&Deep模型基于超5000亿样本进行训练。每当有一组新的训练数据到达时,模型都需要被重新训练。然而,每次都进行重计算所需的计算量巨大,且会延迟数据抵达到模型更新的时效性。为了解决这一挑战,我们实现了一个热启动系统,它将使用旧模型的潜入向量、线性模型权重等参数对新模型进行初始化。

在将模型加载到服务中前,会做一次预运行,来确保它不会导致线上服务出错。我们的“靠谱测试”(sanity check)通过对新旧模型的经验化验证完成。

4.3 模型服务

一旦模型完成了训练和验证,我们就将它加载到模型服务中。对于每个请求,该服务将收到一组召回系统提供的候选app列表以及用户特征来计算评分。随后,app按照评分从高到低排序,我们将向用户按照这一顺序展现app列表。评分通过一个Wide&Deep模型的前向推导(forward inference)来计算。

为了将请求响应速度优化至10ms,我们实现了多线程并行来优化服务性能,通过更小批次的并行,来替换先前在一个批次的推导步骤中对所有候选app进行评分。

5. 实验结果

为了评估Wide&Deep在现实世界的推荐系统中的有效性,我们从两个方面进行了测试和评估:app获取指标和服务性能。

5.1 APP获取指标

我们进行了为期三周的线上AB实验。对参照组,随机选取了1%的用户并呈现旧版本的排序系统给出的推荐结果,它是一个由丰富外积特征变换构成的高度优化的wide-only逻辑回归模型。对实验组,1%的用户被呈现了使用相同特征的Wide&Deep模型所推荐的结果。如表1所示,在应用商城主页上,相对于参照组,Wide&Deep模型提升了3.9%的APP获取率(统计学显著)。

除了线上实验,我们也离线计算了AUC。这一指标上,Wide&Deep稍高一些,其优势更多地体现在线上服务效果。一个可能的原因是,离线数据的印象(impressions)和标签是固定的,而线上系统可产行新的探索性推荐,这是通过混合泛化与记忆,并学习新的用户反馈得到的。

5.2 服务性能

服务于我们的商业移动应用商店是充满挑战的,这是由于其高流量下对高吞吐量和低延时的要求导致的。在峰值流量下,我们的推荐系统每秒要服务于超一千万的APP。单线程对一个批次的所有候选者评分耗时31ms,我们进行了多线程实现,并将单批次数据划分的更小,这显著降低了客户端的延迟至14ms(包括了服务的overhead),如表2所示。

6. 相关工作

将带外积特征变换的wide线性模型和带稠密嵌入的深度神经网络结合的想法来源于前人的启发,如因子分解机通过对两个变量的交互信息得到两个低维嵌入向量的内积,这一技术向线性模型中加入了泛化能力。本文中,我们通过神经网络替换内积,学习嵌入向量间的高度非线性交互信息,以扩充模型的能力。

在语言模型中,联合训练RNN和使用n-gram特征的最大熵模型,被证实可显著降低RNN的复杂度(如隐藏层的大小),这是通过直接学习输入与输出之间的权重来实现的。在计算机视觉领域,深度残差学习(deep residual learning)被用来降低训练更深模型(deeper model)的难度,并通过捷径链接跳过一个或多个层来提升精确度。联合训练神经网络和图像模型也被用来评估图片中的人类姿态问题。在本项工作中,我们探索了联合训练前馈神经网络和线性模型,通过直接训练稀疏特征与输出单元的链接关系,来解决稀疏输入的广义推荐和排序问题。

在推荐系统的文章中,通过耦合内容信息的深度学习和评价矩阵的协同过滤(CF),拓展了协同深度学习。在移动APP推荐系统中,也有着前任的工作:如AppJoy在用户的应用使用历史上使用了CF。与前人关于CF或内容为基础的实现不同,我们在APP推荐系统中,对用户和印象(impression)数据做了Wide&Deep模型的联合训练。

7. 结论

记忆和泛化对推荐系统都很重要。Wide线性模型可通过外积特征变换有效记忆稀疏特征交互信息,而深度神经网络可通过低维嵌入技术对未见过的特征交互进行泛化。我们呈现了Wide&Deep学习框架来结合两个模型的优势。我们在大规模商业应用商店Google Play的推荐系统中实践并评估了这一框架。线上实验结果表明,相对于仅Wide和仅Deep模型,Wide&Deep模型对APP获取指标有着显著提升。

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

推荐阅读更多精彩内容