前面两期,我们了解了原理、训练及评估,然而为什么有效及若干细节仍值得讨论。
系列目录
理解Batch Normalization系列1——原理
理解Batch Normalization系列2——训练及评估
理解Batch Normalization系列3——为什么有效及若干讨论
理解Batch Normalization系列4——实践
文章目录
BN改善了ICS吗?
什么是ICS?
BN与ICS无关
BN改善了损失的平滑性
什么是平滑性?
其他11个值得讨论的问题
参考文献
BN改善了ICS吗?
原作者认为BN是旨在解决了 ICS(Internal Covariate Shift)问题。原文是这样解释:
We define Internal Covariate Shift as the change in the distribution of network activations due to the change in network parameters during training. To improve the training, we seek to reduce the internal covariate shift. By fixing the distribution of the layer inputs x as the training progresses, we expect to improve the training speed.
什么是ICS?
所谓Covariate Shift,是指相比于训练集数据的特征,测试集数据的特征分布发生了变化。
而原作者定义的Internal Covariate Shift,设想把每层神经网络看做一个单独的模型,它有着自己对应的输入与输出。如果这个“模型”越靠输出层,由于训练过程中前面多层的权重的更新频繁,导致它每个神经元的输入(即上一层的激活值)的数值分布,总在不停地变化,这导致训练困难。
然而,一个启发性的解释很容易被推翻,又有人做了更进一步的解释。
BN与ICS无关
2018年的文章《How Does Batch Normalization Help Optimization?》做了实验,如图1所示。
图 1. BN与ICS (来源: 原始论文)
左图表明,三个网络训练曲线,最终都达成了较高的精度;右图是三个网络中抽出3个层的激活值,绘制9个HISTOGRAMS图,每层激活值的分布都在训练过程中不断变化(HISTOGRAMS图),尤其是网络中更深的层,这导致了ICS问题(根据上文的ICS定义)。
应用了BN,观察到的右图(Standard+BatchNorm)的激活值分布变化很明显,理论上将引起明显的ICS问题。
-
在BN层后叠加噪音(输入到后面的非线性激活,相当于BN白干了),观察到的右图(Standard+"Noisy" BatchNorm)的激活值分布变化更为突出,理论上将引起更为明显的ICS问题。
(然而,我的理解是:如果每个BN层后叠加噪音,下一层的BN也会进行标准化,层层抵消,相当于仅最后一个BN层后叠加的噪音增大了ICS)
然而两种情况下,左图BN的表现依然非常稳定。即BN并没有减少ICS。
那么,BN是为什么有效?
BN改善了损失的平滑性
2018年的论文《How Does Batch Normalization Help Optimization?》,作者定义了一个描述损失函数平滑度的函数,观察加入BN的前后,损失函数平滑性的变化。如图2所示。纵轴的数值越小,表明损失函数曲面越平滑;纵轴数值越大,表明损失函数曲面越颠簸。蓝色线为加入BN后的损失函数的平滑度,可以看到,加入BN后,损失函数曲面的平滑程度得到了显著改善。
图 2. BN的加入,增加了损失函数的光滑度(来源: 原始论文)
因此得到的结论是:BN的加入使得损失函数曲面变得平滑,而平滑的损失函数进行梯度下降法变得非常容易(可参见图3)。
什么是平滑性?
对平滑性的理解,我想没有比图3更合适的了。
图 3. 损失函数的光滑度对比(来源:Visualizing the Loss Landscape of Neural Nets)
图3中所展示的是,ResNet中引入的shortcut connection,实际上是对损失函数的平滑作用。显然,对于左侧的损失函数,梯度下降将是异常困难;而对于右侧,即经过平滑的损失函数,将大大提升训练效率。
由于权重参数动辄千万,必然将权重数映射成2个,因此绘制损失函数曲面相当需要技巧与计算代价,尚未找到BN的平滑性3D图对比,但不影响图2中BN对平滑性改善效果的证明。
其他11个值得讨论的问题
-
BN层的位置能不能调整?如果能调整哪个位置更好?
能。原因:由第二章BN的反向传播可知,BN不管放在网络的哪个位置,都可以实现这两个功能:训练和、传递梯度到前一层,所以位置并不限于ReLU之前。
原始论文中,BN被放在本层ReLU之前,即
也有测试表明,BN放在上一层ReLU之后,效果更好,即
表1 BN的位置对训练结果的影响来源
Name | Accuracy | LogLoss | Comments |
---|---|---|---|
Before | 0.474 | 2.35 | As in paper |
Before + scale&bias layer | 0.478 | 2.33 | As in paper |
After | 0.499 | 2.21 | |
After + scale&bias layer | 0.493 | 2.24 |
但是由于这些都是试验证明,而非理论证明,因此无法肯定BN放在ReLU后就一定更好。
在实践中可以都试试。
-
在训练时为什么不直接使用整个训练集的均值/方差?
使用 BN 的目的就是为了保证每批数据的分布稳定,使用全局统计量反而违背了这个初衷。
-
在预测时为什么不直接使用整个训练集的均值/方差?
完全可以。由于神经网络的训练数据量一般很大,所以内存装不下,因此用指数滑动平均方法去近似值,好处是不占内存,计算方便,但其结果不如整个训练集的均值/方差那么准确。
-
batch_size的配置
不适合batch_size较小的学习任务。因为batch_size太小,每一个step里前向计算中所统计的本batch上的方差和均值,噪音声量大,与总体方差和总体均值相差太大。前向计算已经不准了,反向传播的误差就更大了。
尤其是最极端的在线学习(batch_size=1),原因为无法获得总体统计量。
-
对学习率有何影响?
由于BN对损失函数的平滑作用,因此可以采用较大的学习率。
-
BN是正则化吗?
在深度学习中,正则化一般是指为避免过拟合而限制模型参数规模的做法。即正则化=简化。BN能够平滑损失函数的曲面,显然属于正则化。不过,除了在过拟合时起正则作用,在欠拟合状况下,BN也能提升收敛速度。
-
与Dropout的有何异同?
BN由于平滑了损失函数的梯度函数,不仅使得模型训练精度提升了,而且收敛速度也提升了;Dropout是一种集成策略,只能提升模型训练精度。因此BN更受欢迎。
-
能否和Dropout混合使用?
虽然混合使用较麻烦,但是可以。不过现在主流模型已经全面倒戈BN。Dropout之前最常用的场合是全连接层,也被全局池化日渐取代。既生瑜何生亮。
-
BN可以用在哪些层?
所有的层。从第一个隐藏层到输出层,均可使用,而且全部加BN效果往往最好。
-
BN可以用在哪些类型的网络?
MLP、CNN均ok,几乎成了这类网络的必选项。
RNN网络不ok,因为无论训练和测试阶段,每个batch上的输入序列的长度都不确定,均值和方差的统计非常困难。
-
BN的缺点
在训练时前向传播的时间将增大。(但是迭代次数变少了,总的时间反而少了)
下一期,我们将动手实现一个BN层。
(如果本文对您有所帮助,别忘了点赞支持一下哈,感谢各位看官)
参考文献
[1] https://arxiv.org/pdf/1502.03167v3.pdf
[2] https://r2rt.com/implementing-batch-normalization-in-tensorflow.html
[3] Adjusting for Dropout Variance in Batch Normalization and Weight Initialization
[4] https://www.jianshu.com/p/05f3e7ddf1e1
[8]https://panxiaoxie.cn/2018/07/28/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0-Batch-Normalization/
[9] https://www.tensorflow.org/api_docs/python/tf/layers/batch_normalization
[11] https://github.com/ducha-aiki/caffenet-benchmark/blob/master/batchnorm.md