Batch Normalization(BN)解决的是Internal Covariate Shift (ICS)的问题。
Internal Covariate Shift在文中定义为
The change in the distribution of network activations due to the change in network parameters during training.
也就是在训练的过程中因为网络参数改变引起网络各层输出的分布改变。
Internal Covariate Shift分为两个部分,Internal和Covariate Shift。
-
Covariate Shift。Covariate Shift 指在有监督学习中,对训练数据集和测试数据集,边际分布不一致,即,但条件分布一致。通过domain adaptation的方法解决。参考 https://www.quora.com/What-is-Covariate-shift
-
Internal。注意在网络中前一层的输出是下一层的输入。对某一中间层而言,在训练的过程中,因为前面层的参数不断变化,输出分布变化,对该层的输入分布也不断变化。
对某一中间层而言,输入的分布不断改变,需要不断适应新的分布,学习效率也就不高。
BN希望固定网络的各层输入的分布,以加快训练速度。
白化(whitening)模型的输入可以使得训练收敛更快。神经网络时多层的结构,考虑白化神经网络中各层的输入。
对mini-batch做Normalization
对整个数据集做白化复杂度很高,BN做了两个必要的化简:
-
instead of whitening the features in layer inputs and outputs jointly, we will normalize each scalar feature independently, by making it have the mean of zero and the variance of 1.
-
since we use mini-batches in stochastic gradient training, each mini-batch produces estimates of the mean and variance of each activation.
对一个d维的输入x,对每一维分别标准化。比如对第k维
,这里对均值和方差都是从mini-batch求的。
注意到简单地对某个层的输入做标准化会改变这个层地表示。为了解决这个问题,BN对每个激活值引入两个参数,分别做scale和shift,思想是allows the BN transform to represent the identity transformation and preserves the network capacity
(感觉类似于resnet)。即
完整的Batch Normalizing Transform 如下图
反传时的梯度,使用链式法则chain rule求取
测试阶段的BN
测试时,BN的均值和方差用的是训练时记录的。因为测试时均值和方差时固定的,BN层变为一个线性变换。
对卷积层做BN
对conv层的BN和对fc层的BN不同,因为filter在图像上移动,filter weight是整个图像共用的。
为了保持卷积的性质,在conv层中,对同一个feature map不同位置的元素,一起做normalization。比如输入维度[N, C, W, H],那么对N*W*H个元素一起求均值和方差,也就是会有C个均值和方差。
参考 https://stackoverflow.com/questions/38553927/batch-normalization-in-convolutional-neural-network
BN使得可以用较大的学习率训练
通常,大学习率会增大参数,进而增大后续计算的梯度,引起模型爆炸。采用BN层,可以使梯度反传不受参数规模影响。
具体而言,假设有一个标量,对BN层有
即,经过BN处理后的输出,不受标量影响。所以有
-
,即,标量不影响反传的梯度。
-
,即,大的参数会引起小的梯度。
两个结论公式都可以通过导数是输出对输入的变化率简单得到。
Reference:
Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
深度学习中 Batch Normalization为什么效果好?
作者:冰糖柠萌