深度学习在推荐平台的使用

推荐系统的策略主要分为召回和排序两个过程

召回主要负责生成推荐的候选集

排序负责将多个算法策略的结果进行个性化排序


一:召回层:我们通过用户行为、场景等进行实时判断,通过多个召回策略召回不同候选集。再对召回的候选集进行融合。候选集融合和过滤层有两个功能,一是提高推荐策略的覆盖度和精度;另外还要承担一定的过滤职责,从产品、运营的角度制定一些人工规则,过滤掉不符合条件的 Item。下面是一些我们常用到的召回策略:

User-Based 协同过滤:找出与当前 User X 最相似的 N 个 User,并根据N 个 User 对某 Item 的打分估计 X 对该 Item 的打分。在相似度算法方面,我们采用了 Jaccard Similarity:


Model-Based 协同过滤:用一组隐含因子来联系用户和商品。其中每个用户、每个商品都用一个向量来表示,用户 u 对商品 i 的评价通过计算这两个向量的内积得到。算法的关键在于根据已知的用户对商品的行为数据来估计用户和商品的隐因子向量。

Item-Based 协同过滤:我们先用 word2vec 对每个 Item 取其隐含空间的向量,然后用 Cosine Similarity 计算用户 u 用过的每一个 Item 与未用过 Item i之间的相似性。最后对 Top N 的结果进行召回。

Query-Based:是根据 Query 中包含的实时信息(如地理位置信息、WiFi 到店、关键词搜索、导航搜索等)对用户的意图进行抽象,从而触发的策略。

Location-Based:移动设备的位置是经常发生变化的,不同的地理位置反映了不同的用户场景,可以在具体的业务中充分利用。在推荐的候选集召回中,我们也会根据用户的实时地理位置、工作地、居住地等地理位置触发相应的策略。

二:排序层:每类召回策略都会召回一定的结果,这些结果去重后需要统一做排序。

● 离线计算层:离线计算层主要包含了算法集合、算法引擎,负责数据的整合、特征的提取、模型的训练、以及线下的评估。

● 近线实时数据流:主要是对不同的用户流实施订阅、行为预测,并利用各种数据处理工具对原始日志进行清洗,处理成格式化的数据,落地到不同类型的存储系统中,供下游的算法和模型使用。

● 在线实时打分:根据用户所处的场景,提取出相对应的特征,并利用多种机器学习算法,对多策略召回的结果进行融合和打分重排。

具体推荐流程图如下


对于不同召回策略所产生的候选集,如果只是根据算法的历史效果决定算法产生的 Item 的位置显得有些简单粗暴,同时,在每个算法的内部,不同 Item 的顺序也只是简单的由一个或者几个因素决定,这些排序的方法只能用于第一步的初选过程,最终的排序结果需要借助机器学习的方法,使用相关的排序模型,综合多方面的因素来确定


排序系统尝试了多种线性、非线性、混合模型等机器学习方法,如逻辑回归、GBDT、GBDT+LR 等。通过线上实验发现,相较于线性模型,传统的非线性模型如 GBDT,并不一定能在线上 AB 测试环节对 CTR 预估有比较明显的提高。而线性模型如逻辑回归,因为自身非线性表现能力比较弱,无法对真实生活中的非线性场景进行区分,会经常对历史数据中出现过的数据过度记忆。下图就是线性模型根据记忆将一些历史点击过的单子排在前面:


从图中我们可以看到,系统在非常靠前的位置推荐了一些远距离的商户,因为这些商户曾经被用户点过,其本身点击率较高,那么就很容易被系统再次推荐出来。但这种推荐并没有结合当前场景给用户推荐出一些有新颖性的 Item。为了解决这个问题,就需要考虑更多、更复杂的特征,比如组合特征来替代简单的“距离”特征。怎么去定义、组合特征,这个过程成本很高,并且更多地依赖于人工经验。而深度神经网络,可以通过低维密集的特征,学习到以前没出现过的一些 Item和特征之间的关系,并且相比于线性模型大幅降低了对于特征工程的需求,从而吸引我们进行探索研究。在 实 际 的 运 用 当 中, 我 们 根 据 Google 在 2016 年 提 出 的 Wide & DeepLearning 模型,并结合自身业务的需求与特点,将线性模型组件和深度神经网络进行融合,形成了在一个模型中实现记忆和泛化的宽深度学习框架。在接下来的章节中,将会讨论如何进行样本筛选、特征处理、深度学习算法实现等。

三:样本的筛选

