Transformer 架构详解:Encoder-Decoder、多头注意力、位置编码全拆解

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」系列的第二篇。