Appearance
第5章 循环神经网络与序列模型
Chapter 5: Recurrent Neural Networks and Sequence Models
序列数据无处不在:文本、语音、时间序列、基因序列……RNN 是第一个真正为序列建模而设计的神经网络架构。 本章推导 RNN 的核(kernel /ˈkɜːrnl/)心机制——循环计算图与随时间反向传播(backpropagation /ˌbækprəpəˈɡeɪʃən/)(BPTT),并深入 LSTM 的门控机制如何解决长程依赖问题。最后,我们分析 RNN 的固有瓶颈,并以此为桥梁引出注意力(attention /əˈtenʃən/)机制(Attention),为后续 Transformer(/trænsˈfɔːrmər/) 的学习做好铺垫。
时间线:
- 1982: Hopfield 提出 Hopfield 网络
- 1990: Elman 提出简单循环网络(SRN)
- 1997: Hochreiter & Schmidhuber 发表 LSTM
Sequential data is everywhere: text, speech, time series, gene sequences... RNN is the first neural architecture truly designed for sequence modeling. This chapter derives RNN's core mechanism — the recurrent computation graph and Backpropagation Through Time (BPTT) — and dives into how LSTM's gating mechanism solves long-term dependency problems. Finally, we analyze RNN's inherent bottleneck, building a bridge to the Attention mechanism that follows in Volume 5.
前置知识 (Prerequisites): 前馈神经网络基础(第4章第1-2节),矩阵求导(AI数学基础第3章),反向传播(第4章第3节) 依赖库 (Dependencies): torch>=2.1.0, numpyCode companion: code/rnn_lstm.py
目录 (Table of Contents)
- 3.1 GRU 的设计动机
- 3.2 GRU 公式推导
- 3.3 LSTM vs GRU
编码器(encoder /ɪnˈkoʊdər/)-解码器(decoder /diːˈkoʊdər/)架构 (Encoder-Decoder Architecture)
- 4.1 固定维度的上下文向量
- 4.2 编码器-解码器的信息瓶颈
- 5.1 从瓶颈到查阅
- 5.2 Attention 的直觉
1. RNN 循环计算图 (RNN Recurrent Computation Graph)
1.1 问题定义:为什么需要"循环"?
前馈网络(FNN)有一个根本性限制:输入长度必须固定。
对于一条句子,例如 "I love neural networks",我们无法预先知道句子的长度。更重要的是,词与词之间有顺序依赖关系——"love" 的语义受到前面的 "I" 的影响。如果只是把每个词独立地送入一个全连接层,前后信息就被割裂了。
RNN 的解决方案:引入一个隐藏状态 (hidden state)
1.2 RNN 基本公式
最简单的 RNN(有时称为 Elman RNN)定义如下:
隐藏状态更新 (Hidden State Update):
输出 (Output):
其中:
— 在时间步 的输入向量(如词嵌入(embedding /ɪmˈbedɪŋ/)) — 上一个时间步的隐藏状态 — 当前时间步的隐藏状态 — 循环权重矩阵(RNN 的核心——连接前后时间步) — 输入权重矩阵 — 输出权重矩阵 — 偏置项 — 激活函数(将值压缩到 ,给非线性以稳定梯度)
关键观察:
在所有时间步共享。这意味着无论序列多长,RNN 都在使用同一组参数(parameter /pəˈræmɪtər/)处理每一个时间步——这就是"循环"的含义。
1.3 展开的计算图 (Unrolled Graph)
将循环结构"展开"成时间维度的前馈图,有助于理解 RNN 的计算流:
y_1 y_2 y_3 y_T
↑ ↑ ↑ ↑
W_hy W_hy W_hy W_hy
┌───┴───┐ ┌───┴───┐ ┌───┴───┐ ┌───┴───┐
h_0→│ h_1 │→→→│ h_2 │→→→│ h_3 │→⋯→│ h_T │
└───┬───┘ └───┬───┘ └───┬───┘ └───┬───┘
↑ ↑ ↑ ↑
x_1 x_2 x_3 x_T图 5.1: RNN 展开后的计算图。注意
在所有时间步是同一个矩阵——虚箭头代表循环连接,展开后变成从左到右的实心传递。
展开后的视角:RNN 等价于一个极深的"前馈"网络,其深度等于序列长度
1.4 随时间反向传播 (BPTT)
BPTT (Backpropagation Through Time) 就是在展开后的计算图上应用反向传播。
损失函数
定义在
以 MSE 为例:
对 的梯度
对 的梯度(关键)
核心在于
其中
最终,对
🔍 完整演算:BPTT 梯度链 — 3 步标量 RNN 手算
📐 公式
随时间反向传播(BPTT)中,损失
其中梯度链的核心传递因子为:
对标量 RNN(
📖 参数含义
| 符号 | 名称 | 含义 |
|---|---|---|
| 时间步 | 模型预测与真实值的误差 | |
| 循环权重矩阵 | 控制隐藏状态在时间步间的传递 | |
| 时间步 | RNN 的"记忆"载体 | |
| 梯度传递因子 | 衡量误差信号在相邻时间步的衰减或放大 | |
| 值域 |
📝 公式来源
从 RNN 前向公式
由链式法则和
当时间步跨度
✏️ 手算演示
考虑一个标量 RNN(输入维度
Step 1: 前向传播
Step 2: 计算相邻时间步的梯度传递因子
Step 3: 计算远距离梯度链(
结果:仅跨越 2 步,梯度就衰减到了约 12%。若序列长度
Step 4: 代入不同
| 0.5 | 0.2505 | 0.4885 | 0.1224 — ✅ 梯度消失 |
| 0.9 | 0.4509 | 0.8792 | 0.3965 — ⚠️ 长序列仍会消失 |
| 2.0 | 1.0020 | 1.9538 | 1.9581 — ❌ 梯度爆炸 |
梯度爆炸验证(
经过 20 步,梯度将达到约
🌍 实际意义
- 梯度消失是 vanilla RNN 无法学习长程依赖的根本原因:理论分析(Bengio et al., 1994)表明,vanilla RNN 在实践中很难捕捉超过 5—10 步的依赖关系。
- 梯度爆炸导致训练不稳定(NaN 损失),实际解决方案是梯度裁剪(Gradient Clipping)——将梯度模长限制在阈值以内,详见 §1.5。
- LSTM 的核心贡献就是通过加性细胞状态替代乘性梯度路径,从根本上解决梯度消失问题(详见 §2.6)。
1.5 梯度消失与梯度爆炸
从上面的推导,我们得到:
这是一个连乘结构。假设我们定义矩阵谱范数
- 如果
:连乘项 当 很大时 ⟹ 梯度消失 (Vanishing Gradient) - 如果
:连乘项 当 很大时 ⟹ 梯度爆炸 (Exploding Gradient)
为什么这是致命问题?
梯度消失意味着距离较远的时间步对当前参数的更新几乎没有贡献。RNN 无法学习"长程依赖"——例如在句子 "I grew up in France... I speak French" 中,最后一个词需要记忆前面的 "France"。如果距离太远,梯度消失使得这种学习几乎不可能。
梯度爆炸意味着参数更新过大,训练不稳定(NaN 损失)。解决办法:梯度裁剪 (Gradient Clipping) — 将梯度的模控制在阈值以内。
核心洞察: 梯度消失的根本原因是连乘结构。LSTM 的核心贡献就是通过加性的细胞状态来替代乘性的梯度传递路径。
2. LSTM (Long Short-Term Memory)
LSTM 由 Hochreiter & Schmidhuber 于 1997 年提出,后来经过多次改进(尤其是 forget gate 的加入)。它是解决 RNN 梯度消失问题最具影响力的方案。
2.1 核心思想:信息高速公路
LSTM 引入了一个新的内部状态——细胞状态 (Cell State)
┌──────────────────────────────────────┐
│ LSTM Cell │
│ │
h_{t-1} ────────┼─────────────────────────────────┐ │
│ ┌─────┐ │ │
│ ┌─────┐ │tanh │ ┌───┐ │ │
x_t ────────────┼────┤σ │ │ │ │σ │ │ │
│ │ │────▶│ │─────▶│ │─┼────┤───▶ h_t
│ │forget │input│ │output │ │
│ └─────┘ │ │ │ │ │ │
│ └─────┘ └───┘ │ │
│ │ │ │ │
│ ┌─────┐ │ │ │ │
│ │ σ │ │ │ │ │
│ │ │──┘ │ │ │
│ │input gate │ │ │
│ └─────┘ │ │
│ │ │
│ C_{t-1} ────────────⊕───────────┘ │
│ │ │
│ └────▶ C_t │
└──────────────────────────────────────┘图 5.2: LSTM 细胞内部结构示意图。三条"门"控制信息的流入、保持和流出。细胞状态
如同传送带贯穿整个链式结构,只有少量的线性交互。
2.2 遗忘门 (Forget Gate)
功能:决定从旧细胞状态
为什么需要? 当网络进入新的上下文时,旧信息可能不再相关。例如在 "她开始阅读一本书... 她合上了它" 中,"阅读"的动词形态完成后,关于"正在阅读"的信息应该被遗忘门清除。
公式:
其中
输出
2.3 输入门 (Input Gate)
功能:决定在细胞状态中存储哪些新信息。
为什么需要? 不是所有的新输入都值得被记住。输入门充当"筛选器",让重要的新信息进入细胞状态。
输入门由两部分组成:
a) 输入门控制信号(决定更新哪些值):
b) 候选细胞状态(生成新的候选值):
这里
2.4 细胞状态更新 (Cell State Update)
这是 LSTM 中最关键的一步:
其中
直观理解:
— 遗忘门决定保留多少旧记忆 — 输入门决定写入多少新信息 - 两者相加得到新的细胞状态
核心洞察:从
到 的梯度路径是 加法 而非乘法。即使遗忘门接近 1,梯度也能完好无损地沿 路径向后传播。
2.5 输出门 (Output Gate)
功能:基于细胞状态
公式:
2.6 为什么 LSTM 能缓解梯度消失?
这是本章最重要的问题之一。让我们比较 RNN 和 LSTM 的梯度路径。
RNN 的梯度路径(纯乘性):
这是一个矩阵乘法。链式法则使得远距离的梯度趋于 0(或无穷大)。
LSTM 的梯度路径(加性为主):
考虑从
关键观察:
- 主导项
:细胞状态的梯度通过遗忘门直接向后传递,这是一个逐元素缩放而非矩阵乘法。 - 当
时,梯度项 ,远距离梯度信号几乎无损传递。 - 加法结构:
的更新是加法( ),而非乘法( ),梯度不会在每一步被压缩。
即使
简洁表述:RNN 的误差信号在时间上必须连续穿越
矩阵(乘性),而 LSTM 的误差信号可以选择一条"高速公路"——通过 路径的加法捷径,几乎无损地传播到远处。
2.7 完整 LSTM 前向传播总结
将以上所有公式汇总:
输入维度:
参数数量:LSTM 有 4 组权重矩阵(
🔍 完整演算:LSTM 门控计算 — 2 步标量 LSTM 手算与梯度对比
📐 公式
LSTM 前向传播的完整公式组:
其中
📖 参数含义
| 符号 | 名称 | 含义 |
|---|---|---|
| 遗忘门 | 控制保留 | |
| 输入门 | 控制写入新信息的比例,值域 | |
| 候选细胞状态 | 可能写入细胞的新信息,值域 | |
| 细胞状态 | LSTM 的"记忆线",信息传递主干道 | |
| 输出门 | 控制从 | |
| 隐藏状态 | LSTM 的输出(给上层和下一时间步) | |
| Hadamard 积 | 逐元素乘法 |
📝 公式来源
LSTM 的设计动机源于解决 RNN 梯度消失问题。核心思想是用加性的细胞状态更新
梯度从
✏️ 手算演示
考虑一个标量 LSTM(
初始状态:
输入序列:
Step 1: 时间步
Step 2: 时间步
关键观察:信息保留
梯度对比:LSTM vs Vanilla RNN
考虑从时间步 2 到时间步 1 的梯度传播:
| 架构 | 梯度传递因子 | 值 | 10 步累积 |
|---|---|---|---|
| LSTM | 0.629 | ||
| Vanilla RNN | 0.434 |
(Vanilla RNN 的
LSTM 经过 10 步仍保留约 1% 的梯度信号,而 RNN 的梯度已几乎完全消失(0.02%)。这正是 LSTM 能学习长程依赖(如"France
🌍 实际意义
- LSTM 解决了 NLP 中长距离依赖的核心难题:机器翻译中的性别一致、代词的远距离指代、情感分析中的转折词等。
的可学习性使 LSTM 能根据上下文动态决定"记忆多久",这比固定衰减的 RNN 灵活得多。 - 1997 年提出至今,LSTM 仍是时间序列预测、语音识别等领域的强力基线模型。
3. GRU (Gated Recurrent Unit)
GRU 由 Cho et al. 于 2014 年提出,是 LSTM 的简化变体。
3.1 GRU 的设计动机
LSTM 有三个门和一个独立的细胞状态。GRU 观察到:
- 遗忘门和输入门常常是互补的(忘记旧信息 = 留出空间给新信息)
- 细胞状态
和隐藏状态 可以合并
于是 GRU 将门减少到两个,合并了细胞状态和隐藏状态。
3.2 GRU 公式推导
重置门 (Reset Gate)
更新门 (Update Gate)
候选隐藏状态:使用重置门来"重置"旧状态。
注意这里
最终隐藏状态:更新门
直观理解:这是可学习的加权平均。
接近 0 时保留更多旧信息(类似遗忘门 = 1),接近 1 时接受更多新信息(类似遗忘门 = 0,输入门 = 1)。
3.3 LSTM vs GRU
| 特性 | LSTM | GRU |
|---|---|---|
| 门数量 | 3 (f, i, o) | 2 (r, z) |
| 内部状态 | 细胞状态 | 只有隐藏状态 |
| 参数量 | ||
| 表达能力 | 理论上更灵活(独立控制遗忘/写入/输出) | 更简洁,参数量少约 25% |
| 实际表现 | 长序列任务稍优 | 许多任务上与 LSTM 持平 |
| 训练速度 | 稍慢 | 稍快 |
经验法则:如果数据量很大,LSTM 的额外参数可能带来精度提升;如果计算资源受限或追求快速迭代,GRU 是不错的选择。
4. 编码器-解码器架构 (Encoder-Decoder Architecture)
4.1 固定维度的上下文向量
编码器-解码器(Encoder-Decoder)架构由 Cho et al. 和 Sutskever et al. 在 2014 年独立提出。也称为 Seq2Seq (Sequence-to-Sequence)。
基本结构:
编码器 (Encoder) 解码器 (Decoder)
x_1 → [RNN] y_1 → [RNN] → y_1_pred
x_2 → [RNN] y_2 → [RNN] → y_2_pred
... ↘ ↗ ...
x_T → [RNN] → [context] → [RNN] → y_T_pred
↓
固定维度向量
(通常取 h_T 或某种聚合)流程:
- 编码:将输入序列
依次送入 RNN 编码器,最终得到上下文向量 :
- 解码:基于上下文向量
和已生成的输出,逐个时间步生成目标序列 :
4.2 编码器-解码器的信息瓶颈
核心问题:无论输入序列多长,编码器必须将全部信息压缩到一个固定维度的向量
这个
- 对于短句(如 "Hello world"),256 维向量可能够用
- 对于长句(如 "The man who gave a speech about... yesterday finally..."),256 维向量几乎不可能保留所有细节
- 解码器在每个时间步都看到同一个
,没有机制去"关注"输入序列特定位置的信息
直觉类比:这就像你闭着眼睛听别人复述整篇论文的内容摘要,然后要求你逐字写出全文——摘要中丢失的细节无法被恢复。
5. 为什么需要 Attention?
5.1 从瓶颈到查阅
Attention 机制的核心思想非常直观:
在解码的每一步,不依赖单一的上下文向量,而是"查阅"编码器的所有隐藏状态,动态选择相关信息。
5.2 Attention 的直觉
让我们用类比来理解(不涉及 Attention 的具体计算——那将在 Vol 5 第 1 章展开):
无 Attention(RNN Encoder-Decoder):
你参观一座博物馆,在入口处被迫写下一段描述整座博物馆的文字,然后进入各个展厅时只能依靠这段文字来回忆展品。显然,你不可能在入口描述所有细节。
有 Attention:
在每一个展厅,你直接看向当前展品,并翻阅之前写下的笔记,找到与当前展品最相关的记录。你本质上是在有选择地查阅所有信息源。
核心列表对比:
| 特性 | RNN (无 Attention) | Transformer (有 Attention) |
|---|---|---|
| 信息传递 | 通过固定向量 | 动态选择相关位置的信息 |
| 长程依赖 | 困难(梯度消失) | 直连(任意两个位置步长 = 1) |
| 并行化 | 必须串行(后一步依赖前一步的 | 可以完全并行 |
| 瓶颈 | 上下文向量维度固定 | 无信息瓶颈 |
Attention 的完整公式将在《第 6 卷 Transformer》第 1 章中给出。 本章的 core 结论是:RNN 的循环结构(串行、乘性梯度路径、固定上下文向量)是其所有固有局限的根源,而 Attention 正是针对这些局限的直接回应。
6. 小结 (Summary)
RNN 通过隐藏状态
实现序列建模,但 BPTT 的连乘梯度路径导致梯度消失/爆炸。 LSTM 引入细胞状态
和三个门(遗忘、输入、输出),通过加法梯度路径使梯度能无损传播到远处,有效缓解了梯度消失。 GRU 是 LSTM 的简化变体,将门减为 2 个(更新门、重置门),合并了细胞状态和隐藏状态,参数量减少约 25%。
编码器-解码器架构将变长序列压缩到固定维度的上下文向量,存在严重的信息瓶颈。
RNN 的局限(串行计算、梯度消失、信息瓶颈)是通往 Attention 机制的直接动机——Attention 将在 Transformer 架构中彻底替代循环结构。
进一步阅读 (Further Reading):
- Hochreiter & Schmidhuber (1997). "Long Short-Term Memory." Neural Computation. — LSTM 原始论文
- Cho et al. (2014). "Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation." — GRU 与 Seq2Seq
- Sutskever, Vinyals & Le (2014). "Sequence to Sequence Learning with Neural Networks." — Seq2Seq 经典
- Bengio, Simard & Frasconi (1994). "Learning long-term dependencies with gradient descent is difficult." — 梯度消失的理论分析
- Olah (2015). "Understanding LSTM Networks." — 可视化 LSTM 的优秀博文
参考文献 (References)
- Hochreiter, S. & Schmidhuber, J. (1997). Long Short-Term Memory. Neural Computation, 9(8), 1735–1780.
- Cho, K. et al. (2014). Learning phrase representations using RNN encoder-decoder. EMNLP.
- Sutskever, I., Vinyals, O. & Le, Q. V. (2014). Sequence to sequence learning with neural networks. NeurIPS.