批量归一化和丢失的排序?

Ordering of batch normalization and dropout?

最初的问题是专门针对 TensorFlow 实现的。但是,答案是针对一般实施的。这个一般答案也是 TensorFlow 的正确答案。

在 TensorFlow 中使用 batch normalization 和 dropout 时(特别是使用 contrib.layers)我需要担心顺序吗?

如果我在使用 dropout 后立即进行批归一化,这似乎可能会出现问题。例如,如果批量归一化中的偏移训练到训练输出的较大比例数字,但随后将相同的偏移应用于较小的(由于对具有更多输出的补偿)比例数字而没有在测试期间丢失,那么班次可能会关闭。 TensorFlow 批量归一化层是否会自动对此进行补偿?还是由于我失踪的某种原因没有发生这种情况?

此外,将这两个一起使用时还有其他需要注意的陷阱吗?例如,假设我在上述方面以正确的顺序使用它们(假设 一个正确的顺序),在多个上同时使用批归一化和丢失会不会有问题连续层?我没有立即看出这有什么问题,但我可能遗漏了一些东西。

非常感谢!

更新:

一项实验测试似乎表明排序确实很重要。我 运行 同一个网络两次,只有 batch norm 和 dropout reverse。当 dropout 在 batch norm 之前时,验证损失似乎随着训练损失的下降而上升。在另一种情况下,它们都在下降。但在我的情况下,动作很慢,所以经过更多训练后情况可能会发生变化,这只是一次测试。仍将不胜感激更明确和明智的答案。

Ioffe and Szegedy 2015, the authors state that "we would like to ensure that for any parameter values, the network always produces activations with the desired distribution". So the Batch Normalization Layer is actually inserted right after a Conv Layer/Fully Connected Layer, but before feeding into ReLu (or any other kinds of) activation. See this video 时间 53 分钟左右了解更多详情。

就 dropout 而言,我认为 dropout 是在激活层之后应用的。在 dropout paper 图 3b 中,隐藏层 l 的 dropout factor/probability 矩阵 r(l) 应用于 y(l),其中 y(l) 是应用激活函数 f 后的结果。

所以综上所述,使用batch normalization和dropout的顺序是:

-> CONV/FC -> BatchNorm -> ReLu(或其他激活) -> Dropout -> CONV/FC ->

如评论中所述,here 是阅读层顺序的绝佳资源。我浏览了评论,这是我在互联网上找到的关于主题的最佳资源

我的 2 美分:

Dropout 旨在完全阻止来自某些神经元的信息,以确保神经元不会共同适应。 因此,批量归一化必须在 dropout 之后进行,否则您将通过归一化统计信息传递信息。

如果您考虑一下,在典型的 ML 问题中,这就是我们不计算整个数据的均值和标准差然后将其拆分为训练集、测试集和验证集的原因。我们拆分然后计算训练集的统计数据,并使用它们对验证和测试数据集进行归一化和居中

所以我建议方案 1(这考虑了 pseudomarvin's 对已接受答案的评论)

-> CONV/FC -> ReLu(或其他激活) -> Dropout -> BatchNorm -> CONV/FC

相对于方案2

-> CONV/FC -> BatchNorm -> ReLu(或其他激活) -> Dropout -> CONV/FC -> 在接受的答案中

请注意,这意味着与方案 1 下的网络相比,方案 2 下的网络应该显示过拟合,但是 OP 运行 一些测试提到的问题并且它们支持方案 2

通常,只需删除 Dropout(当您有 BN 时):

  • "BN eliminates the need for Dropout in some cases cause BN provides similar regularization benefits as Dropout intuitively"
  • “ResNet、DenseNet 等架构未使用 Dropout

有关更多详细信息,请参阅本文 [Understanding the Disharmony between Dropout and Batch Normalization by Variance Shift],@Haramoz 在评论中已经提到。

基于 research paper 为了获得更好的性能,我们应该在应用 Dropouts 之前使用 BN

正确的顺序是:Conv > Normalization > Activation > Dropout > Pooling

我找到了一篇论文,解释了 Dropout 和 Batch Norm(BN) 之间的不和谐。关键思想是他们所说的 “方差偏移”。这是因为 dropout 在训练和测试阶段有不同的行为,这改变了 BN 学习的输入统计数据。 主要思想可以在这张取自 paper 的图中找到。

可以在 notebook 中找到此效果的小演示。

Conv - Activation - DropOut - BatchNorm - Pool --> Test_loss: 0.04261355847120285

Conv - Activation - DropOut - Pool - BatchNorm --> Test_loss: 0.050065308809280396

Conv - Activation - BatchNorm - Pool - DropOut --> Test_loss: 0.04911309853196144

Conv - Activation - BatchNorm - DropOut - Pool --> Test_loss: 0.06809622049331665

Conv - BatchNorm - Activation - DropOut - Pool --> Test_loss: 0.038886815309524536

Conv - BatchNorm - Activation - Pool - DropOut --> Test_loss: 0.04126095026731491

Conv - BatchNorm - DropOut - Activation - Pool --> Test_loss: 0.05142546817660332

Conv - DropOut - Activation - BatchNorm - Pool --> Test_loss: 0.04827788099646568

Conv - DropOut - Activation - Pool - BatchNorm --> Test_loss: 0.04722036048769951

Conv - DropOut - BatchNorm - Activation - Pool --> Test_loss: 0.03238215297460556


使用 2 个卷积模块(见下文)在 MNIST 数据集(20 个时期)上进行训练,每次都使用

model.add(Flatten())
model.add(layers.Dense(512, activation="elu"))
model.add(layers.Dense(10, activation="softmax"))

卷积层的内核大小为(3,3),默认填充,激活为elu。 Pooling是poolside(2,2)的一个MaxPooling。损失是categorical_crossentropy,优化器是adam.

对应的Dropout概率分别为0.20.3。特征图的数量分别为3264

编辑: 当我按照一些答案中的建议放弃 Dropout 时,它收敛得更快,但泛化能力比我使用 BatchNorm and Dropout 时更差。

我阅读了答案和评论中的推荐论文

从 Ioffe 和 Szegedy (2015) 的观点来看,只在 网络结构。李等。 (2018)给出统计和 实验分析,当 从业者在 BN 之前使用 Dropout。因此,李等人。 (2018)推荐 在所有 BN 层之后应用 Dropout。

从 Ioffe 和 Szegedy (2015) 的观点来看,BN 位于 inside/before激活函数。然而,陈等人。 (2019) 使用结合了 dropout 和 BN 的 IC 层,Chen 等人。 (2019) 建议在 ReLU 之后使用 BN。

安全后台,我只在网络中使用Dropout或者BN

Chen, Guangyong, Pengfei Chen, Yujun Shi, Chang-Yu Hsieh, Benben Liao, 还有张胜宇。 2019. “重新思考批量归一化的使用 和深度神经网络训练中的辍学。 CoRR abs/1905.05928。 http://arxiv.org/abs/1905.05928.

Ioffe、Sergey 和 Christian Szegedy。 2015.“批量归一化: 通过减少内部协变量加速深度网络训练 转移。” CoRR abs/1502.03167。 http://arxiv.org/abs/1502.03167.

李、向、陈硕、胡小林、杨健。 2018. 《理解 Dropout 和 Batch Normalization by Variance 之间的不协调 转移。” CoRR abs/1801.05134。 http://arxiv.org/abs/1801.05134.

ConV/FC - BN - Sigmoid/tanh - 辍学。 激活函数是Relu还是其他,normalization和dropout的顺序取决于你的任务