第4章 循环神经网络
语言、语音、时间序列 - 这些数据都有一个共同点:它们是序列,前后相继、环环相扣。前几章的网络只能”看一张图、判一个标签”,而循环神经网络(RNN)让网络第一次拥有了记忆:它一边读入新信息,一边记住旧信息,从而能够处理”顺序即语义”的任务。在 Transformer 横空出世之前,RNN 与它的改进型 LSTM 曾是自然语言处理当之无愧的主角;理解 RNN,就是理解”序列建模”这一人工智能核心命题的起点。
4.1 经典循环神经网络
前面几章处理的都是”单个样本”:一张图像、一组特征,彼此独立。而现实世界大量数据天然是序列:一句话由词按顺序组成,一段语音由连续的声学帧组成,股价、气温、心电图则随时间逐点采样。序列数据有三个特点:顺序即语义(“我打你”与”你打我”意思相反)、长度可变、上下文相关(元素的意义依赖前后文)。表 4-1 列出常见序列数据。
表 4-1 常见序列数据
| 数据类型 | 序列中的基本元素 | 典型任务 |
|---|---|---|
| 文本 | 词 / 字 / 子词 | 语言模型、机器翻译、情感分析 |
| 语音 | 每 10~20 ms 一帧的声学特征 | 语音识别、语音合成 |
| 时间序列 | 等间隔采样点 | 股价预测、气温预报、电力负荷预测 |
| 视频 | 图像帧 | 动作识别、视频理解 |
| 生物信号 | 采样点 | 心电图异常检测、脑电分析 |
用多层感知机(MLP)处理序列,最朴素的办法是固定窗口:只看最近 \(N\) 个元素。它有三个致命缺陷:窗口太小,远距离信息被截断;窗口太大,参数随 \(N\) 膨胀;更根本的是,依赖的距离并不固定。经典例子是英语完形填空:“I grew up in France… I speak French.” 省略号可能隔着几十个词,要预测句末的 French,必须回忆起开头的 France - 而固定窗口的视野永远有限。可见 MLP 没有”记忆”。
为什么窗口不行
语言中的依赖常常”远在天边”:指代(“小明的妈妈说他生病了”中的”他”)、时态呼应、主题一致性,都可能跨越整段话。窗口长度是人拍脑袋定的,而真实依赖距离是数据说了算的 - 固定窗口本质上是在用”人为的先验”对抗”未知的分布”。
循环神经网络(Recurrent Neural Network, RNN)的核心思想只有一句话:给网络装上”记忆”。做法是引入隐藏状态 \(h_{t}\):它既用于计算当前输出,又被反馈回网络自身、参与下一时刻的计算,因此携带了截至 \(t\) 时刻的历史信息。RNN 通常画成两种等价形式:折叠形式是带自环的单元;按时间展开则把自环拉开,得到与时间步等长的深层网络(图 4-1)。展开后每个时刻都有输入 \(x_{t}\)、隐藏状态 \(h_{t}\) 与输出 \(y_{t}\)。
展开图里最关键的观察是权值共享:所有时刻共用同一组权重 \(W_{\mathit{hx}}\)、\(W_{\mathit{hh}}\)、\(W_{\mathit{yh}}\) 与偏置。无论 France 与 French 相隔 3 个词还是 30 个词,联系它们的规律是同一套。权值共享的收益:参数量与序列长度无关;可处理任意长度序列;所有时刻共同更新同一组参数。这是它与”按时间展开后看似很深”的普通前馈网络的本质区别。
于是,RNN 一个时间步的前向计算就是两条公式:
\[ h_t=\tanh\!\left(W_{hx}x_t+W_{hh}h_{t-1}+b_h\right) \]
\[ y_t=W_{yh}h_t+b_y\qquad\text{分类时再接 softmax} \]
第一式把”新输入”与”旧记忆”融合、更新隐藏状态,tanh 把结果压缩到 (−1, 1) 并提供非线性;第二式从当前状态读出输出。\(h_{0}\) 通常取零向量;计算需从 \(t\)=1 依次推到 \(t\)=\(T\),无法并行。用伪代码描述:
# RNN 前向计算(伪代码):沿着时间一步步推进
h = 0 # 隐藏状态 h_0 初始化为零向量
for t in 1 … T:
h = tanh(W_hx @ x[t] + W_hh @ h + b_h) # 融合新输入与旧记忆,更新状态
y[t] = W_yh @ h + b_y # 由当前状态读出输出
训练 RNN 的标准算法是随时间反向传播(Backpropagation Through Time, BPTT):先把网络按时间展开成深度网络,再对整条展开链做反向传播,把误差信号从第 \(T\) 步一路传回第 1 步;因权重共享,某权重的梯度等于各时刻梯度的总和。简言之,BPTT 就是”对权值共享的深网络做 BP”。然而,误差沿时间链逐层回传时,RNN 最著名的难题浮出水面。
把误差从时刻 \(T\) 传回时刻 1,需要连乘 (\(T\)−1) 个中间 Jacobian 矩阵:
\[ \frac{\partial L}{\partial h_1}=\frac{\partial L}{\partial h_T}\prod_{k=2}^{T}\left[\operatorname{diag}\!\left(\tanh'(z_k)\right)W_{hh}\right] \]
其中 tanh′ 的取值在 (0, 1] 之间,每一步回传都相当于”乘一个小于或接近 1 的数”。若 \(W_{\mathit{hh}}\) 的范数小于 1,梯度随步长指数衰减,几十步后趋近于 0 - 梯度消失,远处信息再也学不到;若大于 1,则指数爆炸,训练发散(实践中用”梯度裁剪”缓解爆炸),如图 4-2 所示。
梯度消失 ≠ 梯度为零
“消失”的梯度在数学上只是指数级地小,但在浮点精度下会下溢成 0,表现为远处时刻的权重几乎收不到更新信号;而”爆炸”的梯度则会溢出成 NaN,直接毁掉训练。所以 RNN 既”记不住”(消失),又”容易翻车”(爆炸)。
一句话理解 RNN
折叠时是一个带记忆的自环单元,展开时是一个权值共享的深层网络 - 它的”记忆”就是隐藏状态 \(h_{t}\),前向靠两条公式,训练靠 BPTT,而梯度沿时间连乘带来的消失与爆炸,则让它难以记住很远的信息。
类比:接力跑
把 RNN 想成一场接力跑:隐藏状态 \(h_{t}\) 是接力棒,每一棒的选手(时间步)都从上一棒接过全部历史信息,再添上自己手里的新输入,继续向前传。棒传得越远,信息丢失得越多 - 这正是梯度消失的生活版本。
梯度消失意味着经典 RNN 实际上只能记住几步到十几步之内的信息,长期依赖(long-term dependency)成了它的致命伤:读一篇长文,读到后面就忘了前面。下一节的主角 LSTM,正是为攻克这一难题而生的。
4.2 长短时记忆神经网络
1997 年,Hochreiter 与 Schmidhuber 提出长短时记忆网络(Long Short-Term Memory, LSTM)。它的核心洞察是:梯度之所以消失,是因为信息被迫一次又一次穿过 tanh 这类”挤压”变换,每过一次就乘一个小于 1 的导数;那不如干脆开辟一条传送带 - 细胞状态 \(C_{t}\) - 让它几乎不经过变换地横贯整个网络,信息得以”原样”地长距离传送。传送带上写什么、留什么、读什么,由三个可学习的门来调控。
门(gate)是一个输出在 0~1 之间的 sigmoid 单元:输出接近 1 表示”几乎全部放行”,接近 0 表示”几乎全部阻挡”。三个门接收同一个输入 - 上一时刻的隐藏状态 \(h_{t-1}\) 与当前输入 \(x_{t}\) 的拼接 [\(h_{t-1}\), \(x_{t}\)]:
\[ \begin{aligned} f_t&=\sigma\!\left(W_f[h_{t-1},x_t]+b_f\right) &&\text{遗忘门},\\ i_t&=\sigma\!\left(W_i[h_{t-1},x_t]+b_i\right) &&\text{输入门},\\ \widetilde C_t&=\tanh\!\left(W_C[h_{t-1},x_t]+b_C\right) &&\text{候选记忆},\\ o_t&=\sigma\!\left(W_o[h_{t-1},x_t]+b_o\right) &&\text{输出门}. \end{aligned} \]
有了三个门,传送带的更新就一目了然:
\[ \begin{aligned} C_t&=f_t\odot C_{t-1}+i_t\odot\widetilde C_t,\\ h_t&=o_t\odot\tanh(C_t). \end{aligned} \]
第一式是”传送带”的更新:先把旧状态按遗忘门的比例”打折”,再加上新内容(输入门与候选记忆逐元素相乘),⊙ 表示按元素相乘;第二式是读出:把更新后的细胞状态压缩到 (−1, 1) 后,按输出门的比例读出,得到新的隐藏状态 \(h_{t}\) - 它既作为本时刻的输出,又作为下一时刻的”记忆输入”继续传递。整个结构如图 4-3 所示。
图 4-3 LSTM 单元结构:细胞状态 C_t 沿传送带横贯(紫色),遗忘门、输入门、输出门(σ,橙色)与候选记忆(tanh,绿色)共同决定”忘什么、写什么、读什么”;h_t 同时作为输出与下一时刻的输入
类比:带三把锁的抽屉
遗忘门决定把抽屉里不再有用的旧物扔掉(读到新话题时清空旧记忆);输入门决定把眼前的新东西放进抽屉(记住”France”);输出门决定把抽屉里的哪部分展示给外人看(当前时刻只透露当下需要的信息)。三把锁的开合程度不是人设定的,而是网络从数据里学出来的 - 它们只是带 sigmoid 的线性层,通过梯度下降自动找到最佳的”开关”位置。
门为什么用 sigmoid
因为网络需要”可微的开关”:硬开关(0/1)不可导,梯度无法流过,也就无法训练;sigmoid 输出 0~1 的连续值,梯度可以顺利传播,训练结束后门自然学会在 0 与 1 之间取合适的位置 - 门是”软开关”,介于”全开”与”全关”之间。
从梯度角度看,误差沿传送带回传时只需乘一个标量 \(f_{t}\)(0~1 之间),不再与整条链路的 Jacobian 连乘;当遗忘门接近 1 时,误差几乎”无损”地反向流动,数百步之外的梯度依然存在。这正是恒等捷径(identity shortcut)思想的早期形态 - 后来的 ResNet 残差连接与之一脉相承。
LSTM 的代价是参数多、计算重,与经典 RNN 的对比见表 4-2。2014 年,Cho 等人提出更精简的门控循环单元(Gated Recurrent Unit, GRU):把遗忘门与输入门合并成更新门 \(z_{t}\),并引入重置门 \(r_{t}\) 控制对旧记忆的利用程度,不再有独立的细胞状态:
表 4-2 LSTM 与经典 RNN 对比
| 对比项 | 经典 RNN | LSTM |
|---|---|---|
| 记忆能力 | 短:一般只能记住几步到十几步 | 长:可记住数百步以上的长期依赖 |
| 梯度传播 | 误差沿时间链连乘,容易消失或爆炸 | 传送带近似”恒等捷径”,误差可长距离近乎无损地回传 |
| 参数数量 | 少(一组权重 \(W\)) 多( | 约 RNN 的 3~4 倍,四组权重) |
| 计算开销 | 小、训练快 | 较大、训练较慢 |
| 门控机制 | 无 | 遗忘门、输入门、输出门 |
\[ \begin{aligned} z_t&=\sigma\!\left(W_z[h_{t-1},x_t]+b_z\right),\\ r_t&=\sigma\!\left(W_r[h_{t-1},x_t]+b_r\right),\\ \widetilde h_t&=\tanh\!\left(W_h[r_t\odot h_{t-1},x_t]+b_h\right),\\ h_t&=(1-z_t)\odot h_{t-1}+z_t\odot\widetilde h_t. \end{aligned} \]
GRU 参数更少、训练更快,在很多任务上性能与 LSTM 相当。可以说,LSTM 与 GRU 是”门控思想”的两个代表 - 先想清楚”该忘什么、该记什么”,再动手更新记忆。
在 Transformer 出现之前,LSTM 几乎是序列任务的事实标准,典型应用包括:语言模型 - 预测下一个词,曾统治文本生成与对话系统;Seq2Seq 机器翻译 - 用编码器把源语言句子压缩成一个语义向量,再用解码器逐词生成译文(图 4-4),这一”编码—解码”框架正是今天生成式大模型的前身;语音识别 - 把一帧帧声学特征映射为音素和文字;此外还有情感分析、命名实体识别、股价与电力负荷等时间序列预测。
2017 年之后,Transformer 逐步取代了 RNN,原因有三。第一,串行不可并行:\(t\) 时刻的计算必须等 \(h_{t-1}\) 算完,GPU 无法同时处理一句话的所有位置,训练速度受限;第二,长依赖仍有天花板:即便 LSTM,面对几千词的长文本依然吃力,梯度要逐时间步”爬”回去;第三,注意力一步直达:Transformer 让任意两个位置直接建立联系,依赖距离变成常数,且全序列可并行计算。但 RNN 的遗产并未消失:门控思想延续到 GRU 与各类门控残差结构,“编码—解码”框架孕育了今天的 LLM,而”给网络加记忆”这一命题,正是注意力机制要解决的同一个问题 - 第 5 章将展开这段故事。
本章要点
- 序列数据的特点是顺序即语义、长度可变、上下文相关;固定窗口无法处理可变且可能很远的依赖。
- RNN 通过隐藏状态自环获得”记忆”;折叠图与按时间展开图等价,且所有时刻权值共享。
- 前向:\(h_{t}\) = tanh(\(W_{\mathit{hx}}x_{t}\) + \(W_{\mathit{hh}}h_{t-1}\) + \(b_{h}\));训练用
BPTT(按时间展开后反向传播)。 - 梯度消失/爆炸源于误差沿时间连乘 Jacobian:范数小于 1 指数衰减、大于 1 指数爆炸,由此形成长期依赖难题。
- LSTM 用细胞状态传送带 \(C_{t}\) + 遗忘/输入/输出三门缓解梯度消失:\(C_{t}\) = \(f_{t}\) ⊙ \(C_{t-1}\) + \(i_{t}\) ⊙ \(\widetilde{C}_{t}\),\(h_{t}\) = \(o_{t}\) ⊙ tanh(\(C_{t}\))。
GRU用更新门/重置门进一步简化;“编码—解码”(Seq2Seq)框架是 LLM 的前身;2017 年后 Transformer 因可并行与”一步直达”的注意力而胜出。
延伸阅读 · 与现代AI的联系
- Seq2Seq:大语言模型的前身。2014 年 Sutskever 等人的《Sequence to Sequence Learning with Neural Networks》用”编码器—解码器”统一了翻译、摘要等生成任务;2015 年 Bahdanau 等人提出注意力机制,正是为了摆脱”语义向量 c 容量有限”的瓶颈 - 而注意力最终在 2017 年演化为 Transformer(第 5 章)。今天 GPT、BERT、DeepSeek 的”输入—输出”架构,都还能看到编码器—解码器的影子。
- Transformer 如何克服 RNN 的短板。自注意力让任意两个位置”一步直达”、全序列并行,从根本上绕开了串行计算与长依赖连乘,见第 5 章。
- 门控思想的延续。LSTM 的门控与恒等捷径,在 GRU、Transformer 的门控残差乃至专家混合(MoE)路由中都有延续;ResNet 的残差连接与 LSTM 传送带是同一思想的两种表达。
- RNN 并未消失。在语音流式识别、在线时序预测等低延迟/低资源场景,轻量 RNN/GRU 仍在服役;“给模型加记忆”的命题在 LLM 中则演化为上下文窗口、KV 缓存与长文本技术。



