BN IN LN GN
归一化层
- Batch Normalization (2015)
- Layer Normalization (2016)
- Instance Normalization (2017)
- Group Normalization (2018)
- BN是在batch上,对N、H、W做归一化,而保留C的维度,即在每个通道上计算一个batch的均值与方差;
- LN是在通道方向上,对C、H、W做归一化,即对每一层计算均值与方差与batch无关;
- IN是在单个特征图上,对H、W做归一化,即对每个输入实例的每个特征图计算均值与方差;
- GN是将通道分组,再做归一化。
对于BN、IN与GN,可学习参数和的维度都是通道数。
- BN对小batchsize效果不好;
- LN对RNN作用明显,(与batch无关,在深度上做归一化);
- IN主要用于风格化迁移;
- GN是针对BN在batci size较小时错误率较高而提出的改进算法
Batch Normalization
为什么要进行BN?
- 在深度神经网络训练的过程中,通常以输入网络的每一个mini-batch进行训练,这样每个batch具有不同的分布,使模型训练起来特别困难。
- Internal Covariate Shift (ICS) 问题:在训练的过程中,激活函数会改变各层数据的分布,随着网络的加深,这种改变(差异)会越来越大,使模型训练起来特别困难,收敛速度很慢,会出现梯度消失的问题。
BN过程
-
BN算法的过程:
- 沿着通道计算每个batch的均值 ;
- 沿着通道计算每个batch的方差 ;
- 做归一化;
- 加入缩放和平移变量 和 ;
-
公式如下:
-
Python代码:
1
2
3
4m = K.mean(X, axis=-1, keepdims=True)#计算均值
std = K.std(X, axis=-1, keepdims=True)#计算标准差
X_normed = (X - m) / (std + self.epsilon)#归一化
out = self.gamma * X_normed + self.beta#重构变换
为什么加入 和 ?
如果直接采用归一化公式,会改变数据分布,影响本层网络学习到的特征,加入缩放和平移不变量保证每一次数据经过归一化后还保留原有学习来的特征,同时又能完成归一化操作,加快训练。
均值与方差的获取途径
BN层是以每个channel来计算的,求出当前channel上所有图像的均值和方差,然后再batch上求平均,得到改组batch数据的局部数据均值和方差,引入的两个可学习参数的维度与通道数量一致。
在训练阶段,对于均值而言采用每个batch 的平均值;对于标准差采用每个batch 的无偏估计,则训练阶段BN公式为
在测试时,使用的均值和方差是训练集上数据通过指数滑动平均估算整个训练数据集样本的均值跟方差,而不是当前batch的局部值。
为什么训练时不用全训练集的均值跟方差?
容易过拟合,每一批数据的均值和方差有一定差别,而不是用固定的值,这可以增加模型的鲁棒性,减少过拟合。
同时在训练时将数据集完全打乱,并用一个较大的batch值,可以提高鲁棒性。
为什么测试时不采用当前batch的均值跟方差?
会导致样本输出随着所处batch的不同而有所差异,增加了测试不确定性。
BN的作用
- 允许较大的学习率;
- 梯度消失可以被解决;
- 初始化对参数的影响小了,因为如果初始化偏差较大,经过BN也会拉回一个正常范围;
- 有解决过拟合的效果,假设有噪声也会被归一化。
Layer Normalization
针对BN不适用于深度不固定的网络,LN对深度网络的某一层的所有神经元的输入进行归一化;
LN中同层神经元的输入拥有相同的均值和方差,不同的输入样本有不同的均值和方差。
LN不需要批处理,单条数据内部就能归一化,不依赖于batch size和输入sequence的长度,所以在RNN上的效果好。
Instance Normalization
在图像风格化中,生成结果依赖于某个图像实例,特征图的各个通道的均值和方差会影响道最终生成图像的风格,因此对H、W做归一化,可以加速模型收敛,并且保持每个图像实例之间的独立。
Group Normalization
GN是为了解决BN对较小的mini-batch size效果差的问题。GN适用于占用显存比较大的任务,例如图像分割。对这类任务,可能 batch size 只能是个位数,再大显存就不够用了。而当 batch size 是个位数时,BN 的表现很差,因为没办法通过几个样本的数据量,来近似总体的均值和标准差。GN 也是独立于 batch 的,它是 LN 和 IN 的折中。
具体方法:GN 计算均值和标准差时,把每一个样本 feature map 的 channel 分成 G 组,每组将有 C/G 个 channel,然后将这些 channel 中的元素求均值和标准差。各组 channel 用其对应的归一化参数独立地归一化。