Transformer 架构:从零开始理解每一步

本文用一张架构图把 Transformer 的每一步拆开讲清楚,适合没有深度学习基础的读者。

Transformer 架构全貌


一、全局视角:Transformer 在做什么

一句话:把一段输入序列变成一段输出序列

翻译任务举例:输入「I love you」→ 输出「我爱你」。Transformer 通过 编码器(Encoder) 理解输入,再通过 解码器(Decoder) 逐步生成输出。

整个流程可以拆成四大块:

阶段 做什么 对应图中位置
输入处理 文本 → 数字向量 左侧绿色区域
编码器 理解输入的完整语义 上方红色框
解码器 逐个生成输出 token 下方粉色框
输出预测 向量 → 概率 → 选词 右下角黄/蓝色框

二、输入处理:让机器「读懂」文字

2.1 分词 / Token 化

机器不认识汉字和单词,需要先把文本切成最小单元——token

"I love you" → ["I", "love", "you"]
"我爱你"     → ["我", "爱", "你"]

每个 token 对应词表里的一个编号(整数),比如 love → 3421

2.2 词嵌入(Embedding)

一个整数编号信息量太少。词嵌入把每个编号映射成一个高维向量(比如 512 维的浮点数组),让语义相近的词在向量空间里距离更近。

"love" → [0.12, -0.34, 0.56, ...]   (512 个数)
"like" → [0.11, -0.31, 0.55, ...]   ← 和 love 很接近
"car"  → [-0.78, 0.22, 0.01, ...]   ← 和 love 差很远

这个映射表是模型训练出来的,不是人工设定的。

2.3 位置编码(Positional Encoding)

为什么需要? Transformer 不像 RNN 那样逐个读入单词,它是一次性看到所有 token 的。这意味着它天生分不清「狗咬人」和「人咬狗」——词是一样的,只是顺序不同。

位置编码给每个位置生成一个独特的向量,和词嵌入相加,让模型知道谁在前、谁在后。

输入表示 = 词嵌入 + 位置编码

补充: 原始论文用 sin/cos 函数生成固定位置编码;后来的模型(如 RoPE)改用了更灵活的旋转位置编码。

处理完毕后,每个 token 变成了一个既包含语义、又包含位置的向量,这组向量就是编码器的输入。


三、编码器(Encoder):理解输入

编码器堆叠 N 层(原始论文 N=6),每层结构完全相同,包含两个子模块:多头自注意力前馈网络

3.1 线性投影到 Q / K / V

进入注意力之前,先把每个 token 的向量用三个不同的线性变换,分别投影成三个新向量:

向量 全称 直觉含义
Q(Query,查询) 「我想找什么信息?」 当前 token 发出的搜索请求
K(Key,键) 「我能提供什么信息?」 每个 token 公开的标签
V(Value,值) 「我的实际内容是什么」 真正会被取走的信息

为什么要分成三个?如果 Q 和 K 直接用同一个向量,模型只能做「我和你像不像」的比较;分开后可以实现「我想找的」和「你能提供的」是不同维度的匹配,表达能力更强。

3.2 多头自注意力(Multi-Head Self-Attention)

核心公式:

\[\text{Attention}(Q, K, V) = \text{softmax}\!\left(\frac{QK^T}{\sqrt{d_k}}\right) V\]

拆解步骤:

  1. 打分: 用 Q 和所有 K 做点积 → 得到每对 token 之间的”相关度分数”
  2. 缩放: 除以 \(\sqrt{d_k}\)(向量维度的平方根),防止分数过大导致 softmax 梯度消失
  3. 归一化: softmax 把分数变成 0~1 之间的权重,所有权重加起来等于 1
  4. 加权求和: 用权重对 V 做加权求和 → 每个 token 得到了一个融合了其他 token 信息的新向量

自注意力的意义: 每个 token 可以”关注”输入中所有位置的其他 token。比如在「The cat sat on the mat because it was tired」中,自注意力让 “it” 知道自己指的是 “cat” 而不是 “mat”。

为什么是”多头”? 把 Q/K/V 分成多组(比如 8 组),每组独立计算注意力,最后拼接。不同的”头”可以关注不同方面:

3.3 残差连接 + 层归一化

输出 = LayerNorm(x + SubLayer(x))

每个子模块(注意力、FFN)之后都有这一对操作,图中共出现 2 次。

3.4 前馈网络(FFN)

FFN(x) = W₂ · GELU(W₁ · x + b₁) + b₂

两个线性层夹一个激活函数(GELU)。可以理解为:注意力负责”在 token 之间交换信息”,FFN 负责”对每个 token 自己的信息做深加工”。

