循环网络(RNN / LSTM / GRU)¶
序列数据长度可变、位置有依赖。RNN 用隐状态在时间步之间传递信息。
基础 RNN¶
\[
h_t = \tanh\big(W_{xh} x_t + W_{hh} h_{t-1} + b_h\big)
\]
同一套权重在所有时间步共享。长序列上易出现梯度消失/爆炸(BPTT)。
LSTM / GRU¶
| 结构 | 要点 |
|---|---|
| LSTM | 遗忘/输入/输出门 + 细胞状态,减轻长程梯度问题 |
| GRU | 门控更少,往往更快、效果接近 |
\[
c_t = f_t \odot c_{t-1} + i_t \odot \tilde{c}_t, \qquad
h_t = o_t \odot \tanh(c_t)
\]
双向与多层¶
- BiRNN:正反向隐状态拼接,适合整句已可见的编码。
- 多层:上层吃下层各步输出。
何时用 RNN vs Transformer¶
| 更倾向 RNN/LSTM | 更倾向 Transformer |
|---|---|
| 流式/在线、算力紧 | 并行训练、长程依赖、大规模预训练 |
| 短序列基线 | NLP / 多模态主流 |
import torch.nn as nn
rnn = nn.LSTM(128, 256, num_layers=2, batch_first=True, bidirectional=True)