应该在神经网络中的 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 层之前还是之后进行特征嵌入?的主要内容,如果未能解决你的问题,请参考以下文章