今天开始了推荐系统的第二个模型Wide&Deep的学习,这是谷歌发表于2016年的深度学习模型,主要的思想是用Memorization和Generalization来帮助网络去学习到目标函数。具体地,论文地址在此:https://arxiv.org/pdf/1606.07792.pdf
Wide&Deep的网络结构
Wide模型:传统的logistic regression模型,即将处理好的输入的特征通过线性加权的方式,再通过sigmoid函数的变换,用来拟合目标函数的概率。该部分的特点为,对于历史中出现过的某个值,或者某种特征组合是很敏感的,因而,它的作用是memorization。在wide部分,我们通常会将ID类型的特征放入其中,希望它能够学习到在数据集中高频出现的特征组合,其中,我们使用带L1的随机梯度下降的算法FTRL(Follow the Regularized Leader)使得wide部分的稀疏性大大降低,节约参数的计算和存储。当然,一些手动交叉的部分的特征也可以放入wide模型中去。
Deep模型:deep neural network模型,即深度学习的多层感知机的网络结构。通过多层感知机的叠加,对特征进行非线性的抽取,可以组合得到一定的泛化能力。因而,它的作用是generalization。在deep部分,我们通常选择一些数值型的特征放在deep中,通过embedding+深度交互的结合,能够学习到各个特征的最优向量表达。由于Deep部分的输入是embedding向量以及数值类特征,因此,优化的时候可以使用AdaGrad去训练。
Wide&Deep模型:
从谷歌的论文的网络结构图可以看到,它的dense部分为连续型变量(如年龄、app的安装数量、访问次数等等)+类别型变量(如人口基础信息、设备类型、用户曝光App等),它的deep部分为用户安装的app和用户曝光的app的特征交叉。
具体代码:
相关思考题:
在模型结构日渐复杂的今天,你认为wide部分存在的意义还大吗?在你的模型中还保留这wide部分这种简单暴力的结构,还是已经用更复杂的结构来代替?
在模型结构日益复杂的今天,我认为wide部分还是有存在的意义的,可以提取出高频出现的特征组合,当然,这块部分也可以用FM来替代,比较典型的是deepFM模型。能把Wide部分和Deep部分分开训练吗?能让FTRL在线学习,而深度部分batch训练吗?
我觉得不能将Wide和Deep分开训练,因为两者的联合才构建了到最终的目标函数的映射。
附录:
namedtuple是升级版的tuple,tuple的特性是一个包含多个不可变属性值的对象,namedtuple对于对象本身就做了命名,同时也给域做了命名定义,如下面的例子,定义了一个name为SparseFeat的namedtuple,该namedtuple具有三个域,分别为name、vocabulary_size和embedding_size。
from collections import namedtuple
SparseFeat = namedtuple('SparseFeat',['name','vocabulary_size','embedding_size'])
sparseFeat = SparseFeat(name='Sparse1', vocabulary_size=14, embedding_dim=8)
参考资料:
- [DataWhale学习资料](https://github.com/datawhalechina/team-learning-rs/blob/master/DeepRecommendationModel/Wide%26Deep.md)
- [见微知著,你真的搞懂Google的Wide&Deep模型了吗?]
https://zhuanlan.zhihu.com/p/142958834 - [在线最优化求解] (https://github.com/wzhe06/Ad-papers/blob/master/Optimization%20Method/%E5%9C%A8%E7%BA%BF%E6%9C%80%E4%BC%98%E5%8C%96%E6%B1%82%E8%A7%A3%28Online%20Optimization%29-%E5%86%AF%E6%89%AC.pdf)