现在几乎所有的卷积神经网络都或多或少使用了BN。特别是要做很深的神经网络,必须要用这个BN层。一般来讲,梯度会是比较小的数值,反向传播到越底层,梯度越小,这就导致了一个问题:顶层梯度大些,收敛快,底层梯度小,迭代收敛慢。但是,卷积神经网络中一般底层抽取的是一些边缘,简单的纹理信息等,而上层抽取的特征一般是由底层这些融合而来。那么,当上层收敛快时,下层收敛慢,下层一有一点改变,上层就白训练了。因此我们希望在学习底部层的时候避免改变顶部层,从而有了批量归一化。
BN的提出,就是要解决在训练过程中,中间层数据分布发生改变的情况。
批量归一化(BN)的思想:把每一个mini-batch小批量数据的均值和方差固定住。具体为先对输入BN层的数据 求均值和方差,
这里求方差时需要加上一个小的大于0的常量,目的是避免方差为0。
接下来,对输入数据 进行调整得到输出,
这里的 和 都是可学习参数,当我们直接对输入数据减均值除以标准差,相当于输出变成一个均值为0方差为1的分布,可能有时变成这样的标准正态分布不是太好,那么我们就可以去学习一个新的均值 (对数据偏移),新的方差(对数据缩放),这样控制数据变化不太大,最终的目的都是希望底层的变化小,对顶层影响小,就可以尽量避免改变顶部层。
BN层的作用位置(批量归一化是一个线性变换):
对于全连接层,BN作用在特征维,假设一个二维矩阵,每一行是一个样本,每一列是一个特征,那么它会对每一列做前文提到的操作:1 对某一列数据求均值方差 2 对这列数据进行调整,减均值除以标准差,用学到的 和 作用一下。对于卷积层,BN作用于通道维,对于一个输入/输出卷积层的数据,设数据大小为(批量大小*图像高*图像宽*通道数),那我们对每一个通道的“批量大小*图像高*图像宽”个数据求均值方差再调整。
批量归一化的好处:本质上是对每个小批量数据加入噪音从而控制了模型复杂度,观察下式
这里 和 可以理解为噪音,因为这两个数是在每一个随机采样的小批量上计算得来,减均值相当于做了一个随机偏移,除以标准差相当于随机缩放。也正因此,BN层没必要和丢弃法一起用。(丢弃法dropout也是一个正则化方法,控制模型复杂度避免过拟合)
总结,
使用了BN层后允许学习率可以调比较大,加快收敛速度。