为什么Transformer使用LayerNorm而不是BatchNorm?

在深度学习领域,标准化(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个特征维度:

  1. 计算均值
    μj=1N∑i=1Nxij\mu_j = \frac{1}{N} \sum_{i=1}^{N} x_{ij}μj=N1i=1Nxij

  2. 计算方差
    σj2=1N∑i=1N(xij−μj)2\sigma_j^2 = \frac{1}{N} \sum_{i=1}^{N} (x_{ij} - \mu_j)^2σj2=N1i=1N(xijμj)2

  3. 标准化
    x^ij=xij−μjσj2+ϵ\hat{x}_{ij} = \frac{x_{ij} - \mu_j}{\sqrt{\sigma_j^2 + \epsilon}}x^ij=σj2+ϵxijμj

  4. 缩放和平移
    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

  1. 计算均值
    μi=1D∑j=1Dxij\mu_i = \frac{1}{D} \sum_{j=1}^{D} x_{ij}μi=D1j=1Dxij

  2. 计算方差
    σi2=1D∑j=1D(xij−μi)2\sigma_i^2 = \frac{1}{D} \sum_{j=1}^{D} (x_{ij} - \mu_i)^2σi2=D1j=1D(xijμi)2

  3. 标准化
    x^ij=xij−μiσi2+ϵ\hat{x}_{ij} = \frac{x_{ij} - \mu_i}{\sqrt{\sigma_i^2 + \epsilon}}x^ij=σi2+ϵxijμi

  4. 缩放和平移
    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的核心原因了:

  1. NLP任务的特性:Transformer主要用于处理NLP任务,而文本数据天然就是变长的。BN在处理变长序列时存在固有缺陷,而LN则能很好地适应这种数据特性。对每个序列(样本)独立进行标准化,可以确保不同长度的句子之间不会相互干扰。

  2. 对Batch Size的不敏感性:在训练大型Transformer模型时,由于显存的限制,我们往往只能使用较小的batch size。BN在小batch size下性能会急剧下降,而LN则完全没有这个问题,保证了训练的稳定性。

  3. 训练稳定性:有研究表明,LN相比BN能提供更平滑的梯度和更稳定的训练动态,尤其是在像Transformer这样深层的模型中。

一个形象的例子

想象一下我们有一批学生(一个batch),每个学生都选修了不同的课程(特征维度)。

  • BatchNorm:相当于对每一门课程(特征),计算所有选了这门课的学生的平均分和方差,然后对每个学生在这门课上的成绩进行标准化。如果某个batch里只有一两个学生选了某门冷门课,那这个标准化就没太大意义了。
  • LayerNorm:相当于对每一个学生,计算他所有已选课程的平均分和方-差,然后对他自己的所有成绩进行标准化。这样,每个学生的成绩都是基于他自己的表现来调整的,与其他学生无关。

对于Transformer来说,每个“学生”就是一个独立的句子(序列),句子的长度和内容千差万别。因此,采用LayerNorm这种“因材施教”的标准化方式,显然比BatchNorm那种“一刀切”的方式更加合理。

### LayerNormTransformer 中的应用原因 Transformer 模型中广泛使用 Layer Normalization(LayerNorm),而不是 Batch Normalization(BatchNorm),这是由 Transformer 的结构特性和任务需求所决定的。BatchNorm 在 CNN 中表现出色,因为它通过在批次维度上进行归一化,能够加速训练并提升模型稳定性。然而,在 Transformer 这类处理变长序列的任务中,BatchNorm 的局限性变得明显。 BatchNorm 的核心机制是基于一个批次内的样本进行均值和方差的计算,这种做法在处理固定长度的输入时(如图像)是有效的。然而,在自然语言处理等任务中,序列长度可能差异较大,导致 BatchNorm 无法有效统计每个位置的特征分布。例如,在训练过程中,如果某个位置的 token 数量不足,BatchNorm 计算出的均值和方差会存在较大偏差,从而影响模型性能。此外,BatchNorm 在测试阶段依赖于训练时累积的统计信息,当测试集中出现比训练集更长的序列时,这些统计信息可能无法覆盖新增位置的特征分布,从而导致性能下降 [^3]。 相比之下,LayerNorm 通过在每个样本的所有特征维度上进行归一化,而不是在批次维度上,解决了上述问题。具体来说,LayerNorm 对输入张量的最后一个维度(通常是特征维度)进行归一化,确保每个样本都能独立地进行标准化,而不会受到批次内其他样本的影响。这种特性使得 LayerNorm 更适合处理变长序列和自注意力机制中的特征交互。例如,在 Transformer 中,每个位置的向量代表了不同的语义特征,直接在这些特征上进行归一化更有意义,而 BatchNorm 由于依赖批次统计量,难以适应这种动态变化的输入结构 [^2]。 ### LayerNormTransformer 中的具体应用位置 在 Transformer 模型中,LayerNorm 被广泛应用于多个关键模块,以提升模型的训练效率和稳定性。具体来说,LayerNorm 通常被应用在以下两个位置: 1. **多头注意力机制(Multi-Head Attention)之后**:在 Transformer 的自注意力模块中,输入经过多头注意力计算后,输出会通过一个 LayerNorm 层,以确保后续操作的输入分布稳定。这一设计有助于缓解梯度消失问题,并提升模型对长距离依赖关系的建模能力。 2. **前馈神经网络(Feed-Forward Network, FFN)之后**:在每个 Transformer 编码器和解码器的子层中,前馈神经网络的输出也会经过 LayerNorm 处理。这一操作确保了非线性变换后的特征分布保持一致性,从而提高模型的泛化能力。 以下是一个简化版的 Transformer 编码器层实现,展示了 LayerNorm 在其中的具体应用: ```python import torch import torch.nn as nn class TransformerEncoderLayer(nn.Module): def __init__(self, d_model=512, num_heads=8, dim_feedforward=2048, dropout=0.1): super(TransformerEncoderLayer, self).__init__() self.self_attn = nn.MultiheadAttention(d_model, num_heads, dropout=dropout) self.linear1 = nn.Linear(d_model, dim_feedforward) self.dropout = nn.Dropout(dropout) self.linear2 = nn.Linear(dim_feedforward, d_model) self.norm1 = nn.LayerNorm(d_model) self.norm2 = nn.LayerNorm(d_model) self.dropout1 = nn.Dropout(dropout) self.dropout2 = nn.Dropout(dropout) def forward(self, src): src2 = self.self_attn(src, src, src)[0] src = src + self.dropout1(src2) src = self.norm1(src) src2 = self.linear2(self.dropout(torch.relu(self.linear1(src)))) src = src + self.dropout2(src2) src = self.norm2(src) return src ``` 在上述代码中,`self.norm1` 和 `self.norm2` 分别对应多头注意力和前馈网络后的 LayerNorm 操作。通过这种设计,Transformer 能够在每一层都保持特征分布的稳定性,从而提升整体的训练效率和模型性能。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

布鲁格若门

对你有用的话真是太好了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值