读论文-《Wide&Deep》

《Wide&Deep Learning for Recommender Systems》,2016,Google

Wide&Deep介绍

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

与一般搜索排名问题类似,推荐系统中的一个挑战是实现记忆和泛化。记忆可以被宽松地定义为学习items或特征之间的相关频率,在历史数据中探索相关性的可行性。另一方面,泛化是基于相关性的传递,并探索过去从未或很少发生的新特征组合。基于记忆的推荐结果通常更加局限性的,是在用户和items已经有直接关联的活动上。与记忆相比,泛化倾向于改善推荐items的多样性。在这篇paper中,我们主要关注Google Play商店的app推荐问题,但是该方法对推荐系统具有通用性。

对于工业环境中的大规模在线推荐和排名系统,诸如逻辑回归的广义线性模型被广泛使用,因为它们是简单的,可扩展性好和可解释性强。模型通常使用独热编码训练二值化稀疏特征。例如,如果用户安装了Netflix,则二进制特征“user_installed_app=netflix”的值为1。记忆可以通过稀疏特征进行交叉乘积(叉乘,也叫做外积或向量积)转换获得,例如AND(user_installed_app = netflix,impression_app = pandora),当用户安装了Netflix并且之后展示在Pandora上,那么得到特征的值为1,其余为0。这个交叉特征就展示了特征对之间的相关性和目标label之间的关联。泛化可以通过增加一些粗粒度的特征实现,(例如AND(user_installed_category = video,impression_category = music)),但通常需要手动进行特征工程。交叉积转换的一个限制是它们不能生成未出现在训练数据中的query-item特征对。这里主要是对接下来线性模型需要的特征做了下解释,一个是one-hot,比较稀疏。一个是交叉特征,就是特征之间做笛卡尔积,用于线性模型去寻找显性的非线性。

基于embedding的模型,例如FM或DNN,可以通过为每个query和item学习出一个低维稠密嵌入向量,来推广到先前未见过的query-item特征对,这显然减少特征工程的负担。然而,当潜在的query-item矩阵稀疏且高秩时,例如具有特定偏好的用户或很少出现的小众items,很难学习query和item的有效低维表示。在这种情况下,大多数query-item对之间不存在交互,但是稠密嵌入将导致对所有query-item对的非零预测,因此可能过度泛化并且推荐不太相关的内容。另一方面,利用交叉积特征的线性模型能用很少的参数记住那些‘exception_rules’。embedding特征,也就是把稀疏数据映射到稠密的低维数据。

文章中提出了Wide&Deep学习框架,通过联合训练线性模型部分和NN部分,在一个模型中实现记忆和泛化。Wide&Deep模型的结构图如下所示。

Wide&Deep学习框架,用于联合训练具有嵌入的前馈神经网络和具有特征变换的线性模型,可以用于具有稀疏输入的通用推荐系统。

推荐系统概述

App的推荐系统如下图所示。当用户访问应用商店时,会生成一个query,其中包括各种用户和上下文功能。推荐系统返回App列表(也称为印象),用户可以在其上执行某些操作,例如点击或购买。这些用户操作以及查询和印象记录在日志中,作为学习器的训练数据。

由于数据库中有过百万的应用程序,因此对全部app计算score不合理。因此,收到一个query的第一步是检索。检索系统返回一个items的短列表,通常是机器学习模型和人为定义规则的组合。在减少候选池之后,排序系统按照他们的score对所有项目进行排名。分数通常为P(y | x),给定特征x的用户行为y的概率,包括用户特征(例如,国家,语言,人口统计),上下文特征(例如,设备,一天中的小时,day of the week)和印象特征(例如,应用年龄,应用的历史统计数据)。在本文中,重点为使用Wide&Deep学习框架的排序模型上。

Wide&Deep Learning

1.Wide部分

Wide部分的形式是y = w T x + b的广义线性模型,y是预测,x=[x1,x2,x3…xd]是d维特征的向量,w=[w1,w2,w3…wd]是模型参数,b是偏置项。特征集合包括了原始的输入特征和转化后的特征。其中,最重要的转化就是交叉乘积转换,

