契机
将一些显式的原始以及人工构造的交叉特征放到wide侧进行类似LR模型的操作,从而完成memorization的功能,这些特征已经被专家确定是对最终的结果有很大影响;将一些复杂特征,比如数值类型或者embedding等特征统一放到deep侧来提取更加高阶的特征,从而完成generalization的功能。
模型结构
模型核心结构如下所示:
这个图其实并不是特别直观,甚至在实际应用中都没有严格遵循上图所画的结构。上图的意思是wide侧和deep侧之间特征是严格分开的,但实际应用中模型的结构如下图所示,可以发现"User Installed App"和"Impression App"在wide和deep侧都有出现,只不过wide侧用到的特征是这两个特征one-hot的交叉特征,deep侧用到的特征是这两个特征的embedding。
这里值得注意的是,wide侧梯度更新的方法是L1类型FTRL,deep侧梯度更新的方法是adagrad。这样做的原因也是根据两侧特征来考虑的,因为wide侧特征维度比较庞大而且很稀疏,这时采用L1类型FTRL能够最大程度地将绝大部分的权重都降低至0,这样能够极大节省计算量;deep侧需要更加精准地完成参数更新,因而必须要采用更精准的梯度更新方法。
核心思想
文章给出的核心思想在于有些显式的特征用deep来学习,并不能学的更好,因为有可能模型可能会学偏,理论上如果所有的交叉特征都在训练样本中出现过,deep侧的意义并不大,deep侧的任务就是用来学习更加抽象的、交叉特征捕捉不到的特征。
wide & deep还有一个极大的优点在于两侧的参数可以分开更新,因为wide侧的特征对于线上数据的分布更加敏感,可以实时地将线上数据喂到wide侧进行wide侧参数的更新,而且wide侧参数较少,更新起来也比较方便。而deep侧模型较为抽象,这时没必要更新地这么频繁。