1.是什么?
批量归一化(Batch Normalization),由Google于2015年提出,是近年来深度学习(DL)领域最重要的进步之一。该方法依靠两次连续的线性变换,希望转化后的数值满足一定的特性(分布),不仅可以加快了模型的收敛速度,也一定程度缓解了特征分布较散的问题,使深度神经网络(DNN)训练更快、更稳定。
2.为什么?
随着网络的深度增加,每层特征值分布会逐渐的向激活函数的输出区间的上下两端(激活函数饱和区间)靠近,长此以往则会导致梯度消失,从而无法继续训练model。BN就是通过方法将该层特征值分布重新拉回标准正态分布,特征值将落在激活函数对于输入较为敏感的区间,输入的小变化可导致损失函数较大的变化,使得梯度变大,避免梯度消失,同时也可加快收敛。
3.怎么样?
3.1算法过程
输入:批处理(mini-batch)输入
输出:规范化后的网络响应
过程:
1.计算批处理数据均值(mini-batch mean)
2.计算批处理数据方差(mini-batch variance)
3.规范化(normalize): 获得N ∼ ( 0 , 1 ) 正态分布。其中 ε 是为了避免除数为0时所使用的微小正数。
4.尺度变换和转移(scale and shift): 将乘以 γ 调整数值大小,再加上 β 增加偏移后得到,这里的 γ 是尺度因子,β是平移因子。这一步是BN的精髓,由于归一化后的基本会被限制在正态分布下,使得网络的表达能力下降。为解决该问题,我们引入两个新的参数:γ 和 β 。γ 和 β 是在训练时网络自己学习得到的。
换句话说正态分布式的数据归一化变成了下面的形式来进行数据归一化
5.return 学习的参数
3.2原理分析
我们的激活函数本质上想要放大差别,而随着网络深度的增加,就好像我们小时候玩的听筒传话游戏,每个人将听到的信息轮流传下去,信息便会在传递的过程中变得离谱起来。如下图:
如果数据在梯度很小的区域,那么学习率就会很慢甚至陷入长时间的停滞。减均值除方差后,数据就被移到中心区域如上图所示,对于大多数激活函数而言,这个区域的梯度都是最大的或者是有梯度的(比如ReLU),这可以看做是一种对抗梯度消失的有效手段。对于一层如此,如果对于每一层数据都那么做的话,数据的分布总是在随着变化敏感的区域,相当于不用考虑数据分布变化了,这样训练起来更有效率。
训练的本质就是要根据loss去调整模型的参数,从而使得模型找到一个特定的function去拟合我们的数据。而BN的把数据从梯度较小的区域移到了梯度较大区域,如此一来,backforward时的loss梯度大,模型收敛速度就快了,这也就是sigmoid激活函数被ReLU激活函数普遍替代的原因。
参考:
Batch Normalization 批量归一化 【全方位解释】
Batch Normalization详解
深入理解批归一化Batch Normalization批标准化