Recommendation-System-2-WideDeep

Background

2016 年Google通过用wide& Deep+ FTRL 优化器对数据稀疏性sparsity和特征组合学习的问进行研究
原文:
In the experiments, we used Follow- the-regularized-leader (FTRL) algorithm with L1 regularization as the optimizer for the wide part of the model, and AdaGrad for the deep part.

来自 https://zhuanlan.zhihu.com/p/142958834

Motivation目的

  • CTR预估任务里面需要精细的特征工程对特征进行组合使模型对出现频率高的特征进行学习。但问题是特征工程需要花费时间长而且麻烦

  • 对于sparse的数据进行特征组合进行训练容易模型过拟合,泛化性差,因此需要一种generalization的方法对数据进行处理

  • Wide&Deep模型就是围绕记忆性和泛化性进行讨论的,模型能够从历史数据中学习到高频共现的特征组合的能力,称为是模型的Memorization。能够利用特征之间的传递性去探索历史数据中从未出现过的特征组合,称为是模型的Generalization。Wide&Deep兼顾Memorization与Generalization并在Google Play store的场景中成功落地。

    特点

  • 用了Embedding的deep model对学习general的feature
    为了解决sparse 数据的问题,Google把DNN,embedding结合用于处理sparse的数据。通过dense embedding的方法把sparse的高维数据进行降维的同时,也把0,1的sparse的数据变成连续的数据使得梯度下降学习的时候不会因为梯度消失的问题而变得模型难以训练。而这个模块也成为deep model

  • 用了wide model对特征进行自动组合。
    为了解决特征组合的问题,google通过利用wide model方法直接把其他类别的数据进行线性投影从而达到特征选择的作用。因为线性投影的时候每个特征都有一个weight进行权衡。而模型学习的时候就是把这些weight进行调整来选择。这样可解释性也比较强

  • 联合训练
    W&D模型是将两部分输出的结果结合起来联合训练,将deep和wide部分的输出重新使用一个逻辑回归模型做最终的预测,输出概率值。联合训练的数学形式如下:需要注意的是,因为Wide侧的数据是高维稀疏的,所以作者使用了FTRL算法优化,而Deep侧使用的是 Adagrad

    原理

  • 我们可以看到 Wide& Deep model基本就是wide model 和deep model的输出的相加,再通过logistics 或softmax(如果是多分类),输出的结果是CTR (click or not click)的概率

  • Wide model
    wide部分是一个广义的线性模型,输入的特征主要有两部分组成,一部分是原始的部分特征,另一部分是原始特征的交叉特征(cross-product transformation),对于交互特征可以定义为

  • Deep model
    Deep部分是一个DNN模型,输入的特征主要分为两大类,一类是数值特征(可直接输入DNN),一类是类别特征(需要经过Embedding之后才能输入到DNN中),DNN模型随着层数的增加,中间的特征就越抽象,也就提高了模型的泛化能力。对于Deep部分的DNN模型作者使用了深度学习常用的优化器AdaGrad,这也是为了使得模型可以得到更精确的解。

  • W&D模型是将两部分输出的结果结合起来联合训练,将deep和wide部分的输出重新使用一个逻辑回归模型做最终的预测,输出概率值。联合训练的数学形式如下:需要注意的是,因为Wide侧的数据是高维稀疏的,所以作者使用了FTRL算法优化,而Deep侧使用的是 Adagrad

    优缺点

  • 优点

    • 通过结合wide和deep model同时解决sparse data和memorization, generalization的问题
    • 不用特意人工选择特征进行组合
    • 数据特征可以通过embedding方式降维降低参数的数目
  • 缺点

    • 可能需要考虑把哪些特征放到deep model哪些放到wide model
    • 需要通过联合训练方式对不同模型优化

      6. 思考

  • 在你的应用场景中,哪些特征适合放在Wide侧,哪些特征适合放在Deep侧,为什么呢?
    个人认为categorical的数据如果distinct的value很多的feature应该用于deep model,比如说像电影类别id的特征,或者用户地址,如果细分的话会有上百个value,而每个value这样需要one-hot来表示的话就会变得很大这样需要deep model的embedding进行降维。 而如果value个数不多的categorical feature,比如性别,又或者连续数据,比如年龄,可以通过wide的 model进行处理。不过感觉也可以放到deep model里面

  • 为什么Wide部分要用L1 FTRL训练?
    Wide model 用L1 - FTRL 的优化器主要原因是 L1-FTRL 在结合L1-FOBOS 和 L1-RDA的优化方法后再梯度下降有较高的精度同时,也能产生稀疏性进行特征的筛选,而这个在wide-model里有利于wide mode通过weight的稀疏性进行特征组合和选择。比如说通过L1-FTRL 我们可以把 y=w1x1 +w2x2 +w3x3 里面的w1, w2的weight降到接近0从而达到排除特征x1和x2 而选择x3的效果

  • 为什么Deep部分不特别考虑稀疏性的问题?
    Deep model 之所以不用太考虑了稀疏性是因为embedding已经把稀疏的特征进行降维成dense的vector,而对于本来就不sparse的feature如年龄也就更加不用考虑稀疏性了

    Future work

  • 有没有可以不用专门分开两种训练方法,更加general的训练方法对不同的模型进行训练但不会影响效果?

  • 能不能不专门考虑什么feature要放到deep model什么feature放到wide model达到更好的自动化特征选择的效果?

    Reference

    [1] https://github.com/datawhalechina/team-learning-rs/blob/master/DeepRecommendationModel/Wide%26Deep.md

[2] https://zhuanlan.zhihu.com/p/142958834

Comments