Transformer 架构及其变体
第 7 章 最终得到了一套稳定的文本到词元 ID 映射。本章继续追踪这些 ID 如何经过仅解码器 Transformer:先进入嵌入层,再穿过一叠残差块,经过最终归一化,最后投影到词表。2017 年提出的 Transformer 在编码器-解码器系统中引入了注意力与前馈网络组成的基本块 (Vaswani et al. 2017)。现代因果语言模型沿用这套结构,但在归一化、位置处理、前馈网络、注意力头和缓存表示上各有不同。
这些差异并非表面风格。它们决定哪些位置可以交换信息、梯度怎样穿过深层网络、每个块包含多少参数,以及服务进程要为每条活跃序列保留多少状态。因此,一份有用的架构说明必须写明张量形状、掩码语义和内存单位,不能只画一个写着“Transformer”的方框。
范围:因果解码器
这里设一个批次包含 条长度为 的序列,模型宽度为 。分词器从大小为 的词表中输出整数 ID: 。嵌入表把它映射为初始残差流 。经过 个块和最终归一化后,输出矩阵生成覆盖整个词表的 logits:
其中, 是最后一个块的输出, 是最终归一化, 是输出矩阵,也称反嵌入矩阵, 是位置 的 logits, 是候选的下一词元 ID。因果条件 表示位置 只能依赖位置 及其之前的词元。编码器模型使用双向掩码,编码器-解码器模型还会加入交叉注意力。它们与这里的模型共享若干部件,但信息流契约并不相同。
输入嵌入与 可以共享参数,这种设计叫作权重绑定 (Press and Wolf 2017)。绑定会省去一张 矩阵,但也要求输入与输出两种用途共用同一组参数行。这是一项架构选择,不是由模型大小决定的规则。
一个块会更新同一条残差流两次
常见的前置归一化解码器块包含两次残差更新:
其中, 是块索引, 是块的输入, 和 分别是注意力与前馈网络产生的更新, 是加入注意力更新后的状态, 是块的输出。注意力在掩码允许的位置之间混合信息,前馈网络(FFN)则独立变换每个位置。两者都返回与残差流形状相同的张量,残差相加才有定义。
残差流(residual stream)是穿过整个堆叠的宽度为 的状态。称它为“流”有助于理解信息怎样逐层更新,但它不是独立的记忆模块,只是每个子层都会读取和修改的一组隐藏向量。
图中采用的是前置归一化。原始 Transformer 则在每次残差相加后做归一化 (Vaswani et al. 2017):
这里各符号的形状与前置归一化块相同,只是归一化器移到了残差相加之后。Xiong 等人解释了为什么前置归一化在初始化时具有更平稳的梯度,并可能减少对学习率预热的依赖 (Xiong et al. 2020)。这不代表后置归一化无效,初始化、残差缩放、深度和优化器设置都会改变比较结果。应记录准确的块方程,而不能只写“前置归一化”或“后置归一化”。
归一化控制尺度
LayerNorm 会把隐藏向量居中,并除以其标准差 (Ba et al. 2016)。均方根层归一化(RMSNorm)由 Zhang 和 Sennrich 于 2019 年提出,它省去均值减除,按均方根做归一化 (Zhang and Sennrich 2019):
其中, 是一个词元的隐藏向量, 是按均方根缩放后的向量, 是第 个分量, 是学到的逐元素缩放, 用来防止除零, 表示逐元素乘法。实现必须固定 、累加精度,以及是否包含可学习偏置。这些细节会影响检查点兼容性和低精度稳定性。
有些架构还会在查询与键做点积前分别归一化。QK 归一化解决的问题不同于残差流归一化,它限制的是注意力分数的尺度。模型清单应分别写明这两处归一化。
前馈网络提供逐位置容量
原始 Transformer 使用两张矩阵,并在中间放置 ReLU。常见的门控替代方案是 Swish 门控线性单元(SwiGLU) (Shazeer 2020):
其中, 是一个残差向量, 是逐元素门控后的中间表示, 分别是门控投影和值投影, 把结果投影回模型宽度, 是 FFN 隐藏宽度, 按元素计算。忽略偏置时,这种门控 FFN 有 个参数,两矩阵前馈网络有 个参数。
这个计数解释了常说的“三分之二”调整。隐藏宽度为 的普通 FFN 有 个参数。要让三矩阵门控 FFN 与之匹配,需要在按硬件友好倍数取整前令 。这个比例是参数预算规则,不是 SwiGLU 的固有属性。实际模型会选择不同的扩展比例;矩阵参数量相同,也不保证不同内核或硬件上的运行时间相同。
注意力与 FFN 的作用不同,但“一个负责存知识、另一个只负责路由”属于解释,不是张量不变量。消融实验可以定位行为,前向方程本身不能指定语义归属。
带显式形状的因果自注意力
对一条序列,设 ,并假定查询头、键头和值头的宽度相同。令 为查询头数, 为不同的键值头数, 为单个头的宽度。学到的投影产生
每个查询头 都会映射到一个键值头 。对查询位置 ,其输出为
其中, 是位置 上查询头 的查询, 和 是位置 上选中的键和值, 是加入掩码后的分数, 是归一化后的注意力权重, 是掩码。普通因果注意力在 时取 ,在 时取 。负无穷项经过 softmax 后概率为零。填充、打包文档、滑动窗口和前缀语言模型需要不同的掩码。
在常见初始化假设下,除以 可以防止分数方差随头宽度增长 (Vaswani et al. 2017)。把 个查询头的输出拼接起来,再经过输出投影,就得到宽度为 的残差更新。
当 且省略偏置时,查询投影和输出投影合计有 个参数,键投影和值投影合计有 个参数。标准 MHA 因此使用 个投影参数。GQA 与 MQA 会减少 K/V 投影项和缓存,但稠密查询-键交互仍按 扩展。
完整序列上的稠密注意力层会形成 个查询-键关系,因此算术量随 的平方增长。朴素实现还会显式生成 分数矩阵,但数学定义并不要求保留这块临时存储。
位置信息通过查询和键进入注意力
不带掩码、只看内容的自注意力具有置换等变性,打乱输入位置只会同样打乱输出。因果掩码虽然规定了方向,却没有为相同内容向量显式表示距离。旋转位置嵌入(RoPE)会按位置旋转查询和键中成对的坐标 (Su et al. 2024)。设参与旋转的宽度 为偶数,定义
其中, 是频率基数, 表示一对旋转坐标, 是该坐标对的角频率, 是词元位置。把所有 组成分块对角矩阵 ,则
这里 和 是旋转前的查询与键, 和 使用配置好的频率方案。最后一个恒等式表明,点积中的位置部分取决于相对偏移 。这并不意味着完整注意力分数只由距离决定,内容向量仍然参与计算。
频率基数、旋转维度占比,以及上下文扩展采用的任何缩放规则,都属于检查点契约。训练后更改它们属于适配实验,而不是元数据修改。RoPE 很常见,但不是唯一有效的位置方案。ALiBi 会对每个因果上有效的分数加入按头设置的线性距离惩罚 (Press et al. 2022):
其中, 是头 的固定斜率,对允许访问的历史位置有 , 是前文定义的因果掩码。ALiBi 不引入可学习的位置向量。无论采用哪一种方法,长上下文表现都取决于训练长度、频率或斜率配置、后续适配和评估分布。
预填充创建缓存,解码复用缓存
自回归服务会显露出整序列训练图没有展示的两个阶段。第一遍就是 预填充(prefill) 阶段:它一次读完整个提示词,在因果掩码下生成各位置的 logits,并把提示词的键和值写入缓存。最后一个提示词位置的 logits 用于预测第一个生成词元。不同位置可以并行计算,尽管服务系统可能把很长的预填充分块执行。第二阶段是 解码(decode):每条序列一次处理一个新位置,让新查询读取已经保存的历史键和值,选择或采样一个词元,把该位置的键和值追加到缓存,再重复这个过程。
在前缀固定的标准因果自注意力中,某一层过去位置的键和值不会因后续解码而改变。复用它们可以避免反复投影整个前缀。不过,稠密解码的每一步仍要读取保留的缓存,因此缓存既占容量,也消耗带宽。对长度不齐的批次,持久键值(KV)张量的有效载荷记作
其中, 是第 层每个位置保存的键值元素数, 是驻留序列数, 是第 条序列的缓存长度, 是注意力层数, 是第 层不同的 KV 头数, 和 是每个头的键和值元素数, 是每个缓存元素占用的字节数。若所有序列长度都为 ,并且 ,公式可化为 。真实服务还会产生分配块、元数据、填充或碎片、量化尺度、推测解码或束搜索状态、前缀共享和卸载等开销。上式计算的是稠密张量的有效载荷,不是进程总内存。
复用缓存后,每层为一个新词元执行稠密注意力的成本与历史长度 线性相关,这里省略头数和维度因子。若提示词长度为 ,之后生成 个词元,整个解码过程的注意力工作量与 成正比。缓存复用避免了重复投影前缀,却不会让长解码变成常数时间。
缓存随驻留词元数线性增长。它是否超过模型权重,取决于上述所有变量,以及权重和缓存精度。因此,不能把某一个交叉点说成 Transformer 的普遍属性。
图 8.4 采用明确假设:32 层、头宽度 128、每个 KV 元素两字节、批大小为一,以及 70 亿个两字节权重参数。MHA、GQA 与 MQA 三条线只改变 ,图中每个数值都直接来自缓存公式。
下面的可执行单元会输出每词元缓存有效载荷,以及缓存等于所述权重字节数时的上下文长度。可以修改批大小、精度或 KV 头数,测试不同的部署配置。
layers = 32
head_width = 128
bytes_per_kv_element = 2
batch_size = 1
parameter_count = 7_000_000_000
bytes_per_weight = 2
weight_bytes = parameter_count * bytes_per_weight
def kv_payload_bytes(sequence_length, kv_heads):
return (
2
* layers
* batch_size
* sequence_length
* kv_heads
* head_width
* bytes_per_kv_element
)
for name, kv_heads in [("MHA", 32), ("GQA", 8), ("MQA", 1)]:
bytes_per_token = kv_payload_bytes(1, kv_heads)
crossover_tokens = weight_bytes / bytes_per_token
cache_at_128k_gib = kv_payload_bytes(128_000, kv_heads) / 2**30
print(
f"{name}: {bytes_per_token / 1024:.0f} KiB/词元;"
f"128k 缓存={cache_at_128k_gib:.2f} GiB;"
f"在 {crossover_tokens:,.0f} 个词元时等于权重字节数"
)
MHA、GQA 与 MQA 改变 KV 头的共享方式
其中,多头注意力(MHA)使用 ,每个查询头都有自己的键头和值头 (Vaswani et al. 2017)。多查询注意力(MQA)使用 ,所有查询头共享一组键和值 (Shazeer 2019)。分组查询注意力(GQA)取中间值 ,把多个查询头映射到同一个 KV 头 (Ainslie et al. 2023)。
在稠密有效载荷公式下,其他维度不变时,从 MHA 改为 GQA 会把缓存缩小 倍;改为 MQA 则缩小 倍。这些是精确的存储比例,不是质量结论。Ainslie 等人报告称,可以把 MHA 检查点使用原始预训练算力的 5% 续训为 GQA,并在其实验中取得接近 MHA 的质量和接近 MQA 的速度 (Ainslie et al. 2023)。这说明 GQA 是有用的设计点,但不能证明某个 KV 头数适合所有模型和上下文长度。
MLA 改变缓存表示
DeepSeek-V2 引入的多头潜在注意力(MLA)主要不是通过共享传统 KV 头来节省缓存 (DeepSeek-AI 2024)。它把每个残差向量投影成低维潜在向量 ,再从中生成内容键和值。系统还会保留一小段独立的 RoPE 键分量,因为位置相关的旋转使完整键投影无法全部吸收到后续矩阵乘法中。
在 DeepSeek-V2 的构造里,每个位置的有效载荷为
其中, 是联合 KV 潜在宽度, 是解耦的 RoPE 键宽度,、、 和 与稠密缓存公式中的含义相同。DeepSeek-V2 取 、,即每个位置、每层缓存 个元素。传统等宽 MQA 缓存的是 个元素,所以 MLA 并非普遍比 MQA 更小。优化后的解码可以把上投影矩阵吸收到查询投影和输出投影中,无需显式重建完整的逐头 K 和 V。
DeepSeek 报告称,相比其 MHA 基线,MLA 所需缓存更少,并在受控消融列出的大多数指标上表现更好。这些结果支持论文中的架构和训练配方,但不是潜在注意力支配 GQA 的普遍定理。
区分算术量、临时内存与持久状态
多种技术都被称为“高效注意力”,但它们改变的是不同资源:
| 技术 | 是否改变注意力结果 | 主要改变的资源 | 仍然存在的成本 |
|---|---|---|---|
| FlashAttention | 不改变,在数值运算顺序差异范围内仍是精确稠密注意力 | HBM 传输与临时分数存储 | 稠密二次注意力算术和持久 KV 缓存 |
| MQA / GQA | 改变,查询头共享 K/V 投影 | KV 参数、缓存有效载荷与解码带宽 | 每个查询仍读取所有允许访问的缓存位置 |
| MLA | 改变,K/V 内容采用潜在分解 | 缓存表示及相关带宽 | 若不结合稀疏机制,仍覆盖所有位置 |
| 训练式稀疏注意力 | 改变,主要注意力只读取选中的位置或块 | 主要打分与值聚合的算术量和内存传输 | 选择器开销和缓存占用取决于具体设计 |
FlashAttention 注意力内核(FlashAttention)会分块计算精确注意力,因此无需把完整分数矩阵写入高带宽内存 (Dao et al. 2022)。它减少训练和预填充阶段的 IO 与临时激活内存,却不会自行改变解码时保留的历史键值元素数量。
稀疏注意力会改变数学连接方式。Native Sparse Attention 同时训练三条带门控的分支:压缩的粗粒度词元、选中的细粒度块,以及局部滑动窗口 (Yuan et al. 2025)。DeepSeek Sparse Attention(DSA)是另一种较晚的设计。它先用低维 lightning indexer 为历史词元排序,再让主 MLA 路径读取选出的 top- 子集 (DeepSeek-AI 2025)。主要注意力从全部 个历史位置转向 个位置,但 DeepSeek-V3.2 报告的索引器仍以较小维度计算所有查询与键的分数,因此仍是二次复杂度。选择器错误、继续训练成本和保留的缓存状态也必须计入。稀疏选择不会自动删除完整缓存。
不存在脱离工作负载的单一效率前沿。GQA 使用简单的稠密计算,并有按头数精确计算的存储公式。MLA 改变分解方式,在匹配的训练配方下可能进一步减少缓存。学习式稀疏直接减少覆盖的位置数,却增加了需要测量召回率和硬件效率的选择器。训练损失、长上下文任务质量、预填充吞吐量、解码延迟、驻留批大小和实现成熟度,可能让同一组候选方案得到不同排序。
分词器决定词表规模 ,也决定送入架构的序列长度。本章进一步固定模型宽度、块数、头维度、掩码语义、位置方案和缓存表示。这些选择会变成 第 10 章 与 第 31 章 面对的张量形状和内存需求。服务内核可以更高效地实现这些方程,却不能悄悄改变掩码、头映射或检查点参数行的含义。
把架构记录为一份契约
一份可复现的解码器规格至少应写明:
- 词表规模、嵌入宽度、输出投影形状和权重绑定方式;
- 块数、模型宽度、FFN 宽度、激活函数,以及所有偏置设置;
- 残差顺序、归一化位置、类型、epsilon 与计算精度;
- 查询头数、KV 头数、头宽度,以及查询到 KV 的映射;
- 注意力掩码、文档边界行为,以及任何局部或稀疏模式;
- 位置机制、RoPE 基数与旋转维度,以及缩放规则;
- 缓存表示、元素类型、量化尺度粒度,以及每词元有效载荷字节数;
- 最终归一化,以及任何 logit 缩放或裁剪。
“类似 LLaMA”或“使用 GQA”都不足以确定这些字段。序列化模型配置、检查点张量、训练代码和服务引擎必须遵守同一份契约。
在完整训练前完成验证
- 核对形状与参数量。 推导每个投影的形状,并与序列化张量中的参数总量核对,其中包括共享参数。
- 测试因果性。 改动未来词元,确认更早位置的 logits 不变;若模型使用填充、打包文档或前缀掩码,也要覆盖这些情况。
- 比较参考注意力实现。 在小张量上,把优化内核与直观的高精度实现比较,并声明数值容差。
- 测试缓存等价性。 在每个位置确认逐词元解码 logits 与完整前缀前向传播在容差内一致。
- 测量缓存字节数。 在不同批大小和序列长度下,对照声明公式比较已分配内存与有效载荷。
- 覆盖位置边界。 测试训练长度、部署上限,以及前缀缓存或序列打包使用的位置偏移。
- 消融架构选择。 在参数量、词元数和算力预算匹配的条件下,比较归一化、FFN、头共享与位置方案。
- 做端到端基准测试。 报告训练吞吐量、预填充延迟、解码延迟、最大驻留批大小,以及目标工作负载上的质量。
Transformer 块可以压缩成一页图,但它的契约从词元 ID 一直延伸到服务内存。只有把数学运算、张量布局和运行时表示分开说明,才能得到真正精确的架构定义。
延伸阅读
- Vaswani et al., “Attention Is All You Need,” 2017. arXiv:1706.03762Vaswani 等人提出 Transformer,一种完全基于多头注意力、无循环和卷积的序列转换架构,以更高并行性实现了当时最优的机器翻译质量。
- Ba et al., “Layer Normalization,” 2016. arXiv:1607.06450层归一化在单个训练样本的隐藏层内部计算归一化统计量,消除了对批大小的依赖,并稳定了循环神经网络的训练过程。
- Zhang & Sennrich, “Root Mean Square Layer Normalization” (RMSNorm), 2019. arXiv:1910.07467RMSNorm 去除 LayerNorm 的均值中心化步骤,仅用 RMS 统计量做归一化,在保持相近精度的同时将每步运行时间降低 7% 至 64%。
- Xiong et al., “On Layer Normalization in the Transformer Architecture,” 2020. arXiv:2002.04745本文用平均场理论证明,将层归一化置于残差块内部(Pre-LN)可在初始化时产生良好梯度,从而无需学习率预热即可训练 Transformer。
- Hendrycks & Gimpel, “Gaussian Error Linear Units (GELUs),” 2016. arXiv:1606.08415本文提出 GELU 激活函数,定义为 x 乘以高斯累积分布函数,在视觉、NLP 和自动语音识别(ASR)任务上均优于 ReLU 和 ELU。
- Shazeer, “GLU Variants Improve Transformer” (SwiGLU), 2020. arXiv:2002.05202本文提出将 SwiGLU、GEGLU 等 GLU 变体用于 Transformer 前馈网络(FFN)子层,替换 ReLU 激活函数,实验表明这些变体可降低困惑度并提升下游任务性能。
- Su et al., “RoFormer: Enhanced Transformer with Rotary Position Embedding” (RoPE), 2024. arXiv:2104.09864RoFormer 提出 RoPE(旋转位置嵌入),在自注意力中将词元位置编码为旋转矩阵,同时实现序列长度灵活性和随相对距离衰减的词元间依赖。
- Press et al., “Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation” (ALiBi), 2022. arXiv:2108.12409ALiBi 用与距离成线性比例的偏置替换位置嵌入,使模型在短序列上训练后能在推理时外推到更长序列,且不增加额外运行时开销。
- Press & Wolf, “Using the Output Embedding to Improve Language Models” (权重绑定), 2017. arXiv:1608.05859将神经语言模型的输入与输出嵌入矩阵绑定(weight tying),可降低困惑度,并将翻译模型参数量压缩至原来的不足一半而不损失性能。
- Shazeer, “Fast Transformer Decoding: One Write-Head is All You Need” (MQA), 2019. arXiv:1911.02150多查询注意力(MQA)在所有注意力头之间共享键和值,大幅降低增量解码的内存带宽需求,且质量损失极小。
- Ainslie et al., “GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints” (以接近 MQA 的成本达到接近 MHA 的质量,可从 MHA 续训得到), 2023. arXiv:2305.13245GQA 提出分组查询注意力(GQA),在多头注意力(MHA)与多查询注意力(MQA)之间插值,以接近 MQA 的推理速度达到接近 MHA 的质量,并提供仅用 5% 原始预训练算力将现有 MHA 检查点升训为 GQA 的方案。
- Dao et al., “FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness” (把「数字节」当作一个算法思想), 2022. arXiv:2205.14135FlashAttention 是一种 IO 感知的精确注意力算法,通过分块(tiling)与重计算减少高带宽显存(HBM)访问次数,实现更快的实际训练速度并将显存占用降至序列长度线性级别。
- DeepSeek-AI, “DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model” (提出多头潜在注意力(MLA)), 2024. arXiv:2405.04434DeepSeek-V2 是一个 236B 混合专家(MoE)语言模型,通过多头潜在注意力(MLA)和 DeepSeekMoE 将 KV 缓存压缩 93.3%,并将训练成本降低 42.5%。
- Yuan et al., “Native Sparse Attention: Hardware-Aligned and Natively Trainable Sparse Attention” (NSA,可训练的稀疏注意力), 2025. arXiv:2502.11089NSA 把稀疏注意力做成端到端可训练,而非事后加掩码:压缩、选择与滑窗三路层级设计,在保持全注意力质量的同时加速长上下文的训练与解码。
- DeepSeek-AI, “DeepSeek-V3.2: Pushing the Frontier of Open Large Language Models” (DeepSeek 稀疏注意力(DSA)投入生产), 2025. arXiv:2512.02556提出 DeepSeek 稀疏注意力(DSA),一种由 lightning indexer 驱动的细粒度稀疏注意力,最早随 DeepSeek-V3.2-Exp 上线,把长上下文注意力成本从 O(L^2) 降向 O(Lk),输出质量几乎不变。
- Touvron et al., “LLaMA: Open and Efficient Foundation Language Models,” 2023. arXiv:2302.13971LLaMA 发布了一系列仅使用公开数据训练的开放基础大语言模型(7B 至 65B 参数),通过在更多词元上训练较小模型,在推理阶段达到或超越更大专有模型的性能。
- Bai et al., “Qwen Technical Report,” 2023. arXiv:2309.16609Qwen 是在最多 3 万亿词元上训练的大语言模型系列,涵盖基础预训练模型、经 RLHF 对齐的对话模型,以及面向代码与数学的专用模型。
- Yang et al., “Qwen2 Technical Report,” 2024. arXiv:2407.10671Qwen2 是一组开放权重大语言模型(0.5B 至 72B,另含 57B-A14B 混合专家模型),在 7 万亿词元上训练,采用分组查询注意力、旋转位置嵌入、SwiGLU、直接偏好优化,并支持约 30 种语言。
- Yang et al., “Qwen2.5 Technical Report,” 2024. arXiv:2412.15115Qwen2.5 是一系列在 18 万亿词元上预训练、并经过监督微调(SFT)、直接偏好优化(DPO)和组相对策略优化(GRPO)后训练的大语言模型,涵盖 0.5B 至 72B 密集模型及混合专家(MoE)变体 Qwen2.5-Turbo 与 Qwen2.5-Plus。
评论
登录后评论