Appearance
从RNN到Transformer
这一页是理解 Transformer 的「思维转换」关键点:它到底用什麼办法,替代了 RNN 的顺序记忆? 想通这一层,后面的注意力机制就会非常自然。
RNN 是怎么「读句子」的
RNN 维护一个隐藏状态 h,像人一样从左到右逐词阅读,每读一个词就更新一次记忆:
"我 喜欢 深度学习"
│ │ │
▼ ▼ ▼
h0 →[RNN]→ h1 →[RNN]→ h2 →[RNN]→ h3h3理论上浓缩了整句话的信息。- 更新公式(简化):
h_t = tanh(W_x · x_t + W_h · h_{t-1})
两个绕不开的痛点
痛点 1:串行,无法并行。 算 h2 必须先有 h1,算 h3 必须先有 h2。GPU 有成千上万个核,却只能干等着一步步来。
痛点 2:长距离信息衰减。 一句话开头和结尾隔了几十个词,信息要经过几十次矩阵相乘才能传到,越传越弱——这就是「长距离依赖」问题。
"a ... (50个词) ... 因此 a 应该用单数" ← 开头的 a 和结尾的语法一致性,
RNN 要跨越 50 步才能建立这个联系,非常吃力Transformer 的思路革命
与其「传话游戏」一步步把信息传下去,不如让每个词直接看到所有其他词。
这就是 自注意力(Self-Attention) 的核心思想:
RNN: 词1 → 词2 → 词3 → 词4 (链式, 相邻才能通信)
Transformer:
词1 ⇄ 词2 ⇄ 词3 ⇄ 词4 (全连接, 任意两步直接通信)
↖___________↗
任意两个位置之间的距离都是 1- 并行:所有位置的相关性可以用一次矩阵乘法同时算完,不需要串行。
- 短路径:任意两个词之间的信息通路长度恒为 1,长距离依赖不再是问题。
一个生活化的类比
把「理解一个句子」想象成开会:
| RNN | Transformer | |
|---|---|---|
| 开会方式 | 接力传话,每人只跟下一个人说 | 圆桌会议,任何人可随时看向任何人 |
| 速度 | 慢(要排队) | 快(同时进行) |
| 记不记得住开头 | 传到后面就忘了 | 一抬头就能看到开头 |
代价是:圆桌会议需要「谁该看谁、看多久」的规则——这正是注意力权重要学习的东西。
天下没有免费的午餐:丢了顺序怎么办?
RNN 天然知道「谁在前谁在后」,而自注意力把所有词一视同仁地全连接,它本身不知道词序。
"狗 咬 人" 和 "人 咬 狗"
如果只用自注意力(不加位置信息),模型眼中这两句"词袋"完全相同!解决办法:位置编码(Positional Encoding)——把「第几个词」的信息也变成一个向量,加到词表示上。详见 位置编码。
完整对比表
| 维度 | RNN / LSTM | Transformer |
|---|---|---|
| 计算方式 | 顺序(串行) | 并行 |
| 长距离依赖路径长度 | O(n) | O(1) |
| 顺序信息 | 天然具备 | 需位置编码显式注入 |
| 每步复杂度 | O(1)(相对步数) | O(n²)(注意力矩阵) |
| 显存/算力瓶颈 | 时间(算得慢) | 空间(n² 注意力) |
| 训练速度(GPU) | 慢 | 快 |
注意 O(n²):序列长度 n 翻倍,注意力计算与显存要翻四倍。这正是长上下文模型的痛点,也是 高效注意力 要解决的问题。
那 Transformer 到底怎么「算」注意力?
预告一下后面三页的主线,它们会自底向上把这台引擎拆开:
- 词嵌入:把离散的词变成连续的向量(模型能算的前提)。
- 位置编码:给向量打上「顺序戳」。
- 注意力机制:用 Q/K/V 让词与词互相关注(全教程最核心的一页)。
- 多头注意力:同时戴多副「透镜」看关系。
- 前馈网络与残差连接:每个位置的非线性加工与稳定训练。
小结
- RNN 的两大硬伤:无法并行 与 长距离依赖衰减。
- Transformer 用「任意位置直连」的自注意力同时解决这两点。
- 代价:失去了顺序感知 → 用位置编码补回;带来了 O(n²) 复杂度 → 用高效注意力优化。
下一步
万丈高楼平地起,先看第一步:怎么把一个词变成向量 → 词嵌入。