繁体   English   中英

批量标准化和辍学的顺序?

[英]Ordering of batch normalization and dropout?

最初的问题是关于 TensorFlow 实现的。 但是,答案是针对一般实现的。 这个通用答案也是 TensorFlow 的正确答案。

在 TensorFlow 中使用批量标准化和 dropout(特别是使用 contrib.layers)时,我需要担心排序吗?

如果我使用 dropout,然后立即进行批量标准化,这似乎可能会出现问题。 例如,如果批量归一化训练到较大规模的训练输出,但同样的转移应用于较小的(由于有更多输出的补偿)规模数字而在测试期间没有丢失,那么班次可能已关闭。 TensorFlow 批量归一化层会自动对此进行补偿吗? 还是由于某种原因我失踪了?

另外,将这两者一起使用时是否还有其他需要注意的陷阱? 例如,假设我在上述方面以正确的顺序使用它们(假设顺序正确),在多个连续层上同时使用批量标准化和 dropout 会不会有问题? 我没有立即发现问题,但我可能会遗漏一些东西。

非常感谢!

更新:

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

Ioffe 和 Szegedy 2015中,作者指出“我们希望确保对于任何参数值,网络始终产生具有所需分布的激活”。 因此,批归一化层实际上是在 Conv 层/全连接层之后插入的,但在输入 ReLu(或任何其他类型的)激活之前。 有关更多详细信息,请在 53 分钟左右观看此视频

就 dropout 而言,我相信 dropout 是在激活层之后应用的。 dropout 论文图 3b 中,隐藏层 l 的 dropout 因子/概率矩阵 r(l) 应用于 y(l) 上,其中 y(l) 是应用激活函数 f 后的结果。

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

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

正如评论中所指出的,阅读层顺序的惊人资源是here 我浏览了评论,这是我在互联网上找到的最佳主题资源

我的 2 美分:

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

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

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

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

与方案 2 不同

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

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

通常,只需放弃Dropout (当你有BN时):

  • “BN 在某些情况下消除了对Dropout的需求,因为 BN 直观地提供了与 Dropout 相似的正则化优势”
  • “ResNet、DenseNet 等架构不使用Dropout

有关更多详细信息,请参阅@Haramoz 在评论中已经提到的这篇论文 [通过 Variance Shift 了解 Dropout 和 Batch Normalization 之间的不和谐]。

Conv - 激活 - DropOut - BatchNorm - 池 --> Test_loss: 0.04261355847120285

转换 - 激活 - 丢弃 - 池 - BatchNorm --> Test_loss: 0.050065308809280396

Conv - 激活 - BatchNorm - 池 - DropOut --> Test_loss: 0.04911309853196144

转换 - 激活 - BatchNorm - DropOut - 池 --> 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 - 激活 - 池 --> 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 - 激活 - 池 --> Test_loss: 0.03238215297460556


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

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

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

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

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

我发现一篇论文解释了 Dropout 和 Batch Norm(BN) 之间的不和谐。 关键思想是他们所谓的“方差转移” 这是因为 dropout 在训练和测试阶段具有不同的行为,这会改变 BN 学习的输入统计信息。 主要思想可以在这张取自这篇论文的图中找到。 在此处输入图像描述

可以在这个笔记本中找到这个效果的一个小演示。

我在https://stackoverflow.com/a/40295999/8625228的答案和评论中阅读了推荐的论文

从 Ioffe 和 Szegedy (2015) 的角度来看,网络结构中只使用了 BN。 李等人。 (2018) 给出了统计和实验分析,当从业者在 BN 之前使用 Dropout 时,存在方差偏移。 因此,李等人。 (2018) 建议在所有 BN 层之后应用 Dropout。

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

在安全背景上,我只在网络中使用 Dropout 或 BN。

Chen、Guangyong、Pengfei Chen、Yujun Shi、Chang-Ysieh、Benben Liao 和 Shengyu Zhang。 2019.“重新思考批量标准化和 Dropout 在深度神经网络训练中的使用”。 CoRR abs/1905.05928。 http://arxiv.org/abs/1905.05928

约夫、谢尔盖和克里斯蒂安·塞格迪。 2015. “批量标准化:通过减少内部协变量偏移来加速深度网络训练。” CoRR abs/1502.03167。 http://arxiv.org/abs/1502.03167

李、向、陈硕、胡晓林和杨健。 2018.“通过方差转移了解辍学和批量标准化之间的不和谐。” CoRR abs/1801.05134。 http://arxiv.org/abs/1801.05134

根据研究论文以获得更好的性能,我们应该在应用 Dropouts 之前使用 BN

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

ConV/FC - BN - Sigmoid/tanh - dropout。 如果激活函数是 Relu 或其他,规范化和 dropout 的顺序取决于您的任务

在阅读了多个答案并进行了一些测试后,这些是我的假设

a) 总是BN -> AC ,(没有 b/w 他们)。
b) BN -> Dropout over Dropout -> BN ,但都尝试一下。 [较新的研究,发现第一个更好]
c) BN消除了Dropout的需要,不需要使用Dropout
d)到底。
e) Dropout前的BN是数据泄露。
f) 最好的办法是尝试每一种组合。


所谓的最佳方法 -

-> BN -> AC -> Dropout ->->

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM