论文阅读笔记 Wide & Deep Learning for Recommender Systems

<阅读笔记>

参与了dantezhao的一个论文阅读计划 paper-notes

将阅读成果分享到博客

本文讲解了广度和深度学习相结合的方法,并以Google Play为例,介绍了该方法在推荐系统实践中的应用

带着问题阅读:
1. what: Wide & Deep Learning的两部分,分别是什么  
2. why: 为什么将二者相结合  
3. how: 广度和深度相结合的具体实现

0. 摘要

对已知特征,广度线性模型(wide linear models)有很好的记忆(Memorization)能力

对低维未知特征,深度神经网络(deep netural network)具有很好的泛化(Generalization)能力

本文将广度线性模型的记忆能力和深度神经网络的泛化能力相结合

这套方法被应用于Google Play,10亿活跃用户,1百万apps的手机应用市场

相比仅用广度和仅用深度,广度深度相结合的方法明显改善了app的获得率

广度和深度学习(wide & deep learning)方法的实现已经开源到TensorFlow中


1. 导言

  • 推荐系统也是一种搜索排序系统
推荐系统可以视为一个搜索排序(search ranking)系统

在这个搜索排序系统中

输入查询可以看作用户和上下文信息的集合

输出可以看作物品的排序列表

  • 记忆(Memorization)和泛化(Generalization)
推荐系统和搜索排序系统,都要实现记忆和泛化

记忆可以粗略地解释为,学习物品或特征共现的频率以及从历史数据发掘可用的关联关系

泛化则是基于关联关系的可传递性,发掘历史数据中从未出现或极少出现的特征组合

基于记忆的推荐系统更为"主题相关",直接关联被用户已发生行为所作用的物品

泛化则用于改善推荐物品的多样性

  • 线性模型
广义线性模型(generalized linear models)简单、可扩展、可解释

被广泛应用于工业级的大规模在线推荐和排序系统

广义线性模型通常是基于二进制化的稀疏特征训练的

这些特征使用了独热编码(one-hot encoding)

例如:
user_installed_app=netflix值为1
当出现AND(user_installed_app=netflix, impression_app=pandora)时
如果用户安装了netflix,那么这个组合的值为1,推荐系统就会显示pandora给用户

向量叉积变换(cross-product transformation)的局限之一是
无法泛化出训练数据中没有出现过的"查询-物品"特征组合(query-item feature pair)

  • 泛化
泛化的一种形式是加入粒度更粗的特征

比如上面的例子
将AND(user_installed_app=netflix, impression_app=pandora)
变为AND(user_installed_category=video, impression_category=music)

通过学习每个查询(query)和每个物品(item)特征的低维密集嵌入向量(low-dimensional dense embedding vecotr)

嵌入式模型(Embedding-based models),如分解机(factorization machines)或深度神经网络(deep neural networks)
可以泛化出之前没见过的"查询-物品"特征组合

如果潜在的"查询-物品"矩阵过于稀疏或高阶,就很难从这类数据中学习到有效的"查询-商品"低维组合

比如有特殊偏好的用户或者仅有少数拥趸的小众商品

"查询-物品"组合之间没有相关性,而密集嵌入又会为所有的组合泛化出预测结果

这种情况带来了过度泛化和相关性很弱的推荐

而具有向量叉积变换的线性模型,就能记住这些参数极少的异常规则(exception rules)
  • 广度和深度学习框架

[站外图片上传中...(image-612f02-1561643169129)]

Figure 1:广度和深度模型图谱

综上所述,本文对一个线性模型模块和一个神经网络模块进行联合训练(joint training)

将记忆和泛化融入一个模型
  • 本文的主要贡献
1) 开发了一套广度和深度相结合的学习框架,用于稀疏输入的推荐系统
这套框架对"带嵌入的前馈神经网络"和"特征变换线性模型"进行联合训练(joint trainning)

2) 实现并评测了广度和深度推荐系统在Google Play市场的产品化

