Transformer 架构有哪些变化
自2017年Transformer架构(“Attention Is All You Need”)问世以来,我们见证了Transformer在自然语言处理、计算机视觉、语音识别等领域的爆炸式应用。多年来,一系列改进逐渐提高了Transformer的稳定性、效率以及处理更大上下文窗口的能力。
这些改进的主要驱动力之一是大型语言模型(LLM)的快速发展。像GPT、LLaMA等模型已经扩展到数十亿甚至数万亿参数。有效训练这些模型需要:
- 高效利用数据:最大限度地减少批处理中不必要的填充,并利用动态序列打包等技术。
- 更长的上下文窗口:现代LLM通常需要数千甚至数万个token的上下文长度,这给模型准确编码位置信息的能力带来了巨大挑战。
- 训练稳定性:随着模型深度和规模的增长,确保稳定的梯度流变得更具挑战性,因此鲁棒的归一化策略至关重要。
- 计算效率:在保持或提高性能的同时,减少内存占用和计算时间是一项持续的工程挑战。
数据打包和位置信息
效率改进的一个具体例子是训练数据的组织方式。以前,批处理中的每个文档可能都被填充到固定的最大长度,如果文档很短,就会导致空间浪费。这通常看起来像:
[ Doc 1 ] [ lots of padding ]
[ Doc 2 ] [ lots of padding ]
...
现在,一种越来越常见的策略是更有效地将多个文档打包成单个序列或批处理,例如:
[ Doc 1 ] [Sep] [ Doc 2 ] [Sep] [ Doc 3 ] [Sep] [ less padding ]
[ Doc 4 ] [Sep] [ Doc 5 ] [Sep] [less padding]
...
这种“动态打包”或“高效训练数据打包”减少了填充,更好地利用了模型的上下文窗口。然而,这也意味着模型必须对位置信息非常精确:它需要知道在分隔符[Sep]
之后,位置“1”的token实际上属于**下一个**文档。这是将位置嵌入(特别是旋转位置嵌入(RoPE)等技术)集成到自注意力层的关键原因之一,这样即使新文档的token索引出现在批处理中间,也能正确处理。
简而言之,虽然大上下文窗口和最小填充提高了吞吐量,但它们也对模型的架构提出了更高的要求,以准确跟踪位置。现代Transformer设计已经适应了这些挑战,我们现在将详细探讨。
1. 位置编码与旋转嵌入
原始方法 (2017)
- 正弦位置编码:原始的Transformer设计通过使用固定的正弦模式,在输入嵌入层注入位置信息。每个token的嵌入都与相应的正弦向量相加,该向量编码了绝对位置(例如,token #1,token #2等)。
现代方法 (2025)
- 旋转位置嵌入 (RoPE):许多新架构不再在输入阶段添加位置编码,而是将位置信息直接整合到注意力机制中。
- 关键特性:
- 打包序列中的token索引:当多个文档连接到单个批次中时,RoPE可以更灵活地表示位置。每个注意力头可以精确地解释“文档2的token 1”是在某个
[Sep]
token之后,而不是盲目地对所有token应用一个单一的连续绝对索引。 - 更长的上下文窗口:通过在查询-键空间中通过旋转嵌入位置信息,模型可以更好地外推到更长的序列,而无需重新训练或重新设计嵌入层。
- 平滑集成:RoPE集成在注意力的Q/K向量中,因此位置信息仅在需要时使用——即在计算注意力分数时。
- 打包序列中的token索引:当多个文档连接到单个批次中时,RoPE可以更灵活地表示位置。每个注意力头可以精确地解释“文档2的token 1”是在某个
2. 前置层归一化
原始方法 (2017)
- 后置层归一化:在原始Transformer中,子层(自注意力或前馈网络)之后是“Add & Norm”步骤。因此,流程是:
- 子层(例如,注意力)
- 添加残差连接
- 应用层归一化
现代方法 (2025)
- 前置层归一化:许多新的Transformer将归一化步骤移到**子层之前**。流程变为:
- 应用层归一化(或 RMSNorm)
- 子层
- 添加残差连接
- 优点:
- 训练稳定性:经验证据表明,前置归一化可以显著减少训练不稳定性,特别是在更深的架构中。
- 梯度流:通过对每个子层的输入进行归一化,梯度能更一致地反向传播通过网络,从而缓解梯度爆炸或消失的问题。
- RMSNorm:一些变体用RMSNorm替换LayerNorm,RMSNorm根据其均方根归一化激活,在某些情况下可能更高效或更稳定。
3. 分组查询注意力
原始自注意力 (2017)
- 多头,单查询组:虽然原始的Transformer将查询、键和值分成多个头,但除了每个头的维度划分之外,它并没有明确地重新组织查询本身。
现代自注意力 (2025)
- 分组查询注意力:一种更先进的机制,它以一种可以实现以下目标的方式划分或分解查询向量:
- 提高效率:通过对查询进行分组,注意力内部的某些操作可以更有效地进行批处理或向量化。
- 鼓励专业化:每个查询组可能侧重于输入序列的不同方面或模式,可能充当专门的子注意力模块。
- 改进扩展性:随着上下文窗口的增长,分组查询方法有助于控制计算和内存成本,尽管具体实现方式各不相同。
分组查询注意力可以通过多种方式实现。在某些方法中,模型将查询分为独立的组,每个组关注不同的键子集。在其他方法中,分组更多地与查询维度的分解和处理方式有关。无论哪种方式,其原理都是允许更细致或更高效的注意力计算。
4. 整合所有改变
将这些思想整合起来,现代Transformer块可能看起来像这样:
- 输入:来自前一层的隐藏表示(或来自第一个块的嵌入层)。
- 前置归一化:对输入应用层归一化或RMSNorm。
- 自注意力(带旋转嵌入+分组查询):
- 每个查询-键对根据其位置通过RoPE进行旋转,确保模型动态处理位置信息。
- 查询可能被分组或分区以提高效率和表示能力。
- 残差连接:将注意力输出添加到此子层的输入中。
- 前馈网络的前置归一化:在前馈子层之前再次进行归一化。
- 前馈网络:一个多层感知机(通常带有GELU或ReLU激活函数)处理归一化的表示。
- 残差连接:将前馈子层的输出添加到其输入中。
- 输出:将其传递到下一个块(如果是最后一个块,则传递到最终预测层)。
5. 这些改变的重要性
处理更长的上下文和高效数据打包
- 现代语言模型通常每序列处理数千个token。从正弦位置编码到旋转位置嵌入的转变,使得模型能够更好地在这些大上下文和单个批次中的多个文档之间编码位置信息。
- 高效的数据打包(例如,
[Doc 1] [Sep] [Doc 2] [Sep] [Doc 3] ...
)变得更可行,因为模型可以灵活处理每个文档的token索引,而不会与单个、连续的位置编码混淆。
大规模训练的稳定性
- 前置层归一化已知能降低梯度爆炸/消失的风险。这对于训练具有数十亿或数万亿参数的模型至关重要,因为即使是微小的不稳定性也可能使整个训练过程脱轨。
改进的性能和效率
- 经验结果表明,这些设计选择——特别是前置归一化和分组查询注意力——可以降低语言建模任务的困惑度,并提高下游基准的性能。
- 它们还可以减少内存使用,并加快某些注意力计算,这对于在专用硬件(TPU、GPU)上进行大规模批处理训练至关重要。
与未来趋势保持一致
- 随着模型规模和上下文窗口的不断扩大,将位置信息集成到注意力层面并简化计算的技术,很可能仍将是Transformer研究的前沿。
6. 总结
从2017年原始Transformer块到类似Llama 3的块的演变,体现了微小但关键的架构改进如何显著提升大规模语言模型。通过:
- 在自注意力机制中嵌入位置信息(旋转位置嵌入),
- 将归一化移至前置层位置(前置层归一化或RMSNorm),
- 引入分组查询注意力以提高效率和表示能力,
- 并优化数据打包以最小化填充,
现代Transformer实现了更好的训练稳定性,能够处理更长的序列,并更有效地利用硬件资源。
随着研究的深入,我们可以期待更多专门的注意力机制和归一化策略,这得益于对更大模型和更多上下文的持续需求。尽管如此,这些现代改进是向前迈出的有力一步,确保了Transformer仍然是自然语言处理中各种复杂任务的首选架构。这些只是我不断学习到的一些变化,如果您知道更多改进,请在下面评论。
拓展阅读
- “Attention Is All You Need” (Vaswani et al., 2017):原始的Transformer论文。https://arxiv.org/abs/1706.03762
- 旋转位置嵌入:引入该技术以处理大上下文窗口并将位置信息无缝集成到Q/K向量中。例如:https://blog.eleuther.ai/rotary-embeddings
- 前置层归一化:来自实验室的研究显示,在非常深的Transformer网络中,前置归一化可提高稳定性。例如:https://sh-tsang.medium.com/review-pre-ln-transformer-on-layer-normalization-in-the-transformer-architecture-b6c91a89e9ab
- 分组查询注意力:开源库(PyTorch、JAX等)中各种用于高效扩展注意力的实验性实现。例如:https://www.ibm.com/think/topics/grouped-query-attention
- 数据打包策略:关于动态序列打包、最小化填充和最大化GPU利用率以进行大规模批处理训练的教程和博客。例如:https://www.carted.com/blog/variable-length-sequences-in-tensorflow-part-1