Skip to content

RNN 与 LSTM

RNN 的核心思想:序列中每个位置的输出不仅依赖当前输入,还依赖之前的状态。

flowchart LR
subgraph 展开的 RNN
h0[">h₀"] --> h1["h₁ = tanh(Wₕh₀ + Wₓx₁)"]
h1 --> h2["h₂ = tanh(Wₕh₁ + Wₓx₂)"]
h2 --> h3["h₃ = ..."]
end
x1[x₁] --> h1
x2[x₂] --> h2
ht=tanh⁡(Whht−1+Wxxt+b)h_t = \tanh(W_h h_{t-1} + W_x x_t + b) yt=softmax(Wyht+by)y_t = \text{softmax}(W_y h_t + b_y)

WhW_h 和 WxW_x 在所有时间步共享,这是 RNN 能处理变长序列的关键。

import torch
import torch.nn as nn
rnn = nn.RNN(input_size=128, hidden_size=256, num_layers=1, batch_first=True)
x = torch.randn(2, 10, 128) # (batch=2, seq_len=10, features=128)
output, hidden = rnn(x)
print(f"输出: {output.shape}, 最终隐状态: {hidden.shape}")
# 输出: (2, 10, 256), 最终隐状态: (1, 2, 256)

反向传播时,梯度经过 WhW_h 反复相乘:

∂L∂h1∝WhT−1\frac{\partial L}{\partial h_1} \propto W_h^{T-1}
  • 如果 WhW_h 的特征值 < 1 → 梯度消失,早期时间步无法学习
  • 如果 WhW_h 的特征值 > 1 → 梯度爆炸,参数变为 NaN
# 梯度裁剪是防止爆炸的常用手段
torch.nn.utils.clip_grad_norm_(rnn.parameters(), max_norm=1.0)

LSTM 通过门控机制解决梯度消失问题。它维护一个细胞状态 ctc_t,信息可以不受阻碍地流过:

flowchart TD
subgraph LSTM 单元
A[遗忘门 f_t] --> D[细胞状态 c_t]
B[输入门 i_t] --> D
C[输出门 o_t] --> E[隐状态 h_t]
D -->|tanh| E
end
门公式作用
遗忘门ft=σ(Wf⋅[ht−1,xt]+bf)f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)决定丢弃哪些旧信息
输入门it=σ(Wi⋅[ht−1,xt]+bi)i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i)决定存储哪些新信息
候选值c~t=tanh⁡(Wc⋅[ht−1,xt]+bc)\tilde{c}_t = \tanh(W_c \cdot [h_{t-1}, x_t] + b_c)新候选信息
更新ct=ft⊙ct−1+it⊙c~tc_t = f_t \odot c_{t-1} + i_t \odot \tilde{c}_t更新细胞状态
输出门ot=σ(Wo⋅[ht−1,xt]+bo)o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o)决定输出什么
隐状态ht=ot⊙tanh⁡(ct)h_t = o_t \odot \tanh(c_t)最终输出
lstm = nn.LSTM(input_size=128, hidden_size=256, num_layers=1, batch_first=True)
x = torch.randn(2, 10, 128)
output, (hidden, cell) = lstm(x)
print(f"输出: {output.shape}") # (2, 10, 256)
print(f"隐状态: {hidden.shape}") # (1, 2, 256)
print(f"细胞状态: {cell.shape}") # (1, 2, 256)

同时从前向和后向处理序列,捕获上下文:

bilstm = nn.LSTM(128, 256, bidirectional=True, batch_first=True)
output, _ = bilstm(x)
print(f"双向输出: {output.shape}") # (2, 10, 512) — 256×2
特性RNNLSTMTransformer
并行计算❌❌✅
长距离依赖❌✅✅ (O(1))
训练速度慢慢快
推理速度快中中(可用 KV Cache)
  • 时间序列预测(股价、天气)
  • 语音识别(CTC 损失)
  • 文本生成(字符级 RNN)
  • 机器翻译(Seq2Seq + Attention)
  • CNN — 图像处理架构
  • Transformer — 取代 RNN 的现代架构