3) 以API的形式在TensorFlow上开源了广度和深度学习系统的具体实现代码

广度和深度学习框架的思路简单,在满足训练和服务速度的前提下,显著改善了移动应用市场的app获得率


2. 推荐系统概述

[站外图片上传中...(image-3f98aa-1561643169129)]

Figure 2 展示了手机应用推荐系统的基本架构

  • 查询(Query)和用户行为(User Action)
当用户访问app商店时,查询(Query)就产生了,查询可以包括各类用户和文本特征

推荐系统首先展示一个应用列表(也被称为 展示impression)

用户可以点击或者购买应用列表上的应用

用户的查询(queries)和展示(impressions)被记入日志,作为学习器的训练数据
  • 召回和排序(Retrieval and Ranking)
推荐系统有一个服务延迟上限(serving latency requirements),通常是O(10)毫秒

在时限内为每个查询穷尽百万app计算每个app的分数是不可能的

这种情况下,推荐系统在收到查询的第一步是召回(retrieval)

召回系统为用户返回一个与查询匹配度最佳的简短物品列表

返回这个列表的依据通常是机器学习模型或者人工定义的规则

缩小了备选池(candidate pool)的规模之后,排序(ranking)系统为备选列表中的所有物品排序

分数通常是P(y|X),代表给定特征x时,用户行为标签y的概率

特征x包括:
a) 用户特征:国籍、语言、人口统计学
b) 文本特征:设备、当前时间
c) 展示特征(impression feature):app年龄,app历史数据

本文将广度和深度学习框架应用于上述第二个步骤排序系统中


3. 广度和深度学习

3.1 广度部分

广度部分是广义线性模型,如图Figure 1 左侧所示
  • 广义线性模型公式

y = wTx + b

y表示预测值
x=[x1, x2,..., xd] 是d个特征的向量

w=[w1, w2,..., wd] 是模型的参数
b 是bias(偏差)

特征集包括原始特征输入和变换后的特征

其中最重要的一个变换就是向量叉积变换
  • 向量叉积变换(cross product transformation)公式
    [站外图片上传中...(image-ecf06b-1561643169129)]

其中Cki是一个布尔变量
如果第i个特征属于第k个变换Ø k
那么Cki的值为1,否则为0

对于二进制特征,当且仅当组成特征都为1,它的向量叉积变换才是1,否则向量叉积为0

通过这种方式捕获二进制特征之间的交互,为广义线性模型增加非线性

3.2 深度部分

深度部分是图Figure 1右侧的前馈神经网络

分类特征的原始输入是特征字符串(如"language=en")

每一个稀疏高维的分类特征都被转为低维密集的真值向量,通常被称为嵌入向量

嵌入的维度大约在O(10)到O(100)的范围内

嵌入向量先被随机初始化,然后它们的值在模型训练期间被用于最小化最终损失函数

这些低维密集嵌入向量在前馈传递中被送入神经网络的隐藏层
  • 隐藏层使用的计算公式
    [站外图片上传中...(image-31e435-1561643169129)]

其中l是层数

f是激活函数,通常是一个线性整流函数ReLUs(rectified linear units)
a(l)是第l层的激活值(activations)
b(l)是第l层的偏差(bias)
W(l)的第l层的模型权重

3.3 广度和深度模型的联合训练(joint training)

  • 联合训练(Joint Training)
广度部分和深度部分相结合时,使用了输出(output)对数几率(log odds)的加权和作为预测 

这个加权和被送入一个通用的逻辑损失函数(logistic loss function)进行联合训练  
  • 联合训练(Joint Training)和集成训练(Ensemble)
1) 集成训练中

每个模型都是独立训练,模型产生的预测在推导阶段整合而不是在训练阶段

因为独立训练,模型的规模更大(更多特征和变换)以达到合理的准确性

2) 联合训练中

在训练阶段就同时优化了所有参数,包括广度部分和深度部分以及它们的加权和

