1.batch normalization的原理
在神经网络训练过程中,由于网络参数根据梯度下降在不断的变化,每经过一个网络层数据的分布都会发生不同的改变。我们将这种由于网络参数更新造成的数据分布变化称为Internal Covariate Shift。Internal Covariate Shift会导致输入数据分布向某一个方向偏移,从而造成网络数据训练缓慢。以sigmoid激活函数构建的网络为例,sigmoid函数的导数如图,由图可知,当输入分布集中在0左右时,导数值最大,梯度下降最快。假如分布偏移到6以上,则大部分数据落入饱和区,梯度下降会非常缓慢。
我们在模型训练时有很重要的一点就是在喂入数据之前需要将数据进行归一化处理。归一化就是将数据区间压缩到0-1,避免了数据量级差异导致的模型收敛问题。在图像处理领域,我们还会使用白化操作。白化就是将图像的像素分布调整为平均像素值为0,方差为单位方差的正太分布。白化的优点在于降低了图像信息的冗余,提高了特征的独立性,促进模型的快速收敛。收到白化方法的启发,我们是否能够在模型的每一层都进行类似白化的操作呢?答案是肯定的。通过对每一层输入数据分布的改变来得到较优的梯度是batch normalization的最终目的。batch normalization的算法流程如图:
我们通过对数据进行normalize处理,将数据分布集中在梯度较大的范围,加快了模型的收敛。但是这样改变了非线性处理后的数据分布,为了保持非线性,batch normalization 中加入了和两个需要训练的参数,对normalize之后的数据分布做一个微调,增强网络表达。
2.batch normalization在卷积神经网络中的使用
我们知道在普通的全连接网络中每一层之间的batch normalization就作用于该层的输出,那么在卷积网络中每一层的输出实际上是多维的feature map,这个时候应该如何使用batch normalization呢?假设在某一层卷积网络中,输入batch size为n,该层共有m个filter,输出的feature map大小为a*b。那么对于每一个训练实例来说,输出的feature map 维度为m*a*b,对于n个实例输出结果为n*m*a*b。这里我们把所有实例在一个filter上的输出结果作为我们batch normalization的作用范围,对于一个filter来说n个实例就会有size为n*a*b的feature map输出,这里的每一个激活值都会进行normalize。
3.batch normalization如何进行推理
前面介绍了一下batch normalization在训练过程中如何工作,但是应用模型进行推理时很多时候我们一次输入就只有一个样本,这是没有办法计算均值和方差的,那么这种情况下如何获得batch normalization的参数呢?实际上我们在推理过程中是使用了训练集的均值和方差来近似推理过程中的均值和方差。前面说到了训练过程中每输出一个batch,我们会计算出这个batch的均值和方差,在整个训练过程中我们会记录下每个batch的均值和方差,训练集的均值和方差即是所有batch均值和方差的期望。
同样我们使用训练的到的参数和对normalize之后的结果进行微调。
4.batch normalization优缺点总结:
优点:
1.对模型初始化和超参不敏感,减少模型超参数调整,允许使用更大的学习率。
2.可以加快模型收敛速度。
3.提高模型泛化能力,抑制模型过拟合。
缺点:
1.对于batch size的大小有要求,如果一个batch太小可能造成方差和均值计算不准,导致训练效果不佳。
2.在RNN上谨慎使用,目前效果存在争议。
转载:https://blog.csdn.net/u010325168/article/details/101480936