批归一化Batch Normalization的原理及算法

批归一化Batch Normalization的原理及算法

一、BN提出的背景意义

本文的背景文献是:《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》,Batch Normalization算法目前已经被大量的应用,最新的文献算法很多都会引用这个算法,进行网络训练,可见其强大之处。

随机梯度下降法是训练深度网络的首选。尽管随机梯度下降法对于训练深度网络简单高效,但是需要我们人为的去选择参数,比如学习速率、初始化参数、权重衰减系数、Drop out比例,等等。这些参数的选择对训练结果至关重要,以至于我们很多时间都浪费在这些的调参上。BN算法(Batch Normalization)其好处如下:

  • 可以选择比较大的初始学习率,极大的提高训练速度。Batch Gradient Descent使用多个梯度的均值来更新权重,用相对少的训练次数遍历完整个训练集,也正是因为平均了多个样本的梯度,许多样本对神经网络的贡献就被其他样本平均掉了,相当于在每个epoch中,训练集的样本数被缩小了。batch中每个样本的差异性越大,这种弊端就越严重。BN首先是把所有的samples的统计分布标准化,降低了batch内不同样本的差异性,然后又允许batch内的各个samples有各自的统计分布。所以,BN的优点自然也就是允许网络使用较大的学习速率进行训练,加快网络的训练速度(减少epoch次数),提升效果。
  • 省去参数选择的问题。省去过拟合中drop out、L2正则项参数的选择问题,采用BN算法后,可以移除这两项了参数,或者可以选择更小的L2正则约束参数了,因为BN具有提高网络泛化能力的特性;

为什么需要归一化?

神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低。

输入层的数据,已经人为的的归一化,后面网络每一层的输入数据分布是一直在发生变化的,前面层训练参数的更新将导致后面层输入数据分布的变化,因此必然会引起后面每一层输入数据分布的改变。而且,网络的前面几层发生微小的改变,那么后面几层就会被累积放大下去。我们把网络中间层在训练过程中,数据分布的改变称之为:"Internal Covariate Shift"。BN的提出,就是要解决在训练过程中,中间层数据分布发生改变的情况。

二、BN算法原理

1、BN层及使用位置

就像激活函数层、卷积层、全连接层、池化层一样,BN(Batch Normalization)也属于网络的一层。归一化也是网络的一层。

在网络的每一层输入的时候,又插入了一个归一化层,也就是先做一个归一化处理,然后再进入网络的下一层。如果在每一层输入的时候,再加个预处理操作那该有多好啊,比如网络第三层输入数据X3(X3表示网络第三层的输入数据)把它归一化至:均值0、方差为1,然后再输入第三层计算,这样我们就可以解决前面所提到的"Internal Covariate Shift"的问题了。

关于BN的使用位置,在CNN中一般应作用与非线性激活函数之前,s型函数s(x)的自变量x是经过BN处理后的结果。因此前向传导的计算公式就应该是:

批归一化Batch Normalization的原理及算法

其实因为偏置参数b经过BN层后其实是没有用的,最后也会被均值归一化,当然BN层后面还有个β参数作为偏置项,所以b这个参数就可以不用了。因此最后把BN层+激活函数层就变成了:

批归一化Batch Normalization的原理及算法

2、预处理操作选择

说到神经网络输入数据预处理,最好的算法莫过于白化预处理。白化其实跟PCA算法还是挺相似的。举例来说,假设训练数据是图像,由于图像中相邻像素之间具有很强的相关性,所以用于训练时输入是冗余的。白化的目的就是降低输入的冗余性。

经过白化预处理后,数据满足条件:

1.特征之间相关性较低 2.所有特征具有相同的方差

由于计算量非常大,忽略了第1个要求,仅仅使用了下面的公式进行预处理,也就是近似白化预处理:

批归一化Batch Normalization的原理及算法

3.缩放和移位

减均值除方差得到的分布是正态分布,我们能否认为正态分布就是最好或最能体现我们训练样本的特征分布呢?

非也,如果激活函数在方差为1的数据上,没有表现最好的效果,比如Sigmoid激活函数。这个函数在-1~1之间的梯度变化不大。假如某一层学习到特征数据本身就分布在S型激活函数的两侧,把它归一化处理、标准差也限制在了1,把数据变换成分布于s函数的中间部分,就没有达到非线性变换的目的,换言之,减均值除方差操作后可能会削弱网络的性能。

批归一化Batch Normalization的原理及算法

批归一化Batch Normalization的原理及算法

不光是Sigmoid激活函数,Tanh函数在零附近也变成线性

批归一化Batch Normalization的原理及算法

而Relu activation函数,则将一半的输入清零。

批归一化Batch Normalization的原理及算法

因此,必须进行一些转换才能将分布从0移开。使用缩放因子γ和移位因子β来执行此操作。

随着训练的进行,这些γ和β也通过反向传播学习以提高准确性。这就要求为每一层学习2个额外的参数来提高训练速度。

这个最终转换因此完成了批归一算法的定义。缩放和移位是算法比较关键,因为它提供了更多的灵活性。假设如果我们决定不使用BatchNorm,我们可以设置γ=σ和β= mean,从而返回原始值。

三、BN算法过程

批归一化Batch Normalization的原理及算法

采用Normalization方法网络的训练速度快到惊人啊,感觉训练速度是以前的十倍以上。

BN在深层神经网络的作用非常明显:若神经网络训练时遇到收敛速度较慢,或者“梯度爆炸”等无法训练的情况发生时都可以尝试用BN来解决。同时,常规使用情况下同样可以加入BN来加速模型训练,甚至提升模型精度。

猜你喜欢

转载自blog.csdn.net/weixin_41481113/article/details/83386646