Wide & Deep Learning for Recommender Systems
具有非线性特征变换的广义线性模型广泛用于具有稀疏输入的大规模回归和分类问题。通过一系列跨产品特征转换来记忆特征交互是有效且可解释的,而泛化则需要更多的特征工程设计。通过较少的特征工程,深度神经网络可以通过针对稀疏特征学习的低维密集嵌入更好地概括到看不见的特征组合。然而,当用户项目交互稀疏且高级别时,具有嵌入的深度神经网络可能过度概括并推荐不太相关的项目。在本文中,我们提出Wide&Deeplearning——联合训练的宽线性模型(wide linear models)和深度神经网络——结合推荐系统的记忆和概括的好处。我们在Google Play上制作并评估了该系统,Google Play是一个商业移动应用商店,拥有超过10亿活跃用户和超过100万个应用。在线实验结果表明,与仅限Wide和仅限Deep的模型相比,Wide&Deep显着增加了应用获取。我们还在TensorFlow中开源了我们的实现。
推荐系统可以被视为搜索排名系统,其中输入查询是一组用户(user)和上下文(context)信息,并且输出是项目(item)的排序列表。 给定查询,推荐任务是找出数据库中的相关项目,然后基于某些目标(例如点击或购买)对项目进行排名。
与一般搜索排名问题类似,推荐系统中的一个挑战是实现记忆和概括。 记忆可以宽松地定义为学习项目或特征的频繁共现并利用历史数据中可用的相关性。 另一方面,泛化是基于相关的传递性,并探索过去从未或很少发生的新特征组合。 基于记忆的建议通常更加热门,并且与用户已经执行操作的项目直接相关。 与记忆相比,泛化倾向于改善推荐项目的多样性。 在本文中,我们关注Google Play商店的应用推荐问题,但该方法应适用于通用推荐系统。
对于工业环境中的大规模在线推荐和排名系统,诸如逻辑回归的广义线性模型被广泛使用,因为它们简单,可扩展且可解释。模型通常使用one-hot编码训练二值化稀疏特征。例如,二值特征”user_installed_app=netflix”有值为1如果用户安装了Netflix.记忆能被有效实现通过使用在稀疏特征上的跨产品的转换(cross-product transformation),例如AND(user_installed_app=netflix,impression_app=pandora),它的值为1如果用户安装了Netflix并且然后展示了Pandora.这解释了一个特征对的共现关联了目标标签.泛化能被添加通过使用更少颗粒的特征,例如AND(user_installed_category=video,impression_category=music),但是手动特征工程往往是被需要的.跨产品转换(cross-product transformation)的一个限制是它们并不能泛化到训练集中没有出现的query-item的特征对.
基于嵌入的模型,例如因子分解机器(《Factorization machines with libFM》)或深度神经网络,可以通过为每个查询和项目特征学习低维密集嵌入向量来概括到先前未见过的查询项目特征对,同时减少特征工程的负担。 然而,当基础查询项目矩阵稀疏且高级别时,例如具有特定偏好的用户或具有狭窄吸引力的小众项目,难以学习查询和项目的有效低维表示。 在这种情况下,大多数查询项对之间不应该存在交互(interaction),但是密集嵌入将导致对所有查询项对的非零预测,因此可能过度概括并且使得不太相关的推荐。 另一方面,具有跨产品特征转换的线性模型可以使用更少的参数来记忆这些”例外规则”。
在本文中,我们通过联合训练线性模型组件和神经网络组件,提出了在一个模型中实现记忆和泛化的宽和深学习框架,如图1所示。本文的主要贡献包括:
- Wide&DeepLearning框架,用于联合训练具有嵌入的前馈神经网络和具有特征变换的线性模型,用于具有稀疏输入的通用推荐系统。
- 在Google Play上实施的Wide&Deep推荐系统的实施和评估,Google Play是一个拥有超过10亿活跃用户和超过100万个应用的移动应用商店。
- 我们在TensorFlow中开源了我们的实现以及高级API
虽然这个想法很简单,但我们表明,Wide&Deep框架显着提高了移动应用程序商店的应用程序获取率,同时满足了训练和服务速度要求。
RECOMMENDER SYSTEM OVERVIEW
应用程序推荐系统的概述如图2所示。当用户访问应用商店时,会生成一个查询,其中包括各种用户和上下文功能。 推荐系统返回用户可以执行某些操作(例如点击或购买)的应用列表(也称为impression)。 这些用户操作以及查询和impression记录在日志中,作为学习器的训练数据。
由于数据库中有超过一百万个应用程序,因此在服务延迟要求(通常为O(10)毫秒)内为每个查询详尽地评分每个应用程序是难以处理的。 因此,接收查询的第一步是检索(retrieval)。 检索系统使用各种信号返回与查询最匹配的项目的简短列表,通常是机器学习模型和人类定义规则的组合。 在减少候选池之后,排名系统按照他们的分数对所有项目进行排名。 分数通常为P(y|x),给定特征x的用户动作标签y的概率,包括用户特征(例如,国家,语言,人口统计),上下文特征(例如,设备,一天中的小时,一周中的天)和印象功能(例如,应用年龄,应用的历史统计数据)。 在本文中,我们将重点放在使用Wide&Deep学习框架的排名模型上。
WIDE & DEEP LEARNING
The Wide Component
宽组件(The wide component)是形式为y = wT x + b的广义线性模型,如图1(左)所示。 y是预测,$x=[x_1,x_2,….,x_d]$是d个特征的向量,$w=[w_1,w_2,…,w_d]$是模型参数,b是偏差。 特征集包括原始输入特征和转换特征。 最重要的转换之一是跨产品转换(cross-product transformation),其定义如下:
其中$c_{ki}$是布尔变量,如果第i个特征是第k个变换$\phi_k$的一部分,则该值为1,否则为0。 对于二进制特征,当且仅当组合特征AND(“gender = female”,”language=en”)都是1时,跨产品转换为1,否则为0.这样就捕获了二元特征之间的相互作用,并为广义线性模型增加了非线性。
The Deep Component
深度组件(The Deep Component)是前馈神经网络,如图1(右)所示。 对于分类特征,原始输入是特征字符串(例如,”language = en”)。这些稀疏的高维分类特征中的每一个首先被转换为低维和密集的实值向量,通常被称为”嵌入向量”。嵌入的维数通常在O(10)到O(100)的数量级上。嵌入向量随机初始化,然后训练值以最小化模型训练期间的最终损失函数。 然后,在前向传递中将低维密集嵌入向量馈送到神经网络的隐藏层中。具体地,每个隐藏层计算:
其中l是层数,f是激活函数常用ReLU.$a^{(l)},b^{(l)}和W^{(l)}$是激活,bias和模型第l层的权重.
Joint Training of Wide&Deep Model
The Wide component and deep component 被结合使用其输出对数几率的加权和作为预测,然后将其馈送到用于联合训练的一个共同逻辑损失函数。请注意,联合训练和ensemble之间存在区别。在ensemble中,单独的模型是在不知道彼此的情况下单独训练的,并且它们的预测仅在推理时而不是在训练时组合。相比之下,联合训练通过在训练时考虑其宽和深部分以及它们的总和的权重来同时优化所有参数。对模型大小也有影响:对于整体而言,由于训练是不相交的,因此每个单独的模型大小通常需要更大(例如,具有更多特征和变换)以实现ensemble的合理准确性。相比之下,对于联合训练而言,宽部分(Wide part)只需要通过少量的跨产品特征变换来补充深部(Deep part)的弱点,而不是全尺寸的宽模型。
通过使用小批量随机优化同时反向传播从输出到模型的宽和深部分的梯度来完成宽和深模型的联合训练。 在实验中,我们使用了Follow-the-regularized-leader(FTRL)算法,其中L1正则化作为模型的宽部分(Wide part)的优化器,而AdaGrad用于深部(deep part)。
组合模型如图1(中)所示。 对于逻辑回归问题,模型的预测是:
其中Y是二值类标签,$\sigma(·)$是sigmoid函数,$\phi(x)$是原始特征x的跨产品转换,并且b是偏置项.$w_{wide}$是所有宽模型权重,并且$w_{deep}$是应用到最终激活$a^{(l_f)}$的权重.
SYSTEM IMPLEMENTATION
应用程序推荐管道的实现包括三个阶段:数据生成,模型训练和模型服务,如图3所示。
Data Generation
在此阶段,一段时间内的用户和应用程序impression数据用于生成训练数据。每个示例对应一次impression。标签是应用程序获取:如果安装了impressed的应用程序,则为1,否则为0。
词汇表,即将分类特征字符串映射到整数ID的表,也在此阶段生成。系统会计算发生超过最少次数的所有字符串特征的ID空间。 连续实值特征归一化为[0,1]通过将特征值x映射到其累积分布函数P(X≤x),将其划分为$n_q$分位数。对于第i个分位数中的值,归一化值为$\frac{i-1}{n_q-1}$。在数据生成期间计算分位数边界。
Model Training
我们在实验中使用的模型结构如图4所示。在训练期间,我们的输入层接收训练数据和词汇,并生成稀疏和密集的特征以及标签。宽组件(Wide component)包括用户安装的应用和impression应用的跨产品转换。 对于模型的深度部分,为每个分类特征学习32维嵌入向量。 我们将所有嵌入与密集特征连接在一起,从而产生大约1200维的密集向量。 然后将连接的向量馈入3个ReLU层,并且最后输入逻辑输出单元。
Wide&Deep模型接受了超过5000亿个示例的训练。 每当一组新的训练数据到达时,该模型需要重新训练。 然而,每次从头开始重新训练都是计算上昂贵的,并且延迟了从数据到达到服务更新模型的时间。 为了应对这一挑战,我们实施了一个热启动系统,该系统使用先前模型中的嵌入和线性模型权重初始化新模型。
在将模型加载到模型服务器之前,完成模型的dry run以确保它不会导致服务实时交通中的问题。 我们根据先前的模型验证模型质量作为健全性检查。
Model Serving
模型经过训练和验证后,我们将其加载到模型服务器中。 对于每个请求,服务器从应用程序检索系统接收一组应用程序候选者和用户特征以对每个应用程序进行评分。 然后,应用程序从最高分数到最低分数排名,我们按此顺序向用户显示应用程序。 通过在Wide&Deep模型上运行前向推理传递来计算得分。
为了按10毫秒的顺序提供每个请求,我们通过并行运行较小批量使用多线程并行性来优化性能,而不是在单个批量推理步骤中对所有候选应用程序进行评分。