作用
(1)加速收敛:我们在做数据预处理时一般会对输入数据做归一化,但是归一化的数据前向传播过程中分布会发生改变变得不再是归一化的数据,bn的作 用就是把这个改变的分布重新拉回来变成归一化数据。
(2)减少少梯度消失:由于我们在训练神经网络时采用的是小批量梯度下降法,BN在当前层会对这批数据通过激活函数前的输出作归一化,归一化后的数据接近正太分布,大部分数据都分布0附近,而一般激活函数的输入在0附近有比较大的梯度(所以BN一般放在激活函数前)。
(3)降低过拟合:由于BN对这小批量的数据作了归一化,所以一个样本的输出不再仅仅取决于样本本身,也取决于跟这个样本属于同一个mini-batch的其它样本,可以降低异常样本的干扰。
原理
原理:(在反向传播的过程中乘了上一层的输出,当每层的输出都小于1时就会造成梯度消失,大于1时会造成梯度爆炸)BN对每一层的输出都做了标准化使得原本会减小的activation的scale变大。
在训练中,BN的使用使得一个mini-batch中的所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果。这句话什么意思呢?意思就是同样一个样本的输出不再仅仅取决于样本本身,也取决于跟这个样本属于同一个mini-batch的其它样本。同一个样本跟不同的样本组成一个mini-batch,它们的输出是不同的(仅限于训练阶段,在inference阶段是没有这种情况的)。我把这个理解成一种数据增强:同样一个样本在超平面上被拉扯,每次拉扯的方向的大小均有不同。不同于数据增强的是,这种拉扯是贯穿数据流过神经网络的整个过程的,意味着神经网络每一层的输入都被数据增强处理了。
在测试阶段的均值和方差采用训练阶段所有batch的均值和方差的均值。
BN中线性层的作用:使BN既能改变样本的分布,又能保持分布不变,增加了模型的容量。
参考博客