当前位置: 代码迷 >> 综合 >> Wide Deep Learning for Recommender Systems 阅读
  详细解决方案

Wide Deep Learning for Recommender Systems 阅读

热度:29   发布时间:2023-12-07 01:25:59.0

 

摘要

非线性特征变换的广义线性模型广泛应用于有稀疏特征输入的大规模回归和分类问题。通过特征交叉得到的memorization of feature interactions具有很好的效率以及可解释性,但是这种做法的泛化需要在特征工程上投入更多的精力。通过从稀疏数据中学习低维稠密embedding特征,并应用到深度学习中,只需要少量的特征工程就能对潜在的特征组合具有更好的范化性。然而带embedding的deep网络可能过度泛化(over-generalize),特别是当user-item的交互是高维稀疏的时候,可能会推荐不相关的item。本文提出了Wide&Deep模型,联合训练wide侧的线性模型以及deep侧的神经网络,使得推荐系统同时拥有记忆性和泛化性的优点(combine the benefits of memorization and generalization for recommender systems)。我们在Google Play上部署并评估了这个系统,Google Play是一个拥有超过10亿活跃用户和超过100万应用的移动应用商店。在线实验结果表明,Wide&Deep较Wide-only和Deep-only应用程序的获取量显著增加了。我们还在TensorFlow中实现了开源。

CCS概念 

?计算方法论→机器学习; 神经网络; 监督学习; ?信息系统→推荐系统;

关键字

Wide & Deep Learning; Recommender Systems

1. 引言

推荐系统可以被看成搜索排序系统,其中输入的 query是一组用户和上下文信息,输出是items的排序列表。给定一个query,推荐的任务是在数据库中找到相关的items,然后根据某些指标(例如点击或购买)对item进行排序。

与多数搜索排序问题类似,推荐系统中的一项挑战是同时获得记忆性(memorization)和泛化性(generalization)。 记忆可以大致定义为学习频繁共现的tems或features,以及从历史数据中利用相关性(Memorization can be loosely defined as learning the frequent co-occurrence of items or features and exploiting the correlation available in the historical data.)。另一方面,泛化是基于相关性的传递,并探索过去从未或很少发生过的新的特征组合(Generalization, on the other hand, is based on transitivity of correlation and explores new feature combinations that have never or rarely occurred in the past. )。 基于记忆的推荐通常更具局部性(more topical),并且与用户有过行为的items有直接的相关性。 与记忆性相比,泛化倾向于提高推荐items的多样性。 在本文中,我们主要关注Google Play商店的app推荐场景,但该方法对推荐系统具有通用性。

 在工业界中,广义线性模型(如logistic回归)因其简单、可扩展和可解释性,在大规模的在线推荐和排序系统中得到广泛应用。该模型的特征通常是二值化的one-hot编码的稀疏特征。例如,二值特征“user\_installed\_app=netflix”的值为1,表示用户安装了netflix。在稀疏特征上进行特征交叉可以有效的提升memorization,例如AND(user_installed_app=netflix,impression_app=pandora),如果用户安装了netflix并且之后展示在Pandora上,则其值为1。这解释了特征对的共现如何与目标相关(This explains how the co-occurrence of a feature pair correlates with the target label. )。generalization可以通过增加粗粒度的特征实现,例如AND(user\_installel\_category=video, impression\_category=music),但通常需要手动进行功能设计。这种特征交叉变换的一个局限性是它们不能泛化到训练数据中没有出现过的query-item特征对。

注:线性模型通常使用one-hot特征(比较稀疏),显示的特征交叉(笛卡尔积)

基于embedding的模型,如factorization machines 或深度神经网络,通过为每个query和item特征学习一个低维稠密的embedding向量,对以前未出现过的query-item对有泛化性,减少了特征工程的负担。然而,当query-item矩阵是高维稀疏的时候,例如具有特定偏好的users或小众的items,很难学习有效的query和item的低维表示。在这种情况下,大多数query-item对之间应该没有交互,但是稠密的embedding还是会对所有query-item对有非零的预测,因此可能会过度泛化并出现不相关的推荐。另一方面,具有交叉特征变换的线性模型可以用更少的参数记忆那些“exception_rules”。

