应该在神经网络中的 dropout 层之前还是之后进行特征嵌入?

Posted

技术标签:

【中文标题】应该在神经网络中的 dropout 层之前还是之后进行特征嵌入?【英文标题】:Should feature embeddings be taken before or after dropout layer in neural network? 【发布时间】:2021-11-09 03:42:22 【问题描述】:

我正在使用 BERT 训练一个二进制文本分类模型,如下所示:

def create_model():
   text_input = tf.keras.layers.Input(shape=(), dtype=tf.string, name='text')
   preprocessed_text = bert_preprocess(text_input)
   outputs = bert_encoder(preprocessed_text)

   # Neural network layers
   l1 = tf.keras.layers.Dropout(0.1, name="dropout")(outputs['pooled_output'])
   l2 = tf.keras.layers.Dense(1, activation='sigmoid', name="output")(l1)

   # Use inputs and outputs to construct a final model
   model = tf.keras.Model(inputs=[text_input], outputs=[l2])
   return model

此代码是从 tfhub 上的示例中借用的:https://tfhub.dev/tensorflow/bert_en_uncased_L-12_H-768_A-12/4。

我想从倒数第二层提取特征嵌入,并将它们用于示例之间的比较、聚类、可视化等。这应该在 dropout 之前(上面模型中的 l1)还是 dropout 之后(上面模型中的 l2)完成?

我想弄清楚这个选择是否会产生重大影响,或者无论哪种方式都可以?例如,如果我在 dropout 后提取特征嵌入并计算两个示例之间的特征相似性,这可能会受到哪些节点被随机设置为 0 的影响(但也许这没关系)。

【问题讨论】:

【参考方案1】:

为了回答您的问题,让我们回顾一下 Dropout 层的工作原理:

Dropout 层通常用作减轻过拟合的一种手段。假设两层 A 和 B 通过 Dropout 层连接。然后在训练阶段,A 层的神经元被随机丢弃。这可以防止 B 层过于依赖 A 层中的特定神经元,因为这些神经元并不总是可用的。因此,B 层必须考虑来自 A 层的整体信号,并且(希望)不能坚持训练集特有的一些噪声。

需要注意的重要一点是,Dropout 机制仅在训练阶段被激活。在预测时,Dropout 什么都不做。

如果我对您的理解正确,您想知道是在 Dropout 之前还是之后采用特征(请注意,在您的网络中,l1 表示应用了 Dropout 之后的特征)。如果是这样,我会采用 Dropout 之前的特征,因为从技术上讲它并不重要(Dropout 在预测期间是不活动的)并且这样做更合理(没有后续层,Dropout 没有意义)。

【讨论】:

以上是关于应该在神经网络中的 dropout 层之前还是之后进行特征嵌入?的主要内容,如果未能解决你的问题,请参考以下文章

MLP中实现dropout,批标准化

在 Keras 的卷积层上使用 Dropout

Keras减少过拟合的秘诀——Dropout正则化

Dropout与过拟合抑制函数式API

神经网络之dropout层

mxnet:具有共享掩码的多个 dropout 层