Transformer 架构深度解析
"Attention is All You Need"(Vaswani et al., 2017)— Transformer 彻底改变了 NLP 和深度学习格局。
总体架构
- Encoder-Decoder 结构:Transformer 遵循经典的编码器-解码器架构。
- Encoder:N 层堆叠,每层包含 Multi-Head Self-Attention + FFN + Add&Norm。
- Decoder:N 层堆叠,每层包含 Masked Multi-Head Self-Attention + Cross-Attention + FFN + Add&Norm。
Scaled Dot-Product Attention
缩放点积注意力是 Transformer 中最基础的注意力计算单元。
- 输入:Query(Q)、Key(K)、Value(V)
- 公式: [ \text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) V ]
- √d_k 缩放因子:防止点积结果过大导致 softmax 进入梯度饱和区,使梯度消失。
- 计算过程:
- Q × K^T:计算查询与所有键的相似度得分
- Scale:除以 √d_k 进行缩放
- Mask(可选):遮挡不需要关注的位置
- Softmax:将得分归一化为概率分布
- ×V:加权聚合 Value 向量
Multi-Head Attention
多头注意力机制允许模型在不同位置共同关注来自不同表示子空间的信息。
- h 个头并行计算注意力:每个头独立学习不同的注意力模式。
- 每个头: [ \text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V) ]
- 拼接输出: [ \text{MultiHead}(Q,K,V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h) W^O ]
- 多头的作用:使模型能够关注不同位置的不同表示子空间,捕捉更丰富的语义信息。
注意力掩码
- Padding Mask:忽略填充(padding)位置,使其不参与注意力计算,通常将填充位置的注意力分数设为 -∞。
- Look-ahead Mask(Causal Mask):在 Decoder 的自注意力中使用,屏蔽未来位置的信息,保证当前位置只能关注到它之前(含自身)的位置,从而保持自回归属性。
Positional Encoding(位置编码)
- 为什么需要位置编码:Self-Attention 本身是置换不变的(permutation-invariant),不具备序列顺序信息。位置编码为模型注入位置/顺序信息。
- 正弦/余弦编码(原始Transformer): [ \begin{aligned} PE_{(pos, 2i)} &= \sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) \ PE_{(pos, 2i+1)} &= \cos\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) \end{aligned} ] 其中 (pos) 为位置索引,(i) 为维度索引。正弦/余弦函数的特性使模型能够轻松学习相对位置关系。
- 可学习位置编码:BERT 等模型使用可学习的 position embedding,让模型在训练过程中自适应地学习位置表示。
Feed-Forward Network(FFN)
- 结构(原始 Transformer / BERT / GPT): [ \text{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2 ] 两层线性变换,中间使用 ReLU 激活函数,将维度从 (d_{\text{model}}) 扩展到 (d_{ff})(通常 (d_{ff} = 4 \times d_{\text{model}}))再映射回 (d_{\text{model}})。
- SwiGLU(LLaMA 等现代模型):结合 Swish 激活和门控线性单元(GLU),公式为: [ \text{SwiGLU}(x) = (xW_1 \otimes \sigma(xW_2)) W_3 ] 其中 (\otimes) 为逐元素乘法,(\sigma) 为 Swish 激活函数。SwiGLU 在实践中通常优于 ReLU。
Residual Connection & Layer Normalization
- Add & Norm 结构:每个子层(Attention 和 FFN)后跟残差连接和层归一化。 [ \text{output} = \text{LayerNorm}(x + \text{Sublayer}(x)) ]
- Pre-Norm vs Post-Norm:
- Post-Norm(原始 Transformer):先子层计算,后加残差再归一化。训练不稳定,需要 warmup 等技巧。
- Pre-Norm(GPT 等现代模型):先归一化,再进行子层计算,最后加残差。训练更稳定,收敛更快。
- LayerNorm 归一化公式: [ \text{LayerNorm}(x) = \gamma \odot \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} + \beta ] 其中 (\mu) 和 (\sigma^2) 为均值和方差,(\gamma) 和 (\beta) 为可学习的缩放和偏移参数,(\epsilon) 为防止除零的小常数。
完整 Encoder Block 计算流程
输入一个序列,逐步骤展示一个 Encoder Block 的完整计算:
- 输入:词嵌入 + 位置编码 → (X \in \mathbb{R}^{n \times d_{\text{model}}})
- Multi-Head Self-Attention:
- 投影得到 Q、K、V
- 分头计算 Scaled Dot-Product Attention
- 拼接各头输出,线性投影
- Add & Norm:(X = \text{LayerNorm}(X + \text{Attention}(X)))
- FFN:通过两层线性 + ReLU(或 SwiGLU)
- Add & Norm:(X = \text{LayerNorm}(X + \text{FFN}(X)))
- 输出:维度不变的表示序列,送入下一个 Encoder Block
完整 Decoder Block 计算流程
- 输入:目标序列的词嵌入 + 位置编码
- Masked Multi-Head Self-Attention:使用 Look-ahead Mask 防止看到未来位置
- Add & Norm:残差连接 + 层归一化
- Cross-Attention:以 Decoder 自注意力输出为 Q,Encoder 输出为 K、V,进行标准 Multi-Head Attention
- Add & Norm:残差连接 + 层归一化
- FFN:与 Encoder 相同的 FFN 结构
- Add & Norm:残差连接 + 层归一化
- 输出:送入下一个 Decoder Block 或最终的线性分类层
Transformer 的优缺点
优点
- 并行计算:Self-Attention 可以完全并行处理序列所有位置,相比 RNN 的串行计算大幅提升训练速度。
- 长程依赖建模:每个位置直接与所有位置交互,有效捕捉长距离依赖关系,解决了 RNN 的长期遗忘问题。
- 全局感受野:注意力机制提供全局上下文信息,有利于理解语义。
- 可解释性:注意力权重可以可视化,帮助理解模型关注的重点。
缺点
- 计算复杂度高:Self-Attention 的时间复杂度为 (O(n^2)),长序列下计算和内存开销巨大。
- 位置编码依赖:需要额外显式注入位置信息,不如 RNN 天然具有顺序感。
- 小数据易过拟合:Transformer 参数量大,在小规模数据上容易过拟合。
- 缺乏局部归纳偏置:相比 CNN,Transformer 没有天然的局部感知先验。
关键变体
- BERT(Encoder-only):仅使用 Transformer Encoder,通过 Masked Language Model(MLM)和 Next Sentence Prediction(NSP)进行预训练,实现双向上下文理解。适用于分类、NER、QA 等理解任务。
- GPT(Decoder-only):仅使用 Transformer Decoder,采用自回归方式从左到右生成文本。适用于文本生成、对话、代码生成等生成任务。
- T5(Encoder-Decoder):完整的 Encoder-Decoder 结构,将所有 NLP 任务统一为"文本到文本"(Text-to-Text)框架,使用前缀式训练策略。
总结
- 核心创新:Self-Attention 彻底取代 RNN,实现了真正的并行计算和高效的全局长程依赖建模。
- 当前地位:Transformer 已成为几乎所有 NLP 和多模态模型的基石,从 BERT、GPT 系列到 ViT、CLIP、LLaMA 等,Transformer 架构持续推动着深度学习的发展。