跳到主要内容

Transformer:从原始架构到现代组件

Transformer 不等于 Attention。它是一个组合架构,整合了 Token 表示、位置编码、注意力机制、前馈子层(FFN)、残差连接和归一化。2017 年的原始论文定义的是 Encoder-Decoder 结构;而当前主流的 Decoder-only 架构在多个细节上已发生显著变化。

文本怎样变成输入向量

分词器把文本转换为词表中的词元,再给出整数形式的词元编号(token ID)。一个 token 可以是整词、词的一部分、标点或字节级单元。如何切分、对应哪个编号,取决于分词器,不能只按语言判断。特殊词元还可以标记序列边界或消息角色。

用一个纯示意词表:BOS=0hello=1world=2。词元序列 [BOS, hello, world] 对应编号 [0,1,2]。模型从学习到的嵌入表 ERV×dE\in\mathbb R^{|\mathcal V|\times d} 中取出第 0,1,20,1,2 行,组成 3×d3\times d 的矩阵;加上批次维度后,形状为 [1,3,d]。编号只用于查表,不是数值测量,编号 2 的含义不是编号 1 的两倍。原始 Transformer 的第 3.4 节介绍了这种输入嵌入。

位置信息按下文的具体架构加入;之后,网络逐层生成依赖上下文的表示。输入词元的嵌入不自动等于适合检索的句子或文档向量。训练一节中的词表输出投影,则把“文本到向量”的过程接回“向量到词元”。

核心张量

对于输入 XRb×n×dX\in\mathbb{R}^{b\times n\times d},通过线性投影生成 Q/K/V。假设 Query 头数为 hqh_q,单头维度 dh=d/hqd_h=d/h_q,常见的张量形状如下:

Q: [batch, h_q, sequence, d_h]
K: [batch, h_kv, sequence, d_h]
V: [batch, h_kv, sequence, d_h]

注意力计算公式为:

Attention(Q,K,V)=softmax ⁣(QKdh+M)V.\operatorname{Attention}(Q,K,V)=\operatorname{softmax}\!\left(\frac{QK^{\top}}{\sqrt{d_h}}+M\right)V.

多头注意力(MHA)取 hq=hkvh_q=h_{kv},多查询注意力(MQA)取 hkv=1h_{kv}=1,介于两者之间的 GQA 取 1<hkv<hq1<h_{kv}<h_qGQA 论文也把 MHA 与 MQA 纳入其两个端点。MQA/GQA 主要减少 KV Cache 的访问流量,不减少 query 数量,也不保证质量不变。

上面的注意力公式需要按对应的头计算,不能直接把所列形状的 Q 和 K 张量相乘。若采用等大、连续分组,要求 hqh_q 能被 hkvh_{kv} 整除,令 r=hq/hkvr=h_q/h_{kv}。从零编号的第 ii 个 query 头使用第 g(i)=i/rg(i)=\lfloor i/r\rfloor 个 KV 头:

Oi=softmax ⁣(QiKg(i)Tdh+M)Vg(i).O_i=\operatorname{softmax}\!\left(\frac{Q_iK_{g(i)}^T}{\sqrt{d_h}}+M\right)V_{g(i)}.

例如八个 query 头、两个 KV 头时,query 0–3 共用 KV 头 0,query 4–7 共用 KV 头 1。每个输出形状为 [batch, sequence, d_h],八个输出拼接后恢复宽度 dd。把 K/V 按组显式重复可以演示计算含义,但高效内核可以直接共享,不必真正存储这些副本。

Block 不仅仅是 Attention

标准的前馈子层(FFN)定义为:

FFN(x)=W2ϕ(W1x+b1)+b2.\operatorname{FFN}(x)=W_2\phi(W_1x+b_1)+b_2.

现代 Block 常采用 SwiGLU 或 GEGLU,引入独立的 Gate 和 Value 投影。FFN 往往占据了 Block 中大部分的参数和计算量。

残差连接与归一化的顺序也有区别:

  • 原始 Post-Normy=LN(x+Sublayer(x))y=\operatorname{LN}(x+\operatorname{Sublayer}(x))
  • 常见 Pre-Normy=x+Sublayer(Norm(x))y=x+\operatorname{Sublayer}(\operatorname{Norm}(x))

