![](/img/trans.png)
[英]Question About Dropout Layer and Batch Normalization Layer in DNN model
[英]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
时):Dropout
的需求,因为 BN 直观地提供了与 Dropout 相似的正则化优势”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.2
或0.3
。 特征图的数量分别为32
或64
。
编辑:当我按照一些答案中的建议放弃 Dropout 时,它收敛得更快,但泛化能力比我使用 BatchNorm和Dropout 时更差。
我在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.