这篇博客主要是本人看李宏毅老师的深度学习视频笔记,老师主要是从为什么要进行批量归一化,怎么进行批量归一化,批量归一化究竟做了什么,使用批量归一化之后的网络该怎么训练,以及此举带来的好处等方面阐述!

另一篇博客是对Batch Normalization理论原理及python实现的详细介绍,建议两篇融合着看。

为什么要进行归一化?


loss对不同尺度参数的敏感度.png

如果输入的数据中尺度差异较大,则左图中w1的轻微改变即导致loss的较大变化,也就是说loss对于权重w1的依赖很大,而对于w2的依赖较小,loss对于各权重的变化如上图所示,这时训练网络要求我们在w1和w2方向设置不同的学习率以适应梯度的大小,这就导致了网络难以训练!而右图我们归一化了各输入数据的维度之后,很明显可以看到loss对于w1和w2的梯度都相同,这时不要求我们对每个权重设置不一样的学习率,有效的加速了网络的训练过程。

如何进行归一化?


普通归一化方法.png

普通的归一化操作如上图所示,对于输入的每一个特征维度计算均值和标准差,然后进行归一化处理。但是在深度网络(或者说神经网络的隐层)中该怎么做特征归一化呢?


深度网络的归一化.png

我们都知道对于神经网络而言,上一层网络的输出即是下一层网络的输入,所以我们可以对输入层和中间每一层网络的输出做归一化处理(一般网络的输出都是先进行BN处理,再通过激活函数)!

比如说我们的网络已经通过训练知道了自己存在的问题,并试图去修正,其会根据loss对于各参数的偏导来更新自己,但是正如我们前面所说,如果输入的特征尺度不一样,导致了loss对于特征尺度较大的参数的偏导也很大,而对于尺度较小的参数偏导数较小,因此在小数值参数更新到较好的范围时,大数值参数可能会出现“修正过头”的现象(或者说大数值参数更新到需要的范围时,小数值参数反而没有更新到理想范围),这时就需要Batch Normalization来对输入特征的各参数进行归一化处理,减小内部神经元分布的改变(Internal Covariate Shift)!

在Batch Normalization出来之前的办法就是通过设置较小的learning rate来解决这种问题,但是这种方法会降低网络的训练效率!

Batch Normalization具体流程

但是这里我们需要考虑一个问题,每一层网络输入(上一层网络的输出)的统计特性是随着网络层数的不同而在变化的,因为每一层网络的参数是不一样的,所以我们不能简单的找到一个固定的mean和std去逐层网络的做Batch Normalization。


图片.png

Batch Normalization是对一个Batch做归一化来近似代替对整个训练数据的处理,因为随着训练次数的不同,w的值也是在改变的,导致了每一轮训练中每一层计算bn的均值和标准差都是在改变的,如果每次都是对整个训练集做Batch Normalization操作,计算消耗太大!既然如此,我们就要求Batch Normalization不能用于小批量的数据,因为这样就没有办法从一个Batch里去估计整个训练集的统计特性!

BN的训练过程是需要进行反向传播的,因为计算得到的均值mean和标准差std都是随着输入z的变化而改变的,所以这里我们需要对两者都做反向传播以最终更新输入特征z(可以理解为Batch Normalization前向的一个反向过程),不能将均值和标准差想象为一个常量而不更新。

当然这里我们强制的将输入特征进行归一化处理后,也可以再通过网络去学习gamma和beta,将输入特征在缩放到适应网络需要的范围内。


批量归一化示意图.png

测试过程的Batch Normalization

BN的训练过程完成之后,在测试的时候就出现了一个问题,因为均值和标准差都是计算一个Batch中的输入特征得到的,而在测试的时候,并没有任何Batch,所以就不可能有均值mean和标准差std!一个理想的办法就是将训练时得到的均值mean和标准差std保存下来,在测试的时候使用!而随着训练的进行,测试时所需要的均值mean和标准差std是靠近训练过程最后或者说准确率很高的时候所对应的值,所以这时候我们采用滑动平均的方式保存训练数据,也即是给予准确率很高的数据以较大的权重,而训练过程中靠前的数据赋予的权重会很小!

Batch Normalization的优点


批量归一化的优点.png

Batch Normalization所带来的好处有:

加速了训练进程,减少了达到同等要求的训练次数,使得训练深度网络的能力极大的加强;

因为BN起到了减小内部神经元分布(internal covariate shift)的作用,所以我们可以使用较大的学习率;

一定程度上降低了梯度爆炸或梯度消失的可能,因为我们将loss对于各参数的梯度都调整到一个相同的范围内,不会出现某一个参数的偏导数很小或很大的情况,从而导致梯度消失或爆炸;

对于输入参数归一化的要求更低,即使我们将输入参数增大k倍,也会通过Batch Normalization操作将其归一化到原来的尺度范围内;

BN可以在一定程度上减轻overfitting的影响,也就起到了regularization的作用。如果噪声影响了某个参数,从而导致了均值和标准差的变化,网络也会通过Batch Normalization操作去极大的降低噪声的影响。