我们知道深度神经网络一旦开始训练起来,那么中间层的输入参数就要发生变更,网络中每一层的输入数据分布一直在发生变化的。即便在输入层,我们已经人为的为每个样本归一化,但是仍然阻止不了后面网络每一层的输入数据的分布变化,因为在训练的时候,前面层训练参数的更新将导致后面层输入数据分布的变化。以网络第二层为例:网络的第二层输入,是由第一层的学习参数和input输入参数计算得到的,而第一层的学习参数在整个训练过程中一直在变化,因此必然会引起后面每一层输入数据分布的改变。人们把网络中间层在训练过程中数据分布的改变称之为:Internal Covariate Shift,翻译为:内部协变量偏移。
为了解决Internal Covariate Shift问题,谷歌的技术大佬于2005年提出了:Batch Normalization。从字面意思看来Batch Normalization(简称BN)就是对每一批数据进行归一化。在BN出现之前,我们的归一化操作一般都在数据输入层,对输入的数据进行求均值以及求方差做归一化,但是BN的出现打破了这一个规定,我们可以在网络中任意一层进行归一化处理,因为我们现在所用的优化方法大多都是min-batch SGD,所以我们的归一化操作就成为Batch Normalization。