cki是一个boolean值变量,当第i个特征是第k个转换ϕk,否则的就是0。对于一个二进制特征,交叉积特征可以简单理解为AND(gender=female, language=en),当且仅当gender=female,language=en时,交叉特征为1,其他都为0。该方法能捕捉出特征间的交互,为模型添加非线性。

2.Deep部分

Deep模块则是一个前向神经网络,对于类别型特征,原始输入特征其原始输入都是字符串形式的特征,如“language=en”.我们把这些稀疏,高维的类别型特征转换为低维稠密的实值向量,这就是embedding向量。embedding随机初始化,并利用反向传播对其进行更新。将高维的特征换换为embedding特征后,这些低维的embedding向量就被feed到神经网络中,每个隐藏层做如下计算:

其中l是网络的层数,f是激活函数,一般用RELU,al,bl,Wl分别为第l层的激活函数,偏置项,模型权值。
也就是说输入的类别型特征是字符串,需要转化下,然后做embedding,模型是一个全连接。

3.Joint Training of Wide&Deep Model

通过将Wide部分和Deep部分的对数加权输出作为预测值,然后将其feed给一个常规的逻辑损失函数中,用于联合训练。需要注意的是,联合训练和ensemble是有区别的。在集成方法中,模型都是独立训练的,模型之间没有关系,他们的预测输出只在最后才合并。但是,联合训练的话,两个模型是一起训练所有参数。对于模型大小来说,集成方法,因为模型之间独立,所以单个模型的大小需要更大,即需要更多的特征和特征工程。以此起来获得合理的精度。但是联合训练,两个模块只要互相补充对方不足即可,可以同时优化模型的参数。在Wide&Deep中,只需要两个模型,训练简单,可以很快的迭代模型。

Wide&Deep模型的联合训练通过反向传播将输出值的误差梯度通过mini-batch随机梯度同时传送给Wide和Deep部分。在实验中,我们使用带L1的FTRL算法作为Wide模块的优化器,使用AdaGrad更新Deep模块。

对于逻辑回归问题,我们模型的预测是:

其中Y是一个二值的类别标签,σ()是sigmoid函数,ϕ(x)表示交叉特征,b是一个bias项,Wwide是Wide模型的权值,Wdeep是应用在最后的隐藏层到输出上的权值。

系统实现

1.数据生成
在此阶段,一段时间内的用户和应用程序展示数据用于生成训练数据。标签是应用程序获取:如果安装了展示的应用程序,则为1,否则为0。

词汇表,即将分类要素字符串映射到整数ID的表,也在此阶段生成。系统会计算发生超过最少次数的所有字符串要素的ID空间。 通过将特征值x映射到其累积分布函数P(X≤x),将连续的实值特征归一化为[0,1],将其分成n_q个分位数。对于第i个分位数中的值,归一化值是(i-1)/(n_q-1)。 在数据生成阶段计算分位数边界。

2.模型训练
我们在实验中使用的模型结构如下图所示。在训练期间,我们的输入层接收训练数据和词汇表,并生成稀疏和稠密的特征以及标签。Wide部分包括用户安装的应用和展示应用的交叉乘积。对于模型的Deep部分,为每个分类特征学习32维嵌入向量。我们将所有嵌入与密集特征连接在一起,产生大约1200维的稠密向量。然后将连接的向量输入3个ReLU层,最后输入logistic output单元。

Wide&Deep模型已接受超过5000亿条数据的训练。每当一组新的训练数据到达时,该模型需要重新训练。然而,每次从头开始重新训练都是计算上昂贵的,并且延迟了从数据到达到服务更新模型的时间。为了应对这一挑战,我们实施了一个热启动系统,该系统使用先前模型中的嵌入和线性模型权重初始化新模型。

在将模型加载到模型服务器之前,完成模型的干运行以确保它不会导致提供实时交易的问题。我们根据先前的模型验证模型质量作为健全性检查。

