Transformer 架构详解:Encoder-Decoder、多头注意力、位置编码全拆解
上一篇我们讲了注意力机制的原理——AI 如何学会在信息中「挑重点」。今天我们要看一个更完整的图景:注意力机制如何组装成 Transformer,这个改变 AI 历史的模型架构。
一、Transformer 的诞生
2017 年,Google 发表了一篇论文:Attention Is All You Need。这篇论文提出了一个大胆的想法:
完全抛弃 RNN,只用注意力机制来构建序列模型。
这篇论文后来成为 AI 领域被引次数最多的论文之一。它提出的 Transformer 架构,成为了 GPT、BERT、LLaMA、Claude 等大模型的基石。
二、Transformer 的整体架构
Transformer 的整体结构是一个 Encoder-Decoder 架构:
输入序列(例如中文) 输出序列(例如英文)
│ ▲
▼ │
┌─────────┐ ┌─────────┐
│ Encoder │ ──上下文──▶ │ Decoder │
│ 编码器 │ │ 解码器 │
└─────────┘ └─────────┘
- Encoder(编码器):读取输入序列,理解其含义,生成一组「上下文向量」
- Decoder(解码器):根据编码器的输出,逐步生成目标序列
不过,并非所有 Transformer 都同时有 Encoder 和 Decoder:
- GPT 系列:只用 Decoder(自回归生成)
- BERT 系列:只用 Encoder(双向理解)
- T5、BART:Encoder-Decoder 完整架构
三、Encoder:理解输入
Encoder 由 N 个相同的层堆叠而成(原始论文 N=6)。每层包含两个子层:
输入
│
▼
┌──────────────────────────────┐
│ Multi-Head Self-Attention │ ← 自注意力:每个词关注所有词
│ + 残差连接 + Layer Norm │
├──────────────────────────────┤
│ Feed-Forward Network (FFN) │ ← 前馈网络:进一步处理
│ + 残差连接 + Layer Norm │
└──────────────────────────────┘
│
▼
输出(上下文向量)
残差连接(Residual Connection)
每个子层都有一个「残差连接」——把输入直接加到输出上:
output = LayerNorm(x + Sublayer(x))
为什么需要残差连接?因为深层网络容易出现梯度消失问题。残差连接让梯度可以直接「跳」过某些层,使得训练深层网络成为可能。
Layer Normalization
Layer Norm 对每个样本的所有特征进行归一化,稳定训练过程。计算公式为:
LayerNorm(x) = γ × (x - μ) / (σ² + ε)^0.5 + β
其中 μ 和 σ 分别是均值和标准差,γ 和 β 是可学习的参数。现代大模型(如 LLaMA)也常用 RMSNorm,去掉了均值中心化,只保留均方根缩放,计算更快、效果相当。
前馈网络(Feed-Forward Network)
每个子层的 FFN 本质上是一个两层全连接网络,中间用非线性激活函数:
FFN(x) = W₂ · activation(W₁ · x + b₁) + b₂
原始论文使用 ReLU 激活,后来的模型普遍改用 GELU(Gaussian Error Linear Unit):
GELU(x) = x · Φ(x) (Φ 是标准正态分布的累积分布函数)
GELU 在零点附近更平滑,梯度流更稳定,已经成为 Transformer 的标配。FFN 的隐藏层维度通常是模型维度的 4 倍(d=512 时 FFN 隐藏层为 2048),这是 Transformer 中参数最多的地方。
四、Decoder:生成输出
Decoder 同样由 N 层堆叠,但每层有三个子层:
输入(已生成的部分)
│
▼
┌──────────────────────────────┐
│ Masked Multi-Head │ ← 掩码自注意力:只能看到
│ Self-Attention │ 当前位置之前的词
│ + 残差连接 + Layer Norm │
├──────────────────────────────┤
│ Multi-Head │ ← 交叉注意力:关注
│ Cross-Attention │ 编码器的输出
│ + 残差连接 + Layer Norm │
├──────────────────────────────┤
│ Feed-Forward Network │
│ + 残差连接 + Layer Norm │
└──────────────────────────────┘
│
▼
输出(下一个词的概率分布)
为什么需要 Masked Attention?
在生成文本时,模型是从左到右逐词生成的。如果 Decoder 能看到「未来」的词,就等于「作弊」了。所以需要用 Masked Attention,把未来位置的概率设为 0。
生成第1个词时:只能看到 <start>
生成第2个词时:只能看到 <start> 我
生成第3个词时:只能看到 <start> 我 喜欢
生成第4个词时:只能看到 <start> 我 喜欢 苹果
交叉注意力(Cross-Attention)
Decoder 需要「参考」编码器的输出。交叉注意力让 Decoder 的每个位置都能「查看」编码器的所有输出:
Decoder 的 Query ← 来自 Decoder 上一层的输出
Encoder 的 Key, Value ← 来自 Encoder 的最终输出
这样,生成每个目标词时,模型都能「回看」整个输入句子。
五、多头注意力:多角度看问题
在讲位置编码之前,我们先深入理解一下 Multi-Head Attention(多头注意力)。
注意力的核心是 Query、Key、Value 三个矩阵:
Attention(Q, K, V) = softmax(Q·K^T / √d_k) · V
用一个直观例子理解:假设你在图书馆找书(Query),每本书有个标签(Key),书的内容是(Value)。你通过比较「想找什么」和「标签是什么」的相关性,决定花多少时间看每本书。
为什么要「多头」? 因为词的语义是多维度的。一个词可能在语法上与动词相关,在指代上与名词相关,在语义上与形容词相关。所以模型用多组 Q/K/V 同时从不同角度计算注意力:
MultiHead(Q, K, V) = Concat(head₁, head₂, ..., headₕ) · W^O
其中 headᵢ = Attention(Q·Wᵢ^Q, K·Wᵢ^K, V·Wᵢ^V)
原始论文使用 8 个头(h=8),模型维度 d=512,所以每个头的维度是 64。注意力计算后拼接所有头的输出,再乘以权重矩阵 W^O 做线性变换。
六、位置编码:告诉模型「顺序」
Self-Attention 有一个特性:它本身不关心顺序。对它来说,「猫吃鱼」和「鱼吃猫」是一样的——因为每个词都能看到所有其他词。
但顺序显然很重要!所以 Transformer 引入了位置编码(Positional Encoding),给每个位置加一个「位置信号」:
词嵌入 + 位置编码 = 最终输入
"猫" + 位置0的编码 → [0.2, 0.5, -0.1, ...]
"吃" + 位置1的编码 → [0.3, 0.4, -0.2, ...]
"鱼" + 位置2的编码 → [0.1, 0.6, -0.1, ...]
原始 Transformer 使用正弦/余弦函数生成位置编码:
PE(pos, 2i) = sin(pos / 10000^(2i/d))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d))
其中 pos 是位置,i 是维度索引,d 是模型维度。
这种编码方式的好处:
- 每个位置有唯一的编码
- 相对位置可以通过线性变换得到
- 可以泛化到训练时未见过的长度
现代位置编码:RoPE
后来的大模型(LLaMA、Qwen、Mistral、Gemma 等)普遍改用 RoPE(Rotary Position Embedding)。核心思想是:
对 Query 和 Key 的每一对维度,旋转一个角度 θ = pos × base^(-2i/d)
RoPE 的优势:
- 天然编码相对距离:两个位置的注意力分数只取决于它们的相对距离,而非绝对位置
- 长度外推友好:配合 NTK-aware scaling,可以在推理时使用比训练更长的序列
- 与 FlashAttention 兼容:高效的推理实现
可以说,RoPE 是现代 Transformer 能处理长上下文(32K、128K 甚至 1M token)的关键技术之一。
七、完整的 Transformer 架构图
graph TB
subgraph Encoder["Encoder(编码器)"]
E1["输入嵌入 + 位置编码"]
E2["Multi-Head Self-Attention"]
E3["Add & Norm"]
E4["Feed-Forward Network"]
E5["Add & Norm"]
E1 --> E2 --> E3 --> E4 --> E5
end
subgraph Decoder["Decoder(解码器)"]
D1["输出嵌入 + 位置编码"]
D2["Masked Multi-Head Self-Attention"]
D3["Add & Norm"]
D4["Multi-Head Cross-Attention"]
D5["Add & Norm"]
D6["Feed-Forward Network"]
D7["Add & Norm"]
D1 --> D2 --> D3 --> D4 --> D5 --> D6 --> D7
end
subgraph Output["输出"]
O1["Linear"]
O2["Softmax"]
O1 --> O2
end
E5 -->|"K, V"| D4
D7 --> O1
style Encoder fill:#4a90d9,color:#fff
style Decoder fill:#e74c3c,color:#fff
style Output fill:#2ecc71,color:#fff
八、Transformer 的三种变体
原始 Transformer 是 Encoder-Decoder 结构,但后来发展出了三种主要变体:
| 变体 | 代表模型 | 特点 | 适用任务 |
|---|---|---|---|
| Encoder-only | BERT | 双向注意力,同时看到左右上下文 | 文本分类、命名实体识别 |
| Decoder-only | GPT、LLaMA、Claude | 单向注意力,只能看到左边 | 文本生成、对话 |
| Encoder-Decoder | T5、BART | 完整结构 | 翻译、摘要 |
为什么 GPT 只用 Decoder?
GPT 的任务是「给定前面的词,预测下一个词」。这天然适合 Decoder:
- 训练时:用 Masked Attention 防止看到未来
- 推理时:逐词生成,每生成一个词就追加到输入
BERT 的任务是「给定上下文,预测被遮住的词」。这需要双向注意力,所以只用 Encoder。
九、Transformer 为什么这么成功?
| 特性 | 影响 |
|---|---|
| 并行训练 | 所有位置同时计算,训练速度大幅提升 |
| 长距离依赖 | 任意两个位置直接连接,解决了 RNN 的长距离遗忘问题 |
| 可扩展性 | 模型越大、数据越多,效果越好(Scaling Law) |
| 通用性 | 不仅用于文本,还扩展到图像、语音、视频 |
十、一句话总结
Transformer = 注意力机制 + 位置编码 + 残差连接 + 层归一化。它完全抛弃了 RNN 的顺序处理,用并行的注意力机制实现了对序列的建模,成为了现代 AI 的基石。
下一篇:我们将从 Transformer 出发,看看 GPT、BERT、LLaMA 等模型各自如何发展注意力机制,形成今天 LLM 的技术路线。
本文是「从 Attention 到 LLM」系列的第二篇。