订购批量标准化和退出?

gol*_*enk 87 python neural-network conv-neural-network tensorflow

最初的问题是关于TensorFlow实现的具体问题.但是,答案仅适用于实施.这个一般答案也是TensorFlow的正确答案.

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

似乎有可能如果我使用dropout然后立即批量标准化可能会有麻烦.例如,如果批量标准化的偏移训练到训练输出的较大比例数,但是然后将相同的偏移应用于较小的(由于具有更多输出的补偿)标度数而在测试期间没有丢失,那么转移可能会关闭.TensorFlow批量标准化层是否会自动对此进行补偿?或者这不是因为某些原因我不在乎?

此外,在将这两者结合使用时还有其他需要注意的问题吗?例如,假设我使用他们以正确的顺序在问候上述(假设有一个正确的顺序),可以存在与使用分批正常化和漏失在多个连续层烦恼?我没有立即看到问题,但我可能会遗漏一些东西.

非常感谢!

更新:

实验测试似乎表明排序确实很重要.我运行了相同的网络两次,只有批量规范和退出反向.当辍学率在批量规范之前时,随着训练损失的减少,验证损失似乎在增加.在另一种情况下,他们都会倒下.但就我而言,动作很慢,所以在经过多次训练后情况可能会发生变化,这只是一次测试.一个更明确和知情的答案仍然会受到赞赏.

Zho*_*ang 106

Ioffe和Szegedy 2015中,作者表示"我们希望确保对于任何参数值,网络始终会产生具有所需分布的激活".因此,批量标准化层实际上是在Conv层/完全连接层之后插入,但在进入ReLu(或任何其他类型)激活之前.有关详细信息,请在53分钟左右观看此视频.

就丢失问题而言,我认为在激活层之后会应用dropout.在丢失纸图3b中,隐藏层1的丢失因子/概率矩阵r(l)在y(1)上被应用于其,其中y(1)是在应用激活函数f之后的结果.

总而言之,使用批量规范化和丢失的顺序是:

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

  • 似乎甚至Christian Szegedy现在也喜欢在ReLU之后执行BatchNorm(而不是之前).Keras的作者F. Chollet引用:"我没有回去查看他们在原始论文中提出的建议,但我可以保证最近由Christian编写的代码在BN之前应用了.它仍然偶尔成为话题但是,辩论." [源(https://github.com/fchollet/keras/issues/1802#issuecomment-187966878) (43认同)
  • [本文](https://arxiv.org/pdf/1801.05134.pdf)表明,除非进行一些调节以避免出现差异变化的风险,否则通常与BN退出会导致更差的结果. (8认同)
  • 此外,激活后使用BN看起来准确性可能更高:https://github.com/cvjena/cnn-models/issues/3 (5认同)
  • 合并该怎么办,会在batchnorm和激活之间进行吗? (2认同)

Mil*_*der 28

正如在评论中指出,一个惊人的资源来读起层的顺序是在这里.我已经完成了评论,这是我在互联网上找到的最佳主题资源

我的2美分:

辍学意味着完全阻止来自某些神经元的信息,以确保神经元不会共同适应.因此,批量规范化必须在丢失之后,否则您将通过规范化统计信息传递信息.

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

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

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

而不是计划2

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

请注意,这意味着与方案1下的网络相比,方案2下的网络应显示过度拟合,但OP运行了一些测试,如上所述,他们支持方案2

  • 但这不会破坏您的 BN 统计数据,因为您将在应用 dropout 后计算它们,而在测试时不会出现这种情况? (5认同)
  • @ZakJ是正确的。请参阅 mohammed adel 的回答和本文:https://arxiv.org/pdf/1801.05134.pdf。实际上,批量归一化层学会抵消在测试时关闭 Dropout 时不再存在的数据中的协变量偏移。 (3认同)
  • @skeller88 我还没有读过这篇论文。我认为如果你在 dropout 之前就有 BN,那么这基本上就搞砸了 BN 层的意图,因为 BN 的功能是向下一层提供标准化数据。 (3认同)
  • 我在验证准确性方面遇到了问题,但已通过方案 1 进行标准化 (2认同)

Jia*_*ang 16

我阅读了答案和评论中的推荐论文\n /sf/answers/2820719961/

\n

从Ioffe and Szegedy (2015)\xe2\x80\x99s的角度来看,网络结构中仅使用BN。李等人。(2018) 给出了统计和实验分析,表明当实践者在 BN 之前使用 Dropout 时,会出现方差变化。因此,李等人。(2018) 建议\n在所有 BN 层之后应用 Dropout。

\n

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

\n

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

\n\n\n

陈光勇、陈鹏飞、史玉君、谢长宇、廖本本和张胜宇。2019。\xe2\x80\x9c重新思考在深度神经网络训练中批量归一化\n和 Dropout 的使用。\xe2\x80\x9d CoRR \nabs/1905.05928。http://arxiv.org/abs/1905.05928

\n\n\n

约夫、谢尔盖和克里斯蒂安·塞格迪。2015.\xe2\x80\x9c批量归一化:\n通过减少内部协变量\nShift加速深度网络训练。\xe2\x80\x9d CoRR abs/1502.03167。http://arxiv.org/abs/1502.03167

\n\n\n

李翔、陈硕、胡晓林、杨健。2018.\xe2\x80\x9c理解\n方差\nShift 导致的 Dropout 和批量归一化之间的不和谐。\xe2\x80\x9d CoRR abs/1801.05134。http://arxiv.org/abs/1801.05134

\n\n\n


Luk*_*sen 14

Conv - 激活 - 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"))
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 由于神经网络的随机性,仅仅进行一次训练是不够的。当您进行大约 100 次训练并取平均值时,结果会更加准确。 (5认同)
  • 这是权重初始化的衡量标准。 (2认同)
  • 请预先设置随机种子并运行至少10次以上,否则一次训练的结果不可靠。 (2认同)

xtl*_*luo 11

通常,只需删除Dropout(如果有BN):

  • “ BN消除了Dropout在某些情况下的需要,因为BN直观上提供了与Dropout相似的正则化好处”
  • “诸如ResNet,DenseNet等的架构未使用 Dropout

有关更多详细信息,请参见本文[ 通过方差Shift理解辍学和批处理规范化之间的不和谐 ],如@Haramoz在评论中已经提到的。

  • @DINATAKLIT 在您之前的评论中,“关于 MLP 的组合它们是否有用”,您的意思是“使用 MLP 时组合 Dropout 和 BN 是否有用”?我对此的感觉是,这主要取决于您的模型大小和您拥有的训练数据量。 (2认同)

小智 10

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

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

  • 这如何回答这个问题? (4认同)
  • 论文提供了 2 种潜在的策略: - 在所有 BN 层之后应用 Dropout(仅) - 将 Dropout 更改为方差更稳定的形式 (3认同)