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



我正在使用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的例子。

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

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

为了回答你的问题,让我们回忆一下Dropout层是如何工作的:

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

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

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

最新更新