通常 FFN 的中间维度是输入的 4 倍(比如 512 → 2048 → 512),让模型有更大的”思考空间”。

3.5 编码器输出

经过 N 层堆叠后,输出的向量组称为上下文化表示(Context)。每个 token 的向量现在不再只代表自己,而是融合了整段输入的完整语义。这组向量会被送到解码器使用。


四、解码器(Decoder):逐步生成输出

解码器同样堆叠 N 层,但比编码器多一个子模块(交叉注意力),共三个子模块。

4.1 右移的目标序列

解码器的输入是已经生成的部分结果(推理时)或右移的正确答案(训练时)。

正确答案:  "我"  "爱"  "你"  "<EOS>"
右移后:  "<BOS>"  "我"  "爱"  "你"

这样,每个位置的任务就是根据左边已有的内容,预测下一个 token

4.2 Masked 多头自注意力

和编码器的自注意力几乎一样,区别在于加了遮罩(Mask):每个 token 只能看到自己和左边的 token,看不到右边(未来的 token)。

为什么要遮罩?因为生成是从左到右的,生成第 3 个词时,第 4 个词还不存在。训练时虽然能看到完整答案,但必须用 mask 模拟这种”看不到未来”的真实推理场景,否则模型会”作弊”。

4.3 交叉注意力(Cross-Attention)

这是解码器独有的模块:

作用:让解码器在生成每个词时,能够”回头看”输入句子。比如翻译「I love you」时,生成「爱」这个字需要关注输入中的「love」。

4.4 FFN + 残差连接 + 层归一化

和编码器完全一样,不再赘述。每个子模块之后都有残差连接和层归一化。

4.5 解码器层的堆叠

解码器同样堆叠 N 层,上一层的输出作为下一层的输入,逐层精炼。


五、输出预测:从向量到文字

解码器最后一层的输出是一组向量,还需要转回文字:

  1. 线性层: 把向量映射到词表大小的维度(比如 50000 维,对应词表中每个词一个分数)
  2. Softmax: 把分数转成概率分布(所有词的概率之和 = 1)
  3. 选词: 取概率最高的那个 token 作为输出(贪心策略),或用 beam search / 采样等策略

然后把这个新 token 拼到解码器输入的末尾,重复整个解码过程,直到生成 <EOS>(结束符)。


六、训练 vs 推理的区别

  训练 推理
编码器 运行一次 运行一次
解码器输入 右移后的完整正确答案(Teacher Forcing) 已生成的部分序列,逐步增长
解码器运行 一次并行处理所有位置(靠 mask 防作弊) 一步步循环,每步多生成一个 token
目标 缩小预测和正确答案的差距,更新参数 用训练好的参数直接生成

Teacher Forcing(教师强制): 训练时不等模型自己生成上一个词再喂下一个,而是直接把正确答案喂给解码器。这样训练更稳定、收敛更快。


七、主要变体

原始 Transformer 是 Encoder-Decoder 结构,后来衍生出三大家族:

变体 结构 代表模型 擅长
仅编码器 只用 Encoder BERT 理解型任务(分类、抽取、问答)
仅解码器 只用 Decoder GPT、LLaMA、Qwen 生成型任务(对话、写作、代码)
编码器-解码器 完整结构 T5、原始 Transformer 序列到序列(翻译、摘要)

现在最流行的大语言模型(ChatGPT、Claude、Qwen 等)大多是仅解码器架构——去掉了编码器和交叉注意力,只保留带 mask 的自注意力和 FFN,靠超大规模数据和参数量实现强大的生成能力。


八、总结:一张图的完整信息流

输入文本
  ↓ 分词 / Token 化
  ↓ 词嵌入 + 位置编码
  ↓
┌─────────── 编码器 × N 层 ──────────┐
│  线性投影 → Q / K / V              │
│  多头自注意力(看所有位置)          │
│  残差连接 + 层归一化                │
│  前馈网络(FFN)                    │
│  残差连接 + 层归一化                │
└───────────────────────────────────┘
  ↓ 上下文化表示(Context)
  ↓ K, V 传入解码器的交叉注意力
┌─────────── 解码器 × N 层 ──────────┐
│  Masked 多头自注意力(只看左边)     │
│  残差连接 + 层归一化                │
│  交叉注意力(Q 来自解码器,KV 来自编码器)│
│  残差连接 + 层归一化                │
│  前馈网络(FFN)                    │
│  残差连接 + 层归一化                │
└───────────────────────────────────┘
  ↓
  线性层 → Softmax → 预测下一个 token

参考

支付宝打赏 微信打赏

来杯咖啡~

文章导航