Background
Covariance shift
——when the input distribution to a learning system changes, it is said to experience covariance shift.
当这种现象发生在多层神经网络之间时,即前面层参数的改变,使得后面层的输入分布发生改变时,就叫Internal covariance shift。
前面层的参数变化会影响当前层的输入分布,缺点有二:
1.大大减慢当前层的参数学习速度(当前层也是一个learning system,一旦其输入的分布改变,就要调整参数来适应这种分布);
2.若使用sigmoid激活函数,当前层的输入可能会处于sigmoid函数的非线性饱和区域,进而导致梯度消失现象。在BN出现以前,通常采用ReLU(x)=max(0,x)激活函数或使用较小的learning rate来解决这个问题。
因此我们想到,如果前面层的输出activation(即当前层的输入input)的分布是一定的呢?那样就会减少下一层输入陷入sigmoid饱和非线性区域的可能,梯度不再容易消失,从而加快训练速度。
Whitening
对某一层的输出activations进行白化操作(零均值、单位方差、去相关),可以使得这些activations的分布保持恒定,从而减小internal covariance shift对下一层的影响。
其缺点在于:
1.expensive computation
2.not everywhere differentiable
为了解决这个问题,作者在Batch_normalization中提出了两个简化做法。
Normalization via Mini-batch statistics
BN包括两个重要的操作:
1.normalization:零均值化、单位方差
2.scale and shift:引入两个参数,从而使得BN操作可以代表一个恒等变换(相当于BN transform的输入和输出是一样的,也就是不改变输入分布)
表示如下:
对某一layer,其输入x的维度(即前一层的activations个数)为d,则需要对每一维(即每一个activation)分别进行normalization:
然而,仅仅对每个输入进行normalization会改变输入的分布,例如,若使用的是sigmoid激活函数,则对输入的normalization会将其限制在sigmoid函数的线性区域,为了解决这个问题,我们在normalization操作后面加上一个如下所示的线性变换(linear transform),使得整个Batch normalization具有表达恒等变换的能力。
对每一个前一层的输出activation,都要学习自己的gama、beta。
当每个activation的gama和beta都按如下当时取值时,输入的activations经过BN操作后分布不变,此时,BN就相当于一个恒等变换了。
整个BN算法框架如下:
反向传播
推导过程如下:
Testing
Batch-Normalized Convolutional Networks
正如卷积神经网络里,同一个feature map里面的多个units是由同一个kernel在input image的不同区域滑动得到的,当在卷积神经网络里加入BN操作时,同一个feature map的activations也用同样的normalization方式,也就是说,对一个具有n个feature maps的activation layer,只需要学习n个gama-beta参数对。
加入BN后
加入BN操作的神经网络,可以设置更大的learning rate、去掉dropout层、减少L2正则化。
实验
某一层的输出activations的分布随着训练时间的增长而变化的曲线:
可以看出,加入BN后,分布更加稳定,减弱了internal covariance shift。