Transformer:从原始架构到现代组件
Transformer 不等于 Attention。它是一个组合架构,整合了 Token 表示、位置编码、注意力机制、前馈子层(FFN)、残差连接和归一化。2017 年的原始论文定义的是 Encoder-Decoder 结构;而当前主流的 Decoder-only 架构在多个细节上已发生显著变化。
文本怎样变成输入向量
分词器把文本转换为词表中的词元,再给出整数形式的词元编号(token ID)。一个 token 可以是整词、词的一部分、标点或字节级单元。如何切分、对应哪个编号,取决于分词器,不能只按语言判断。特殊词元还可以标记序列边界或消息角色。
用一个纯示意词表:BOS=0、hello=1、world=2。词元序列 [BOS, hello, world] 对应编号 [0,1,2]。模型从学习到的嵌入表 中取出第 行,组成 的矩阵;加上批次维度后,形状为 [1,3,d]。编号只用于查表,不是数值测量,编号 2 的含义不是编号 1 的两倍。原始 Transformer 的第 3.4 节介绍了这种输入嵌入。
位置信息按下文的具体架构加入;之后,网络逐层生成依赖上下文的表示。输入词元的嵌入不自动等于适合检索的句子或文档向量。训练一节中的词表输出投影,则把“文本到向量”的过程接回“向量到词元”。
核心张量
对于输入 ,通过线性投影生成 Q/K/V。假设 Query 头数为 ,单头维度 ,常见的张量形状如下:
Q: [batch, h_q, sequence, d_h]
K: [batch, h_kv, sequence, d_h]
V: [batch, h_kv, sequence, d_h]
注意力计算公式为:
多头注意力(MHA)取 ,多查询注意力(MQA)取 ,介于两者之间的 GQA 取 。GQA 论文也把 MHA 与 MQA 纳入其两个端点。MQA/GQA 主要减少 KV Cache 的访问流量,不减少 query 数量,也不保证质量不变。
上面的注意力公式需要按对应的头计算,不能直接把所列形状的 Q 和 K 张量相乘。若采用等大、连续分组,要求 能被 整除,令 。从零编号的第 个 query 头使用第 个 KV 头:
例如八个 query 头、两个 KV 头时,query 0–3 共用 KV 头 0,query 4–7 共用 KV 头 1。每个输出形状为 [batch, sequence, d_h],八个输出拼接后恢复宽度 。把 K/V 按组显式重复可以演示计算含义,但高效内核可以直接共享,不必真正存储这些副本。
Block 不仅仅是 Attention
标准的前馈子层(FFN)定义为:
现代 Block 常采用 SwiGLU 或 GEGLU,引入独立的 Gate 和 Value 投影。FFN 往往占据了 Block 中大部分的参数和计算量。
残差连接与归一化的顺序也有区别:
- 原始 Post-Norm:;
- 常见 Pre-Norm:。
Pre-Norm 通常使深层网络的训练更稳定,但它与 Post-Norm 在数学上并不等价。LayerNorm 会进行中心化和方差缩放;RMSNorm 仅按均方根进行缩放。记录配置时,应明确 epsilon 值、归一化位置(Pre/Post)以及是否包含 Bias,而不仅仅标注“使用了 Norm”。
归一化究竟沿哪个维度?
常规 Transformer 的 LayerNorm 对每个 token 的 个特征独立归一化,不跨批次或序列位置。对单个 token 向量 ,计算 ,其中 、。RMSNorm 常用的无偏置形式为 。取 、缩放为一、偏置为零,手算时忽略 epsilon,LayerNorm 得到 ,RMSNorm 得到 。二者都不使用 BatchNorm 那样的运行批次统计量,因此训练与推理时这部分计算一致。
FFN 在各 token 位置分别应用同一组权重;注意力负责混合位置。各头输出拼接后,还要经过学习到的输出投影,回到宽度 ,才能与残差相加。
位置编码
没有位置信息或依赖顺序的掩码时,自注意力具有置换等变性:重新排列输入行,输出行也按相同方式排列。固定的因果掩码已经引入顺序,因此不具有这种任意置换对称性。
RoPE 在现代 Decoder 中非常普遍。但配置了长上下文窗口并不证明模型能有效检索远处信息,且位置缩放策略可能会牺牲短上下文的质量。
原始架构 vs 现代常见实例
右列并非统一标准。例如,Llama 3 采用的 RMSNorm、RoPE、GQA 和 SwiGLU 是一个特定的架构组合;它既不能定义所有 Transformer,也不能将整体性能提升归因于单一组件。
形状与显存估算示例
假设 batch=2, , , ,则 :
Q/K/V: [2, 8, 128, 64]
attention scores: [2, 8, 128, 128]
concatenated output: [2, 128, 512]
若 batch=1, , 8 个头,仅 Attention Score 矩阵的元素数量为:
按 fp16 精度计算,仅 Score 矩阵就占用约 256 MiB 显存,这还未计入梯度、Softmax 中间值、Q/K/V 投影、FFN 以及多层堆叠的开销。FlashAttention 通过分块(Tiling)计算避免了显式存储完整的中间矩阵,从而降低内存峰值,但精确的全注意力计算复杂度在理论上仍是二次方。
训练与生成是两套系统
Causal LM 的训练阶段,已知完整序列,可以并行计算所有位置;而生成阶段是自回归的,每个 Token 都依赖于之前的输出。KV Cache 避免了重新计算旧的 K/V,但其主体大小正比于层数、上下文长度、K/V 头数、头维度、Batch 大小与每元素字节数的乘积。
性能报告应区分以下指标:
- Prefill 延迟与 Decode 延迟;
- 特定 Batch、Prompt/Output 长度及采样参数下的吞吐量;
- KV Cache 的量化、窗口、分页或 Offload 策略;
- 训练时的激活内存 vs 推理时的常驻内存;
- 内核实现、编译器、硬件及精度。
仅声称“支持 1M 上下文”或“使用 FlashAttention”并不能证明端到端的可用性。
网络堆叠在每个位置输出的是隐藏向量 ,不是词元编号。词表投影 生成 logit:。Softmax 与交叉熵把这些分数变成词表上的分布,并针对下一个词元目标计算训练损失。生成时从这个分布选择或采样词元;这里归一化的维度是词表项,注意力里归一化的维度则是 key。
以预测下一个 token 为例,训练输入为 [BOS, A, B],目标为 [A, B, EOS]。每个输入位置只能看到自身及更早输入;如果直接喂入未移位的目标,即使有因果掩码也会泄露答案。2017 年的编码器—解码器在解码器的掩码自注意力与 FFN 之间加入交叉注意力:解码器状态提供 query,编码器输出提供 key 和 value,可访问全部有效源位置,但仍须屏蔽源序列填充。
生成时先处理一次提示词(prefill),从末位置输出选出下一个 token,再把这个 token 送入整个网络栈(decode)。因果前缀未改变且缓存精确时,旧状态不依赖新追加的 token,因此旧 K/V 可复用。比较有无缓存的确定性输出时须关闭 dropout。缓存大小与复用条件详见注意力变体与 KV 缓存压缩。
架构家族
- Encoder-only:使用双向上下文,常用于表示学习或判别任务;
- Decoder-only:使用 Causal 目标,适合生成任务;
- Encoder-Decoder:分离输入编码与条件生成,适合序列转换任务;
- MoE Transformer:将 Token 路由到部分专家(Experts),增加总容量,但引入负载均衡、通信开销及路由失败风险。
这些标签不足以复现模型。Tokenizer、数据、训练目标、上下文课程(Curriculum)、优化器、后训练策略及工具协议往往比单个 Block 的细节对最终行为影响更大。
失败模式与反例
- Causal Mask 方向错误会导致未来 Token 泄露;
- Padding、Packing 或跨文档 Attention 可能导致训练数据污染;
- 长上下文中,中间位置的信息利用率可能低于首尾位置;
- Benchmark 或语料污染无法通过架构调整修复;
- RoPE 缩放、GQA、量化及融合内核在特定长度或精度下可能产生交互退化;
- 固定内存的流式任务中,RNN/SSM 可能比增长型 KV Cache 更合适;
- 局部视觉任务中,卷积的归纳偏置可能比 Attention 更节省数据。
最小复现配置卡
architecture: encoder | decoder | encoder-decoder
layers: N
width: d_model
attention: heads, kv_heads, head_dim, window, kernel
position: method, base, scaling, trained_length
norm: type, pre_or_post, epsilon
ffn: activation_or_gate, intermediate_width, experts
training: objective, data boundary, precision, optimizer, seeds
inference: cache, quantization, batch, prompt/output lengths
当前产品和 API 的对比属于 Frontier Radar 的范畴;本页仅维护可复用的架构边界定义。