广度部分只需少量向量叉积特征变换补充深度部分即可,无需动用整个广度模型

  • FTRL算法

联合训练中,使用了Follow-the-regularized-leader(FTRL)算法
模型广度部分使用L1范数(regularization)作为优化器
模型深度部分使用了AdaGrad
模型图示在图Figure 1的中间部分

  • 模型的计算公式
    [站外图片上传中...(image-c0f00e-1561643169129)]

Y表示二进制分类标签
σ(·)表示反曲函数
Ø(X)表示原始特征x的向量叉积变换
b表示偏差(bias)项
Wwide表示所有广度模型权重的向量
Wdeep表示应用于最终激活值a(lf)的权重


4. 推荐系统实现

实现推荐系统包括三个步骤(如图Figure 3所示):
1) 数据生成(data generation)

2) 模型训练(model Training)

3) 模型提供服务(model serving)
  • 应用推荐系统管线概览(Figure 3)

[站外图片上传中...(image-f8b630-1561643169129)]

4.1 数据生成(data generation)

  • 训练数据(training data)
用户和应用在一段时间内的展示数据(impression data)用于生成训练数据

每个样本都对应一个展示(impression)

这个展示的标签就是"应用获取率(app acquisition)":
如果展示应用被安装,数值为1,否则数值为0
  • 词汇数据(vocabularies)
词汇数据实际上是数据表
这些表将分类特征字符串(categorical feature strings)映射为整型ID(integer IDs)

所有出现超过一定次数的字符串特征值,系统都会计算它们的ID空间(ID space)

通过映射特征值x到它的累计分布函数P(X≤x)
再分为nq个分位数
连续真值特征会被归一化为[0,1]
在第i个分位数的值被归一化为 (i-1)/(nq-1)
分位数的边界是在数据生成阶段计算出来的

4.2 模型训练(Model Training)

[站外图片上传中...(image-307024-1561643169129)]

模型结构如图Figure 4所示

1) 输入层(input layer)  
训练阶段,输入层获取训练数据和词汇数据并生成带标签的稀疏或密集特征

2) 广度部分(wide component)  

模型的广度部分包括用户已安装应用和展示应用的向量叉积变换

3) 深度部分(deep component)  

模型的深度部分,从每个分类特征学习得到一个对应的32维嵌入向量

模型将所有嵌入及密集特征合并到一起,生成一个大约1200维的密集向量

合并所得的向量先被传入3个线性整流函数层,最终到达逻辑输出单元

4) 模型训练的效率问题  

广度和深度组合模型在5000亿个样本上训练

每加入一个新的训练数据集,模型都需要重新训练

重新训练计算成本高昂且延迟了从加入新数据到更新模型的时间

5) 热启动系统(warm-starting system)  

为解决重新训练的效率问题,模型使用了一种热启动模式

热启动模式在每次重新训练时都初始化一个新模型

新模型包括了新数据嵌入和之前模型的线性模型权重

6) 试运行(dry run)  

模型加载到模型服务器前,会进行一次试运行(dry run),以确保线上实时场景不会出问题

上线前通过对比之前的模型,检验新模型运转正常

4.2 模型提供服务(Model Serving)

1) 模型训练完成并验证功能后,将加载到模型服务器

2) 模型为推荐系统提供服务的流程如下:

    a) 每一次请求,服务都会通过应用召回系统和用户特征获取一个备选应用列表,并为其中的应用打分

    b) 应用按照分数从高到低排列并展示给用户

3) 分数计算

系统给应用的评分,是通过在广度和深度组合模型上运行一个正向推断(forward inference)计算而来的

4) 提升服务时效

为了将每次请求响应控制在10毫秒内,系统通过多线程并行对性能进行了优化

之前在一个批次内计算所有备选应用的分数

优化后并行计算更小批次里的备选应用的分数


5. 实验结果

