1 简介
Google于2016年在 DLRS 上发表了一篇文章 《Wide & Deep Learning for Recommender Systems》;这里的Wide & Deep模型将 宽度模型与深度神经网络 进行联合训练,结合了 记忆与泛化 的能力。该模型在Google Play的推荐场景中有具体应用,有效地增加了Google Play的软件安装量。目前Wide & Deep模型已经开源,并且在TensorFlow上提供了高级API。
2 模型结构
- 在Wide & Deep模型中包括两部分,分别为 Wide模型和Deep模型。对应下图左右两边。Wide & Deep模型的思想来源是,根据人脑有不断记忆并泛化的过程,这里将 宽线性模型(Wide Model,用于记忆) 和 深度神经网络模型(Deep Model,用于泛化) 相结合,汲取各自优势形成了Wide & Deep模型,以用于推荐排序。
- Wide & Deep模型旨在使得训练得到的模型能够同时获得 记忆(Memorization)和泛化(Generalization) 能力;
(1)记忆(Memorization)即从历史数据中发现item或特征之间的相关性。“记忆能力”可以被理解为模型直接学习并利用历史数据中物品或特征的“共现频率”的能力,由于这类模型的结构简单,原始数据往往可以直接影响推荐结果,产生类似于“如果点击过A,就推荐B”这类规则式的推荐,这就相当于模型直接记住了数据的分布特点,并利用这些记忆进行推荐。像逻辑回归这类简单模型,如果发现这样的“强特征”,则其相应的权重就会在模型训练过程中被调整得非常大,这样就实现了对这个特征的直接记忆。
(2)泛化(Generalization)即相关性的传递,探索并发现在历史数据中很少或者没有出现过的新的交叉特征。这里通过Embedding的方法,使用低维稠密特征输入,可以更好地泛化训练样本中未出现过的交叉特征。“泛化能力”可以被理解为模型传递特征的相关性,以及发掘稀疏甚至从未出现过的稀有特征与最终标签相关性的能力。
2.1 Wide模型
- 记忆(Memorization)主要是学习特征的共性/相关性,根据已有用户对物品的行为产生相关物品。我们通过Wide模型来学习记忆。wide模型就是一个广义线性模型:
其中,特征 是一个 维的向量; 为模型的参数。最终在的基础上增加sigmoid函数作为最终的输出,这其实就是一个 逻辑回归(LR)。
- Wide模型的输入特征包括 原始的输入特征和转换后的特征。一个重要的转换是,特征交叉转换(Cross-Product Transformation),它可以定义成下面这样:
其中,为一个boolean变量,如果第个特征是第个变换 的一部分那么为1,否则为0;例如,对于一个二值特征,一个特征交叉变换(如 AND(性别=男,语言=英语))只能当组成特征(“性别=男”,和“语言=英语”)都为1时才会为1,否则为0。
2.2 Deep模型
- 泛化(Generalization)可以被理解为相关性的传递(Transitivity),是指算法可以学会特征背后的规律,对于新的交叉特征也能给出合适的输出值,可以提高推荐结果的多样性。我们通过Deep模型来学习Generalization。
- Deep模型是一个前馈神经网络。对于类别特征,原始的输入是特征字符串(比如“语言=英语”)。这些稀疏的、高维的类别特征首先被转换成一个低维的、稠密的、实数值的向量。泛化往往会通过学习低维的 Embedding向量来探索过去从未或很少出现的新的特征交叉,通常的Embedding模型有 Factorization Machines(FM)和 Deep Neural Network(DNN)。
- 为了达到泛化,我们会引入新的小颗粒特征,例如类别特征(安装了视频类目的应用,展示的是音乐类目的应用等),将这些高维稀疏的类别特征映射为低维稠密的向量后,与其他连续特征(用户年龄、应用安装数等)拼接在一起,输入MLP中;
- 首先,Embedding向量被随机初始化,然后在训练过程中通过最小化损失函数来优化模型。每一个隐含层的计算如下:
其中,是激活函数,使用Relu激活函数。基于Embedding的深度模型的输入是:类别特征(产生Embedding)+ 连续特征。
2.3 模型联合训练
联合训练指的是Wide模型和Deep模型组合在一起,在训练时进行加权求和,并且通常采用logistic作为损失函数来进行训练。Wide & Deep模型如下:
3 Wide & Deep系统实现
3.1 App推荐系统
- 当一个用户访问App商量时生成一个query,它包含着许多用户特征和上下文特征。推荐系统会返回一个App列表,用户在此之上会执行特定的动作(点击或购买)。这些用户行为会伴随着请求和曝光,以日志的形式记录下来;
- 由于数据库中有超过百万的App,而在线服务耗时通常来说,每一个query为10ms;因此,对每一个App进行评分比较困难。因此,当我们收到一个query时,第一步先进行检索(Retrieval)。检索系统会返回一个最匹配query的物品短列表(通常使用机器学习模型和人工定义规则来检索);
- 通过检索得到候选池后,排序系统(Ranking System)会对所有候选池中的物品进行评分和排序。得分通常是 。一个用户的特征对应动作标签,其中特征包括用户特征(比如国家、语言、人口属性信息)、上下文特征(比如设备、天的小时、周的天)、曝光特征(比如App的历史统计信息)。本节只关注 在排序系统中使用Wide & Deep模型。
3.2 系统流程
- app推荐系统主要流程包括:
- 训练数据生成;(a)样本的label要根据实际的业务需求来定,比如在App商店中想要提高App的下载率,那么就以这次展示的 item 用户有没有下载作为label,使得模型以下载作为目标进行优化;(b)特征处理包括连续特征归一化。在对离散特征进行处理时,可以去掉出现频次较少的特征,以减小计算的复杂度;
- 模型训练;
最终实验使用的模型如下:
(a)Wide模型仅包含了用户安装App和曝光App的特征交叉转换;
(b)Deep部分的输入是全量的特征向量;对于Deep模型,会为每一个类别特征学习到一个32维的Embedding向量。我们将所有Embeddings连接起来形成稠密特征,产生一个接近1200维的稠密向量。
(c)连接后的向量输入到3个Relu层,最终采用Logistic作为输出单元;
(d)训练数据有500万个样本,输入层同时产生稀疏特征或稠密特征。当新的训练数据来临的时候,我们用的数热启动的方式,也就是从之前的模型中读取Embeddings以及线性模型的权重来初始化一个新模型,而不是从头开始重新训练。
- 模型服务部署;为了在10ms的级别服务于每个请求,我们使用多线程并行来优化性能,将App候选集分为多个小批次,并行化预测得分。
- 在实际的推荐系统中,通常将推荐的过程分为两部分:Retrieval 和 Ranking ;
(1)Retrieval 部分负责从数据库中检索出与用户相关的一些App;
(2)Ranking 部分负责对这些检索出的App打分,并最终按照分数的高低向用户返回相应的列表;
TensorFlow代码实现
数据集说明
https://archive.ics.uci.edu/ml/datasets/Census+Income
- 预测收入范围:>50k 或者 <=50k (二分类问题)
Attribute Information:
# label
Listing of attributes:
>50K, <=50K.
# 用到的特征
age: continuous.
workclass: Private, Self-emp-not-inc, Self-emp-inc, Federal-gov, Local-gov, State-gov, Without-pay, Never-worked.
fnlwgt: continuous.
education: Bachelors, Some-college, 11th, HS-grad, Prof-school, Assoc-acdm, Assoc-voc, 9th, 7th-8th, 12th, Masters, 1st-4th, 10th, Doctorate, 5th-6th, Preschool.
education-num: continuous.
marital-status: Married-civ-spouse, Divorced, Never-married, Separated, Widowed, Married-spouse-absent, Married-AF-spouse.
occupation: Tech-support, Craft-repair, Other-service, Sales, Exec-managerial, Prof-specialty, Handlers-cleaners, Machine-op-inspct, Adm-clerical, Farming-fishing, Transport-moving, Priv-house-serv, Protective-serv, Armed-Forces.
relationship: Wife, Own-child, Husband, Not-in-family, Other-relative, Unmarried.
race: White, Asian-Pac-Islander, Amer-Indian-Eskimo, Other, Black.
sex: Female, Male.
capital-gain: continuous.
capital-loss: continuous.
hours-per-week: continuous.
native-country: United-States, Cambodia, England, Puerto-Rico, Canada, Germany, Outlying-US(Guam-USVI-etc), India, Japan, Greece, South, China, Cuba, Iran, Honduras, Philippines, Italy, Poland, Jamaica, Vietnam, Mexico, Portugal, Ireland, France, Dominican-Republic, Laos, Ecuador, Taiwan, Haiti, Columbia, Hungary, Guatemala, Nicaragua, Scotland, Thailand, Yugoslavia, El-Salvador, Trinadad&Tobago, Peru, Hong, Holand-Netherlands.
代码说明
- 输出结果
model directory = models
accuracy: 0.85172904
accuracy_baseline: 0.76377374
auc: 0.9047877
auc_precision_recall: 0.76719904
average_loss: 0.32222852
global_step: 20000
label/mean: 0.23622628
loss: 32.18529
precision: 0.74487007
prediction/mean: 0.2416372
recall: 0.56630266
参考资料
- 《推荐系统算法实践》- 黄美灵
- 《深度学习推荐系统》- 王喆
- 原始论文:Wide & Deep Learning for Recommender Systems https://arxiv.org/abs/1606.07792
- Tensorflow开源代码:https://chromium.googlesource.com/external/github.com/tensorflow/tensorflow/+/r0.10/tensorflow/g3doc/tutorials/wide_and_deep/index.md
https://github.com/baidu-research/tensorflow-allreduce/blob/master/tensorflow/examples/learn/wide_n_deep_tutorial.py - 使用的数据集:https://archive.ics.uci.edu/ml/datasets/Census+Income