神经网络的归一化(batch normalization)


前言

对于神经网络而已,层级的网络结果使得底层参数更新会对高层输入的分布产生很大影响,使得输入的数据难以满足独立同分布的特点,影响模型的性能。对此,研究者们在神经网络中引入归一化(normalization)方法,使得各层输入限制在一定范围内。


提示:以下是本篇文章正文内容,下面案例可供参考

一、批次归一化(batch normalization)

BatchNorm就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的。

接下来一步一步的理解什么是BN。

为什么深度神经网络随着网络深度加深,训练起来越困难,收敛越来越慢?这是个在深度学习领域很接近本质的好问题。很多论文都是解决这个问题的,比如ReLU激活函数,再比如Residual Network,BN本质上也是解释并从某个不同的角度来解决这个问题的。

从原始论文名字可以看出,BN是用来解决“Internal Covariate Shift”问题的,那么首先得理解什么是“Internal Covariate Shift”?

论文首先说明Mini-Batch SGD 的两个优势:梯度更新方向更准确;并行计算速度快;(为什么要说这些?因为BatchNorm是基于Mini-Batch SGD的,所以先夸下Mini-Batch SGD,当然也是大实话);然后吐槽下SGD训练的缺点:超参数调起来很麻烦。(作者隐含意思是用BN就能解决很多SGD的缺点)

接着引入covariate shift的概念:如果机器学习系统实例集合<X,Y>中的输入值X的分布老是变,这不符合独立同分布假设,网络模型很难稳定的学规律 。对于深度学习这种包含很多隐层的网络结构,在训练过程中,因为各层参数不停在变化,所以每个隐层都会面临covariate shift的问题,也就是在训练过程中,隐层的输入分布老是变来变去,这就是所谓的“Internal Covariate Shift”,Internal指的是深层网络的隐层,是发生在网络内部的事情,而不是covariate shift问题只发生在输入层。

然后提出了BatchNorm的基本思想:能不能让每个隐层节点的激活输入分布固定下来呢?这样就避免了“Internal Covariate Shift”问题了。

BN不是凭空拍脑袋拍出来的好点子,它是有启发来源的:之前的研究表明如果在图像处理中对输入图像进行白化(Whiten)操作的话——所谓白化,就是对输入数据分布变换到0均值,单位方差的正态分布——那么神经网络会较快收敛,那么BN作者就开始推论了:图像是深度神经网络的输入层,做白化能加快收敛,那么其实对于深度网络来说,其中某个隐层的神经元是下一层的输入,意思是其实深度神经网络的每一个隐层都是输入层,不过是相对下一层来说而已,那么能不能对每个隐层都做白化呢?这就是启发BN产生的原初想法,而BN也确实就是这么做的,可以理解为对深层神经网络每个隐层神经元的激活值做简化版本的白化操作。

BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前的激活输入值随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近,所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因。(比如sigmoid函数为激活函数时,由于深层的隐层输入值域越来越大,越来越离散,越来越远离原点,这就造成进过sigmiod函数后,梯度变化非常小。)而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数(激活函数)对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

其实一句话就是:对于每个隐层神经元,把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的比较标准的正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,以此避免梯度消失问题。因为梯度一直都能保持比较大的状态,所以很明显对神经网络的参数调整效率比较高,就是变动大,就是说向损失函数最优值迈动的步子大,也就是说收敛地快。BN说到底就是这么个机制,方法很简单,道理很深刻。

但是,仔细思考一下,我们可以提出一个疑问:**如果都通过BN,那么不就跟把非线性函数替换成线性函数效果相同了?这意味着多层的线性函数变换没有意义,因为多层线性网络跟一层线性网络是等价的。这也意味着深度的意义就没有了。**所以BN为了保证非线性的获得,对变换后的满足均值为0方差为1的x又进行了scale加上shift操作(y=scale*x+shift),每个神经元增加了两个参数scale和shift参数,这两个参数是通过训练学习到的,意思是通过scale和shift把这个值从标准正态分布左移或者右移一点并长胖一点或者变瘦一点,每个实例挪动的程度不一样,这样等价于非线性函数的值从正中心周围的线性区往非线性区动了动。核心思想应该是想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢

二、层归一化(layer normalization)

batch normalization方法虽然广泛应用,但是在实际应用时,需要计算并保存该层神经网络batch的均值和方差信息。对于一个深度固定的神经网络(如DNN,CNN)非常适宜。但是对于深度不定的RNN而言,不同的情况下需要保存的静态特征不同,简单说就是,可能存在一个特殊的sequence比其他sequence长很多,这样训练时计算很麻烦。

与batch normalization方法针对单个神经元不同,layer normalization方法考虑神经网络中一层的信息,计算该层的平均值和方差作为规范化标准,对该层的所有输入实施同一个规范化操作,不受mini-batch均值和方差的影响,可以用于mini-batch较小时的场景,动态网络结构和RNN。此外,由于无须保存mini-batch的均值和方差,节省了内存。

三,权重归一化(weight normalization)

batch-normalization和layer normalization方法将规范化应用于输入数据X,weight normalization方法则是对权重进行规范化。即将权重向量分解为权重大小和方向两部分,不依赖于输入数据的分布。此外,weight normalization方法还避免了layer normalization方法中对每一层使用同一个规范公式的不足。

batch normalization和layer normalization方法属于将特征规范化,weight normalization方法是将参数规范化。3种规范方法尽管对输入数据的尺度化(scale)来源不同,但本质上都实现了数据的规范化操作。


四,组归一化(group normalization)

group normalization是一种新的归一化方式,在某些情况下可以代替batch normalization。该方法主要针对后者在一个批次中样本少时表现效果差而提出的。group normalization根据通道进行分组,然后在每个组内做归一化,计算其均值与方差,从而不受批次中样本数量的约束。随着批次中样本数量的减少,group normalization表现更佳。

猜你喜欢

转载自blog.csdn.net/qq_39297053/article/details/112856758