在本文中,我们提出了图1所示的Wide & Deep框架,融合了线性模型和深度网络,以获得 memorization and generalization。

这篇文章的主要贡献:

  • 联合训练使用了embedding的深度网络和使用了交叉特征的线性模型。
  • 再有十亿活跃用户和百万app的google play上实施和评价Wide & Deep推荐系统。
  • 我们用tf的高阶API开源了实现。

虽然这个想法很简单,但我们发现Wide & Deep框架在满足训练和服务速度要求的同时,显著提高了移动应用商店的应用获取率。

2.推荐系统概述

App推荐系统的概述如图2所示。当用户访问应用商店时,会生成一个query,其中可以包含各种用户和上下文特征。推荐系统返回一个应用程序列表(也称为曝光),用户可以对其执行某些操作,如点击或购买。这些用户操作以及qury和曝光都被记录在日志中,作为学习的训练集。

由于数据库中有超过一百万个应用程序,在服务延迟要求(通常是100毫秒)内对每个应用程序进行彻底的评分是很困难的。因此,收到query的第一步是检索。检索系统使用各种标记(通常是机器学习模型和规则的组合)返回与query最匹配的项目的简短列表。候选池缩小后,排序系统根据score对所有的items进行排序。分数通常是P(y | x),即给定特征x,用户产生行为的概率作为标签y,特征包括用户特征(例如,国家、语言、人口统计)、上下文特征(例如,设备、一天中的小时、一周中的一天)和曝光特征(例如,应用年龄、app的历史统计数据)。在这篇论文中,我们重点讨论了使用Wide & Deep学习框架的排名模型。

3. WIDE & DEEP LEARNING

3.1 Wide部分

如图1左侧所示,wide部分是y = w^Tx+b的广义线性模型。y是预测,\mathbf{x}=[x_1, x_2, \cdots , x_d]是d维特征向量,\mathbf{w}=[w_1, w_2, \cdots , w_d]是模型参数,b是偏置。特征集包括原始输入特征和经过转换的特征,最重要的转换过的特征就是交叉特征,定义如下:

\phi_{k}(\mathbf{x}) = \prod_{i=1}^{d}x_{i}^{c_{ki}}\ \ \ \ c_{ki} \in \{0, 1\} \ \ \ \ \ \ \ \ \ \ (1)

c_{ki}是布尔值,1代表第i个特征是第k个转换特征\phi_k,其他情况是0。对于二值特征,当且仅当组成的特征("gender=female" \ and \ "language=en" )全是1,交叉特征(e.g., \ "AND(gender=female, language=en)")才是1,否则是0。这样捕获了二值特征的交互,并且为广义线性模型引入了非线性。

3.2 Deep部分

如图1右侧所示,deep部分是前向反馈神经网络。类别特征的原始输入是字符串类型的(e.g., \ "language=en")。我们会先将这些高维稀疏的类别特征转换为低维稠密的实值向量,通常称为embedding向量。embedding的维度通常是几十到几百。embedding的向量通常是随机初始化的并和模型一起训练。低维稠密embedding向量被送入神经网络隐层,具体来说,每个隐藏层计算:

a^{l+1} = f(W^{(l)}a^{(l)} + b^{(l)}) \ \ \ \ \ \ \ \ \ (2)

其中,l是层数,f是激活函数,通常是整流线性单元(ReLUs)。

3.3 Wide & Deep模型联合训练

输出是wide和deep部分加权和的对数几率,再送入logistic loss function一起训练。注意联合训练和集成学习的区别。在集成学习中,单个模型在不知道其他模型的情况下单独训练,并且它们的预测(inference)只在推理时组合。相比之下,联合训练通过考虑wide和deep部分以及它们加权和的权重来同时优化所有参数。对模型尺寸也有影响:对于集成来说,由于训练是独立的,每个单独的模型尺寸通常需要更大(例如,具有更多的特征和变换),以达到合理的精度,以便集成学习生效。相比之下,对于联合训练,wide部分只需要通过少量的交叉特征转换来补充deep部分的弱点,而不是全尺寸的wide模型。

