深度学习中的归一化方法
综述
归一化层,目前主要有这几个方法,Batch Normalization(2015年)、Layer Normalization(2016年)、Instance Normalization(2017年)、Group Normalization(2018年)、Switchable Normalization(2018年)。
将输入的图像shape记为[N, C, H, W],这几个方法主要的区别就是在:
- batchNorm是在batch上,对NHW做归一化,对小batchsize效果不好;
- instanceNorm在图像像素上,对HW做归一化,用在风格化迁移;
- layerNorm在通道方向上,对CHW归一化,主要对RNN作用明显;
- GroupNorm将channel分组,然后再做归一化;
- SwitchableNorm是将BN、LN、IN结合,赋予权重,让网络自己去学习归一化层应该使用什么方法。
Batch Normalization
首先,在进行训练之前,一般要对数据做归一化,使其分布一致,但是在深度神经网络训练过程中,通常以送入网络的每一个batch训练,这样每个batch具有不同的分布。所以batch normalization就是强行将数据拉回到均值为0,方差为1的正态分布上,这样不仅数据分布一致,而且避免发生梯度消失。
算法过程:
- 沿着通道计算每个batch的均值 u u u;
- 沿着通道计算每个batch的方差 σ 2 σ^2 σ2;
- 对 x x x做归一化, x ’ = ( x − u ) σ 2 + ε 2 x’=\frac{(x-u)}{\sqrt[2]{σ^2+ε}} x’=2σ2+ε(x−u)
- 加入缩放和平移变量 γ γ γ和 β β β,归一化后的值, y = γ ∗ x ’ + β y=γ*x’+β y=γ∗x’+β
加入缩放平移变量的原因是:保证每一次数据经过归一化后还保留原有学习来的特征,同时又能完成归一化操作,加速训练。 这两个参数是用来学习的参数。
import numpy as np
def Batchnorm(x, gamma, beta, bn_param):
# x_shape:[B, C, H, W]
results = 0
eps = 1e-5
x_mean = np.mean(x, axis=(0, 2, 3), keepdims=True)
x_var = np.var(x, axis=(0, 2, 3), keepdims=True)
x_normalized = (x - x_mean) / np.sqrt(x_var + eps)
results = gamma * x_normalized + beta
return results
Instance Normalization
BN注重对每个batch进行归一化,保证数据分布一致,因为判别模型中结果取决于数据整体分布。但是图像风格化中,生成结果主要依赖于某个图像实例,所以对整个batch归一化不适合图像风格化中,因而对HW做归一化,即对像素进行归一化。可以加速模型收敛,并且保持每个图像实例之间的独立。
def Instancenorm(x, gamma, beta):
# x_shape:[B, C, H, W]
results = 0.
eps = 1e-5
x_mean = np.mean(x, axis=(2, 3), keepdims=True)
x_var = np.var(x, axis=(2, 3), keepdims=True0)
x_normalized = (x - x_mean) / np.sqrt(x_var + eps)
results = gamma * x_normalized + beta
return results