目录:

  • 背景
  • Wide & Deep
    • Wide
    • Deep
    • 总体
  • 其他
    • 联合训练和集成训练
    • 优缺点
    • 存在的疑惑
    • 后续改进
    • 思考题
  • 参考资料

背景

 文接DeepCrossing,既然deepcrossing已经可以很好地完成ctr任务了,为什么还需要提出wide&deep框架呢?

 原因在于deepcrossing会过分地挖掘长尾特征,而稀释一些主要的头部特征,从而导致一些明显的,强壮特征(个人叫法)的影响力被降低,从而降低模型的记忆能力。那么为了同时保持模型的泛化能力,我们可以在DeepCrossing的DNN基础上,为模型提供记忆能力,于是就有了Wide&Deep模型。

Wide & Deep

 Wide&Deep模型分为两部分:提供记忆能力的wide部分和提供泛化能力的deep部分。给出Wide&Deep的结构图:

 其中,图片左边为wide部分,可以用一个简单的映射来表示,图片右边就是DNN网络。下面对Wide&Deep模型进行具体的介绍。

Wide部分

 Wide部分的主要目的是提供显性的,强壮的特征,让模型可以直接利用这些特征,从而达到“记忆”的目的。

 而特征进行交叉有很多种方式,对于有n个特征的情况而言,进行二阶的特征交叉就可以有n×(n-1)/2种情况,但是这里的特征需要我们手动去进行交叉,所以当n很大时,我们自然无法人为的完成所有任务,所以wide部分需要基于业务应用选取最有可能的特征交叉,并将其作为wide部分的输入。

 在论文Wide & Deep Learning for Recommender Systems中,论文作者举了Google Play作为例子向我们介绍Wide部分特征的选择。在这里他们使用了用户下载的应用和被曝光的应用进行特征的交叉,即一个用户下载的应用和被曝光的应用之间的共现情况。解释为:如果某个曝光应用和某个下载的应用经常一起出现在用户的设备上,那么就可以构建AND(installed_app=A, impression_app=B)的特征。

 在原论文中,交叉特征的表示形式为

\phi_k(x) = \prod_{i=1}{d}x_i^{c_{ki}}, c_{ki}\in{0, 1}

 这种特征我们称其为叉乘变换,简单理解就是二值特征的与操作,举个例子,AND(x=A, y=B)即必须当x=A时且y=B时这个特征才等于1否则等于0,这种特征有助于提供模型的非线性https://zhuanlan.zhihu.com/p/111243634

 而wide层的本质就是一个线性变换,用一个广义线性模型表示:

y=w_0+W^Tx

 在代码(tensorflow)中的表现形式如下:

concat_dense_inputs = Concatenate(axis=1)(list(dense_input_dict.values()))
dense_logits_output = Dense(1)(concat_dense_inputs)

 但是如果特征很多的话,我们就需要提供大量空间来为这些特征存储参数和为这些参数的训练提供时间,于是我们考虑矩阵的稀疏性质。

 为了保证模型参数的稀疏性,wide部分的训练选择采取L1 FTRL。在这里我没有对FTRL有深入的了解,只能暂时地接受其更关注稀疏性的性质。而对于L1可以使模型更加稀疏的原因,可以参考资料https://blog.csdn.net/jinping_shi/article/details/52433975 。写得非常好,墙裂推荐👍。

Deep部分

 Deep部分我们延用之前DeepCrossing的思想,采取DNN来实现模型的泛化性质。

 在论文中,作者将类别特征利用embedding方法得到不同的特征的embedding表示,再将其与数值型特征进行拼接得到一条长约1200的向量,将该向量作为网络的输入,通过三层线性层并在每个线性层之后添加relu激活函数,最后再通过一层线性层并使用sigmoid激活函数得到deep层的打分。
 其隐藏层的计算的数学表达形式为:

a^{l+1}=f(W^{(l)}a^{l}+b^{l})

 其中f为激活函数。

总体

 最终结合wide层的打分wide_score和deep层的打分deep_score通过一个全连接层并利用sigmoid函数进行非线性变换,最后得到最终的得分。

 其最终的表示形式为

P(y=1\mid x) = \sigma(w^T_{wide}[x,\phi(x)]+w^T_{deep}a^{(l_f)}+b)

 其中,\phi(x)为交叉变换后得到的特征,a^{l_f}是最后激活得到的值。

 论文中架构如下图:

其他

联合训练和集成训练

 论文中提到Wide&Deep模型是一个联合训练的模型,模型在训练的时候同时进行参数的更新。而集成模型在训练的时候是互不知晓的,只有在进行推断的时候才会被联合起来一起使用。其中,Wide&Deep的联合训练体现在最后利用一个dense将两个部分的输出得分进行一次线性变换,最后通过这个连接将误差进行反向传播,实现参数的同时更新。

优缺点

  • 优点:同时提取了低阶的隐藏特征和高阶的混合特征,使模式可以在保证对过去数据的记忆模式的情况仍然保持一定的泛化能力。
  • 缺点:wide部分仍然需要人工手动进行特征制作,对人工成本要求过高。

存在的疑惑

 😵在论文中将连续实值特征分段使其离散化,为什么要这么做?😵

后续改进

  • 了解FTRL的使用
  • 区分集成训练和联合训练

思考题

  1. 在你的应用场景中,哪些特征适合放在Wide侧,哪些特征适合放在Deep侧,为什么呢?
    当某些特征是很明显的具有强烈的共现关系时,适合放在Wide侧,而其余的基础特征都可以放在deep侧。

  2. 为什么Wide部分要用L1 FTRL训练?
    因为L1 FTRL更加注重模型的稀疏性,可以生成更多值为0的参数,降低模型的复杂性。

  3. 为什么Deep部分不特别考虑稀疏性的问题?
    Deep部分输入的特征要么是数值特征,要么是经过embedding处理之后的类别特征,此时不存在稀疏的性质。

参考资料

  1. https://zhuanlan.zhihu.com/p/111243634
  2. https://blog.csdn.net/jinping_shi/article/details/52433975
  3. https://github.com/datawhalechina/team-learning-rs/tree/master/DeepRecommendationModel
  4. https://zhuanlan.zhihu.com/p/47293765
  5. https://zhuanlan.zhihu.com/p/142958834
  6. https://zhuanlan.zhihu.com/p/92279796?utm_source=wechat_session&utm_medium=social&utm_oi=753565305866829824&utm_campaign=shareopn
  7. https://zhuanlan.zhihu.com/p/62552763

0 条评论

发表评论