Wide & Deep联合训练使用小批量随机优化,将梯度从输出同时反向传播回wide侧和deep侧。实验中,我们使用带L1正则的FTRL来优化wide部分,AdaGrad优化deep部分

组合模型如图1(中部)所示,对于logistic regression问题来说,模型的预测是:

P(Y=1|x) = \sigma ( \mathbf{w}_{wide}^{T} [ \mathbf{x}, \phi(\mathbf{x}) ] + \mathbf{w}_{deep}^{T} a^{(l_{f})} + b) \ \ \ \ \ \ \ \ (3)

Y是一个二值标签,\sigma(\cdot)是sigmoid函数,\phi(\mathbf{x})是原始向量\mathbf{x}的交叉特征,b是偏置,\mathbf{w}_{wide}是wide侧的全部权重,\mathbf{w}_{deep}是deep侧应用在最后的隐藏层输出上的权值。

4.系统实现

如图3所示,实现app推荐流程有三个步骤:data generation, model training, mdel serving。

4.1 Data Generation

 Continuous real-valued features are normalized to [0, 1] by mapping a feature value x to its cumulative distribution function P(X ≤ x), divided into nq quantiles. The normalized value is \frac{i-1}{n_q - 1} for values in the i-th quantiles. Quantile boundaries are computed during data generation. 

在该阶段中,使用一段时间内的用户和应用程序曝光数据来生成训练数据。每个样本对应一个曝光。标签为app acquisition:如果曝光的程序被安装了,则为1,否则为0。

这个阶段也会用词汇表将类别特征字符串映射成整数id。系统为所有超过最小次数的字符串计算ID空间。连续特征被利用其累计分布函数P(X \leqslant x)归一化到[0,1],然后在离散到n_q分位数来实现的。归一化后的第i部分对应于\frac{i-1}{n_q - 1}的值。各部分的边界在数据生成阶段完成计算。

4.2 模型训练

我们在实验中使用的模型结构如图4所示。During training, our input layer takes in training data and vocabularies and generate sparse and dense features together with a label。wide部分由用户安装app和曝光(impression)app的cross-product变换构成。而对于deep部分,模型为每个类别型特征学习了一个32维的embedding向量。我们将所有的embedding向量和稠密向量拼接在一起,得到了一个约1200维的稠密向量这一拼接得到的向量随后被输入到三个ReLU层,并最终通过逻辑输出单元(logistic output unit)

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

在将模型加载到服务前,将对模型进行一次试运行,以确保它不会在服务实时流量时造成问题。作为一个健全性检验,我们根据经验验证了模型的质量。

4.3 模型服务

一旦模型经过训练和验证,我们就将其加载到服务。对于每个request,服务器从应用程序检索系统接收一组候选应用程序以及用户特征来进行评分。然后,将应用程序从最高分到最低分进行排序,并按此顺序向用户展示应用程序。评分通过一个Wide&Deep模型的前向推导(forward inference)来计算。

为了能将为每个请求服务的延迟时间控制在100ms内,我们实现了多线程并行来优化服务性能,通过更小批次的并行,来替换先前在一个批次的推导步骤中对所有候选app进行评分。

5. 实验结果

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

5.1 app获取指标

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

除了线上实验,我们也离线计算了AUC。这一指标上,Wide&Deep稍高一些,线上服务的AUC优势效果更加显著。一个可能的原因是,离线数据的曝光和标签是固定的,而线上系统可产行新的探索性推荐,这是通过泛化与记忆(generalization with memorization)的结合,并学习新的用户反馈得到的。

5.2 服务性能

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

6.相关工作

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

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

在推荐系统的文章中,协同深度学习利用深度学习建模内容信息(content information)利用协同过滤学习打分矩阵(ratings matrix)。在移动APP推荐系统中,也有着相关的工作:如AppJoy在用户的应用使用历史上使用了CF。与前人关于CF或内容为基础的实现不同,我们在APP推荐系统中,对用户和曝光数据做了Wide&Deep模型的联合训练。

7.结论

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


 

 

 

 

 

 

 

参考:https://www.jianshu.com/p/3439c856a1bb

  相关解决方案