Wide & Deep算法&实现
🛒

Wide & Deep算法&实现

text
Wide & Deep算法的Python代码实现
Tags
深度学习
机器学习
推荐系统
Created
Aug 3, 2022 12:56 PM

原理

notion image
Wide & Deep模型的主要思路是由单层的Wide部分和多层的Deep部分组成的混合模型。其中Wide部分主要作用是让模型具有较强的“记忆能力”;Deep部分的主要作用是让模型具有“泛化能力”
  • “记忆能力”可以理解为模型直接学习并利用历史数据中的物品或者特征的“共现频率”的能力;例如协同过滤、逻辑回归等简单模型有较强的“记忆能力”;
  • “泛化能力”可以理解为模型传递特征的相关性,以及挖掘稀疏甚至从未出现过的稀有特征与最终标签相关性的能力;
Wide部分:Dense Features + Sparse Features(onehot处理)+ 特征组合;
Deep部分:Dense Embedding(Sparse Features 进行 onehot + Embedding处理);

优缺点

优点

  • 结构简单,复杂度低,目前工业中广泛应用;
  • 线性模型和深度模型优势互补,分别提取低阶和高阶特征交互信息,兼具记忆能力和泛化能力;
  • 线性部分为广义线性模型,可灵活替换为其他算法,比如FM,提升Wide部分提取信息的能力;

缺点

  • 深度模型可自适应的进行高阶特征交互,但是隐式的构造特征组合,可解释性差;
  • 深度模型仍需要人工特征来提升模型效果,只是需求量没有线性模型大;

代码实现

class WideDeep(Model): def __init__(self, feature_columns, hidden_units, output_dim, activation): super(WideDeep, self).__init__() self.dense_feature_columns, self.sparse_feature_columns = feature_columns self.embed_layer = EmbedLayer(self.sparse_feature_columns) self.wide = WideLayer() self.deep = DNNLayer(hidden_units, output_dim, activation) def call(self, inputs, training=None, mask=None): dense_inputs, sparse_inputs, onehot_inputs = inputs[:, :13], inputs[:, 13:39], inputs[:, 39:] # Wide wide_input = tf.concat([dense_inputs, onehot_inputs], axis=1) wide_output = self.wide(wide_input) # Deep sparse_embed = self.embed_layer(sparse_inputs) deep_output = self.deep(sparse_embed) output = tf.nn.sigmoid(0.5 * (wide_output + deep_output)) return output

参考

推荐算法(三)--Wide&Deep 推荐算法与深度学习的碰撞
Wide&Deep 是 Google 在2016年提出的模型,一个线性模型与深度模型结合的产物。 论文传送门: 代码传送门: 在此之前,CTR 任务中主要以 线性模型+人工特征 为主流方法,此类方法缺陷比较明显:线性模型表达能力有限,需要大量人工特征来提升模型效果。随着深度学习的不断火热,深度模型展现了强大的表达能力,并且能自适应的学习特征之间的高阶交互。 因此 Google 取彼之长补己之短,将线性模型与深度模型以并行结构的方式进行融合,线性部分拟提取低阶交互信息,深度部分提取高阶交互信息,提出了 Wide&Deep模型,并在Google Play store中成功落地,收益明显。 模型结构如图1,中间为 Wide&Deep 总体结构,左边(Wide Models)为拆解出来线性模型,右边(Deep Models)为深度模型。未激活的线性模型输出与深度模型输出相加,再进行激活即得到总体模型的输出。 算法公式如下: 括号内第一项为线性模型的输出,第二项为深度模型的输出,将两部分输出相加,再加上一个偏置 b 之后输入 sigmoid 进行激活得到预测的概率值。 线性部分等同于一个 LR,唯一不同的是在输入上多了 \phi(X),该项表示的是在原始输入 X 上构造出的人工特征,一般为特征之间的二阶交互,也可根据业务场景设计一些复杂的强特,以提升模型表达能力。 线性部分的输出是对输入 [X, \phi(X)] 的线性映射,无需激活。 需要注意的是,两部分的输入不同: 该部分为一个多层的全连接网络,第 l 层的输出为 a^{(l)} , y 为全连接最后一层未进行 sigmoid 激活的输出,与线性部分未激活的输出相累加再进行激活即为模型最终输出。 Wide 部分:Dense Features +
推荐算法(三)--Wide&Deep 推荐算法与深度学习的碰撞