在深度学习领域,标准化(Normalization)技术是加速模型训练、提升模型稳定性和性能的关键技术之一。其中,批量标准化(Batch Normalization, BN) 和 层标准化(Layer Normalization, LN) 是两种最常见的标准化方法。
对于卷积神经网络(CNN)等在计算机视觉领域的常见模型,BN无疑是标配。然而,在自然语言处理(NLP)的Transformer模型中更长用的是LN。
为什么Transformer选择了LayerNorm,而不是效果卓著的BatchNorm呢? 要回答这个问题,我们必须从BN和LN的内部工作原理以及它们所面向的数据特性入手。
什么是批量标准化(Batch Normalization)?
BN的核心思想是在神经网络的每一层输入端,对一个mini-batch的数据进行标准化处理。
具体来说,对于一个包含NNN个样本的mini-batch,BN会计算这个batch内每个特征维度的均值和方差,然后用这些统计量来对该特征进行标准化。
假设一个mini-batch的输入为 X={x1,x2,...,xN}X = \{x_1, x_2, ..., x_N\}X={x1,x2,...,xN},其中每个xix_ixi是一个DDD维的特征向量。对于第jjj个特征维度:
-
计算均值:
μj=1N∑i=1Nxij\mu_j = \frac{1}{N} \sum_{i=1}^{N} x_{ij}μj=N1∑i=1Nxij -
计算方差:
σj2=1N∑i=1N(xij−μj)2\sigma_j^2 = \frac{1}{N} \sum_{i=1}^{N} (x_{ij} - \mu_j)^2σj2=N1∑i=1N(xij−μj)2 -
标准化:
x^ij=xij−μjσj2+ϵ\hat{x}_{ij} = \frac{x_{ij} - \mu_j}{\sqrt{\sigma_j^2 + \epsilon}}x^ij=σj2+ϵxij−μj -
缩放和平移:
yij=γjx^ij+βjy_{ij} = \gamma_j \hat{x}_{ij} + \beta_jyij=γjx^ij+βj
其中 ϵ\epsilonϵ 是一个很小的常数以防止分母为零,γj\gamma_jγj 和 βj\beta_jβj 是可学习的参数,用于恢复数据的表达能力。
BN的优点:
- 有效缓解“内部协变量偏移”:这是BN最核心的贡献。通过将每一层的输入标准化,保证了输入的稳定性,让模型训练得更快、更稳。
- 允许使用更高的学习率:由于输入分布稳定,模型对参数更新的幅度不再那么敏感,因此可以设置更大的学习率来加速收敛。
- 具有一定的正则化效果:由于BN引入了基于mini-batch统计量的随机性,这在一定程度上起到了正则化的作用,可以减少对Dropout等正则化技术的依赖。
深入理解:什么是内部协变量偏移(Internal Covariate Shift)?
想象一下一个很深的神经网络,比如有几十层。当我们开始训练时,数据从第一层流向最后一层。在反向传播过程中,每一层的权重都会被更新。
这就带来一个问题:对于网络中的某一层(比如第10层)来说,它的输入来自于前面9层的计算结果。当这9层的权重在每次迭代中都发生变化时,第10层接收到的输入的数据分布也在不断地变化。
这种训练过程中,网络内部节点数据分布的不断变化,就被称为“内部协变量偏移”(Internal Covariate Shift)。
它为什么是个问题?
- 学习速度变慢:每一层都需要不断地去适应前一层带来的数据分布变化,就像一个追着移动靶心射击的射手,很难快速稳定地命中目标。
- 容易陷入梯度饱和区:对于像Sigmoid或Tanh这样的激活函数,如果输入值过大或过小,会落入梯度接近于0的“饱和区”。输入分布的剧烈变化,使得神经元的输出更容易进入这些区域,导致梯度消失,训练停滞。
BN如何解决ICS?
BatchNorm的思路非常直接:既然输入的分布在变,那我就在每一层强制把它“掰”回来!
BN通过在每一层激活函数之前,将该层的输入重新标准化为均值为0,方差为1的标准正态分布。
这样一来,无论前面的层如何变化,对于当前层来说,它看到的输入分布都是相对稳定的。这极大地缓解了ICS问题,使得:
- 可以使用更高的学习率:不用再小心翼翼地调整学习率来适应变化的分布,可以大胆地加速训练。
- 激活函数更加“舒适”:输入被控制在激活函数梯度较大的区域,避免了梯度饱和问题。
这就是BN能够显著加速模型收敛并提升稳定性的核心原因。
然而BN不适合处理变长序列的情况。在NLP任务中,一个batch内的句子或序列长度往往是不同的。通常我们会通过padding的方式将它们补齐到相同的长度。但如果使用BN,它会把padding的部分也计算在内,这会引入噪声,干扰正常的标准化过程。对于不同长度的序列,BN需要为每个时间步维护一套统计量,这在推理时会变得非常复杂。
什么是层标准化(Layer Normalization)?
为了解决BN在循环神经网络(RNN)和变长序列上的问题,Layer Normalization被提了出来。
与BN不同,LN的标准化是在单个样本内部进行的。它计算每一个样本所有特征的均值和方差,然后用这些统计量来对该样本进行标准化。
假设我们有一个DDD维的特征向量xix_ixi:
-
计算均值:
μi=1D∑j=1Dxij\mu_i = \frac{1}{D} \sum_{j=1}^{D} x_{ij}μi=D1∑j=1Dxij -
计算方差:
σi2=1D∑j=1D(xij−μi)2\sigma_i^2 = \frac{1}{D} \sum_{j=1}^{D} (x_{ij} - \mu_i)^2σi2=D1∑j=1D(xij−μi)2 -
标准化:
x^ij=xij−μiσi2+ϵ\hat{x}_{ij} = \frac{x_{ij} - \mu_i}{\sqrt{\sigma_i^2 + \epsilon}}x^ij=σi2+ϵxij−μi -
缩放和平移:
yij=γx^ij+βy_{ij} = \gamma \hat{x}_{ij} + \betayij=γx^ij+β
注意,这里的γ\gammaγ和β\betaβ是全局共享的,而不是像BN那样每个特征维度都有一套。
LN的优点:
- 与Batch Size无关:LN的计算完全在单个样本内部进行,所以它不受batch size大小的影响。
- 天然适用于变长序列:对于不同长度的序列,LN为每个序列独立计算统计量,不受padding的影响,非常适合处理NLP中的变长输入。
Transformer为什么选择LayerNorm?
现在我们可以总结出Transformer选择LN的核心原因了:
-
NLP任务的特性:Transformer主要用于处理NLP任务,而文本数据天然就是变长的。BN在处理变长序列时存在固有缺陷,而LN则能很好地适应这种数据特性。对每个序列(样本)独立进行标准化,可以确保不同长度的句子之间不会相互干扰。
-
对Batch Size的不敏感性:在训练大型Transformer模型时,由于显存的限制,我们往往只能使用较小的batch size。BN在小batch size下性能会急剧下降,而LN则完全没有这个问题,保证了训练的稳定性。
-
训练稳定性:有研究表明,LN相比BN能提供更平滑的梯度和更稳定的训练动态,尤其是在像Transformer这样深层的模型中。
一个形象的例子
想象一下我们有一批学生(一个batch),每个学生都选修了不同的课程(特征维度)。
- BatchNorm:相当于对每一门课程(特征),计算所有选了这门课的学生的平均分和方差,然后对每个学生在这门课上的成绩进行标准化。如果某个batch里只有一两个学生选了某门冷门课,那这个标准化就没太大意义了。
- LayerNorm:相当于对每一个学生,计算他所有已选课程的平均分和方-差,然后对他自己的所有成绩进行标准化。这样,每个学生的成绩都是基于他自己的表现来调整的,与其他学生无关。
对于Transformer来说,每个“学生”就是一个独立的句子(序列),句子的长度和内容千差万别。因此,采用LayerNorm这种“因材施教”的标准化方式,显然比BatchNorm那种“一刀切”的方式更加合理。
896

被折叠的 条评论
为什么被折叠?



