RNN 是什么
全称:Recurrent Neural Network · 循环神经网络 核心关键词:Recurrent(循环)—— 同一套参数反复调用处理序列每一步
一句话速记
RNN 是一种按顺序处理序列的神经网络,每一步用”当前输入 + 上一步的隐藏状态”算出新的隐藏状态,读完整个序列后最后的隐藏状态代表整体理解。
RNN 是 Transformer 的前任,理解 RNN 的三个致命缺点就理解了 Transformer 为什么存在。
通俗解释(5 分钟版)
它在解决什么任务
对一句话(或任何序列:音频帧、股票价格、一段代码)做理解,输出一个表示。比如:
- 情感分类:读完 “这电影真难看” → 输出”负面”
- 翻译:读完中文 → 输出英文
- 预测下一个词:读完 “今天天气很” → 输出”好”
核心机制:隐藏状态向量 h 逐步更新
RNN 在处理序列时维护一个隐藏状态向量 h(hidden state),它是一个固定维度的向量(比如 256 维),用来累积到当前时间步为止的上下文信息。
- 读第 1 个词 “我”:用 “我” 的向量
x_1+ 初始状态h_0(全 0) → 算出h_1 - 读第 2 个词 “爱”:用 “爱” 的向量
x_2+ 上一步的h_1→ 算出h_2 - 读第 3 个词 “北京”:用
x_3+h_2→h_3 - 读第 4 个词 “天安门”:用
x_4+h_3→h_4 - 读完。
h_4就是整句话 “我爱北京天安门” 的向量表示。
每一步都用同一组参数做这个计算(模型训练时学出来),只是输入不同。这个”反复调用同一个模块”的特性就是 RNN 里的 “R”(Recurrent)。
关键点:h 只有一份,每步的新 h_t 完全覆盖上一步的 h_{t-1},不是追加。信息靠”新 h_t 的计算里包含旧 h_{t-1}”间接继承,这正是长距离会衰减的数学根源——旧信息每一步都被重新加工一次,传得越远越稀薄。
为什么叫「隐藏状态」(hidden state)
与「隐藏层」同源:神经网络按层分,有输入层(外部输入)、输出层(任务输出)、以及中间的隐藏层(hidden layer)。叫 hidden 是因为对使用者来说不可见——中间张量不是输入张量、也不是最终消费结果,只是网络内部的工作空间。
统计 / 序列模型的传统:RNN 的语言里经常和 HMM(隐马尔可夫模型) 对照。HMM 区分观测变量(你看到的)和隐变量(模型内部需要推断的底层状态)。h 承载的是「对序列到目前为止的内部认识」,对应的是隐变量这条线,不是输入也不是最终输出。
不要误读成「加密 / 不让看」:训练、分析、部署时 h 完全可以被读出来、拿出来用(例如最后一层 hidden state 常当词向量 / 句向量做检索、相似度)。名字沿用的是历史术语,不是真的藏数据。
考察概率:词源级问题,很少考。知道「hidden = 非输入非输出的内部中间表示」足够。
画图
"我" "爱" "北京" "天安门"
↓ ↓ ↓ ↓
┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐
│ RNN │ → │ RNN │ → │ RNN │ → │ RNN │
└─────┘ └─────┘ └─────┘ └─────┘
↓ ↓ ↓ ↓
h1 h2 h3 h4 ← 整句话的理解
一个数学公式(不记也行,理解直觉就够)
h_t = tanh(W_x · x_t + W_h · h_{t-1} + b)
x_t:当前词的向量h_{t-1}:上一步的隐藏状态向量W_x, W_h, b:模型学出来的参数tanh:非线性激活函数
三个致命缺陷(Transformer 出现的根本原因)
1. 慢:顺序依赖,不能并行
- h3 必须等 h2 算完
- 100 个词必须按顺序算 100 步
- GPU 擅长并行计算,在这里沦为单核
2. 忘:远距离信息衰减(梯度消失)
- h4 里虽然理论上包含 “我” 的信息,但经过 3 次变换后严重稀释
- 100 个词长的句子,第 1 个词对第 100 个词几乎没影响
- 长句子根本理解不了
3. 训练累:反向传播也是串行
- 前向串行,反向传播(调参数)也串行
- GPU 大规模并行能力完全浪费
- 训练大模型几乎不可能
LSTM 和 GRU 是什么
RNN 家族的两个重要升级版(2014~2015 年主流):
LSTM(Long Short-Term Memory)
在隐藏状态 h 之外引入了一个更稳定的细胞状态(cell state)c 作为长期记忆通道,配三扇门控制信息流动:
- 遗忘门:决定从
c里扔掉什么 - 输入门:决定把当前信息写入
c多少 - 输出门:决定从
c里读多少出来给h
效果:大幅缓解了”忘”的问题(能记住更远的依赖)。 代价:参数和计算量比 RNN 多 4 倍,但还是解决不了”慢”和”不能并行”。
GRU(Gated Recurrent Unit)
LSTM 的简化版,把三扇门合并成两扇(更新门 + 重置门),参数比 LSTM 少,效果接近。工业界轻量场景用得多。
共同命运
LSTM / GRU 缓解了”忘”,但没改变”按顺序读”的根本架构,所以”慢 + 不能并行”这两个问题依然存在。这就是 2017 年 Transformer 出来后迅速取代它们的原因。
和 Transformer 对比(重点记这个表)
| 维度 | RNN / LSTM | Transformer |
|---|---|---|
| 处理方式 | 按顺序一个个读 | 所有词并行互看 |
| 任意两词距离 | O(n) 步(会衰减) | O(1) 步(直达) |
| 并行性 | 时间维度不可并行 | 完全可并行 |
| GPU 利用率 | 低 | 高 |
| 长距离依赖 | 弱(LSTM 有改善) | 强 |
| 训练速度 | 慢 | 快 |
| 推理速度 | 一次一步(实际上生成时 Transformer 也是一次一步) | 训练快;推理时 Decoder 也是自回归 |
注意最后一行的陷阱:Transformer 在训练时完全并行(因为有真实答案做监督,可以同时给所有位置算损失);但在推理生成时(比如 GPT 生成一段文字),它还是一个 token 一个 token 吐出来的——这叫自回归(Autoregressive),本质上和 RNN 推理一样慢。差别在训练,不在推理。
RNN 还用吗(2026 年视角)
很少了,但不是完全死了:
- 超低延迟场景:TinyRNN 在手机 / 边缘设备上做语音唤醒词,单步推理比 Transformer 省
- 超长序列:RWKV / Mamba 这些”新 RNN”借壳回归(把 Transformer 能力塞进 RNN 架构里),目标是做到训练并行 + 推理 O(1) 内存
- 教科书:学 NLP 的人还是会过一遍 RNN/LSTM 打底
应用工程岗通常不必实现 RNN,但需能说清结构、三缺陷、与 Transformer 对照。
延伸追问
-
Q:为什么 RNN 会梯度消失? 答:反向传播时,梯度经过每个时间步要乘一次权重矩阵。如果这些乘积链条里的值小于 1,连乘到前面就趋近 0;大于 1 就会爆炸。LSTM 用门控机制让梯度可以”直通”(Constant Error Carousel)缓解了这个问题。
-
Q:LSTM 和 GRU 怎么选? 答:数据多、任务复杂、不差算力 → LSTM 更细腻;数据少、算力紧、要训得快 → GRU 参数少一成。2017 年后其实都该让位给 Transformer,除非你在做嵌入式。
-
Q:Transformer 解决了 RNN 所有问题吗? 答:解决了”慢 + 忘 + 不能并行”,但带来新问题——Self-Attention 复杂度 O(n²),序列一长就爆炸。这是 2023 年后 FlashAttention / vLLM / Linear Attention / Mamba 这些工作要解决的。
-
Q:你项目里用过 RNN 吗? 答:按实际情况答;若未用过,说明当前栈以 Transformer 系为主,仍须理解 RNN 与 Transformer 的对照,否则「为什么用注意力」讲不清。
我的记法
TODO
状态
- 已背速记
- 能讲通俗版
- 能答追问
- 在实际场景中用上过
参考资料
- Understanding LSTM Networks - Chris Olah —— 经典图解,15 分钟读完
- Goodfellow 等《Deep Learning》Chapter 10