第 8 步 · 让网络拥有记忆
循环神经网络 · RNNRecurrent Neural Network
同一个网络反复使用,把过去的信息带进现在——序列建模的起点,也是 attention 要超越的对象。
14 分钟
阅读 + 实操
2 个
交互演示
中级
难度
循环神经网络 · 交互演示
隐层6
序列长6
当前步0
① 时序展开:同一个 RNN 单元在每个时间步复用,隐状态 h 从左流向右——点击「步进」逐步喂入输入
② char-RNN 训练:在浏览器里训练一个预测下一字符的小 RNN,看 loss 下降;下方柱状图是反向传播时各时间步的梯度范数——越往左(越早的时间步)梯度越小,这就是「梯度消失」
③ 梯度范数随时间步衰减(左 = 早期时间步,右 = 末期)
为什么学这步?
你已经见过 Transformer,但序列建模的起点是 RNN。理解 RNN 的「记忆」与它的「遗忘」(梯度消失),才能真正明白 attention 为什么出现。
📌 发生了什么
- 隐状态跨时间步传递信息
- 权重在时间上共享
- BPTT 沿时间展开反向
⚠️ 常见陷阱
- 梯度随时间步指数衰减
- 长序列早期信息被「遗忘」
- 难以并行(依赖上一步)
✅ 本章小结
- RNN = 带记忆的序列网络
- 梯度消失是它的致命伤
- 催生了 attention
📐 BPTT 与梯度消失
RNN 把网络沿时间展开,反向传播也沿时间进行(Backpropagation Through Time)。链式法则里反复乘 W_h,是梯度消失的数学根源。
每多回传一步,梯度就多乘一次 W_h(与 tanh 的导数)。若 W_h 的谱半径 < 1,连乘让梯度指数衰减——早期时间步几乎收不到信号。
这正是上方梯度柱状图所示:右端(末期)梯度大,左端(早期)梯度小到几乎为零。LSTM 用门控保留长期记忆,attention 则干脆让每步直连任意远的词——绕过这条衰减链。
🎛 截断步长对比
BPTT 截断(truncated BPTT)只回传最近若干步,用部分梯度换取训练稳定与效率。
| 截断步长 | 表现 | 结果 |
|---|---|---|
| T(完整) | 捕捉全部依赖 | 易爆炸/消失 |
| 10–20 | 工程常用折中 | 推荐 |
| 1 | 近似无记忆 | 快但短视 |
💡 截断越短训练越稳但丢失长程信息;本页演示用完整 BPTT 以暴露衰减现象。
💻 RNN 前向一步
单个时间步前向的 Python 实现(与上方演示器逻辑一致):
# RNN 单步前向:h_t = tanh(W_x·x_t + W_h·h_{t-1} + b_h)
def rnn_step(x_t, h_prev, Wx, Wh, bh):
z = np.zeros(H) # pre-activation
for j in range(H):
s = bh[j]
for k in range(I): s += Wx[j*I + k] * x_t[k]
for m in range(H): s += Wh[j*H + m] * h_prev[m]
z[j] = s
h_t = np.zeros(H)
for j in range(H): h_t[j] = np.tanh(z[j]) # 隐状态
return h_t
# 时序展开:对 t=0..T-1 反复调用,h 在步间传递
# BPTT:沿时间反向,链式连乘 W_h —— 梯度随步长衰减
📚 参考文献与延伸阅读
- Elman, J. L. (1990), Finding Structure in Time, Cognitive Science — 经典简单循环网络
- Hochreiter & Schmidhuber (1997), Long Short-Term Memory, Neural Computation — LSTM 用门控对抗梯度消失
- Pascanu, Mikolov & Bengio (2013), On the difficulty of training recurrent neural networks — 梯度爆炸/消失的数学分析
- 续读 → 第 6 步 · 注意力机制:attention 如何绕过这条衰减链;第 7 步 · Transformer:用注意力彻底取代循环
📝 课后练习
检验你的理解——答对为止