在 PSPNet 与 DeeplabV3中,有对 BN 层对语分割有效性的使用,故再次对 BN 层提出的论文阅读学习,并理解其 Caffe 实现.
DeeplabV3 中关于 Batch Normalization 的使用如下:
在 ResNet 所添加的模块中包括对 BN 参数的学习,作者发现,BN 层对于网络的训练也很重要. 鉴于 BN 参数的训练需要较大的 batch size,DeeplabV3 采用 output_stride=16,batch_size =16, BN 的 decay=0.997,initial_learning_rate=0.007. 在训练集上训练 30K 次迭代后,固定 BN 参数,并采用 output_stride=8 在 PASCAL VOC 2012 训练集上,采用小的 base learning rate=0.001, 再训练 30K 次迭代.
神经网络训练面对的问题:
即 intenal covariate shift(内部相关变量偏移).
BN 层的作用:
SGD 优化的目标损失函数:
如果能够保证网络的非线性输入的分布能够在网络训练过程中一直保持稳定,就可以减少饱和的可能,加速网络训练.
对于深度网络训练过程中所出现内部节点的分布变化,这里称之为 Internal Covariate Shift(ICS).
Internal Covariate Shift 是由于训练过程中网络参数的变化而导致网络激活值的分布发生的变化.
提出采用 Batch Normalization 来对 ICS 进行消除,加速网络训练. 其主要是采用 normalization 处理来固定网络层输入的均值和方差(means and variances).
白化(whiten),将数据变换到均值为 0,方差为1,并去数据相关性. 通过将每一层的输入进行白化处理,可以固定数据的分布,移除 internal covariate shift 的负影响.
训练过程中每一步的白化处理,可以通过直接修改网络,或者修改作用于网络激活值的优化参数. 但是,如果在优化过程中混杂着这些修改,可能会导致梯度下降时需要对参数进行更新.
这显然是需要寻找一种能够进行输入归一化,可微分的,且不需要每次参数更新都对整个训练数据进行重新分析的处理方法.
由于对每一层输入的白化处理计算量大,且不是完全可微的,这里进行了两处必要的简化:
BN 层是可微分的,能够保证模型的训练,且训练时网络层的分布具有较小的 internal covariate shift,加速模型训练.
未添加 BN 层,网络层的输入是 xxx;添加 BN 层后,网络层的输入是 BN(x)BN(x)BN(x),即可采用SGD等进行网络训练.
BN 层有助于网络训练,但在 inference 阶段则是不必要的,网络输出只与输入相关. 因此,网络训练完成后,归一化操作为:
BN层可以应用于网络的任何地方,这里以逐元素非线性仿射变换为例:
传统的深度网络训练中,太大的学习率会导致梯度发散或消失,或者较差的局部最小值.
BN 层能够帮助解决这种问题.
通过归一化网络的激活值,能够阻止参数的细微变化被放大,或者激活值的梯度次优变化. 例如,BN 能够避免网络训练陷入饱和非线性状态.
BN 还能够使网络更好的适应参数尺度. 正常情况下,学习率较大会增加网络层参数的尺度,接着会增大BP时梯度,导致模型发散.
但,加入 BN 层后,网络层的 BN是不受参数尺度影响的.
可以看出,尺度不会影响梯度的BP. 而且,较大的权重会使梯度值变小.
因此,BN 可以确保参数增长的稳定性.
此外,BN 还可以使网络层的 Jacobians 的奇异值接近 0,更有利于训练.
网络加入 BN 后进行训练时,一个训练样本是与 mini-batch 内的其它样本共同处理的,网络不是只有给定的训练样本来得到决策值. 这对于网络的泛化是有利的.
Dropout 是一种常用的降低网络过拟合的方法;但,在加入 BN 的网络中,Dropout 是可以被去除或者大量减少的.
Figure 1. (a) MNIST 网络的测试精度,with BN & without BN. BN层能够更快的训练网络,并取得更高的精度.
(b,c) 可以看出加入 BN 后数据分布更加稳定,减少 internal covariate shift.