BatchNormalization和LayerNormalization的对⽐分析
⼀、为什么对数据归⼀化
我们知道在神经⽹络训练开始前,需要对输⼊数据做归⼀化处理,那么具体为什么需要归⼀化呢?
原因在于:神经⽹络学习过程本质就是为了学习数据特征以及数据的分布特征,⼀旦训练数据与测试数据的分布不同,那么⽹络的泛化能⼒也⼤⼤降低;另外⼀⽅⾯,⼀旦每批训练数据的分布各不相同(batch 梯度下降),那么⽹络就要在每次迭代都去学习适应不同的分布,这样将会⼤⼤降低⽹络的训练速度,这也正是为什么我们需要对数据都要做⼀个归⼀化预处理的原因。
同时也是在训练前为什么要把训练数据充分打乱的原因,充分打乱使得每个batch的样本包含各类别的数据,这样通过每个batch的样本训练时各个batch所包含的数据分布更接近,同时和整个训练集的数据分布更接近,更有利于训练出更泛化的模型,同时有利于模型的收敛。试想不充分打乱数据,若每个batch只包含⼀个类别的数据,不同的batch数据进⾏训练时⽹络就要在每次迭代都去学习适应不同的分布,会使得⽹络收敛很慢。
⼆、数据进⾏归⼀化标准化常⽤的⽅法
数据的标准化(正则化)以及归⼀化之间的界限很模糊,现在都进⾏混⽤,常⽤的⽅法有,最⼩最⼤值归
⼀化以及z-score标准化
标准差是⽅差的算术平⽅根
三、Batch Normalization
1.算法的诞⽣
上⽂提到神经⽹络的本质是学习数据结构的特征以及数据的分布特征。对于深度⽹络的训练是⼀个复杂的过程,只要⽹络的前⾯⼏层发⽣微⼩的改变,那么后⾯⼏层就会被累积放⼤下去。⼀旦⽹络某⼀层的输⼊数据的分布发⽣改变,那么这⼀层⽹络就需要去适应学习这个新的数据分布,所以如果训练过程中,训练数据的分布⼀直在发⽣变化,那么将会影响⽹络的训练速度。
⽹络的训练是对可训练参数不断更新的过程,除了输⼊层的数据外(因为输⼊层数据,我们已经⼈为的为每个样本归⼀化),后⾯⽹络每⼀层的输⼊数据分布是⼀直在发⽣变化的,因为在训练的时候,前⾯层训练参数的更新将导致后⾯层输⼊数据分布的变化。数据分布的改变称之为:“Internal Covariate Shift”。为了解决在训练过程中,中间层数据分布发⽣改变的情况,于是就有了Batch Normalization。
2.Batch Normalization概述
如其名Batch Normalization是以⼀个batch为基本单位,对每个神经元做归⼀化处理,同时Batch Normalization(BN)和隐藏层、卷积层等⼀样是⽹络结构中的⼀层,⼀般应⽤在激活函数前。在没有采⽤BN的时候,激活函数层是这样的:
z=g(Wu+b)
也就是我们希望⼀个激活函数,⽐如s型函数s(x)的⾃变量x是经过BN处理后的结果。因此前向传导的计算公式就应该是:
z=g(BN(Wu+b))
其实因为偏置参数b经过BN层后其实是没有⽤的,最后也会被均值归⼀化,当然BN层后⾯还有个β参数作为偏置项,所以b这个参数就可以不⽤了。因此最后把BN层+激活函数层就变成了:
z=g(BN(Wu))
3.Batch Normalization的计算
注意Batch Normalization的计算不是只简单的通过归⼀化公式事先对⽹络某⼀层A的输出数据做归⼀化,然后送⼊⽹络下⼀层B,这样是会影响到本层⽹络A所学习到的特征的。打个⽐⽅,⽐如我⽹络中间
某⼀层学习到特征数据本⾝就分布在S型激活函数的两侧,你强制把它给我归⼀化处理、标准差也限制在了1,把数据变换成分布于s函数的中间部分,这样就相当于我这⼀层⽹络所学习到的特征分布被搞坏了,原⽂中提出了⼀种变换重构的⽅法,引⼊了可学习参数γ、β,这就是算法关键之处,让我们的⽹络可以学习恢复出原始⽹络所要学习的特征分布。最后Batch Normalization⽹络层的前向传导过程公式如下,其中的ε是⼀个很⼩的数,⽤于防⽌除0。
4.Batch Normalization在测试数据上的使⽤
上⾯的算法是在训练过程中的应⽤,测试阶段假设我们想只输⼊⼀个测试样本,看看结果⽽已。因此测试样本,前向传导的时候,上⾯的均值u、标准差σ要哪⾥来?其实⽹络⼀旦训练完毕,参数都是固定的,这个时候即使是每批训练样本进⼊⽹络,那么BN层计算的均值u、和标准差都是固定不变的。我们可以采⽤这些数值来作为测试样本所需要的均值、标准差。
对于测试集均值和⽅差已经不是针对某⼀个Batch了,⽽是针对整个数据集⽽⾔。因此,在训练过程中除了正常的前向传播和反向求导之外,我们还要记录每⼀个Batch的均值和⽅差,以便训练完成之后按照下式计算整体的均值和⽅差:正则化网络
上⾯简单理解就是:对于均值来说直接计算所有batch u值的平均值;然后对于标准偏差采⽤每个batch σB的⽆偏估计。最后测试阶段,BN 的使⽤公式就是:
5.Batch Normalization的作⽤
1)改善流经⽹络的梯度
2)允许更⼤的学习率,⼤幅提⾼训练速度:
你可以选择⽐较⼤的初始学习率,让你的训练速度飙涨。以前还需要慢慢调整学习率,甚⾄在⽹络训练到⼀半的时候,还需要想着学习率进⼀步调⼩的⽐例选择多少⽐较合适,现在我们可以采⽤初始很⼤的学习率,然后学习率的衰减速度也很⼤,因为这个算法收敛很快。当然这个算法即使你选择了较⼩的学习率,也⽐以前的收敛速度快,因为它具有快速训练收敛的特性;
3)减少对初始化的强烈依赖
4)改善正则化策略:作为正则化的⼀种形式,轻微减少了对dropout的需求
你再也不⽤去理会过拟合中drop out、L2正则项参数的选择问题,采⽤BN算法后,你可以移除这两项了参数,或者可以选择更⼩的L2正则约束参数了,因为BN具有提⾼⽹络泛化能⼒的特性;
5)再也不需要使⽤使⽤局部响应归⼀化层了(局部响应归⼀化是Alexnet⽹络⽤到的⽅法,搞视觉的估计⽐较熟悉),因为BN本⾝就是⼀个归⼀化⽹络层;
6)可以把训练数据彻底打乱(防⽌每批训练的时候,某⼀个样本都经常被挑选到,⽂献说这个可以提⾼1%的精度)。
6.Batch Normalization的缺点
1)受batch_size⼤⼩的限制
BN是以batch为单位计算归⼀化统计量的,当⼀个batch样本数很少时,少量样本的均值和⽅差⽆法反映全局的统计分布,所以基于少量样本的BN的效果会变得很差。在⼀些场景中,⽐如说硬件资源受限,在线学习等场景,BN是⾮常不适⽤的。(在Transformer中使⽤的是Layer Normalization,受硬件的限制,Bert⼀般训练的批次都不⼤)
2)⽆法很好的应⽤于RNN中
在⼀个batch中,通常各个样本的长度都是不同的,当统计到⽐较靠后的时间⽚时,这时可能只有很少的样本数据为⾮零值,基于这些仍有数据的少量样本的统计信息不能反映全局分布,所以这时BN的效果并不好。
另外如果在测试时我们遇到了长度⼤于任何⼀个训练样本的测试样本,我们⽆法到保存的归⼀化统计量,所以BN⽆法运⾏。
四、Layer Normalization
LN是⼀个独⽴于batch size的算法,所以⽆论⼀个batch样本数多少都不会影响参与LN计算的数据量,从⽽解决BN的两个问题。LN的做法是根据样本的特征数做归⼀化。
设 H是⼀层中隐层节点的数量,l 是隐藏的层数,我们可以计算LN的归⼀化统计量(均值)和(标准差):
五、Batch Normalization和Layer Normalization的对⽐分析
Batch Normalization 的处理对象是对⼀批样本, Layer Normalization 的处理对象是单个样本。
Batch Normalization 是对这批样本的同⼀维度特征(每个神经元)做归⼀化, Layer Normalization 是对这单个样本的所有维度特征做归⼀化。
LN不依赖于batch的⼤⼩和输⼊sequence的深度,因此可以⽤于batch-size为1和RNN中对边长的输⼊sequence的normalize操作。但在⼤批量的样本训练时,效果没BN好。
实践证明,LN⽤于RNN进⾏Normalization时,取得了⽐BN更好的效果。但⽤于CNN时,效果并不如BN明显。
以上内容是对如下的总结
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论