Normalization

Normalization comparison

4 种 Normalization 学习的参数都是每个 channel 一对 $\gamma$、$\beta$。

Batch normalization (2015)

同一个 batch 内的所有样本的同一个 channel 一起做标准化。

$$ \begin{cases} \mu &= &\frac{1}{m} \sum_{i=1}^mz^{(i)} \\ \sigma^2 &= &\frac{1}{m} \sum_{i=1}^m(z^{(i)}-\mu) \\ \hat{z}^{(i)} &= &\frac{z^{(i)} - \mu}{\sqrt{\sigma^2 + \epsilon}} \\ \tilde{z}^{(i)} &= &\gamma\hat{z}^{(i)} + \beta \end{cases} $$

网络训练时每个 mini-batch 具有不同的分布,并且网络较深时更新一点就会导致中间 每一层的输出的分布的巨大改变,这种分布的偏移被称为 Internal Covariate Shift,并且随着网络的加深越来越大。

因此 Batch Normalization(BN)提出针对每个 batch 内的所有样本,在每个 channel 进入激活函数之前,计算该 channel 的均值、方差进行标准化,使得数据保持均值为 0、方差为 1 的标准正态分布。并额外为每个 channel 训练一对参数 $\gamma$、$\beta$ 以此补偿神经网络的表达能力(仍然服从正态分布)。

模型训练的过程中,应该保持的 $\mu$、$\sigma$ 的移动指数平均(Exponential Moving Average)。在模型训练完毕后的测试阶段,$\mu$、$\sigma$,将保持固定,成为模型的一部分,不再变动。并且,通常为了优化计算,会将 BN 操作融入到 BN 之前的全连接层或者卷积层中,见附录。

此外,如果使用 BN,那么 $y=Wx+b$ 中的 $b$ 将被忽略。

注意

  • (+) 由于减小了 Internal Covariate Shift,使用了 BN 的网络可以使用更大的 batch size。
  • (+) 由于 BN 引入了同一 batch 内其他样本的信息,相当于少量噪声,带有轻微正则的作用。
  • (+) 适用于固定深度的网络如 FC、CNN(全连接层或卷积操作之后,激活函数之前)。
  • (-) 不适用于小 batch size,小 batch 统计的均值与方差不准。
  • (-) 不适用于 low-level 视觉问题(如降噪、超分),此类问题需要像素集的精准信息。
  • (-) 不适用于动态网络(如 RNN),此类网络的 mini-batch 的长度不定。

参考

Layer Normalization (2016)

每个样本单独进行,该样本的所有 channel 一起做标准化。

如果只有一个训练样本,是否也能统计一些信息做 Normalization?Layer Normalization(LN)提出直接用单个样本的所有 channel 做标准化。如此一来就可以用于 RNN 等样本不定长的场景。

注意

  • (+) 适用于动态网络(如 RNN),因为不需要整个 batch 的长度对齐。

参考

Instance Normalization (2016)

每个样本单独进行,该样本的每个 channel 单独做标准化。

既然能够使用单个样本的所有 channel 标准化,能不能再缩小范围,用单个样本的单个 channel 进行标准化?因此Instance Normalization(IN)被提出对单个样本的单个 channel 进行标准化,其好处是切断了 channel 之间的联系,适用于一些需要维持 channel 之间一定的差别的场景(例如风格迁移中的「风格」的定义是 channel 之间的关系)。

注意

  • (+) 适用于 low-level 视觉任务(如风格迁移),可以消除原先的风格影响(均值、方差),留下内容。

参考

Group Normalization (2018)

每个样本单独进行,该样本的 channel 分成若干 group,每个 group 内的所有 channel 一起做标准化。

LN 与 IN 都是对单个样本进行操作,区别在于 LN 对同一层的所有 channel 一起做标准化,IN 则对每个 channel 单独做标准化,有没有折中的做法?Group Normalization(GN)被提出来对单个样本的多个 channel(称为一个 group)进行标准化,既拓展了 IN 挖掘了更多 channel 之间的依赖(使用了多个 channel 进行标准化),又摆脱了 LN 假设所有 channel 具有同个分布的限制。(尴尬又不失礼貌的微笑)

注意

  • (+) 适用于非动态网络(否则用 LN)、非 low-level 任务(否则用 IN)且 batch size 无法设置足够大(例如目标检测任务;否则用 BN)的场景。

参考

Weight Normalization (2016)

TODO

补充:BN + Conv

BN 的本质是对特征做一定的缩放与偏移,在测试阶段,由于 BN 的参数固定,因此我们可以 将 BN 的运算直接嵌入到 BN 之前的层(例如全连接层、卷积层),从而 减少了计算量,提升了网络预测速度

以卷积层为例,假设某卷积层的参数为 $w$、$b$,输入为 $x$,卷积层之后的 BN 层的样本均值 $\mu$、标准差 $\sigma$、学到的缩放参数 $\gamma$、偏移参数 $\beta$。那么按照正常的顺序,卷积层的输出为: $$ w \otimes x + b $$ 其中 $\otimes$ 表示卷积层操作。紧接其后的 BN 层的输出为: $$ \begin{aligned} &~ && \gamma \frac{w \otimes x + b - \mu}{\sqrt{\sigma^2 + \epsilon}} + \beta \end{aligned} $$ 事实上,我们可以将其进行如下展开: $$ \begin{aligned} &~ && \gamma \frac{w \otimes x + b - \mu}{\sqrt{\sigma^2 + \epsilon}} + \beta \\ &= && (\frac{\gamma}{\sqrt{\sigma^2 + \epsilon}}) \cdot w \otimes x + (\frac{\gamma \cdot (b - \mu)}{\sqrt{\sigma^2 + \epsilon}} + \beta) \\ &= && k \cdot w \otimes x + b' \end{aligned} $$ 因此,事实上我们可以将 BN 的参数融入到之前的卷积层中,对所有卷积核参数乘以系数 $k=\frac{\gamma}{\sqrt{\sigma^2 + \epsilon}}$,将缩放参数从 $b$ 改为 $b' = \frac{\gamma \cdot (b - \mu)}{\sqrt{\sigma^2 + \epsilon}} + \beta$。

通过这种操作,我们可以将完全省去 BN 层的参数与计算量。

参考