从零开始理解 Transformer 模型结构与注意力机制
一、为什么需要 Transformer?
在深度学习发展初期,RNN 和 LSTM 一度是自然语言处理的主力军。但它们存在两个显著问题:
- 串行处理:RNN 必须一个一个词处理,无法并行;
- 长距离依赖难捕捉:句子长了之后,模型难以记住前面的词。
为了打破这两点限制,Google 团队在 2017 年提出了 Transformer 架构,它完全抛弃了循环结构,基于注意力机制,让模型能够:
- 并行处理所有词;
- 更好地捕捉全局信息。
二、Transformer 整体结构图
👇下图是 Transformer 的典型结构:
三、各个模块详解
1. 输入嵌入(Embedding)
每个词通过查词向量表,变成一个向量。比如:
输入句子: "I love NLP"
→ Embedding 后变成一个 3x512 的矩阵(假设词向量维度是 512)
2. 位置编码(Positional Encoding)
由于没有 RNN 的顺序处理能力,Transformer 使用位置编码来加点“顺序感”。方法如下:
- 加入固定的正弦/余弦位置编码;
- 或者使用可学习的位置向量。
3. 自注意力机制(Self-Attention)
核心思想是:每个词都能关注句子中其他所有词,而不是只看相邻词。
简单公式表示:
- Q(Query)、K(Key)、V(Value)都是从词向量经过线性层变换而来。
举个例子(3 个词):
输入词: ["I", "love", "NLP"]
每个词都生成一个 Q、K、V
通过打分矩阵 → 计算每个词对其他词的注意力
4. 多头注意力(Multi-Head Attention)
不是用一组 QKV,而是用 多组 QKV 并行计算,然后拼接结果。
好处:不同的“头”可以关注句子的不同语义维度,比如:
- 一组关注主谓关系
- 一组关注情感词
- 一组关注实体名词
5. 前馈全连接层(Feed Forward)
每个词向量都独立通过一个小型 MLP,增加非线性能力:
FFN(x) = max(0, xW1 + b1)W2 + b2
6. 残差连接 + 层归一化
每一层都通过:
LayerNorm(x + Sublayer(x))
- 防止深层网络的训练困难;
- 稳定梯度传播。
四、Encoder 和 Decoder 的区别
- Encoder:主要做输入的理解。
- Decoder:根据 Encoder 输出生成目标序列(比如翻译句子、写摘要等)。
Decoder 比 Encoder 多了一个:
- Masked Self-Attention:防止模型看到未来词,保证自回归生成。
五、一个实际例子:句子翻译
假设输入英文:
"Hello world"
- 每个词转成 embedding
- 加上位置编码
- 多层 Encoder 编码后生成上下文向量
- Decoder 依次生成目标语言(如“你好,世界”),每一步预测下一个词
六、总结
| 模块 | 作用 |
|---|---|
| Embedding | 把词变成向量 |
| Positional Encoding | 加入顺序信息 |
| Self-Attention | 让词互相“看” |
| Multi-Head | 多角度理解信息 |
| Feed Forward | 非线性增强能力 |
| LayerNorm + 残差 | 稳定训练效果 |