1、为什么提出BN?
训练深层神经网络,由于每层的变化会导致训练困难,训练速度慢,继而提出BN实现训练速度提升的目的。
深度的神经网络模型会涉及多个函数或层组合,在其他层不变的前提下,使用梯度可以更新参数[1]。
但实际是所有层同时更新。每个层在训练过程中的分布发生变化,每一层的输入都受到所有先前层的参数的影响,因此训练变得复杂,训练速度也比较慢。训练期间网络参数变化导致的数据分布的变化叫做Internal Covariate Shift。
所以在2015年作者提出BN,说是通过降低ICS实现BN的目的——加速深层网络的训练[2]。
2、BN是什么?
Batchnorm全名是Batch Normalization,简称BN,即批规范化。可应用网络中任何的输入层和隐藏层。
Batch 是指操作对象是mini-batch数据(SGD是训练深层网络的一种有效方法,使用小批次mini-batch数据来训练深度网络)。
Normalization 标准化顾名思义转换数据到均值为0方差为1的数据分布,不过BN算法在此基础上稍微有些改进。
算法原理(或者说BN在做些什么?)
Batch Normalizing Transform, applied to activation x over a mini-batch
解读:
输入的x是mini-batch的一批数据;
输出的是经过BN处理后的一批新分布的数据;
首先,根据输入的计算均值和方差,代入标准化公式得到均值为0方差为1的新数据
。这里
是一个常数,避免分母为0的情况。
然后,引入缩放因子和迁移因子
得到更合适的分布数据
。其中
是超参数,在模型训练中不断学习。
图片来源:https://www.cnblogs.com/skyfsm/p/8453498.html
经过BN处理后,每一层的输入在训练过程中的分布变得相对稳定。
例如小猫猫二分类任务,第i批次都是小黑猫,第j批次的小猫猫显然有不同的特征分布。由于BN的操作使得压缩在同一均值和方差下,深度网络变得更加稳定。
小结:深度网络难训练是因为所有层都在更新。BN使得网络每层的数据分布相对稳定,使得每一层可以尽量面对同一特征分布的输入值,降低训练难度。
3、BN在神经网络中是怎么应用的?
神经网络的每个单元负责两件事情:先计算,然后应用到激活函数中再计算
。BN的操作是在激活函数应用前的。
【暂放】BN是如何在CNN网络中应用的?
4、BN的作用[2]
(1)降低ICS,提升训练稳定性,加速网络收敛速度。
(2)允许我们使用更高的学习率。
(3)不那么依赖参数初始值。
(4)充当正则化,在某些情况下消除了对Dropout的需要。
(5)深层网络使用sigmoid、tanh等激活函数变得可能。
【暂放】原因说明
5、补充
(1)BN并不是适用于所有任务
- BN不适合图像像素到像素的项目。韩国团队在2017NTIRE图像超分辨率中取得了top1的成绩,主要原因竟是去掉了网络中的batchnorm层,由此可见,BN并不是适用于所有任务的。
- RNN等动态网络使用BN效果不佳且使用起来不方便。
详见来源
(2)为什么使用缩放因子和迁移因子?
如果不引入的处理,每一层的数据分布都是标准正态分布,导致其完全学习不到输入数据的特征。
【暂放】更多细节的理解
(3)参数b的舍去
当使用BN时,参数是没有意义的
【暂放】更多细节的理解
(4)预测时均值和方差的计算
由于均值和方差是基于mini-batch计算的,但在测试时,如果只有一个数据,此时根据一个数据计算的均值和方差是无意义的。
所以我们会记录模型训练过程中的均值和方差,通过track_running_stats控制。预测前通过model.eval()固定BN。
CLASS torch.nn.BatchNorm2d(num_features,
eps=1e-05, # 对应分母中的epsilon
momentum=0.1,
affine=True,
track_running_stats=True)
参考资料
[1] 花书 8.7.1 Batch Normalization
[2] 论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》
[3] 吴恩达《深度学习》调试处理——BN