RNN
Recurrent Neural Network 循环神经网络
RNN 通过隐藏状态的循环连接实现对序列数据的建模,使网络具备"记忆"能力,能够捕捉时间步之间的依赖关系。 属于深度学习中处理变长序列数据的基础架构,是 LSTM、GRU 及现代序列模型的理论起点。
核心思想:隐状态的循环传递
与前馈神经网络不同,RNN 在隐藏层中引入循环连接:每个时间步的隐藏状态不仅依赖当前输入,还依赖前一时间步的隐藏状态。这使得网络能够将历史信息编码到隐状态中,实现对序列上下文的建模。
其中
数学公式
隐藏状态更新:
输出计算:
其中:
是时间步 的输入向量 是隐藏状态向量 是输入到隐藏状态的权重矩阵 是隐藏状态到隐藏状态的权重矩阵(所有时间步共享) 是隐藏状态到输出的权重矩阵 是偏置向量 是输出层的激活函数(如 softmax 用于分类)
参数共享
RNN 的关键特性是权重在所有时间步上共享(
训练:BPTT
RNN 使用时间反向传播 (Backpropagation Through Time, BPTT) 进行训练。将 RNN 沿时间轴展开后,等价于一个深度前馈网络,然后应用标准的反向传播算法计算梯度。
对于损失函数
梯度问题
梯度消失与梯度爆炸
由于 BPTT 中梯度需要经过多个时间步的连乘
- 若
的谱范数 :梯度指数衰减 → 梯度消失,无法学习长距离依赖 - 若
的谱范数 :梯度指数增长 → 梯度爆炸,训练不稳定
缓解策略:
| 问题 | 解决方案 | 说明 |
|---|---|---|
| 梯度爆炸 | 梯度裁剪 (Gradient Clipping) | 当梯度范数超过阈值时进行缩放 |
| 梯度消失 | 门控机制 (LSTM/GRU) | 通过门控制信息流,维持长距离梯度 |
| 梯度消失 | 残差连接 | 提供梯度的"捷径" |
| 梯度消失 | 正交初始化 | 使 |
主要变种
LSTM (Long Short-Term Memory)
LSTM 引入细胞状态
细胞状态
GRU (Gated Recurrent Unit)
GRU 是 LSTM 的简化版本,将遗忘门和输入门合并为更新门,参数更少:
RNN 变种架构对比
| 特性 | Vanilla RNN | LSTM | GRU |
|---|---|---|---|
| 参数量 | |||
| 长距离依赖 | 差 | 好 | 好 |
| 门控机制 | 无 | 3 个门 | 2 个门 |
| 训练速度 | 快 | 慢 | 中等 |
| 适用场景 | 短序列 | 长序列、复杂任务 | 数据量较小的任务 |
序列建模模式
RNN 支持多种输入-输出模式:
- 一对一 (One-to-One):标准前馈网络,非序列任务
- 一对多 (One-to-Many):如图像描述生成(输入图像,输出文字序列)
- 多对一 (Many-to-One):如情感分析(输入文本序列,输出情感标签)
- 多对多 (Many-to-Many):如机器翻译(Encoder-Decoder)、视频分类
PyTorch 示例
python
import torch
import torch.nn as nn
class SimpleRNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super().__init__()
self.rnn = nn.RNN(input_size, hidden_size, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x, h0=None):
# x: (batch, seq_len, input_size)
out, hn = self.rnn(x, h0)
# 取最后一个时间步的输出用于分类
out = self.fc(out[:, -1, :])
return out
# 使用 LSTM 替代
class LSTMModel(nn.Module):
def __init__(self, input_size, hidden_size, output_size, num_layers=2):
super().__init__()
self.lstm = nn.LSTM(input_size, hidden_size,
num_layers=num_layers, batch_first=True,
dropout=0.2)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
out, (hn, cn) = self.lstm(x)
return self.fc(out[:, -1, :])
局限与后续发展
- 并行计算困难:RNN 的时间步必须顺序执行,无法充分利用 GPU 并行能力
- 长距离依赖仍有限:即使 LSTM/GRU 缓解了梯度消失,超长序列仍面临信息瓶颈
- 被 Transformer 取代:在 NLP 领域,基于自注意力机制的 Transformer 架构已大幅取代 RNN,实现更好的并行性和长距离建模能力
发展脉络
Vanilla RNN → LSTM (1997) → GRU (2014) → Attention 机制 → Transformer (2017) → 大语言模型