本文介绍各种不同的Normalization方法
- BN: Batch Normalization
- LN: Layer Normalization
- IN: Instance Normalization
- GN: Group Normalization
- LRN: Local Response Normalization
- WN: Weight Normalization
Normalization总体介绍
- BN,LN,IN的归一化的步骤都是使用下面的公式:
$$
\begin{align}
u &= \frac{1}{m}\sum_{k\in S}x_k \\
\sigma &= \sqrt{\frac{1}{m}\sum_{k\in S}(x_k-u) + \epsilon} \\
\hat{x} &= \frac{1}{\sigma}(x-u) \\
y &= \gamma \hat{x} + \beta
\end{align}
$$- \(u\) 为均值
- \(\sigma\) 为标准差
- \(\gamma\) 和 \(beta\) 是可以训练的参数
- \(\epsilon\) 是平滑因子, 防止分母为0
- BN,LN,IN三种不同的归一化方法, 对应的数据集 \(S\)不同
- BN对同一批数据进行归一化, 不管其他神经元, 只针对某个神经元的Mini Batch个样本输出值做归一化
- LN对同一个样本的同一层输出进行归一化, 不依赖其他样本, 每次只依赖当前样本本身
BN
Batch Normalization
- 对一批数据实行归一化
- 对某个具体的神经元的Mini Batch个样本输出做归一化, 与其他神经元的输出无关
- 代码:
1
2
3
4mu = np.mean(x,axis=0)
sigma2 = np.var(x,axis=0)
x_hat = (x-mu)/np.sqrt(sigma2+eps)
out = gamma*x_hat + beta
LN
Layer Normalization
- 对单个训练样本的同一层所有神经元的输入做归一化
- 与其他样本无关
BN的作用和说明
- Batch Normalization把网络每一层的输出Y固定在一个变化范围的作用
- BN都能显著提高训练速度
- BN可以解决梯度消失问题
- 归一化操作将每一层的输出从饱和区拉到了非饱和区(导数),从而解决了梯度消失问题
- 普通的优化器加上BN后效果堪比Adam
$$ ReLU + Adam \approx ReLU + SGD + BN$$ - 如果对于具有分布极不平衡的二分类测试任务, 不要使用BN
- BN一定程度上有归一化作用
- BN本身就能提高网络模型的泛化能力
- 使用BN后,不用太依赖Dropout, L2正则化等,可以将L2正则化的参数变小一点
WN
Weight Normalization
- 对参数做归一化
- 与数据无关
总结
BN和WN对比
- BN是对对一个mini batch的数据在同一个神经元计算均值和方差
- WN对网络的网络权值 W 进行归一化(L2归一化)
BN和LN对比
- BN高度依赖于mini-batch的大小,实际使用中会对mini-Batch大小进行约束,不适合类似在线学习(mini-batch为1)情况;
- BN不适用于RNN网络中normalize操作:
- BN实际使用时需要计算并且保存某一层神经网络mini-batch的均值和方差等统计信息,对于对一个固定深度的前向神经网络(DNN,CNN)使用BN,很方便;
- 但对于RNN来说,sequence的长度是不一致的,换句话说RNN的深度不是固定的,不同的time-step需要保存不同的statics特征,可能存在一个特殊sequence比其的sequence长很多,这样training时,计算很麻烦
- 但LN可以有效解决上面这两个问题
- LN适用于LSTM的加速,但用于CNN加速时并没有取得比BN更好的效果