Skip to content

从RNN到Transformer

这一页是理解 Transformer 的「思维转换」关键点:它到底用什麼办法,替代了 RNN 的顺序记忆? 想通这一层,后面的注意力机制就会非常自然。

RNN 是怎么「读句子」的

RNN 维护一个隐藏状态 h,像人一样从左到右逐词阅读,每读一个词就更新一次记忆:

  "我    喜欢    深度学习"
   │      │        │
   ▼      ▼        ▼
 h0 →[RNN]→ h1 →[RNN]→ h2 →[RNN]→ h3
  • h3 理论上浓缩了整句话的信息。
  • 更新公式(简化):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,长距离依赖不再是问题。

一个生活化的类比

把「理解一个句子」想象成开会:

RNNTransformer
开会方式接力传话,每人只跟下一个人说圆桌会议,任何人可随时看向任何人
速度慢(要排队)快(同时进行)
记不记得住开头传到后面就忘了一抬头就能看到开头

代价是:圆桌会议需要「谁该看谁、看多久」的规则——这正是注意力权重要学习的东西。

天下没有免费的午餐:丢了顺序怎么办?

RNN 天然知道「谁在前谁在后」,而自注意力把所有词一视同仁地全连接,它本身不知道词序

"狗 咬 人"  和  "人 咬 狗"
如果只用自注意力(不加位置信息),模型眼中这两句"词袋"完全相同!

解决办法:位置编码(Positional Encoding)——把「第几个词」的信息也变成一个向量,加到词表示上。详见 位置编码

完整对比表

维度RNN / LSTMTransformer
计算方式顺序(串行)并行
长距离依赖路径长度O(n)O(1)
顺序信息天然具备需位置编码显式注入
每步复杂度O(1)(相对步数)O(n²)(注意力矩阵)
显存/算力瓶颈时间(算得慢)空间(n² 注意力)
训练速度(GPU)

注意 O(n²):序列长度 n 翻倍,注意力计算与显存要翻四倍。这正是长上下文模型的痛点,也是 高效注意力 要解决的问题。

那 Transformer 到底怎么「算」注意力?

预告一下后面三页的主线,它们会自底向上把这台引擎拆开:

  1. 词嵌入:把离散的词变成连续的向量(模型能算的前提)。
  2. 位置编码:给向量打上「顺序戳」。
  3. 注意力机制:用 Q/K/V 让词与词互相关注(全教程最核心的一页)。
  4. 多头注意力:同时戴多副「透镜」看关系。
  5. 前馈网络与残差连接:每个位置的非线性加工与稳定训练。

小结

  • RNN 的两大硬伤:无法并行长距离依赖衰减
  • Transformer 用「任意位置直连」的自注意力同时解决这两点。
  • 代价:失去了顺序感知 → 用位置编码补回;带来了 O(n²) 复杂度 → 用高效注意力优化。

下一步

万丈高楼平地起,先看第一步:怎么把一个词变成向量 → 词嵌入