本文主要从app获取率和服务性能两方面验证广度和深度学习模型的效果

5.1 应用获取率(app aquisitions)

本文采用A/B测试进行了为期3周的在线实验

分别随机选取了三组各1%的用户作为随机实验对象

三组对象分别应用了三类模型的推荐系统:
1) 高度优化的广度逻辑回归模型,具有丰富的向量叉积特征变换(cross-product feature transformations)
2) 具有相同特征和深度神经网络的深度模型
3) 具有相同特征的深度广度结合模型

其中第一组作为控制组

实验结果表明,在应用获得率(app aquisitions)上:
广度和深度相结合比仅用广度高出3.9%
广度和深度相结合比仅用深度高出1%

除了在线实验,本文使用留出法(hold-out)测试了与线上数据互斥的线下数据集

广度和深度相结合的方法相比仅用广度和仅用深度,只有略微偏高的AUC*值

广度和深度相结合在线上比线下更为显著

原因可能是线下系统的展示(impression)和标签的数据是固定的
线上系统可以混合记忆与泛化生成新的推荐
线上系统也会从新的用户回馈中持续学习

*AUC备注
AUC(Area Under Receiver Operator Characteristic Curve)
ROC全称是"受试者工作特征"(Receiver Operating Characteristic)
ROC曲线的面积就是AUC(Area Under the Curve)
AUC用于衡量"二分类问题"机器学习算法性能(泛化能力)

5.2 服务性能(serving performance)

在商用应用商店,需要同时满足高吞吐和低延迟

峰值流量时,推荐系统服务器需要每秒为上百万个应用评分

单线程处理单个批次的全部备选项需要31毫秒

拆分批次为体量更小的批次,同时使用多线程处理,能够将客户端延迟有效降低到14毫秒


6. 相关研究

  • 分解机(factorization machines)
使用因式分解的方式泛化线性模型,即将2个变量间的关联转成两个低维嵌入向量之间的点积

本文通过学习神经网络嵌入之间的高度非线性关联,替代点积,从而扩展了模型的能力
  • 语言模型中的RNN
对
递归神经网络RNNs(Recurrent Neural Networks)和
带语言模型特征的最大熵模型(Maximum entopy models with n-gram features)
进行联合训练(joint training)

学习输入和输出的直接权重,从而显著降低RNN的复杂度
  • 计算机视觉
1) 深度残差网络
    a) 降低训练更深度模型的难度
    b) 通过跳跃传递(shortcut connections)来提高准确性

2) 对带图像模型的神经网络进行联合训练(joint training)可以从图片中识别人体姿势
  • 推荐系统
1) 内容信息深度学习和协同过滤评分矩阵合二为一,组成协同深度学习(collaborative deep learning)

2) app推荐系统AppJoy,对用户使用记录使用协同过滤
  • 本文所用方法
本文对前馈神经网络和线性模型进行联合训练(joint training)
将稀疏特征和输出单元直接关联
用于稀疏输入数据的推荐和排序问题

之前类似研究使用的方法基于协同过滤或基于内容
本文在用户和展示数据(impression data)的基础上训练广度和深度相结合的模型


7. 总结

记忆和泛化是推荐系统重要的两个方面

广度线性模型借助向量叉积变换,能够有效记忆稀疏特征的关联

深度神经网络可以通过低维嵌入泛化出之前未见的特征关联

广度和深度结合的学习框架(Wide & Deep learning framework)将两种方式的优点

本文将该方法在Google Play产品化,并评估了它的效果

在线实现结果显示,相较于单纯的广度或深度模型,广度和深度结合的模型显著改善了app获得率


<参考资料>:

a) TensorFlow Wide And Deep 模型详解与应用(作者:汪剑)

b) TensorFlow Wide And Deep 模型详解与应用二(作者:汪剑)

c) ROC与AUC的定义与使用详解

你可能感兴趣的:(论文阅读笔记 Wide & Deep Learning for Recommender Systems)