【问题标题】:Batch normalization when batch size=1批量大小 = 1 时的批量标准化
【发布时间】:2020-04-26 03:30:04
【问题描述】:

当我使用批量标准化但设置batch_size = 1 时会发生什么?

因为我使用 3D 医学图像作为训练数据集,所以由于 GPU 的限制,batch size 只能设置为 1。通常情况下,我知道batch_size = 1时,方差为0。而(x-mean)/variance会因为被0除而导致错误。

但是为什么我设置batch_size = 1时没有出现错误呢?为什么我的网络训练得和我预期的一样好?谁能解释一下?

Some people 认为:

ZeroDivisionError 可能不会遇到,因为有两种情况。首先,异常在try catch 块中被捕获。其次,将一个小的有理数 (1e-19) 添加到方差项中,使其永远不会为零。

some people 不同意。他们说:

您应该计算批次图像中所有像素的均值和标准差。 (所以即使是batch_size = 1,batch中的像素还是很多的。所以batch_size=1还能工作的原因不是1e-19

我检查了 Pytorch 源代码,从代码中我认为后一个是对的。

有没有人有不同意见???

【问题讨论】:

  • ZeroDivisionError 可能不会遇到,因为有两种情况。首先,异常在try catch 块中被捕获。其次,将一个小的有理数 (1e-19) 添加到方差项中,使其永远不会为零。检查源代码。
  • @ShubhamPanchal 在计算variance 本身时没有添加任何内容,但在归一化中添加了1e-3 方差,主要用于正则化
  • 更新了答案;我错过了你问题的一个角度。

标签: python tensorflow keras deep-learning batch-normalization


【解决方案1】:

方差将为 0

不,不会; BatchNormalization 仅计算关于单轴的统计信息(通常是通道轴,默认情况下=-1(最后一个));每隔一个轴折叠,即求和以求平均;详情如下。

然而,更重要的是,除非你能明确地证明这一点,否则我建议不要将BatchNormalizationbatch_size=1 一起使用;有强烈的理论理由反对它,并且多个出版物显示 BN 性能在 batch_size 低于 32 时会下降,而对于

小批量替代品Batch Renormalization -- Layer Normalization -- Weight Normalization


实现细节:来自source code

reduction_axes = list(range(len(input_shape)))
del reduction_axes[self.axis]

最终,tf.nn.monentsaxes=reduction_axes 调用,它执行 reduce_sum 来计算 variance。然后,在 TensorFlow 后端,meanvariancepassedtf.nn.batch_normalization 以返回训练或推理标准化输入。

换句话说,如果您的输入是 (batch_size, height, width, depth, channels)(1, height, width, depth, channels),那么 BN 将在 1heightwidthdepth 维度上运行计算。

方差可以为零吗? - 是的,如果任何给定 channel 切片(沿每个维度)的每个数据点都相同。但这对于真实数据来说几乎是不可能的。


其他答案:第一个具有误导性:

将一个小的有理数 (1e-19) 添加到方差中

这在计算方差时不会发生,而是在归一化时添加到方差中;尽管如此,它很少需要,因为variance 远非零。此外,ε 项实际上被 Keras 默认为 1e-3;它在规范化方面发挥作用,而不仅仅是避免零分裂。


更新:我未能解决一个重要的直觉,怀疑方差为 0;实际上,批量统计方差为零,因为只有一个统计 - 但“统计”本身涉及通道 + 空间维度的均值和方差。换句话说,均值和方差的方差(单个训练样本的)为零,但均值和方差本身不是。

【讨论】:

  • '有强烈的理论理由反对它,并且多个出版物表明 BN 性能在 batch_size 低于 32 时会下降,对于
  • "换句话说,均值和方差的方差为零,但均值和方差本身不是。"这并不是所有实际 BN 实现的工作原理。统计信息只计算一次(在除通道之外的所有暗淡上折叠,正如你所说的那样),而不是两次,正如这个措辞似乎暗示的那样(除了批量之外的所有暗淡,然后是批量)。答案更新有点误导和没有根据,没有必要在论点的错误方面妥协。
  • @amiasato 我不关注。 batch_size=1 的统计数据的 sample 方差为零,因为任何单个数字的方差(这是折叠所有其他维度后的结果)为零。这可能是造成混乱的根源。
  • 我的观点是batch_size 在任何已知的 BN 实现中不等同于 n_samples,因为除了通道之外还有其他非奇异维度。 n_samples 等于折叠轴大小的乘积。澄清这一点应该足以消除混乱。
  • @amiasato Fair,但我更喜欢解决看似合理的“接近但不正确”的直觉。更新了措辞。
【解决方案2】:

当batch_size = 1时,方差为0

不,因为当您计算 BN 的均值和方差时(例如使用 tf.nn.monents),您将在轴上计算它 [0, 1, 2](假设您有 NHWC 张量通道顺序)。

来自“组标准化”论文: https://arxiv.org/pdf/1803.08494.pdf

batch_size=1 时,批量归一化等于实例归一化,在某些任务中会有所帮助。

但是,如果您使用某种编码器-解码器,并且在某些层中有空间大小为 1x1 的张量,这将是一个问题,因为每个通道只有一个值,并且值的平均值将等于该值,所以 BN 会将信息归零。

【讨论】:

  • 这基本上是正确的,比最受好评的答案更简洁。我唯一要补充的是,虽然在训练时使用batch_size=1 的batchnorm 等于实例规范,但在原始论文中(以及在大多数默认配置中)IN 在测试时不使用运行统计数据,而BN 使用。
猜你喜欢
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 2019-11-13
  • 2018-04-09
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多