3.5 归一化
在训练模型之前,对训练数据集进行标准化和归一化处理,可以加快模型的收敛速度,而且更重要的是在一定程度上缓解了深层网络中梯度弥散的问题,从而使训练深层网络模型更加容易。归一化处理是深度神经网络训练常用的技巧。
3.5.1 理解归一化含义
下面通过归一化的数学含义及其在深度学习中的应用来理解归一化。
归一化的具体作用是归纳统一样本的统计分布性,归一化在[0,1]之间是统计的概率分布,归一化在[-1, 1]之间是统计的坐标分布。
为了建模或计算方便,首先要保持度量单位的同一性,在深度学习中,当所有样本的输入信号都为正值时,与第一隐含层神经元相连的权重只能同时增加或减小,从而导致学习速度很慢。为了避免出现这种情况并方便后面数据的处理,加快网络学习速度,可以对输入信号进行归一化,使所有样本的输入信号均值接近于0或与其均方差相比很小。神经网络中sigmoid激活函数的取值在0到1之间,网络最后一个节点的输出也是如此。
归一化处理并不适用于所有情况,在实际使用中根据输出值的分布情况,标准化等其他统计变换方法有时可能更好。
3.5.2 归一化和标准化的联系与区别
(1)两者的联系:它们都能取消由于量纲不同引起的误差,都是一种线性变换,都是对向量按照比例压缩再进行平移。
(2)两者的区别:归一化是将样本的特征值转换到同一量纲下,把数据映射到[0,1]或[-1,1]区间内,仅由变量的极值决定,区间放缩法是归一化的一种。标准化是将样本依照特征矩阵的列处理数据,通过求z-score的方法,将其转换为标准正态分布,使其和整体样本分布相关,每个样本点都能对标准化产生影响。
3.5.3 为什么要归一化或标准化
总结起来,主要有以下原因。
(1)应用层面需要统一量纲,因为样本数据的评价标准不一样,需要对其量纲化,统一评价标准。
(2)在使用梯度下降的方法求解最优化问题时,归一化或标准化后可以加快梯度下降的求解速度,即提升模型的收敛速度。
(3)应用归一化可以避免神经元饱和,当神经元的激活在接近0或1时会饱和,在这些区域,梯度几乎为0。这样,在反向传播过程中,局部梯度就会接近0,此时应用归一化可以有效地减少梯度消失。
(4)避免输出数据中小的数值被吞食,也避免太大的数值引发数值问题。
3.5.4 图解为什么要归一化
假设w1的范围为[-10,10],而w2的范围为[-100,100],梯度每次都前进1个单位,那么在w1方向上每次相当于前进了1/20,而在w2上只相当于1/200。从某种意义上来说,在w2上前进的步长更小一些,而w1在搜索过程中会比w2“走”得更快。
这样会导致在搜索过程中更偏向于w1的方向,结果是走出了“L”形,或者“之”字形,图3-29所示为未归一化的最优解搜索过程,这导致需要迭代很多次才能收敛。
图3-29 未归一化的最优解搜索过程
3.5.5 为什么归一化能提高求最优解速度
如图3-30所示为归一化的最优解寻解过程(圆圈可以理解为等高线)。左图表示未经归一化操作的寻解过程,右图表示经过归一化后的寻解过程。
图3-30 归一化的最优解寻解过程
当使用梯度下降法寻求最优解时,很有可能走“之”字形路线(其特点是垂直于等高线进行下降),从而导致需要迭代很多次才能收敛;而右图对两个原始特征进行了归一化,其对应的等高线显得很圆,在梯度下降进行求解时能较快地收敛。
因此,如果机器学习模型使用梯度下降法求最优解时,归一化往往非常有必要,否则很难收敛,甚至不能收敛。
3.5.6 归一化有哪些类型
线性归一化
线性归一化比较适用于数值比较集中的情况。缺点是如果max(x)和min(x)不稳定,很容易使归一化结果不稳定,后续使用效果也不稳定。
标准差标准化
标准差标准化是让经过处理的数据符合标准正态分布,即均值为0,标准差为1。其中μ为所有样本数据的均值,σ为所有样本数据的标准差。
非线性归一化
非线性归一化经常用在数据分化比较大的场景,有些数值很大,有些很小。通过一些数学函数,将原始值进行映射,这些方法包括log、指数、正切等。
3.5.7 局部响应归一化作用
局部响应归一化(Local Response Normalization,LRN)是一种提高深度学习准确度的技术方法。LRN一般是在激活、池化函数后使用的一种处理方法。
在AlexNet中,提出了LRN层,对局部神经元的活动创建竞争机制,使其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。
3.5.8 局部响应归一化原理
局部响应归一化原理是仿造生物学上活跃的神经元对相邻神经元的抑制现象(侧抑制),其公式如下:
其中:
• a表示卷积层后的输出结果,是一个四维数组[batch,height,width,channel]。batch代表批次数,height代表图片高度,width代表图片宽度,channel代表通道数。可以理解成一批图片中的某一张图片经过卷积操作后输出的神经元个数,或者理解为处理后的图片深度。
• 表示在这个输出结构中的一个位置[a,b,c,d],可以理解成在某一张图中的某一个通道下的某个高度和某个宽度位置的点,即第a张图的第d个通道下的高度为b、宽度为c的点。
• N表示通道数。
• A、n/2、k分别表示函数中的input、depth_radius、bias。参数k、n、α、β都是超参数,一般设置k=2、n=5、α=e-4、β=0.75。
• ∑叠加的方向沿着通道方向,即每个点值的平方和是沿着a中的第三维通道方向的,也就是一个点同方向的前面n/2个通道(最小为第0个通道)和后n/2个通道(最大为第d-1个通道)的点的平方和(共n+1个点)。而函数的英文注解中也说明了把输入当成d个三维的矩阵,即把输入的通道数当作三维矩阵的个数,叠加的方向也是在通道方向。
局部响应归一化简单示意图如图3-31所示。
图3-31 局部响应归一化简单示意图
3.5.9 什么是批归一化
以前在神经网络训练中,只是对输入层数据进行归一化处理,却没有在中间层进行归一化处理。虽然我们对输入数据进行了归一化处理,但是输入数据经过σ(WX+b)这样的矩阵乘法及非线性运算之后,其数据分布很可能被改变,而随着深度网络的多层运算,数据分布的变化将越来越大。如果我们能在网络的中间也进行归一化处理,是否对网络的训练起到改进作用呢?答案是肯定的。
这种在神经网络中间层也进行归一化处理,使训练效果更好的方法,就是批归一化(Batch Normalization,BN)。
3.5.10 批归一化的优点
(1)减少了对人为选择参数的依赖。在某些情况下可以取消Dropout方法和L2正则项参数,或者采用更小的L2正则项约束参数。
(2)减少了对学习率的要求。使用批归一化后可以使用初始很大的学习率或选择较小的学习率,算法也能够快速训练收敛。
(3)可以不再使用局部响应归一化,批归一化本身就是归一化网络。
(4)破坏原来的数据分布,在一定程度上缓解过拟合,防止每批训练中某一个样本经常被挑选到,有助于提高精度。
(5)减少梯度消失,加快收敛速度,提高训练精度。
3.5.11 批归一化算法流程
下面给出批归一化算法在训练时的过程。
输入:上一层输出结果,学习参数γ和β。
算法流程如下。
(1)计算上一层输出数据的均值:
其中,m是此次训练样本Batch的大小。
(2)计算上一层输出数据的标准差:
(3)进行归一化处理,得到:
其中ε是为了避免分母为0而加进去的接近于0的很小的值。
(4)重构,对经过上面归一化处理得到的数据进行重构,得到:
其中,γ和β为可学习参数。
注:上述是批归一化训练时的过程,但是当投入使用时,往往只是输入一个样本,没有所谓的均值μβ和标准差。此时,均值μβ是从计算所有批次μβ值的平均值得到的,标准差是根据每个批次的无偏估计得到的。
3.5.12 批归一化和组归一化比较
批归一化(Batch Normalization,BN),可让各种网络并行训练。但是,批量维度进行归一化会带来一些问题,比如批量统计估算不准确导致当批量变小时,批归一化的误差会迅速增加。在训练大型网络和将特征转移到计算机视觉任务中(包括检测、分割和视频),内存消耗限制了只能使用小批量的批归一化。
组归一化(Group Normalization,GN),组归一化将通道分成组,并在每组内计算归一化的均值和方差。组归一化的计算与批量大小无关,并且其准确度在各种批量大小下都很稳定。
在ImageNet上训练的ResNet-50上,组归一化使用批量大小为2时的错误率比批归一化的错误率低10.6%;当使用典型的批量时,组归一化与批归一化相当,并且优于其他归一化变体。而且,组归一化可以自然地从预训练迁移到微调。在进行COCO中的目标检测和分割及Kinetics中的视频分类比赛中,组归一化可以胜过其竞争对手,表明组归一化可以在各种任务中有效地取代强大的批归一化。
3.5.13 权重归一化和批归一化比较
权重归一化(Weight Normalization,WN)和批归一化(Batch Normalization,BN)都属于参数重写(Reparameterization)的方法,只是采用的方式不同。
权重归一化是对网络权重W进行归一化;批归一化是对网络某一层输入数据进行归一化。
权重归一化与批归一化相比有以下3点优势。
(1)权重归一化通过重写深度学习网络的权重W的方式来加速深度学习网络参数收敛,没有引入mini-batch的依赖,适用于RNN(LSTM)网络。批归一化不能直接用于RNN进行归一化操作,原因在于:①RNN处理的队列是变长的;②RNN基于时间状态计算,如果直接使用批归一化处理,需要保存每个时间状态下mini-batch的均值和方差,效率低且占内存较多。
(2)批归一化基于一个mini-batch的数据计算均值和方差,而不是基于整个训练集来做,相当于在进行梯度计算时引入噪声。因此,批归一化不适用于对噪声敏感的强化学习、生成模型等使用。相反,权重归一化通过标量g和向量v对权重W进行重写,因此,权重归一化可以比批归一化引入更少的噪声。
(3)权重归一化不需要额外的存储空间来保存mini-batch的均值和方差,正向和反向传播实现时额外的计算开销也更小。
但是权重归一化不具备批归一化把网络每一层的输出固定在一个变化范围内的能力,因此采用权重归一化时需要注意参数初始化策略的选择。
3.5.14 批归一化适用范围
在CNN中,批归一化应作用在非线性映射前。在神经网络训练时遇到收敛速度很慢,或梯度爆炸等无法训练的状况时可以尝试使用批归一化来解决。另外,在一般使用情况下也可以加入批归一化来加快训练速度,提高模型精度。
批归一化比较适用于每个mini-batch比较大、数据分布比较接近的场景。另外,由于批归一化需要在运行过程中统计每个mini-batch的一阶统计量和二阶统计量,因此不适用于动态的网络结构和RNN网络。
3.5.15 BN、LN、IN和GN的对比
主流归一化方法有批归一化(Batch Normalization,BN)、层次归一化(Layer Normalization,LN)、实例归一化(Instance Normalization,IN)及组归一化(Group Normalization,GN)。下面就根据一组示意图对它们进行比较。
深度网络中的数据维度一般是[N,C,H,W]或[N,H,W,C]格式,N是Batch Size,H/W是特征图的高/宽,C是特征图的通道数,压缩H/W至一个维度。图3-32所示为BN、LN、IN和GN的工作方式对比。假设单个方格的长度是1,那么其表示的是[6,6, , ]。
图3-32 BN、LN、IN和GN的工作方式对比
图3-32形象地表示了4种归一化的工作方式。
• BN:对批次方向做归一化,归一化维度为[N,H,W]。
• LN:在通道方向上做归一化,归一化的维度为[C,H,W],主要对RNN作用明显。
• IN:在一个图像像素内做归一化,归一化的维度为[H,W],主要用于风格化迁移。
• GN:将通道方向分组,然后在每个组内做归一化,先将特征的维度由[N, C, H, W]变换为[N, G, C//G, H, W],归一化的维度为[C//G,H,W]。
还有一种归一化方式,可切摸归一化(Switchable Norm,SN),是将BN、LN、IN结合,赋予权重,让网络自己去学习归一化层应该使用的方法。