3.模型服务
模型经过训练和验证后,我们将其加载到模型服务器中。对于每个query,服务器从应用程序检索系统接收一组应用程序候选者,并接收用户特征来为每个应用程序评分。然后,应用程序从最高分数到最低分数排名,我们按此顺序向用户显示应用程序。通过在Wide&Deep模型上运行前向推理传递来计算得分。

为了按10毫秒的顺序提供每个请求,我们通过并行运行较小批量使用多线程并行性来优化性能,而不是在单个批量推理步骤中对所有候选应用程序进行评分。

实验结果

为了评估Wide&Deep学习在现实世界推荐系统中的有效性,我们进行了实时实验,并在几个方面评估了系统:应用程序获取和服务性能。

我们在A/B测试框架中进行了3周的实时在线实验。对于对照组,1%的用户被随机选择并呈现由先前版本的排名模型生成的推荐,这是一种高度优化的wide-only逻辑回归模型,具有丰富的交叉积转换。对于实验组,1%的用户会收到由Wide&Deep模型生成的建议,并使用相同的特征集进行训练。如表1所示,Wide&Deep模型相对于对照组(统计显着性)将应用商店主登陆页面上的应用获取率提高了3.9%。结果也与另一个1%组进行比较,仅使用具有相同特征和神经网络结构的模型的Deep部分,Wide&Deep在深度模型之上具有+1%的增益。

除了在线实验,还比较了AUC on holdout set。虽然Wide&Deep的AUC略高,但是Wide&Deep模型对在线交易比线下实验的影响更为明显。一个可能的原因是,固定数据集中的印象和标签是固定的,而在线系统可以通过将泛化与记忆相结合来产生新的探索性建议,并从新的用户响应中学习。

相关工作

将宽线性模型与交叉乘积变换和深层神经网络与密集嵌入相结合的想法受到以前的工作的启发,例如FM,它通过将两个变量之间的相互作用分解为两个低维嵌入向量之间点积(也就是内积)来增加线性模型的推广。在本文中,我们通过神经网络而不是点积来学习嵌入之间的高度非线性交互来扩展模型容量。

在语言模型中,已提出联合训练循环神经网络(RNN)和具有n-gram特征的最大熵模型,通过学习输入和输出之间的直接权重来显着降低RNN复杂度(例如,隐藏层大小)。在计算机视觉中,深度残差学习已被用于减少训练更深层模型的难度,并通过跳过一个或多个层的快捷连接来提高准确性。神经网络与图形模型的联合训练也已应用于图像中的人体姿态估计。在这项工作中,我们探索了前馈神经网络和线性模型的联合训练,稀疏特征和输出单元之间的直接连接,用于稀疏输入数据的通用推荐和排序问题。

结论

记忆和泛化对于推荐系统都很重要。宽线性模型可以使用叉乘特征变换有效地记忆稀疏特征交互,而深度神经网络可以通过低维嵌入推广到先前未见过的特征交互。我们介绍了Wide&Deep学习框架,以结合两种模型的优势。我们在Google Play的推荐系统上制作并评估了该框架,在线实验结果表明,Wide&Deep模型在广泛和深度模型上的应用程序获取方面取得了显着的进步。

个人体会

本文中,Google公司为推荐系统和CTR预测提出了Wide&Deep模型,并在Github上进行了开源。

在Wide&Deep模型中,Wide部分和Deep部分是同时训练的,而不是单独进行训练的。而在GBDT+LR(Facebook提出的CTR预测方法)模型中,GBDT需要先训练,然后再训练LR,这两部分有依赖关系,不利于模型的迭代。

总体来说,这篇paper的影响力是很大的,Wide&Deep模型的应用场景也是很广泛的,在一些推荐算法的比赛中也取得了非常好的成绩。但是Wide&Deep模型的缺点就是需要进行人工的特征工程,在2017年华为诺亚方舟实验室和哈工大共同提出的DeepFM改进了这一缺点。Google在2017年还提出了CTR预测方法Deep&Cross,性能效果比Wide&Deep更好一些,但是目前还没有得到广泛的应用。