在实际训练过程中,经常出现隐含层因数据分布不均,导致梯度消失或不起作用的情况。如采用sigmoid函数或tanh函数为激活函数时,如果数据分布在两侧,这些激活函数的导数就接近于0。这样一来,BP算法得到的梯度也就消失了。

如何解决这个问题?
Sergey Ioffe和Christian Szegedy两位学者提出了批标准化(BatchNormalization)方法。Batch Normalization不仅可以有效地解决梯度消失问题,而且还可以让调试超参数更加简单,在提高训练模型效率的同时,还可让神经网络模型更加“健壮”。

那么Batch Normalization是如何做到这些的呢?
首先,我们介绍一下BN的算法流程。

输入:微批次(mini-batch)数据:B={x1,x2,…,xm}

学习参数:γ,β类似于权重参数,可以通过梯度下降等算法求得。

其中xi并不是网络的训练样本,而是指原网络中任意一个隐藏层激活函数的输入,这些输入是训练样本在网络中前向传播得来的。

输出:{yi=NBγ,β(xi)}

CNN 梯度更新 batch normalization 梯度_深度学习


CNN 梯度更新 batch normalization 梯度_人工智能_02

BN是对隐藏层的标准化处理,它与输入的标准化处理NormalizingInputs是有区别的。
Normalizing Inputs是使所有输入的均值为0,方差为1。
而Batch Normalization可使各隐藏层输入的均值和方差为任意值。
实际上,从激活函数的角度来看,如果各隐藏层的输入均值在靠近0的区域,即处于激活函数的线性区域,这样不利于训练好的非线性神经网络,而且得到的模型效果也不会太好。
式(5-6)就起这个作用,当然它还有将归一化后的x还原的功能。

那么BN一般用在哪里呢?
BN应作用在非线性映射前,即对x=Wu+b做规范化时,在每一个全连接和激励函数之间。

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

BN具体功能如示:
1)可以选择比较大的初始学习率,让训练速度飙升。之前还需要慢慢地调整学习率,甚至在网络训练到一半的时候,还需要想着学习率进一步调小的比例选择多少比较合适。现在我们可以采用初始很大的学习率,然而学习率的衰减速度也很快,因为这个算法收敛很快。当然,这个算法即使你选择了较小的学习率,也比以前的收敛速度快,因为它具有快速训练收敛的特性。
2)不用再去理会过拟合中Dropout、L2正则项参数的选择问题,采用BN算法后,你可以移除这两项参数,或者可以选择更小的L2正则约束参数了,因为BN具有提高网络泛化能力的特性。
3)再也不需要使用局部响应归一化层。
4)可以把训练数据彻底打乱。