原理
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