Batchnormalize、Dropout 和层数

Batchnormalize, Dropout and number of layers

我正在学习 batchnormalisation 和 dropout。看到这个 https://www.kaggle.com/ryanholbrook/dropout-and-batch-normalization.

模特

model = keras.Sequential([
    layers.Dense(1024, activation='relu', input_shape=[11]),
    layers.Dropout(0.3),
    layers.BatchNormalization(),
    layers.Dense(1024, activation='relu'),
    layers.Dropout(0.3),
    layers.BatchNormalization(),
    layers.Dense(1024, activation='relu'),
    layers.Dropout(0.3),
    layers.BatchNormalization(),
    layers.Dense(1),
])

我的问题是我们是将 dropout 放在 batchnormalization (BN) 之前还是之后?结果相同?

我的理解是,dropout 会“停用”下一层的神经元(请原谅我的术语)。所以如果我放在 BN 之前,BN 是否会被错误地归一化,因为它不是前一层的完整输出。

所以我们应该把 dropout 放在 BN 之后?重要吗?

如果你仔细查看关于 dropout 层的 tensorflow doc,你会看到它说:

The Dropout layer randomly sets input units to 0 with a frequency of rate at each step during training time, which helps prevent overfitting. Inputs not set to 0 are scaled up by 1/(1 - rate) such that the sum over all inputs is unchanged.

这意味着 dropout 不会停用下一层中的任何神经元,而是“停用”神经元的输入(= 神经元接收 0 作为输入)。请注意,实际的 Dropout 通常是这种情况,其他框架如 PyTorch 使用相同的方法。

所以 Dropout 之后的 BN 不会“错误地归一化”,而是按照它的程序进行,即执行归一化,但现在一些输入有一个 0 而不是它们的非 dropout 值。

将 Dropout 放在 BN 之前还是之后取决于您的数据,并且会产生不同的结果。大多数时候,这两种技术都用于规范化,根据我的个人经验,其中一种就足够了/它们结合起来效果不佳。
如果您将 dropout 视为噪声,那么将 Dropout 放在 BN 之前意味着您对“噪声”输入进行归一化,而将其放在之后意味着您将噪声添加到归一化数据中。