循环神经网络 RNN 与 LSTM
处理序列数据的核心架构,让网络具有"记忆"能力。
循环神经网络(RNN)
- 结构:h_t = tanh(W_hh·h_{t-1} + W_xh·x_t + b_h)
- 展开(Unrolled)视图:随时间步展开的计算图
- 权值共享:同一组权重在不同时间步复用
RNN 梯度消失与爆炸
- 反向传播通过时间(BPTT)导致梯度链式相乘
- 梯度消失:权重更新极小,网络丧失长期记忆
- 梯度爆炸:权重更新极大,训练不稳定
- 处理方式:梯度裁剪(Gradient Clipping)、门控机制
LSTM(长短期记忆网络)
- 核心思想:细胞状态(Cell State)C_t 信息高速公路 + 门控机制精细控制信息流动
遗忘门(Forget Gate)
- f_t = σ(W_f·[h_{t-1}, x_t] + b_f)
- 决定丢弃哪些旧信息
输入门(Input Gate)
- i_t = σ(W_i·[h_{t-1}, x_t] + b_i)
- Ĉ_t = tanh(W_C·[h_{t-1}, x_t] + b_C)
- 决定添加哪些新信息
细胞状态更新
- C_t = f_t ⊙ C_{t-1} + i_t ⊙ Ĉ_t
输出门(Output Gate)
- o_t = σ(W_o·[h_{t-1}, x_t] + b_o)
- h_t = o_t ⊙ tanh(C_t)
GRU(门控循环单元)
- 简化 LSTM:重置门 + 更新门,无单独细胞状态
- 参数量少,训练更快
双向 RNN(BiRNN)
- 正向 + 反向隐藏状态拼接
- 捕获前后双向上下文信息
序列到序列(Seq2Seq)
- Encoder-Decoder 架构
- Encoder 压缩输入序列为上下文向量
- Decoder 逐步生成输出序列
Attention 机制
- 基础 Seq2Seq 的问题:上下文向量信息瓶颈
- 注意力:Decoder 每一步关注 Encoder 不同位置
- 计算:相似度 → softmax 权重 → 加权求和上下文
Bahdanau Attention vs Luong Attention
- Bahdanau:加性注意力,h_t 和 h_s 通过神经网络计算权重
- Luong:乘性注意力,通过点积/一般/拼接三种方式
PyTorch 实现
- nn.RNN、nn.LSTM、nn.GRU 的使用
- batch_first=True 的含义
- 打包填充序列:pack_padded_sequence / pad_packed_sequence
应用场景
- 机器翻译、文本生成、语音识别、时间序列预测、情感分析
总结
| 特性 | RNN | LSTM | GRU |
|---|---|---|---|
| 门控机制 | 无 | 遗忘门、输入门、输出门 | 重置门、更新门 |
| 细胞状态 | 无 | 有 | 无 |
| 参数量 | 少 | 多 | 中等 |
| 长距离依赖 | 难以捕捉 | 擅长捕捉 | 较好捕捉 |
| 训练速度 | 快 | 慢 | 中等 |
| 梯度问题 | 严重 | 有效缓解 | 有效缓解 |