(Wide&Deep) Wide & Deep Learning for Recommender Systems

背景

这是一篇推荐系统相关的论文,场景是谷歌 Play Store 的 App 推荐。文章开头,作者点明推荐系统需要解决的两个能力: memorization 和 generalization。

memorization 指的是学习数据中出现过的组合特征能力。最常使用的算法是 Logistic Regression,简单、粗暴、可解释性强,而且会人工对特征进行交叉,从而提升效果。但是,对于在训练数据中没有出现过的特征就无能为力。

generalization 指的是通过泛化出现过特征从解释新出现特征的能力。常用的是将高维稀疏的特征转换为低维稠密 embedding 向量,然后使用 fm 或 dnn 等算法。与 LR 相比,减少特征工程的投入,而且对没有出现过的组合有较强的解释能力。但是当遇到的用户有非常小众独特的爱好时(对应输入的数据非常稀疏和高秩),模型会过度推荐。

综合前文 ,作者提出一种新的模型 Wide & Deep。

模型

从文章题目中顾名思义,Wide & Deep 是融合 Wide Models 和 Deep Models 得到,下图形象地展示出来。

Wide & Deep Models

Wide Component 是由一个常见的广义线性模型:y=wTx+b{y=w^Tx+b}。其中输入的特征向量 x{x} 包括两种类型:原始输入特征(raw input features)和组合特征(transformed features)。

常用的组合特征公式如下:

ϕk(x)=i=1dxicki,cki{0,1}{\phi_k(x)=\prod_{i=1}^dx_i^{c_{ki}},c_{ki}\in\{0,1\}}

cki{c_{ki}} 代表对于第k个组合特征是否包含第i个特征。xi{x_i}是布尔变量,代表第i个特征是否出现。例如对于组合特征 AND(gender=female, language=en) 当且仅当 x 满足(“gender=female” and “language=en”)时,ϕk(x)=1{\phi_k(x)=1}

Deep Component 是一个标准的前馈神经网络,每一个层的形式诸如:a(l+1)=f(W(l)a(l)+b(l)){a^{(l+1)}=f(W^{(l)}a^{(l)} + b^{(l)})}。对于输入中的 categorical feature 需要先转化成低维稠密的 embedding 向量,再和其他特征一起喂到神经网络中。

对于这种由基础模型组合得到的新模型,常用的训练形式有两种:joint training 和 ensemble。ensemble 指的是,不同的模型单独训练,且不共享信息(比如梯度)。只有在预测时根据不同模型的结果,得到最终的结果。相反,joint training 将不同的模型结果放在同一个损失函数中进行优化。因此,ensmble 要且模型独立预测时就有有些的表现,一般而言模型会比较大。由于 joint training 训练方式的限制,每个模型需要由不同的侧重。对于 Wide&Deep 模型来说,wide 部分只需要处理 Deep 在低阶组合特征学习的不足,所以可以使用简单的结果,最终完美使用 joint traing。

预测时,会将 Wide 和 Deep 的输出加权得到结果。在训练时,使用 logistic loss function 做为损失函数。模型优化时,利用 mini-batch stochastic optimization 将梯度信息传到 Wide 和 Deep 部分。然后,Wide 部分通过 FTRL + L1 优化,Deep 部分通过 AdaGrad 优化。

实验

本篇论文选择的实验场景是谷歌 app 商店的应用推荐,根据用户相关的历史信息,推荐最有可能会下载的 App。

使用的模型如下:
Wide & Deep model structure for apps recommendation.

一些细节:

  • 对于出现超过一定次数的 categorical feature,ID 化后放入到模型中。
  • Continuous real-valued features 通过 cumulative distribution function 归一化到 [0, 1] 区间。
  • categorical feature 由 32 维 embedding 向量组成,最终的输入到 Deep 部分的向量大概在 1200 维。
  • 每天在前一天 embedding 和模型的基础上进行增量更新。

实验结果:

实验结果

Wide & Deep 模型相对于其他两个模型毫无疑问有提升。但结果中也一个反常的现象:单独使用 Deep 模型离线 AUC 指标比单独使用 Wide 模型差,但是线上对比实验时却有较大的提升。论文中作者用了一句:线下实验中的特征是固定的,线上实验会遇到很多没有出现过的特征组合,Deep 相对于 Wide 有更好的模型泛化能力,所以会有反常现象。由于笔者工作中不关注 AUC,也没有办法继续分析。

总结

