Transformer 是一种特殊的 RNN 吗?我现在的答案是:不算,但它确实碰到了 RNN 的边界

这个问题我以前也纠结过:Transformer 到底是不是一种“特殊的 RNN”?

如果只要一句话回答,我现在更愿意说:

通常不把 Transformer 归类为 RNN;但如果把“RNN”宽泛理解成一种逐步读入序列、持续更新内部状态的机制,那么 Transformer 在某些使用方式下,确实会表现出递归式的一面。

这不是在打太极,而是因为这两个模型的关系,刚好卡在“表面行为有点像、核心结构又很不一样”的位置上。

为什么会有人觉得 Transformer 像 RNN

这个直觉并不奇怪。

因为我们处理序列时,最自然的想法就是:

  1. 读入一个 token
  2. 更新当前表示
  3. 再读下一个 token
  4. 一路往前生成或理解

这本来就是 RNN 最经典的工作方式。
而今天很多人接触 Transformer,最常见的场景恰恰也是大语言模型逐 token 生成文本。

于是很容易产生一个感觉:

  • 它也在一步一步往前吐 token
  • 它也在利用前面的上下文
  • 它好像也维护了某种“状态”

所以问题就来了:
既然推理时看起来也是一步一步往前走,那 Transformer 为什么不算 RNN?

先说标准答案:它不是 RNN

从主流深度学习分类来看,Transformer 不属于 RNN

原因不在于它能不能处理序列,而在于它处理序列的机制和 RNN 完全不同。

RNN 的核心写法大概是:

h_t = f(x_t, h_{t-1})

意思很明确:
t 步的状态,直接由当前输入 x_t 和上一步隐藏状态 h_{t-1} 递归得到。

也就是说,RNN 的“时间递归”是写进结构里的。
你不按顺序走,就没法算出后面的状态。

而 Transformer 的核心不是这个。
它更像是在每一层里做:

  • 当前位置先拿到一个表示
  • 再通过 attention 去看其他位置
  • 然后把相关信息汇总回来

也就是说,它不是靠“上一步状态递推到下一步状态”来建模序列,
而是靠token 与 token 之间的显式交互来建模序列。

这就是第一条根本区别。

RNN 是“压缩历史”,Transformer 是“访问历史”

我现在觉得,区分两者最有用的一句话是:

RNN 的思路是把过去压缩进状态里;Transformer 的思路是让当前位置直接访问过去。

这两个思路差别非常大。

RNN:历史被塞进一个状态向量

RNN/LSTM/GRU 都是在努力做一件事:
把到当前时刻为止的所有历史信息,浓缩进一个隐藏状态(或者 cell state)里。

优点是结构很自然,也很节省。
缺点是这个状态本质上是一个固定维度的瓶颈

历史再长,最后也要被压进同一个状态里。
这也是为什么长距离依赖一直是 RNN 的老问题。

Transformer:不要求把一切都压成一个状态

Transformer 的 self-attention 走的是另一条路:

  • 不是强迫模型把所有过去信息都浓缩到一个向量里
  • 而是允许当前位置直接和很多历史 token 建立联系

于是它更像一个“可查询的记忆系统”。
当前 token 不必只相信某个单一隐藏状态,而可以直接去看哪些历史位置和自己最相关。

所以从信息流角度说,Transformer 更不像递归状态机,反而更像带随机访问能力的序列模型

那为什么又能说它“有点像 RNN”

因为在某些语境下,这个问题讨论的不是“结构分类”,而是“执行方式”。

尤其是在 decoder-only Transformer 推理 时,这种相似感会变得很强。

1. 自回归生成本身就是逐步展开的

像 GPT 这类模型在生成第 t 个 token 时,只能依赖前面已经出现的 token。
这件事和语言模型时代的 RNN 很像:都是从左到右、自回归地建模条件概率。

也就是说,它们解决的是同一个任务:

P(x_t | x_{<t})

只是建模这个条件概率的内部机制不同。

2. KV cache 让它看起来更像“维护状态”

推理时为了避免每次都重算整段历史,Transformer 通常会缓存之前 token 的 key/value。
下一步生成时,模型把新 token 的 query 拿出来,再去和历史 cache 交互。

