Batch_normalization是什么?
传统的神经网络,只是在将样本x进入到输入层之前对x进行0-1标准化处理(减均值,除标准差),以降低样本间的差异性,如下图所示:
BN是在此基础上,不仅仅只对输入层的输入数据x进行标准化,还对每个隐藏层的输入进行标准化,如下图所示:
加了一个batch_normalization层后,输入x首先乘以权重加上偏置得到s1,对s1进行归一化后,再进行伸缩和平移,控制伸缩和平移的参数是网络自己学习的,之后再采用激活函数。
为什么要用Batch_normalization?
训练过程中,各层输入的分布随着前面几层参数的变化而变化,使得训练深度神经网络变得复杂。这通过较低的学习速率,和仔细的参数初始化来减慢训练,使得训练具有饱和非线性的模型变得非常困难。们将这种现象称为 internal covariate shift。
在train网络之前,会对数据进行归一化处理,为的是保持训练和测试数据的分布相同,而在神经网络内部,每一层我们都需要有输出和输出,除了对原始数据的标准化处理,在经过网络每一层计算后的数据,它们的分布是不同的。网络的训练,需要去学习适应不同的数据分布,造成的后果就是收敛慢,效果不佳。
另一方面,网络前面的参数变更,会随着网络的深度,其影响不断累积增大,所以说只要有某一层的数据分布发生变化,后面层的数据输入分布也会不同,结合前面说的,为了解决中间层数据分布改变的情况。
换一个角度来说,一般来说,如果模型的输入特征不相关且满足标准正态分布时,模型的表现一般较好。在