如果测试时在训练模式下使用 Batch Normalization 会怎样?

What if Batch Normalization is used in training mode when testing?

批量归一化在训练阶段和测试阶段有不同的行为。

例如在tensorflow中使用tf.contrib.layers.batch_norm时,我们应该在不同的阶段为is_training设置不同的值。

我的问题是:如果我在测试时仍然设置is_training=True怎么办?也就是说,如果我在测试阶段仍然使用训练模式怎么办?

之所以会提出这个问题,是因为Pix2Pix and DualGAN的发布代码在测试时都没有设置is_training=False。而且测试的时候好像设置了is_training=False,生成的图片质量会很差

有人可以解释一下吗?谢谢。

在训练期间,BatchNorm 层尝试做两件事:

  • 估计整个训练集的均值和方差(人口统计)
  • 对输入均值和方差进行归一化,使其表现得像高斯

在理想情况下,我们会在第二点中使用整个数据集的人口统计数据。然而,这些是未知的并且在训练期间会发生变化。这还有一些其他问题。

一个work-around 正在通过

对输入进行归一化
gamma * (x - mean) / sigma + b

基于小批量 统计meansigma

在训练期间,运行 小批量统计数据的平均值用于近似 总体 统计数据。

现在,原始的 BatchNorm 公式使用 整个 数据集的近似均值和方差在推理过程中进行归一化。由于网络是固定的,meanvariance 的近似值应该很好。虽然现在使用人口统计似乎很有意义,但这是一个关键的变化:从小批量统计到整个训练数据的统计。

当批次在训练期间不是独立同分布或批次大小非常小时,这一点至关重要。 (但我也观察到了大小为 32 的批次)。

提议的 BatchNorm 隐含地简单地假设两个统计数据非常相似。特别是,在 pix2pix 或 dualgan 中对大小为 1 的小批量进行训练会给出关于总体统计的非常糟糕的信息。在这种情况下,它们可能包含完全不同的值。

现在有了一个深度网络,后期层期望输入是标准化的批次(在小批量统计的意义上)。请注意,他们接受过此类特定数据的培训。但是在推理过程中使用整个数据集的统计信息违反了假设。

如何解决这个问题?在您提到的实现中,也可以在推理过程中使用小批量统计信息。或者使用 BatchReNormalization 引入 2 个附加项来消除小批量和人口统计之间的差异 或者简单地使用 InstanceNormalization(用于回归任务),事实上,它与 BatchNorm 相同,但单独处理批处理中的每个示例,也不使用人口统计信息。

我在研究期间也遇到过这个问题,现在将 InstanceNorm 层用于回归任务。