Normalization方法
https://zhuanlan.zhihu.com/p/33173246
https://zhuanlan.zhihu.com/p/72589565
为什么需要normalization?
-
独立同分布的数据以简化常规机器学习模型的训练、提升机器学习模型的预测能力。
数据预处理:白化
- 去除特征之间的相关性 --> 独立
- 使所用特征具有相同的均值和方差 --> 同分布
-
ICS Internal Covariate Shift
深度神经网络模型层层叠加每一层的参数更新会导致上层的输入数据分布发生变化,通过层层叠加,高层的输入分布变化会非常剧烈。
指源空间和目标空间的条件概率是一致的,但是其边缘概率不同
-
ICS导致的问题
每个神经元的输入数据不再是“独立同分布”
- 上层参数需要不断适应新的输入数据分布,降低学习速度。
- 下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止。
- 每层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎
normalization基本思想
希望白化操作是可微的,保证白化操作可以通过反向传播来更新梯度。
所以就是基本思想就是 平移和伸缩
通用公式:
h = f ( g ⋅ x − μ σ + b ) h=f\left(\mathbf{g} \cdot \frac{\mathbf{x}-\mu}{\sigma}+\mathbf{b}\right) h=f(g⋅σx−μ+b)
μ是平移参数(shift parameter),σ 是缩放参数(scale parameter),b是再平移参数(re-shift parameter), g 是再缩放参数(re-scale parameter)
平移、缩放是将输入数据限制到了一个全局统一的确定范围
再平移、再缩放是充分利用底层学习的能力,并且保证非线性的表达能力。这两个参数是可学习的。
normalization具体方法梳理
feature map shape 记为[N, C, H, W],其中N表示batch size,即N个样本;C表示通道数;H、W分别表示特征图的高度、宽度。
Batch Normalization
针对单个神经元进行,沿着通道计算每个batch的均值、方差。
第1个样本的第1个通道,加上第2个样本第1个通道 … 加上第 N 个样本第1个通道,求平均,得到通道 1 的均值(注意是除以 N×H×W 而不是单纯除以 N,最后得到的是一个代表这个 batch 第1个通道平均值的数字,而不是一个 H×W 的矩阵)
公式中的M是mini-batch的大小。
μ i = 1 M ∑ x i , σ i = 1 M ∑ ( x i − μ i ) 2 + ϵ \mu_{i}=\frac{1}{M} \sum x_{i}, \quad \sigma_{i}=\sqrt{\frac{1}{M} \sum\left(x_{i}-\mu_{i}\right)^{2}+\epsilon} μi=M1∑xi,σi=M1∑(xi−μi)2+ϵ
适用场景:每个 mini-batch 比较大,数据分布比较接近。在进行训练之前,要做好充分的 shuffle. 否则效果会差很多
存在问题:
- batch size太小的时候,计算的均值、方差不足以代表整个数据分布
- batch size太大的时候,计算容易超出内存容量
- 不适合动态的网络结构 RNN
Layer Normalization
综合考虑一层所有维度的输入,计算该层的平均输入值和输入方差,然后用同一个规范化操作来转换各个维度的输入。
LN 对每个样本的 C、H、W 维度上的数据求均值和标准差,保留 N 维度。
μ = ∑ i x i , σ = ∑ i ( x i − μ ) 2 + ϵ \mu=\sum_{i} x_{i}, \quad \sigma=\sqrt{\sum_{i}\left(x_{i}-\mu\right)^{2}+\epsilon}