Transformer 是一种特殊的 RNN 吗?我现在的答案是:不算,但它确实碰到了 RNN 的边界
这个问题我以前也纠结过:Transformer 到底是不是一种“特殊的 RNN”?
如果只要一句话回答,我现在更愿意说:
通常不把 Transformer 归类为 RNN;但如果把“RNN”宽泛理解成一种逐步读入序列、持续更新内部状态的机制,那么 Transformer 在某些使用方式下,确实会表现出递归式的一面。
这不是在打太极,而是因为这两个模型的关系,刚好卡在“表面行为有点像、核心结构又很不一样”的位置上。
为什么会有人觉得 Transformer 像 RNN
这个直觉并不奇怪。
因为我们处理序列时,最自然的想法就是:
- 读入一个 token
- 更新当前表示
- 再读下一个 token
- 一路往前生成或理解
这本来就是 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 当然可以写成:
- 读入当前 token
- 更新 cache
- 预测下一个 token
- 重复
这在行为层面很像一个 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 解决问题的方式。