Batch Normalization 学习笔记

顾名思义,batch normalization嘛,即“批规范化”,主要作用是为了防止“梯度弥散”。关于梯度弥散,举个很简单的例子Batch Normalization 学习笔记Batch Normalization 学习笔记

1. BN原理

B有人可能会说,BN不就是在网络中间层数据做一个归一化处理嘛,这么简单的想法,为什么之前没人用呢?然而其实实现起来并不是那么简单的。其实如果仅仅对网络某一层A的输出数据做归一化,然后送入网络下一层B,这样是会影响到本层网络A所学习到的特征的。打个比方,比如我网络中间某一层学习到特征数据本身就分布在S型**函数的两侧,你强制把它给我归一化处理、标准差也限制在了1,把数据变换成分布于s函数的中间部分,这样就相当于我这一层网络所学习到的特征分布被你搞坏了,这可怎么办?于是BN使出了一招惊天地泣鬼神的招式:变换重构,引入了可学习参数γ、β,这就是算法关键之处:

Batch Normalization 学习笔记

这是BN的前向传播过程,首先获得mini-batch的均值和方差,然后通过引入可学习重构参数γ、β,让网络可以恢复除原始网络索要学习的特征分布,yi是网络的最终输出。BN的操作是在各个特征维度之间单独进行,也就是说各个通道是分别进行Batch Normalization操作的。

进行尺度缩放和偏移操作,这样可以变换回原始的分布,实现恒等变换,这样的目的是为了补偿网络的非线性表达能力,因为经过标准化之后,偏移量丢失。从某种意义上来说,γ、β代表的其实是输入数据分布的方差和偏移。对于没有BN的网络,这两个值与前一层网络带来的非线性性质有关,而经过变换后,就跟前面一层无关,变成了当前层的一个学习参数,这更加有利于优化并且不会降低网络的能力。

γ、β参数的学习通过chain rule获得。

2. 什么时候使用BN

例如,在神经网络训练时遇到收敛速度很慢,或梯度爆炸等无法训练的状况时可以尝试BN来解决。另外,在一般使用情况下也可以加入BN来加快训练速度,提高模型精度。

3. BN带来的好处

(1) 减轻了对参数初始化的依赖,利于调参;

(2) 训练更快,可以使用更高的学习率;

(3) BN一定程度上增加了泛化能力,dropout等技术可以去掉;

4. BN的缺陷

BN依赖于batch的大小,当batch值很小时,计算的均值和方差不稳定。研究表明对于ResNet类模型在ImageNet数据集上,batch从16降低到8时开始有非常明显的性能下降,在训练过程中计算的均值和方差不准确,而在测试的时候使用的就是训练过程中保持下来的均值和方差。

这一个特性,导致batch normalization不适合以下的几种场景。

(1)batch非常小。比如训练资源有限无法应用较大的batch,也比如在线学习等使用单例进行模型参数更新的场景。

(2)RNN。因为它是一个动态的网络结构,同一个batch中训练实例有长有短,导致每一个时间步长必须维持各自的统计量,这使得BN并不能正确的使用。在rnn中,对bn进行改进也非常的困难。不过,困难并不意味着没人做,事实上现在仍然可以使用的,不过这超出了咱们初识境的学习范围。

Normalization思想非常简单,为深层网络的训练做出了很大贡献。因为有依赖于样本数目的缺陷,所以也被研究人员盯上进行改进,比较典型的就是Layer Normalization与Instance Normalization,Group Normalization了。

至于各种Normalization的适用场景,可以简洁归纳如下:
(1)对于RNN的神经网络结构来说,目前只有LayerNorm是相对有效的;
(2)如果是GAN等图片生成或图片内容改写类型的任务,可以优先尝试InstanceNorm;
(3)如果使用场景约束BatchSize必须设置很小,无疑此时考虑使用GroupNorm;
(4)其它任务情形应该优先考虑使用BatchNorm。