这时你确实可以说:
模型维护了一种随时间增长的内部状态。

但这个状态和 RNN 的隐藏状态仍然很不一样:

  • RNN 的状态通常是一个固定大小向量
  • Transformer 的 KV cache 会随着上下文长度增长
  • RNN 下一步主要依赖上一步状态
  • Transformer 下一步可以直接访问整段缓存历史

所以它“像递归”,但不是经典意义上的 recurrence。

3. 因果 Transformer 可以写成一种循环执行过程

如果只看推理伪代码,decoder Transformer 当然可以写成:

  1. 读入当前 token
  2. 更新 cache
  3. 预测下一个 token
  4. 重复

这在行为层面很像一个 recurrent process。
也正因为如此,有些论文或讨论会从更广义角度说:Transformer 也有递归计算特征。

这个说法不能说完全错,但它说的是执行过程像递归,不是说模型类别等于 RNN

真正拉开差距的,是训练时的计算图

为什么学术和工程上大家还是坚决把 Transformer 和 RNN 分开?

因为它们训练时的差异太大了。

RNN 的训练天然带时间展开

RNN 训练要做 BPTT(Backpropagation Through Time)。
序列上的每一步都依赖前一步,时间维度上天然串行。

这意味着:

  • 很难充分并行
  • 梯度要跨很多步传播
  • 长序列训练成本和稳定性都比较麻烦

Transformer 的训练可以并行处理整段序列

Transformer 虽然在自回归任务里有因果 mask,但训练时通常还是把整段序列一起送进去。
同一层里,各位置的表示可以并行计算 attention。

这对现代硬件太友好了。

所以 Transformer 后来能大规模扩展,一个关键原因就是:
它虽然仍然建模序列,但摆脱了 RNN 那种严格按时间递推的训练方式。

这不是小修小补,而是范式级别的差异。

如果把 RNN 定义放宽,会发生什么

有些人会说:
“RNN 不一定非得是老式 vanilla RNN/LSTM,只要模型在时间上反复应用某种状态更新,不都可以算 recurrent 吗?”

如果按这个非常宽泛的定义,那么很多东西都会变得“有点像 RNN”:

  • 带 cache 的 causal Transformer
  • 一些 memory-augmented network
  • 甚至某些状态空间模型和在线推理系统

这时候“RNN”这个词就会失去区分度。

所以在实际讨论里,更有用的做法不是硬把 Transformer 塞进 RNN,
而是把它们看成两条不同的序列建模路线

  • RNN 路线:通过递归状态更新来建模历史
  • Transformer 路线:通过 attention 显式路由上下文

这两条路线后来又和很多新模型重新交叉,比如 linear attention、state space model、Mamba、RWKV。
很多新架构的魅力,恰恰就在于它们试图同时拿到:

  • RNN 式的高效状态更新
  • Transformer 式的强表达能力

所以,Transformer 到底是不是“特殊的 RNN”

我的答案是:

如果你在做标准模型分类,答案是否。
Transformer 不是 RNN,也通常不会被当成 RNN 的一个子类。

如果你在讨论推理行为或广义递归计算,答案是“它有递归味道,但不是经典 RNN”。

更精确一点说:

  • 它和 RNN 一样,都在解决序列建模问题
  • 它和 RNN 一样,都可以做自回归生成
  • 它在推理时也可以表现出逐步更新状态的形式
  • 但它并不依赖“隐藏状态递推”作为核心建模机制
  • 它真正的核心是 attention 带来的显式上下文访问

所以我现在更愿意把 Transformer 理解成:

不是 RNN 的变种,而是对“序列该如何建模”这件事的重新定义。

结语

这个问题有意思的地方,不是给出一个词典式答案,而是它逼着我们去看清一件事:

序列模型最核心的差别,到底在“任务形式”上,还是在“信息如何流动”上。

RNN 和 Transformer 处理的都是序列,甚至都可以做语言建模;
但一个是让信息沿时间递推,一个是让信息通过 attention 直接路由。

所以说 Transformer 是“特殊的 RNN”,我觉得会把关键差异说浅了。
更准确的说法应该是:

Transformer 继承了 RNN 想解决的问题,但没有继承 RNN 解决问题的方式。