作者从推荐系统的的 memorization 和 generalization 入手,设计出新的算法框架。通过线上和线下实验实验,证明 Deep 和 Wide 联合是必须的且有效的。最终也在自己的业务场景带来提升。

Reference


Practical Lessons from Predicting Clicks on Ads at Facebook(gbdt + lr)

**主题:**Facebook 2014 年发表的广告点击预测文章。最主要是提出经典 GBDT+LR 模型,可以自动实现特征工程,效果好比于人肉搜索。另外,文章中还给出一个 online learning 的工程框架。

问题:

  • GBDT 如何处理大量 id 类特征
    • 广告类对于 user id 的处理:利用出现的频率以及转化率来代替
    • id 特征放在 lr 中处理。
  • GBDT+LR 和 RF+LR 的区别
    • 选出能明显区分正负样本的特征的变换方式,转换成 one hot 有意义
    • RF + LR 可以并行训练,但是 RF 中得到的区分度不高

收获:

  • 数据支撑去做决策,收获和实验数量成正比。
  • CTR click through rate,点击率
  • 评价指标:
    • Normalized Entropy:越小模型越好
    • Calibration:预测点击数除以真实点击数
    • AUC 正样本出现在负样本前面的概率。
  • 数据新鲜度:模型天级训练比周级训练在 NE 下降 1%。
  • GBDT 和 LR 模型采用不同的更新频率,解决训练耗时不同。但是 GBDT 重新训练之后,LR 必须要重新训练。

网络:

GBDT + LR

利用 GBDT 模型进行自动特征组合和筛选,然后根据样本落在哪棵树哪个叶子生成一个 feature vector 输入到 LR 模型中。这种方法的有点在于两个模型在训练过程从是独立,不需要进行联合训练。

GBDT 由多棵 CART 树组成,每一个节点按贪心分裂。最终生成的树包含多层,相当于一个特征组合的过程。根据规则,样本一定会落在一个叶子节点上,将这个叶子节点记为1,其他节点设为0,得到一个向量。比如下图中有两棵树,第一棵树有三个叶子节点,第二棵树有两个叶子节点。如果一个样本落在第一棵树的第二个叶子,将它编码成 [0, 1, 0]。在第二棵树落到第一个叶子,编码成 [1, 0]。所以,输入到 LR 模型中的向量就是 [0, 1, 0, 1, 0]

Online Learning

文章中提到的 Online Learning 包括三个部分:

  • Joiner 将每次广告展示结果(特征)是否用户点击(标签) join 在一起形成一个完成的训练数据;
  • Trainer 定时根据一个 small batch 的数据训练一个模型;
  • Ranker 利用上一个模块得到模型预测用户点击。

注意的点:

  • waiting window time:给用户展示广告之后,我们只能知道用户点击的广告,也就是模型中的正样本。负样本需要设置一个等待时间来判断,即超过某一个时间没有观测到用户点击某一个广告,就认为这是一个负样本。另外设置这个时间也是一个技术活,时间过短导致click没有及时join到样本上,时间太长数据实时性差以及有存储的压力。最后,无论如何都会有一些数据缺失,为了避免累积误差,需要定期重新训练整个模型。
  • request ID:人家的模型是分布式架构的,需要使用 request ID 来匹配每次展示给用户的结果以及click。为了实现快速匹配,使用 HashQueue 来保存结果。
  • 监控:避免发生意向不到的结果,导致业务损失。我们的实时模型也在上线前空跑了好久。

实验:

有无 GBDT 特征对比

训练两个 LR 模型,一个模型输入样本经过 GBDT 得到的特征,另外一个不输入。混合模型比单独 LR 或 Tree

学习率选择

5 种学习率,前三个每一个特征设置一个学习率,最后两种全局学习率。

结果:应该给每一个特征设置一个不同的学习率,而且学习率应该随着轮次缓慢衰减。

GBDT 参数相关实验

  • 前面的树会带来大量的收益,但是树越多训练越慢。
  • 特征重要程度,累加不同树上某个特征的得分减少贡献。
  • 两种特征:
    • 上下文,冷启动的时候比较重要,与数据新鲜度有关。
    • 历史史特征,权重比较大,关键在于长时间积累。

采样

训练数据大多,需要进行采样。

  • uniform subsampling :无差别采样。使用 10 % 的样本,NE 减少 1 %

  • negative down subsampling :对负样本进行下采样。但不是负采样率越低越好,比如下面的图中0.0250就可能是解决了正负样本不平衡问题。最后的CTR指标结果需要重新进行一次映射。

Reference