Pre-Norm 通常使深层网络的训练更稳定,但它与 Post-Norm 在数学上并不等价。LayerNorm 会进行中心化和方差缩放;RMSNorm 仅按均方根进行缩放。记录配置时,应明确 epsilon 值、归一化位置(Pre/Post)以及是否包含 Bias,而不仅仅标注“使用了 Norm”。

归一化究竟沿哪个维度?

常规 Transformer 的 LayerNorm 对每个 token 的 dd 个特征独立归一化,不跨批次或序列位置。对单个 token 向量 xx,计算 γ(xμ)/v+ϵ+β\gamma\odot(x-\mu)/\sqrt{v+\epsilon}+\beta,其中 μ=d1ixi\mu=d^{-1}\sum_i x_iv=d1i(xiμ)2v=d^{-1}\sum_i(x_i-\mu)^2。RMSNorm 常用的无偏置形式为 γx/d1ixi2+ϵ\gamma\odot x/\sqrt{d^{-1}\sum_i x_i^2+\epsilon}。取 x=[1,3]x=[1,3]、缩放为一、偏置为零,手算时忽略 epsilon,LayerNorm 得到 [1,1][-1,1],RMSNorm 得到 [1,3]/5[1,3]/\sqrt5。二者都不使用 BatchNorm 那样的运行批次统计量,因此训练与推理时这部分计算一致。

FFN 在各 token 位置分别应用同一组权重;注意力负责混合位置。各头输出拼接后,还要经过学习到的输出投影,回到宽度 dd,才能与残差相加。

位置编码

没有位置信息或依赖顺序的掩码时,自注意力具有置换等变性:重新排列输入行,输出行也按相同方式排列。固定的因果掩码已经引入顺序,因此不具有这种任意置换对称性。

方法作用位置边界/限制
绝对位置向量加到 Token 表示上外推能力和长度上限取决于具体实现
相对位置 Bias修改 Attention Score与 Bias 形式及窗口大小绑定
RoPE旋转 Q/K 向量对,使点积包含相对位置信息需明确 Base 值、缩放策略及外推方法
ALiBi 类 Bias基于距离的 Score 偏置是一种特定的归纳偏置,并非所有场景最优

RoPE 在现代 Decoder 中非常普遍。但配置了长上下文窗口并不证明模型能有效检索远处信息,且位置缩放策略可能会牺牲短上下文的质量。

原始架构 vs 现代常见实例

组件原始 Transformer (2017)现代 Decoder-only 实例
拓扑结构Encoder-DecoderCausal Decoder Stack
归一化Post-LayerNormPre-RMSNorm 或 Pre-LayerNorm
位置编码正弦绝对位置编码RoPE 或相对位置 Bias
FFN 激活ReLUGELU, SwiGLU/GEGLU, 或 MoE
注意力头MHAMHA, MQA 或 GQA
计算内核常规矩阵运算Fused SDPA, FlashAttention

右列并非统一标准。例如,Llama 3 采用的 RMSNorm、RoPE、GQA 和 SwiGLU 是一个特定的架构组合;它既不能定义所有 Transformer,也不能将整体性能提升归因于单一组件。

形状与显存估算示例

假设 batch=2, n=128n=128, d=512d=512, h=8h=8,则 dh=64d_h=64

Q/K/V: [2, 8, 128, 64]
attention scores: [2, 8, 128, 128]
concatenated output: [2, 128, 512]

若 batch=1, n=4096n=4096, 8 个头,仅 Attention Score 矩阵的元素数量为:

8×40962=134,217,7288\times4096^2=134{,}217{,}728

按 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”并不能证明端到端的可用性。

网络堆叠在每个位置输出的是隐藏向量 htRdh_t\in\mathbb R^d,不是词元编号。词表投影 WvocabRd×VW_{\mathrm{vocab}}\in\mathbb R^{d\times|\mathcal V|} 生成 logit:zt=WvocabTht+bz_t=W_{\mathrm{vocab}}^Th_t+bSoftmax 与交叉熵把这些分数变成词表上的分布,并针对下一个词元目标计算训练损失。生成时从这个分布选择或采样词元;这里归一化的维度是词表项,注意力里归一化的维度则是 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 的范畴;本页仅维护可复用的架构边界定义。

探索关联打开关联网络