我们的目标是预测用户的点击行为。有点击的为正样本,无点击的为负样本,同时,在训练时对于购买过的样本进行一定程度的加权。而且,为了防止过拟合 / 欠拟合,我们将正负样本的比例控制在 10%。最后,我们还要对训练样本进行清洗,去除掉 Noise 样本 ( 特征值近似或相同的情况下,分别对应正负两种样本 )。

用户画像:性别、常驻地、价格偏好、Item 偏好等。

Item 画像:包含了商户、外卖、团单等多种 Item。其中商户特征包括:商户价格、商户好评数、商户地理位置等。外卖特征包括:外卖平均价格、外卖配送时间、外卖销量等。团单特征包括:团单适用人数、团单访购率等。

场景画像:用户当前所在地、时间、定位附近商圈、基于用户的上下文场景信息等。性别、常驻地、价格偏好、Item 偏好等。

四:特征处理

机器学习的另一个核心领域就是特征工程,包括数据预处理,特征提取,特征选择等。

1. 特征提取:从原始数据出发构造新的特征的过程。方法包括计算各种简单统计量、主成分分析、无监督聚类,在构造方法确定后,可以将其变成一个自动化的数据处理流程,但是特征构造过程的核心还是手动的。

2. 特征选择:从众多特征中挑选出少许有用特征。与学习目标不相关的特征和冗余特征需要被剔除,如果计算资源不足或者对模型的复杂性有限制的话,还需要选择丢弃一些不重要的特征。特征选择方法常用的有以下几种:


五:深度学习中用到的特征处理方式

深度学习能自动对输入的低阶特征进行组合、变换,得到高阶特征的特性

1.组合特征

对于特征的处理,我们沿用了目前业内通用的办法,比如归一化、标准化、离散化等。但值得一提的是,我们将很多组合特征引入到模型训练中。因为不同特征之间的组合是非常有效的,并有很好的可解释性,比如我们将 " 商户是否在用户常驻地 "、" 用户是否在常驻地 " 以及 " 商户与用户当前距离 " 进行组合,再将数据进行离散化

通过组合特征,我们可以很好的抓住离散特征中的内在联系,为线性模型增加更多的非线性表述。组合特征的定义为:


2.  归一化

归一化是依照特征矩阵的行处理数据,其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准,也就是说都转化为“单位向量”。在实际工程中,我们运用了两种归一化方法:




线下实验中,连续特征在经过 CDF 的处理后,相比于 Min-Max,CDF的线下 AUC 提高不足 0.1%。我们猜想是因为有些连续特征并不满足在(0,1)上均匀分布的随机函数,CDF 在这种情况下,不如 Min-Max 来的直观有效,所以我们在线上采用了 Min-Max 方法。

3.快速聚合

为了让模型更快的聚合,并且赋予网络更好的表现形式,我们对原始的每一个连续特征设置了它的 super-liner 和 sub-liner,即对于每个特征 x,衍生出 2 个子特征


实验结果表示,通过对每一个连续变量引入 2 个子特征,会提高线下 AUC 的表现,但考虑到线上计算量的问题,并没有在线上实验中添加这 2 个子特征.

4.优化器(Optimizer)的选择

4.1Stochastic Gradient Descent (SGD)

SGD 是一种常见的优化方法,即每次迭代计算 Mini-Batch 的梯度,然后对参数进行更新。其公式为:

缺点是对于损失方程有比较严重的振荡,并且容易收敛到局部最小值。

4.2 Momentum

为了克服 SGD 振荡比较严重的问题,Momentum 将物理中的动量概念引入到SGD 当中,通过积累之前的动量来替代梯度。即


相较于 SGD,Momentum 就相当于在从山坡上不停的向下走,当没有阻力的话,它的动量会越来越大,但是如果遇到了阻力,速度就会变小。也就是说,在训练的时候,在梯度方向不变的维度上,训练速度变快,梯度方向有所改变的维度上,更新速度变慢,这样就可以加快收敛并减小振荡。

.4.3 Adagrad

相较于 SGD,Adagrad 相当于对学习率多加了一个约束,即:


Adagrad 的优点是,在训练初期,由于 gt 较小,所以约束项能够加速训练。而在后期,随着 gt 的变大,会导致分母不断变大,最终训练提前结束。

4.4 Adam

Adam 是一个结合了 Momentum 与 Adagrad 的产物,它既考虑到了利用动量项来加速训练过程,又考虑到对于学习率的约束。利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam 的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。其公式为


小结

