第 3 章 核心组件
第3章 核心组件
本章覆盖 Transformer 的核心组件:编码器与解码器的层内结构,以及构成层的前馈网络、残差连接、层归一化与正则 化等基本构建块。本章聚焦包裹注意力的其余组件,注意力本身的计算细节不再赘述。
3.1 编码器层结构
编码器是 Transformer 中将输入序列转化为上下文表示的核心组件。原论文堆叠 N = 6 个结构相同的编码器层,每层将 上一层的输出作为输入,逐层精炼表示,如图3-1 所示。第一层接收词嵌入与位置编码之和,最后一层的输出直接送入解 码器的交叉注意力模块。
3.1.1 编码器层的标准组成
每个编码器层包含两个子层:多头自注意力(Multi-Head Self-Attention)和逐位置前馈网络(Position-wise FFN)。两 者均包裹在残差连接与层归一化中,计算公式为: Hℓattn = LayerNorm(Hℓ−1 + MultiHead(Hℓ−1 , Hℓ−1 , Hℓ−1 )) Hℓ = LayerNorm(Hℓattn + FFN(Hℓattn )) 输入和输出的维度始终保持 d ,保证层的可堆叠性。以上为原论文 Post-LN 写法,现代实现多采用 Pre-LN,两种放 model 置的训练特性差异在本章层归一化部分展开。 Input H^{ℓ-1} Multi-Head Self-Attention + Layer Norm Feed-Forward Network + Layer Norm Output H^{ℓ} 图3-1 一个编码器层的 Post-LN 计算流程
3.1.2 Self-Attention 子层
自注意力子层是编码器的信息整合单元。每个位置与序列中的所有位置(包括自身)计算注意力权重,生成融合全局上下 文的表示。与解码器不同,编码器不使用因果掩码,因此每个 token 都能看见整个输入序列,形成双向上下文表示。 原论文的标准配置中,d = 512,h = 8 个头,每个头 d = d = 64。对于长度为 n 的序列,自注意力的 Q-K 矩阵维度 model 为 n × n,计算复杂度为 O(n ⋅ d )。 k v model class EncoderSelfAttention(nn.Module): def forward(self, x): q, k, v = self.W_q(x), self.W_k(x), self.W_v(x)
3.1.3 两个子层的协同
scores = torch.matmul(q, k.transpose(-2, -1)) / math.sqrt(self.d_k)
# No causal mask: every position attends to all others
attn_weights = F.softmax(scores, dim=-1)
return torch.matmul(self.dropout(attn_weights), v)自注意力子层与逐位置前馈网络(Position-wise FFN)构成编码器层的分工体系。前者负责跨位置的信息路由——决定哪 些 token 应该被其他位置关注;后者负责信息转换,对路由后的表示逐位置做非线性变换。两者交替:注意力建立了全 局通信信道,FFN 在每个终端上加工信号。层层叠加后,编码器学会利用全局上下文进行复杂的语义组合。这种路由-加 工-路由-加工的交错设计,使浅层捕获局部句法特征(如词性搭配),深层聚合全局语义特征(如指代消解、语义角色标 注),形成了经典的层次化表示学习模式。
3.2 前馈神经网络
前馈神经网络(FFN)是编码器中每个层的第二个子层。虽然结构简单,FFN 占编码器总参数的约三分之二,是模型的知 识存储库和计算深度的主要来源。
3.2.1 位置逐元素的全连接层
FFN 的核心原则是 position-wise:对序列中每个位置独立执行相同的全连接变换,不同位置间不交换信息。这一设计使 FFN 在自注意力完成信息路由后,对各位置进行逐元素的语义变换: FFN(hi ) = ϕ(hi W1 + b1 )W2 + b2 其中 W ∈ R dmodel ×dff 扩展维度,W ∈ R 2 dff ×dmodel 压缩回原维度,ϕ 为激活函数。整个序列共享同一组参数,矩阵运算时 并行执行:
class PositionWiseFFN(nn.Module):
def __init__(self, d_model, d_ff, activation=F.relu):
super().__init__()
self.W1 = nn.Linear(d_model, d_ff)
self.W2 = nn.Linear(d_ff, d_model)
self.activation = activation
def forward(self, x):
return self.W2(self.activation(self.W1(x)))FFN 的计算量为 O(n ⋅ d model ⋅ dff ) ,与自注意力子层的 O(n ⋅ d 2 model ) 不同,前者对序列长度的依赖为线性。
3.2.2 ReLU 与 GeLU 激活函数
原论文使用 ReLU:ReLU(x) = max(0, x)。其计算简单,但存在死神经元问题和输出分布偏移。 2019–2022 年间的主流实现普遍采用 GeLU(Hendrycks & Gimpel, 2016): [1 + erf ( )] x GeLU(x) = x ⋅ Φ(x) = x ⋅ GeLU 以概率解释平滑门控:Φ(x) 是标准正态分布的累积分布函数,使负半轴仍有非零梯度,如图3-2 所示。实践中 GeLU 通常比 ReLU 带来约 0.5%-1% 的困惑度(Perplexity)改进。 ReLU(x)=max(0,x) x<0: gradient=0 Dead Neuron x<0: non-zero gradient Smooth Transition GeLU(x)=x·Φ(x) probabilistic gate Better Perplexity 图3-2 ReLU 与 GeLU 的门控行为对比 前沿模型还使用 SwiGLU(Shazeer, 2020)等门控变体,通过三组参数矩阵提升表达力,代价是增加约 50% 的 FFN 参数 量。 截至 2026 年,门控线性单元(Gated Linear Unit, GLU)已成为大模型 FFN 的事实标准:SwiGLU(以 SiLU 为门控)被 LLaMA-2/3、Qwen、DeepSeek、Mistral、PaLM、Gemma 等系列采用,GeGLU(以 GELU 为门控)常见于 FLAN-T5 等 T5 变体,二者均在训练稳定性与困惑度上优于无门控的 ReLU/GeLU 变体。
3.2.3 d_ff 与 d_model 的比值
d /d 是决定模型容量的关键超参数,如表3-1 所示。原论文取 4x(d = 2048,d model model = 512 )。后续模型中该比值有 所变化: ff ff 模型 dmodel dff 比值
Transformer-base 512 2048 4x
BERT-base 768 3072 4x
GPT-3 (175B) 12288 49152 4x
LLaMA-7B 4096 11008 ≈ 2.7x表3-1 主流模型的 FFN 维度配置 较小的比值减少参数量,适合资源受限场景;较大的比值增加中间表示容量。4x 是参数量、计算量与表达力之间的经验 平衡点。FFN 参数量为 2 ⋅ d ⋅ d = 8 ⋅ d (4 倍配置下)。 model ff model
3.2.4 FFN 可视为键值记忆
Geva et al. (2021) 提出 FFN 的键值记忆类比:第一层投影类似 lookup key,d 个神经元编码词汇级模式特征;第二层 投影类似 value retrieval,将模式映射回语义空间。 ff FFN(x) ≈ f (x ⋅ KT ) ⋅ V 其中 K = W 为键矩阵,V = W 为值矩阵。这一视角揭示:自注意力负责上下文相关的信息路由,FFN 负责上下文无 T 关的知识存储。两者分工互补,共同构成编码器的表达能力。
3.3 残差连接
残差连接是 Transformer 能够堆叠深层结构而保持稳定训练的核心机制。He et al. (2016) 在 ResNet 中首次引入,用于训 练 152 层的图像分类网络并取得 ImageNet 冠军。Vaswani 等人将其无缝适配到 NLP 领域,在 Transformer 的每个子层 中应用残差连接,这是编码器能够堆叠 6 层甚至更深的保障。
3.3.1 残差连接的动机与数学
深层网络面临退化问题:网络加深时训练误差不降反升。根本原因在于深层网络难以学习有效的恒等映射。残差连接通过 跳跃连接构造恒等路径: Output = x + F(x) 若子层函数 F(x) 无贡献(权重趋零),则 Output ≈ x,该子层退化为恒等映射。网络将学习目标从直接映射转化为学习 残差,后者通常更容易优化。
3.3.2 深层梯度传播的保障
class SublayerWithResidual(nn.Module):
def forward(self, x, sublayer):
return x + sublayer(x)残差连接对梯度流的保障可从反向传播角度诠释。设 x ℓ+1 = xℓ + Fℓ (xℓ ) ,梯度为: ∂L ∂L ∂Fℓ = ⋅ (I + ) ∂xℓ ∂xℓ+1 ∂xℓ 加法中的单位矩阵 I 是关键。逐层展开后,损失对浅层 x 的梯度中包含由纯 I 乘积构成的直通路径: ℓ L−1 ∂L ∂L ∂Fk = ⋅ ∏ (I + ) ∂xℓ ∂xL ∂xk k=ℓ 展开后至少有一项是 ∂L ∂L ⋅ IL−ℓ = ∂x 。即使中间子层的梯度极小,损失信号仍可通过恒等路径直达浅层,避免梯度消失, 如图3-3 所示。 ∂xL L gradient x_0 F_1 passes through '+' unchan ged + x_1 F_2 + x_2 ... x_L 图3-3 残差连接中梯度通过加法节点无损反向传播 加法节点的局部梯度为 1,不缩放信号,构成了从深层到浅层的直接梯度通路。
3.3.3 残差流的信息高速公路
残差流(residual stream)指贯穿所有层的恒等映射路径:输入嵌入进入残差流,每层子层将残差增量叠加其上。其核 心特性包括: •线性叠加:各层向残差流写入残差向量,贡献线性累加。 •维度恒定:始终维持 d ,不需层间变换。 model •信号保真:浅层表示可通过残差流无损传递到深层。 从机械可解释性(Mechanistic Interpretability)角度看,残差流是各注意力头和 FFN 神经元通信的共享带宽。每个组件 通过向残差流写入特定方向向量来影响下游计算,注意力写入上下文交互信息,FFN 写入知识信息。线性叠加结构极大便 利了模型内部过程的分析和归因,这是 Transformer 相比 RNN 隐状态在可解释性上的重要优势。 残差块是子层与恒等路径的包裹结构,而归一化在残差块中的放置位置深刻影响梯度行为与训练稳定性。这一交互是下一 节层归一化的主题。
3.4 层归一化
层归一化(Layer Normalization, LN)是保障深层 Transformer 稳定训练的关键技术。与批归一化沿 batch 维度归一化 不同,LN 沿特征维度归一化,对 batch size 不敏感,天然适配变长序列。
3.4.1 层归一化的数学定义
给定输入向量 x ∈ R ,层归一化计算其均值和标准差并做仿射变换: d d d 1 1 μ= ∑ xi , σ= ∑(xi − μ)2 + ϵ d i=1 d i=1 x−μ y=γ⊙ +β σ 其中 γ, β ∈ R 是可学习的缩放和偏移参数,ϵ 为数值稳定项。经 LN 后,每层激活的均值近似为 0、标准差近似为 1。 d
def layer_norm(x, gamma, beta, eps=1e-5):
mean = x.mean(dim=-1, keepdim=True)
var = x.var(dim=-1, keepdim=True, unbiased=False)
return gamma * (x - mean) / torch.sqrt(var + eps) + beta与批归一化不同,LN 对每个样本独立计算统计量,推理时无需维护全局 running statistics,在 batch size 为 1 或变长序 列场景下均能稳定工作。
3.4.2 Post-LN 与 Pre-LN 放置策略
根据 LN 在残差块中的相对位置,分为两种放置策略,如图3-4 所示: Post-LN(原论文方案): x → Sublayer(x) → Add(x) → LayerNorm ,LN 放在残差连接之后: Output = LayerNorm(x + Sublayer(x)) Pre-LN: x → LayerNorm → Sublayer → Add(x) ,LN 放在子层之前(Xiong et al., 2020):
Output = x + Sublayer(LayerNorm(x))
Pre-LN Post-LN
x + x + LayerNormLayerNorm Sublayer Sublayer 图3-4 Post-LN 与 Pre-LN 的残差块结构对比
3.4.3 梯度行为与训练稳定性
两种放置的本质差异在于恒等路径是否被 LN 覆盖。Post-LN 中,LN 对残差连接后的整体信号做归一化,即使恒等梯度路 径完好,反向传播仍需穿过 LN,其缩放因子 γ 在训练初期波动导致梯度方差膨胀。Pre-LN 中,LN 仅施加于子层输入, 恒等映射 x 完全不受 LN 影响,梯度通过加法节点直接传递而不被缩放。 Xiong et al. (2020) 对此给出了定量结论:Post-LN 的梯度方差随层数累积,而 Pre-LN 中恒等路径使各层梯度趋于均衡。 这直接体现在训练特性上: •Warmup 依赖:Post-LN 在 6 层规模下必须配合学习率 Warmup 才能稳定启动;Pre-LN 对 Warmup 的依赖远小于 Post-LN。 •深度上限:Post-LN 在深度超过 12 层时常出现训练初期发散和浅层梯度饥饿;Pre-LN 在 18 层和 30 层的 Transformer 上无需 Warmup 即可稳定收敛。 •工业采用:GPT、LLaMA、BLOOM 等大规模模型普遍采用 Pre-LN。其代价是浅层网络下的轻微性能下降,因归一化提 前限制了子层输入的灵活性;对深度超过 12 层的模型,稳定性收益远超此代价。 后续研究仍在改进两条路线:DeepNet 通过深层参数初始化补偿,使 Post-LN 也能训练极深网络;适当的初始化策略亦 有助于维持残差增量与恒等信号之间的范数平衡,避免子层输出过度主导残差流分布。但 Pre-LN 仍是更简洁、更普遍的 选择。
3.4.4 RMSNorm 与 QK-Norm
现代大模型普遍用均方根归一化(Root Mean Square Normalization, RMSNorm)替代标准 LayerNorm。RMSNorm 仅 保留 γ 缩放,去掉均值中心化与 β 偏置: x y=γ⊙ 1 d 2 d ∑i=1 xi + ϵ 省去均值与偏移的两次逐元素运算后,在几乎无损的前提下提升训练吞吐,LLaMA、Qwen、DeepSeek 等系列均采用。 2023 至 2024 年,QK-Norm(对 query 与 key 单独归一化)被证实能稳定深层 Transformer 的训练,避免注意力分数随 层数增长而发散,成为若干超深模型的标准配置。
3.5 正则化体系
残差连接与层归一化解决的是深度带来的优化难题,正则化面对的则是过拟合风险:编码器参数量大、训练语料有限,模 型有能力记住训练样本的表面模式。Dropout(Srivastava et al., 2014)是原论文的核心正则化方法,与标签平滑配合, 构成编码器的完整正则化体系。
3.5.1 Dropout 的三个放置位置
Vaswani 等人在编码器中指定了三个 Dropout 放置点,如图3-5 所示: •嵌入层之后:对嵌入与位置编码的加和结果施加 Dropout,迫使模型不依赖嵌入中的特定维度。 •子层输出之后:在残差连接前对子层输出施加 Dropout。Pre-LN 形式为 x + Dropout(Sublayer(LayerNorm(x)))。 •注意力权重之上:在 Softmax 后、与 V 相乘前,对注意力权重矩阵施加 Dropout。
class TransformerEncoderLayer(nn.Module):
def __init__(self, d_model, num_heads, d_ff, dropout_rate=0.1):
super().__init__()
self.self_attn = MultiHeadAttention(d_model, num_heads, dropout_rate)
self.ffn = PositionWiseFFN(d_model, d_ff)
self.norm1 = nn.LayerNorm(d_model)
self.norm2 = nn.LayerNorm(d_model)
self.dropout = nn.Dropout(dropout_rate)
def forward(self, x):
attn_out = self.self_attn(self.norm1(x))
x = x + self.dropout(attn_out)
ffn_out = self.ffn(self.norm2(x))
x = x + self.dropout(ffn_out)
return x
Embedding + Pos Encoding Dropout p=0.1 Encoder Stack Attention Weights Dropout Sublayer Output Dropout Sublayer Output Dropout 图3-5 编码器中 Dropout 的三个放置位置
3.5.2 注意力权重的 Dropout
注意力权重 Dropout 作用于 Softmax 后的注意力分布 α 上,以概率 p 将部分注意力权重置零并重新归一化。其正则化 效果在于迫使查询位置不依赖单一的键位置,从多个位置聚合信息。 ij 这一机制有两层作用: •防止注意力崩塌:Softmax 输出的分布可能极度集中,Dropout 强制增加注意力分布的熵。 •增强泛化:随机遮蔽注意力边,最终模式是众多随机子图的集成。 attn_weights = F.dropout(attn_weights, p=dropout_rate, training=self.training) attn_output = torch.matmul(attn_weights, v) 对于 n 个 token,注意力矩阵有 n × n 个元素。n 较小时 Dropout 影响有限;n 较大时则等效于稀疏化注意力图。
3.5.3 子层输出的 Dropout
子层输出 Dropout 直接作用于残差增量 F(x)。它与注意力权重 Dropout 有本质区别:前者作用于 d 维向量,后者作 model 用于 n × n 标量矩阵。 其正则化效果在于:随机关闭某些维度对残差更新的贡献,防止子层过度拟合。被置零的维度等效于该层在该维度上退化 为恒等映射。这种动态决策在深层网络中尤为有效。 配置方面,Transformer-base 中三种 Dropout 统一为 p = 0.1;Transformer-big 将嵌入 Dropout 提升至 p = 0.3,子层 Dropout 保持不变。现代大模型常使用更低的丢弃率(0.05 或 0.0),数据量增大后过拟合风险自然降低。
3.5.4 标签平滑的互补作用
标签平滑(Szegedy et al., 2016)不直接作用于模型内部,而是修改训练目标。对于 V 个类别的分类,one-hot 标签 y 替换为: y~k = { ϵ 1 − ϵ + Vϵ , k = true class V, otherwise 原论文取 ϵ = 0.1。其核心是不要求 100% 置信度,允许分配少量概率给其他 token,迫使 logits 更具区分性。 ls Dropout 与标签平滑形成互补,如表3-2 所示: 机制 作用对象 效果 Dropout 前向传播 随机抑制激活,防特征共适应 标签平滑 训练目标 软化标签,防模型过度自信 表3-2 编码器中的正则化机制 实验证据表明,两者叠加优于单独使用:在原论文 WMT 英德任务上,加入标签平滑后 BLEU 提升约 0.4-0.6 点。 需注意标签平滑会降低概率校准性(Müller et al., 2019)。在知识蒸馏场景中,若教师使用标签平滑,学生蒸馏效果可能 劣于无平滑教师。对依赖 token 概率置信度的推理任务,标签平滑的影响需谨慎评估。
3.6 解码器层结构
解码器是 Transformer 架构中负责生成输出序列的组件。与编码器将输入编码为上下文表示不同,解码器的任务是:以 自回归方式,逐 token 产生目标序列。本节从解码器层的内部结构入手,剖析其与编码器的设计差异及背后的动机。
3.6.1 三层子层的组成
标准 Transformer 解码器的每一层由三个子层堆叠而成,每个子层后接残差连接和层归一化,如图3-6 所示:
- 掩码多头自注意力(Masked Multi-Head Self-Attention):在解码器自身的输入序列上计算注意力,但通过掩码禁止 关注未来位置。
- 编码器-解码器注意力(Cross-Attention):以解码器当前表示作为 Query,以编码器的输出作为 Key 和 Value,实现 源语言信息的注入。
- 逐位置前馈网络(Position-wise FFN):与编码器相同的两层全连接网络,对每个位置独立做非线性变换。 形式化表示为,对第 l 层解码器,给定输入 H ∈ R : l−1 n×dmodel
Al = LayerNorm(Hl−1 + MaskedMHA(Hl−1 , Hl−1 , Hl−1 ))
Bl = LayerNorm(Al + CrossMHA(Al , HLe , HLe ))
Hl = LayerNorm(Bl + FFN(Bl ))其中 H 为编码器最后一层的输出,n 为目标序列长度。 L e Decoder Input Masked Multi-Head Self-Attention + LayerNorm Cross-Attention (Encoder Output) + LayerNorm Position-wise FFN + LayerNorm Decoder Output 图3-6 解码器单层的子层结构与残差连接
3.6.2 与编码器层的异同
解码器层与编码器层的主要差异可归纳为三点。第一,解码器多了交叉注意力子层,这是连接编码器和解码器的桥梁,使 生成过程能持续参考源序列的语义信息。第二,解码器的自注意力是掩码版本,禁止每个位置关注其后的 token,保证生 成过程的因果性。第三,两者的子层残差结构类似,但解码器的残差路径在交叉注意力处多了一条从编码器输出传入的数 据流。 共享的部分包括:都使用相同维度的前馈网络(d = 4 × d )、相同的层归一化位置(在原始论文中为 Post-LN,后 model 续变体多采用 Pre-LN),以及相同的多头注意力机制基础框架。 ff
3.6.3 解码器的整体信息流
从宏观视角看,N 层解码器构成了一条信息精炼通道。底层的解码器处理 token 级别的局部模式;随着层数加深,表示 逐步聚合更丰富的上下文信息。编码器的输出 H 在每一层解码器中都被重复使用:每一层的交叉注意力都接入同一份编 L 码器输出,但各层可以学习不同的关注模式,底层可能更关注词汇对齐,高层可能更关注句法结构。 e 最后,解码器顶层的输出经线性变换和 Softmax,产生对目标词汇表中每个 token 的概率分布: P = Softmax(HN d Wout + bout ) 其中 W ∈ R out dmodel ×∣V ∣ 将模型维度映射到词表大小。
3.6.4 自回归约束的体现
自回归约束是解码器设计的核心前提:在生成第 t 个 token 时,模型只能看到已生成的 t − 1 个 token,不能依赖任何未 来信息。这一约束在两个层面被严格执行。 在结构层面,掩码自注意力通过下三角矩阵形式屏蔽未来位置。在训练层面,使用教师强制(Teacher Forcing)策略—— 即使模型在上一步生成了错误的 token,训练时仍将正确的前缀输入解码器。这两项机制的细节分别在随后两节展开。自 回归约束使得解码器天然适合序列生成任务,但也带来了推理时无法并行化的问题,这是自回归生成的核心矛盾。
3.7 掩码自注意力与交叉注意力
掩码自注意力是解码器中第一个子层的核心机制。它继承了标准自注意力的计算框架,但通过引入因果掩码(Causal Mask),阻止每个位置获取来自后续位置的信息。这一设计是 Transformer 自回归生成能力的根基。
3.7.1 掩码的三角形矩阵形式
掩码自注意力的关键在于注意力分数矩阵上加一个掩码矩阵 M。对于长度为 n 的序列,M 是一个 n × n 的上三角矩阵, 其中未来位置被设为 −∞(实践中用一个很大的负值,如 −10 ),而当前及过去位置设为 0: 9 Mij = { 0, i≥j −∞, i<j 完整的计算流程如下:
- 计算未归一化的注意力分数 S = QK / d T k
- 加上掩码矩阵得到 S = S + M ′
- 对 S 的每一行做 Softmax ′ 由于 exp(−∞) = 0,未来位置的权重被精确置零。
import torch
def create_causal_mask(seq_len: int) -> torch.Tensor:
"""Create a lower-triangular causal mask. Returns a (seq_len, seq_len) mask where mask[i][j] = 0 if j <= i else -inf.
3.7.2 因果性与未来信息屏蔽
"""
mask = torch.triu(torch.full((seq_len, seq_len), float('-inf')), diagonal=1)
return mask因果性(Causality)是掩码自注意力背后的核心原则:模型的输出不能以任何形式依赖于尚未产生的输入。如果解码器
能偷看未来 token(如目标序列的正确答案),它学到的将是复制而非生成,这样的模型在推理时将完全失效。
因果掩码的效果可以从注意力矩阵的角度直观理解,如图3-7 所示。设序列为 ["
sos -> [sos, --, --, --]
I -> [sos, I, --, --]
love -> [sos, I, love, --]
AI -> [sos, I, love, AI]图3-7 因果掩码的注意力作用范围 这种设计使得每个位置在计算其表示时,聚合的上下文仅来自自身及之前的 token,天然符合自回归的因果顺序。
3.7.3 掩码 Softmax 的计算
掩码 Softmax 的数学形式与标准 Softmax 一致,区别在于加掩码后未来位置的指数值为零,从分母中被移除。对第 i 行: exp(Sij + Mij ) αij = i ∑k=0 exp(Sik ) 注意分母只求和到 k = i,因为 k > i 时 exp(−∞) = 0。这意味着第 i 个位置的注意力权重只在 [0, i] 范围内分配,总权重 和为 1。 以实际计算为例,设注意力分数矩阵为:
3.1 1.2 0.5 0.1
2.0 4.5 1.0 0.3
0.8 1.5 3.8 2.1
0.2 0.6 1.0 5.0
S=加上掩码后,上三角位置变为 −∞,Softmax 归一化后得到严格下三角的注意力权重矩阵。这一过程在 PyTorch 中常通 过 F.softmax(scores + causal_mask, dim=-1) 一行代码完成。
3.7.4 训练时的并行效率
掩码自注意力在训练时具有一个关键优势:尽管推理时只能逐 token 生成,但训练时可以并行计算整个目标序列的所有 位置的注意力。原因在于训练数据中完整的目标序列是已知的,教师强制策略将完整的目标序列一次性输入解码器,掩码 机制保证每个位置只看到正确的前缀。 具体来说,一次矩阵乘 QK 即可获得所有位置的未归一化分数。加上掩码后,一次 Softmax 即可产生所有位置的注意 T 力权重。这种并行性使训练效率远高于 RNN,后者因为隐状态依赖而必须串行计算时间步。 并行计算带来的代价是显存开销:注意力矩阵大小为 O(n ),当序列长度 n 较大时成为瓶颈。这也是 FlashAttention 等 高效注意力方法的出发点。 交叉注意力(Cross-Attention)是解码器中第二个子层,也是连接编码器和解码器的唯一信息通道。解码器通过交叉注 意力,在每个生成步动态地从编码器的输出中提取相关的源语言信息。
3.7.5 交叉注意力的 Query 来源
在交叉注意力中,Query 矩阵 Q 来自解码器的前一子层输出,即掩码自注意力经残差连接和层归一化后的结果。这代表 了解码器当前对目标序列的语义理解,以及它在这一步想找什么的检索意图。 具体来说,对第 l 层解码器,Query 来自该层第一个残差块的输出 A : l Qcross = Al Wcross Q 解码器通过 Query 将其对当前目标侧的理解投射到编码器输出的空间中,以找到源序列中与当前生成需求最相关的部 分。不同层和不同头可以独立学习各自的 Query 投影,从而在不同层次和子空间中发起检索。
3.7.6 Key 与 Value 的来源
Key 和 Value 矩阵来自编码器最后一层的输出 H 。编码器已对整个源序列完成了双向上下文编码,因此 H 的每一行都 L L 携带了源序列对应位置及其完整上下文的语义表示。 e e Kcross = HLe Wcross K , Vcross = HLe Wcross V Key 的维度决定了注意力分数矩阵的形状。设源序列长度为 m,目标序列长度为 n,则注意力分数矩阵 S ∈ R 共有 cross n×m n ⋅ m 个元素:行对应目标位置,列对应源位置,Key 与 Value 的数量由源序列长度 m 决定。在典型的机器翻译场景中, m 和 n 通常不同。
3.7.7 信息融合机制
交叉注意力的计算过程就是解码器查询编码器表示的过程,如图3-8 所示。对解码器的每个位置 i,其 Query q 与编码器 每个位置的 Key k 做点积,得到源序列各位置的相关性分数: i j qi ⋅ kj Sij = dk 经 Softmax 归一化后,用这些权重对编码器的 Value 加权求和,得到交叉注意力的输出。这一机制的直观理解是:解码 器在生成每个目标 token 时,都在浏览整个源序列,并决定当前应关注哪些源 token。 Decoder Query Encoder Output Cross-Attention Output "I need context for current token" Key vectors (what I contain) Compute Q·K^T similarity "Focus on positions with high scores" Weighted sum of Value vectors Fused context representation Decoder Query Encoder Output Cross-Attention Output 图3-8 交叉注意力的信息融合流程 多头交叉注意力的设计使解码器能同时关注源序列的不同方面。例如,一个头可能专注词汇对齐(哪个源词对应目标 词),另一个头可能关注句法结构(主谓宾的对应关系),这些互补的信息在拼接后被融合到一起。
3.7.8 多头交叉注意力的设计
交叉注意力的多头机制与自注意力共享相同的框架。对于 h 个头,每个头独立接收 Query、Key、Value 投影,在维度 d =d k /h 的子空间中计算注意力。所有头的输出拼接后,经最终线性投影还原到 d model 维度: model MultiHeadCross(Q, K, V) = Concat(head1 , … , headh )WO 与掩码自注意力的关键区别是,交叉注意力不加掩码。解码器在生成每一步时可以自由地关注源序列的任意位置,因为源 序列是完整已知的——它已经过编码器的双向编码,不需要因果约束。 这一差异带来了一个重要的计算特性:交叉注意力的注意力矩阵是完整的 n × m(目标长 × 源长),而非下三角。这使得 交叉注意力的计算和存储复杂度在训练时为 O(nm),在推理时由于 n = 1(每次只处理一个新 token)降为 O(m)。
3.8 归一化与激活演进
经典 LayerNorm 与 ReLU/GELU 在百亿参数以上的模型中暴露出两个问题:均值归零引入冗余计算,非门控激活对低精 度训练与深层堆叠不够友好。现代模型几乎全部迁移到 RMSNorm 与门控激活,本节依次介绍 RMSNorm、SwiGLU、 GeGLU、SiTU 与 QK-Norm,并对比它们与经典方案的差异,说明每一项改动解决的具体问题。
3.8.1 RMSNorm
层归一化(LayerNorm)同时计算均值与方差,并对特征做均值归零与方差缩放,这是经典方案。RMSNorm(Zhang and Sennrich, 2019)省去均值归零步骤,仅按均方根(Root Mean Square)缩放,其数学形式为: x RMSNorm(x) = ⊙γ 1 d 2 d ∑i=1 xi + ϵ 其中 γ 为可学习的逐维缩放参数,ϵ 为数值稳定项。相比 LayerNorm,RMSNorm 去掉了均值计算与减均值操作,保留的 均方根运算在数学上仍是各向同性的缩放,不会引入均值方向的偏差。从信息论角度看,减均值只移除一个维度的统计 量,而 Transformer 的残差流已经提供了足够的均值自由度,这一步骤的增益本就有限。 去掉均值项的理由是实证的。Ba 等人在原论文中论证均值归零有利于稳定训练,但在深层 Transformer 中,残差连接与 逐层归一化已经为激活提供了稳定的尺度,均值归零的边际收益递减,而省去一次全局归约能降低约三分之一的归一化开 销。对每层都有多个归一化点的 Transformer 而言,这一开销在训练与推理中都不可忽视,尤其在低精度矩阵计算成为 主力的今天,归约开销在算子时间中的占比反而上升。
def rms_norm(x, gamma, eps=1e-6):
# x: (batch, seq, dim), gamma: (dim,)
rms = torch.sqrt(x.pow(2).mean(dim=-1, keepdim=True) + eps)
return x / rms * gammaRMSNorm 自 LLaMA 起成为事实标准,DeepSeek、Kimi、Qwen 等现代模型全量采用。它与 Pre-Norm 放置配合,在 深层堆叠下提供稳定的梯度通路。RMSNorm 还简化了低精度实现:没有均值归零,就不会出现「先减均值再放大」带来 的精度损失,这一特性在 FP8 与 MXFP4 训练中尤为重要——均值归零产生的中心化数据在窄精度下的有效位数更少,去 掉它相当于为低位格式让出了表示范围。 从实现角度看,RMSNorm 的算子也更简单:只需一次平方、一次均值归约、一次开方取倒数与一次逐元素乘,而 LayerNorm 还要额外计算均值并做两次逐元素运算。在训练框架中,归一化算子位于每个子层之间,调用频繁,算子本 身的精简会放大为可观的墙钟收益。这也是为什么多数现代实现会把 RMSNorm 与注意力、FFN 的前置矩阵乘融合成单 次内核启动。
3.8.2 SwiGLU 与 GeGLU
门控线性单元(Gated Linear Unit, GLU)由 Dauphin 等人在 2017 年提出:将线性投影分为两路,一路经激活函数门 控,再与另一路逐元素相乘,为网络引入可学习的门控通路,使模型能够显式控制特征的通断。Shazeer(2020)系统评 估了 GLU 在 Transformer 中的多种变体,其中 SwiGLU 与 GeGLU 表现最优,成为现代 FFN 的标准形态: SwiGLU(x) = Swish(xW1 ) ⊙ (xW2 ), Swish(z) = z ⋅ σ(z) SwiGLU 用 Swish(SiLU)作门控激活,GeGLU 则用 GELU。两者都保留了 GLU 的两路结构,区别只在门控激活的选 择。与经典「ReLU 加 4 倍扩张」的 FFN 相比,门控 FFN 需要两套独立的投影矩阵,参数开销更大,因此通常将中间维 度压缩到约 8d/3,使总参数量与经典 FFN 相当。LLaMA 的 intermediate size 即按此比例设定,例如 4096 维模型配 11008 维中间层。这一比例并非随意:8/3 正好使两路投影加上输出投影的总参数量与单一 4d 投影加输出投影持平。
def swiglu_ffn(x, w_gate, w_up, w_down):
# gated FFN: hidden = silu(x @ w_gate) * (x @ w_up)
hidden = F.silu(x @ w_gate) * (x @ w_up)
return hidden @ w_down门控激活的收益在于表达力与正则化的双重改善。门控路径让模型按 token 内容决定每个特征维度的贡献,等价于在 FFN 内部引入了条件计算——不同 token 可以走不同的特征通路;同时,门控激活在负半轴的非线性行为抑制了无意义特 征,起隐式正则作用。实验表明,在相近参数量下 SwiGLU 的语言建模困惑度一致优于 ReLU 与 GELU。LLaMA 系列采用 SwiGLU,PaLM 采用 GeGLU,两者共同确立了门控激活在现代 FFN 中的统治地位。从实现角度看,SwiGLU 的两路线性 投影还可以融合为一次大矩阵乘法再切分,硬件利用率更高,这一工程细节也推动了它的普及。 门控激活的提升在模型规模增大时更显著。小模型的参数量有限,激活函数的差异常被其他因素淹没;当模型达到数十亿 参数,FFN 承担大部分记忆容量时,门控的「特征选择」能力直接影响知识存储的质量。这也解释了为何 SwiGLU 在 LLaMA 等大规模模型中成为标配,而在早期的 BERT-base 级别模型中,GELU 的差距并不明显。读者在设计自己的模型 时,应结合目标规模判断是否值得采用门控激活。
3.8.3 SiTU 激活函数
SiTU(Sigmoid Tanh Unit)由 Kimi K3 引入,是门控激活族的新成员。从名称看,它将 sigmoid 与 tanh 两类非线性以 乘法形式组合:sigmoid 提供平滑的软门控,tanh 提供有界且带饱和特性的主通路。官方博客未披露完整的参数化定 义,本节依据其所属门控激活族的共性做定性分析。 SiTU 的设计动机可以从两个角度理解。其一,tanh 的输出落在 (−1, 1) 有界区间内,激活幅值可控,配合低精度训练可 降低数值溢出风险;相比之下 Swish 的激活幅值无上界,在高维累加时可能产生大值,而大值在低位格式中需要更多缩 放余量,压缩了可表示的有效精度。其二,sigmoid 门控在输入接近零时处于近似线性区,保留了一阶导数的流动性,避 免了硬饱和激活(如阶跃)在深层堆叠中常见的梯度消失问题,同时 tanh 的远端饱和又提供了抑制噪声的机制。 Kimi K3 在 FFN 中采用 SiTU,替代或补充既有门控。SiTU 的引入说明激活函数的选择仍在持续演进:当数值精度成为训 练瓶颈后,激活的幅值特性与低精度格式的适配度成为新的选型标准——激活不仅要非线性足够强,还要让输出分布落在 低精度格式的高分辨率区间内。这也提示读者,激活函数不是「选完就固定」的组件,而是随精度与规模约束不断调优的 对象。 横向对比 SwiGLU、GeGLU 与 SiTU,可以归纳出门控激活的选型维度:门控的非线性形态(Swish、GELU、 Sigmoid)、主通路的非线性形态(恒等、tanh)以及幅值是否有界。SwiGLU 与 GeGLU 的主通路是恒等映射,幅值无 界;SiTU 的主通路是 tanh,幅值有界。低精度训练更偏好后者,而无需低精度约束的场景则可沿用前者。这一分析框架 可以帮助读者在面对新激活函数时快速定位它在设计空间中的位置。
3.8.4 QK-Norm
经典缩放点积注意力以 1/ d 缩放 query 与 key 的内积,防止点积值过大导致 softmax 饱和。当模型加深、head 维度 增大,或采用低精度训练时,这一缩放不再充分:注意力分数可能出现极端值,softmax 退化为近 one-hot 分布,梯度 k 趋于零,训练稳定性下降;在 FP8 等窄精度格式下,极端分数更容易直接溢出。QK-Norm 在点积前对 query 与 key 分别 施加归一化,逐头计算: q ′ = RMSNorm(q), k ′ = RMSNorm(k) 归一化后注意力分数的幅值被约束在稳定区间,softmax 分布更平滑,模型对学习率与深度的敏感度下降。QK-Norm 的 本质是把「除以固定标量」升级为「除以逐向量的范数」:后者不仅控制总体尺度,还消除了个别维度上的异常值对分数 的支配。从梯度角度看,逐向量归一化使每个查询的分数分布自适应,避免某些查询因嵌入范数大而支配全局注意力。 DeepSeek-V2 起在 MLA 中应用 QK-Norm,Qwen 等模型亦跟进。部分实现以固定缩放替代可学习参数以进一步降低开 销,也有实现将缩放并入归一化以统一低精度路径。QK-Norm 与 RMSNorm 的配合构成了现代注意力前端的标准配置。 它的意义在于:注意力机制不再依赖「精心缩放」的隐含假设,而是通过显式归一化获得对尺度变化的鲁棒性,这为更大 规模、更低精度的训练扫清了数值障碍。 从消融实验看,QK-Norm 的收益在短上下文模型上并不明显,因为短上下文中注意力分数的动态范围有限,固定缩放已 足够。但在长上下文与大 head 维度下,不同查询的键集合规模差异巨大,分数分布随之变化,固定缩放开始失效。这正 是 QK-Norm 在长上下文模型中成为标配的原因——它把「对长度鲁棒」内建进注意力本身,而非依赖某个精心挑选的缩 放常数。类似地,QK-Norm 也让模型对不同 head 的尺度差异更不敏感,减少了训练初期的敏感调参。
def qk_norm(q, k, gamma_q, gamma_k):
# per-head RMSNorm before dot product
q = rms_norm(q, gamma_q)
k = rms_norm(k, gamma_k)
return q, kModern 2026 Block GQA MLA QK-Norm Classic 2017 Block RMSNorm Residual LayerNorm MHA Attention ReLU FFN SwiGLU SiTU FFN 图3-9 经典与现代解码器块对比 归一化与激活的现代化是一场「减法与换元」:RMSNorm 减去均值归零,门控激活替换普通非线性,QK-Norm 为低精度 铺路。如图3-9 所示,现代解码器块的归一化与激活组件全部换了代,但放置位置与数据流骨架与经典 Pre-LN 结构保持 一致。四项改动的共同逻辑是「让数值更友好」:减去冗余统计量、约束激活幅值、归一化注意力分数,最终让模型在更 深、更大、更低精度的条件下稳定训练,这正是现代大模型规模的基石。
3.9 残差连接创新
残差连接是深层网络的梯度保障,但经典残差在极深堆叠与万亿参数规模下出现信息稀释与训练不稳。现代模型通过缩放 残差、可学习混合与注意力取回三种思路增强信息通路,代表方案是 DeepNorm、mHC 与 AttnRes。本节先回顾经典残 差的问题,再依次展开三种创新,说明各自解决的问题与适用的场景。
3.9.1 残差连接的经典设计
经典残差连接将子层输出加回恒等输入:x = x + Sublayer(x)。配合 Pre-Norm 放置,恒等路径构成贯穿全网的梯度高 ′ 速公路,是 12 层以上模型稳定训练的基础。残差连接的数学性质是梯度分解:输出对输入的导数恒含单位矩阵项,反向 传播时梯度可无损地沿恒等路径回传,避免深层网络的梯度消失。经典设计还指出,残差流可以被看作信息高速公路,各 层在其上读写增量信息,这一「读写」隐喻对理解后续的 mHC 与 AttnRes 尤其有用。 本节讨论的连接创新,本质都是在回答同一组问题:增量信息应该以多大比例写入残差流,信息是否只能沿相邻层流动, 深度方向是否需要注意力机制。三类方案给出了不同的答案,分别对应缩放、多路混合与选择性取回。理解这一问法,读 者就能举一反三地评估未来的连接创新。 经典设计有两个局限。其一,恒等路径主导时,深层子层的增量贡献被稀释:当子层输出远小于恒等输入,模型趋向于在 浅层完成大部分计算,深层子层的有效容量被浪费。实验观测显示,Pre-LN 模型深层的注意力与 FFN 输出范数远小于残 差流范数,深层更像「微调器」而非「计算器」。其二,当层数达到数百甚至上千层,或参数达到万亿规模时,表示逐渐 趋向塌缩(Representational Collapse),各层输出趋于同质化,单纯加法的表达能力见顶——所有层学习到相似的表 示,深度带来的收益递减。这两个局限驱动了残差机制的创新:要么显式控制残差与子层的比例,要么给信息通路增加可 学习的选择性。 经典残差「够用」的结论来自中等深度。当模型从几十层扩展到上百层,残差流的总范数随深度增长,而子层增量需要与 越来越大的残差流竞争,深层子层的相对贡献持续下降。这就是「深度收益递减」的数学根源。现代模型要么控制残差流 的总规模(DeepNorm 的缩放、Pre-Norm 的 RMSNorm),要么给深层子层更强的信息通路(mHC 的多路混合、 AttnRes 的选择性取回),本质都是对抗同一问题。
3.9.2 DeepNorm
DeepNet 由 Wang 等人于 2022 年提出,目标是让 Post-LN 结构也能训练极深网络。其核心是对残差路径显式缩放: x′ = x + α ⋅ Sublayer(x) 其中 α 按层数配置,配合子层权重的尺度初始化。缩放的作用是精确控制残差流与子层流的比例,抑制深层输出方差的 爆炸。DeepNet 的推导基于残差流的方差分析:当层数增加,无缩放的残差叠加会使输出方差按层累积,而缩放因子可 以抵消这一累积,只要各层输出方差保持有界,深层堆叠就不会发散。 DeepNet 在 1000 层 Transformer 上实现了稳定训练,验证了显式残差控制的有效性。与依赖 warmup 的隐性稳定不 同,DeepNorm 把「依赖经验初始化的隐性稳定」转化为「可计算参数的显式控制」,为后续更复杂的连接设计提供了方 法论基础。它的思想延伸到现代模型中:任何增强残差的方案,都必须回答「如何保持梯度与方差健康」这个问题——这 是残差创新区别于普通技巧分叉点的关键。 DeepNorm 的另一个贡献是重新审视了 Post-LN。经典结论认为 Post-LN 在深层下不稳定,需要 warmup;DeepNet 证 明只要残差缩放与初始化匹配,Post-LN 同样可以稳定训练极深网络。这一结果提示读者:归一化与残差是一个耦合系 统,单独调整某一项往往无效,必须联合设计。现代模型选择 Pre-Norm 加 RMSNorm,是工程简化与稳定性的务实组 合,而非唯一正确的方案。
3.9.3 mHC 超连接
DeepSeek-V4 采用 mHC(Manifold-Constrained Hyper-Connections)增强传统残差连接。其思想源于超连接 (Hyper-Connections):将单一的恒等跳跃扩展为跨层的可学习混合,让表示在多条路径间加权传播,打破「逐层累加」 的单通道局限。具体而言,某一层的输出不再只与前一层的恒等输入相加,而是与来自多个更早层的表示做可学习的加权 组合,信息可以在不同深度之间直接流动,相当于在残差流上引入了「多跳」通路。 mHC 的关键约束是流形约束:可学习的混合系数被限制在低维流形上,防止跨层自由混合引发优化失稳。这一约束使模 型在保留超连接表达力的同时,维持了类似残差的梯度性质——混合系数在流形上的变化是光滑的,梯度沿混合路径的传 播不会发散。若无此约束,混合系数可能振荡出非稳定区域,训练前期即发散。在 V4 的万亿参数规模下,mHC 保障了 深层信息传递与训练稳定性,是传统残差在超大规模场景下的有效替代。 mHC 的价值可以从信息论角度理解:经典残差的信息通路是「一条直路加一条子路」,容量有限;超连接把通路扩展为 「多路混合」,信息容量更大。而流形约束保证了扩大的容量被稳定地利用,而非被优化器的波动消耗掉。这一「扩容量
- 加约束」的范式,与 MoE 的「扩容量 + 加均衡」、混合注意力的「扩机制 + 加分工」如出一辙,是 2026 年架构创新的 通用模板。 从实现角度看,mHC 引入的额外参数(混合系数)数量相对层内参数可以忽略,但它改变了前向与反向的计算图:前向 需要维护多条跨层路径的加权和,反向则沿多条路径回传梯度。这要求训练框架支持「跨层依赖」的算子编排,也要求显 存规划为跨层激活预留空间。这些工程成本是 mHC 相对经典残差的「税」,读者在评估是否采用时,需要把训练与推理 的工程改动纳入考量。
3.9.4 AttnRes 注意力残差
Kimi K3 引入 AttnRes(Attention Residuals),从另一角度改造残差。传统残差对上游各层表示均匀累积,浅层信息随 深度增加而衰减,深层难以按需访问早期特征。AttnRes 让每一层在汇聚上游表示时按注意力权重选择性取回:模型可以 跨深度挑选需要的表示来源,而非均匀地累加所有层输出。 这一设计相当于在深度方向引入注意力机制:以注意力权重替代固定加法,实现「按需检索」而非「被动累加」。直观 上,经典残差假定「所有历史信息同等重要」,AttnRes 则假定「当前层只关心部分历史」,因此用注意力权重过滤。 AttnRes 改善了浅层信息的保真度与深层训练稳定性,与 mHC 的流形约束路径不同,它用注意力完成来源选择。两种方 案互补:mHC 约束「怎么混合」,AttnRes 决定「混合什么」。K3 与 V4 分别采用二者,说明残差连接创新已成为现代模 型的独立架构维度,而非训练技巧的附属。 AttnRes 的另一层收益是跨深度的表征复用。经典残差中,深层只能通过「间接传播」访问浅层信息,经过多层的非线性 变换后信息已经失真;AttnRes 让深层直接取回浅层的高保真表示,相当于在深度维度上建立了「快捷键」。这种跨层取 回在长文档推理中尤其有价值:模型可以在深层直接访问开头的设定信息,而不必依赖信息在每层的隐式携带。可以预 见,这类「深度注意力」与「稀疏注意力」的结合,将是连接机制的下一个演化方向。 AttnRes 与 mHC 的一个直观区别:mHC 的混合权重通常与输入内容无关,是训练后固定的连接系数;AttnRes 的取回权 重则随输入动态变化,是内容感知的。前者像「固定的多条捷径」,后者像「按需呼叫的直达通道」。内容感知的连接机制 理论上表达力更强,但也对训练稳定性提出更高要求,这正是 K3 以 AttnRes 搭配 Per-Head Muon 等稳定化措施的原 因。 mHC and AttnRes Layer j DeepNorm Classic Residual x x Layer i Learnable Mix Output Add scaled Add Sublayer Sublayer Layer k 图3-10 残差连接的三种演进形态 如图3-10 所示,残差创新的演进路径清晰:经典残差是单一加法,DeepNorm 对加法显式缩放,mHC 与 AttnRes 则把 「一条直路」升级为「多路选择」。现代模型不再把残差视为被动保障,而是将其作为主动调控信息流动与训练稳定性的 架构原语。对工程师而言,选择何种连接方案,本质是在「信息表达力」与「训练稳定性」之间做权衡,而 mHC 与 AttnRes 表明,这两者可以通过设计兼得——DeepNorm 提供了理论基线,mHC 与 AttnRes 则给出了两条不同风格的实 现路径。