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

Should feature embeddings be taken before or after dropout layer in neural network?

我正在使用 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 的节点的影响(但也许这没关系)。

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

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

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

如果我没理解错的话,你想知道是在Dropout之前还是之后获取特征(注意在你的网络中l1表示应用了Dropout之后的特征)。如果是这样,我会采用 Dropout 之前的特征,因为从技术上讲它并不重要(Dropout 在预测期间处于非活动状态)并且这样做更合理(如果没有下一层,Dropout 是没有意义的)。