通过实践证明,Adam 结合了 Adagrad 善于处理稀疏梯度和 Momentum 善于处理非平稳目标的优点,相较于其他几种优化器效果更好。同时,我们也注意到很多论文中都会引用 SGD,Adagrad 作为优化函数。但相较于其他方法,在实践中,SGD 需要更多的训练时间以及可能会被困到鞍点的缺点,都制约了它在很多真实数据上的表现。

六:损失函数的选择

深度学习同样有许多损失函数可供选择,如平方差函数(Mean SquaredError),绝对平方差函数(Mean Absolute Error),交叉熵函数(Cross Entropy)等。在理论与实践中,发现 Cross Entropy 相比于在线性模型中表现比较好的平方差函数有着比较明显的优势。其主要原因是在深度学习通过反向传递更新 W和 b 的同时,激活函数 Sigmoid 的导数在取大部分值时会落入左、右两个饱和区间,造成参数的更新非常缓慢。具体的推导公式如下:


其中 y 是我们期望的输出,a 为神经元的实际输出 a=σ(Wx+b)。由于深度学习反向传递的机制,权值 W 与偏移量 b 的修正公式被定义为:


因为 Sigmoid 函数的性质,导致 σ′(z) 在 z 取大部分值时会造成饱和现象。Cross Entropy 的公式为:


如果有多个样本,则整个样本集的平均交叉熵为:


其中 n 表示样本编号,i 表示类别编号。 如果用于 Logistic 分类,则上式可以简化成 :


与平方损失函数相比,交叉熵函数有个非常好的特质:


可以看到,由于没有了 σ′ 这一项,这样一来在更新 w 和 b 就不会受到饱和性的影响。当误差大的时候,权重更新就快,当误差小的时候,权重的更新就慢。

七.宽深度模型框架

在实验初期,我们只将单独的 5 层 DNN 模型与线性模型进行了比对。通过线下 / 线上 AUC 对比,我们发现单纯的 DNN 模型对于 CTR 的提升并不明显。而且单独的 DNN 模型本身也有一些瓶颈,例如,当用户本身是非活跃用户时,由于其自身与 Item 之间的交互比较少,导致得到的特征向量会非常稀疏,而深度学习模型在处理这种情况时有可能会过度的泛化,导致推荐与该用户本身相关较少的 Item。因此,我们将广泛线性模型与深度学习模型相结合,同时又包含了一些组合特征,以便更好的抓住 Item-Feature-Label 三者之间的共性关系。我们希望在宽深度模型中的宽线性部分可以利用交叉特征去有效地记忆稀疏特征之间的相互作用,而在深层神经网络部分通过挖掘特征之间的相互作用,提升模型之间的泛化能力。下图就是我们的宽深度学习模型框架:


在离线阶段,我们采用基于 Theano、Tensorflow 的 Keras 作为模型引擎。在训练时,我们分别对样本数据进行清洗和提权。在特征方面,对于连续特征,我们用 Min-Max 方法做归一化。在交叉特征方面,我们结合业务需求,提炼出多个在业务场景意义比较重大的交叉特征。在模型方面我们用 Adam 做为优化器,用 CrossEntropy 做为损失函数。在训练期间,与 Wide & Deep Learning 论文中不同之处在于,我们将组合特征作为输入层分别输入到对应的 Deep 组件和 Wide 组件中。然后在 Deep 部分将全部输入数据送到 3 个 ReLU 层,在最后通过 Sigmoid 层进行打分。我们的 Wide & Deep 模型在超过 7000 万个训练数据中进行了训练,并用超过3000 万的测试数据进行线下模型预估。我们的 Batch - Size 设为 50000,Epoch设为 20。



总结:

排序是一个非常经典的机器学习问题,实现模型的记忆和泛化功能是推荐系统中的一个挑战。记忆可以被定义为在推荐中将历史数据重现,而泛化是基于数据相关性的传递性,探索过去从未或很少发生的 Item。宽深度模型中的宽线性部分可以利用交叉特征去有效地记忆稀疏特征之间的相互作用,而深层神经网络可以通过挖掘特征之间的相互作用,提升模型之间的泛化能力。在线实验结果表明,宽深度模型对CTR 有比较明显的提高。同时,我们也在尝试将模型进行一系列的演化:1. 将 RNN 融入到现有框架。现有的 Deep & Wide 模型只是将 DNN 与线性模型做融合,并没有对时间序列上的变化进行建模。样本出现的时间顺序对于推荐排序同样重要,比如当一个用户按照时间分别浏览了一些异地酒店、景点时,用户再次再请求该异地城市,就应该推出该景点周围的美食。2. 引入强化学习,让模型可以根据用户所处的场景,动态地推荐内容。


注:本文整理自美团点评技术文章





































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值