循环神经网络
循环神经网络(Recurrent Neural Network,RNN)是一种专门处理序列数据的神经网络结构。它的核心思想是利用循环连接捕捉序列中的时序依赖关系,适用于自然语言处理(NLP)、语音识别、时间序列预测等任务。
1. RNN 的核心思想
- 传统神经网络的问题:前馈神经网络(如全连接网络、CNN)假设输入之间相互独立,无法处理序列数据(如句子、时间序列)。
- RNN 的解决方案:引入隐藏状态(hidden state),将前一步的信息传递到下一步,实现对历史信息的记忆。
2. RNN 的基本结构
RNN 的每个时间步(time step)接受当前输入和上一步的隐藏状态,输出当前步的结果和新的隐藏状态。
数学公式:
- 输入序列: X = { x 1 , x 2 , . . . , x T } X = \{x_1, x_2, ..., x_T\} X={x1,x2,...,xT}
- 隐藏状态更新:
h t = σ ( W h h t − 1 + W x x t + b h ) h_t = \sigma(W_h h_{t-1} + W_x x_t + b_h) ht=σ(Whht−1+Wxxt+bh) - 输出(可选):
y t = σ ( W y h t + b y ) y_t = \sigma(W_y h_t + b_y) yt=σ(Wyht+by)
其中:
- h t h_t ht:当前时间步的隐藏状态。
- W h , W x , W y W_h, W_x, W_y Wh,Wx,Wy:权重矩阵。
- σ \sigma σ:激活函数(如 tanh 或 ReLU)。
示意图:
3. RNN 的特点
- 参数共享:所有时间步共享同一组权重( W h , W x , W y W_h, W_x, W_y Wh,Wx,Wy),减少参数量。
- 变长序列处理:理论上可处理任意长度的序列。
- 时序依赖建模:通过隐藏状态传递历史信息。
4. RNN 的局限性
(1) 梯度消失/爆炸问题
- 原因:反向传播时梯度需在时间步间连乘,长序列中梯度可能指数级衰减(消失)或增大(爆炸)。
- 影响:难以学习长距离依赖(如句子开头对结尾的影响)。
(2) 短期记忆问题
- RNN 的隐藏状态可能无法有效保留长期信息。
5. 改进方案:LSTM 与 GRU
(1) LSTM(长短时记忆网络)
- 核心结构:引入门控机制(输入门、遗忘门、输出门)控制信息流动。
- 记忆单元(Cell State):长期记忆的存储通道,减少梯度消失。
- 公式略(需重点理解门控逻辑)。
(2) GRU(门控循环单元)
- LSTM 的简化版,合并部分门控,参数更少,计算效率更高。
6. RNN 的常见变体
- 双向RNN(Bi-RNN):同时考虑过去和未来的上下文(如句子中某个词的前后信息)。
- 深度RNN:堆叠多个RNN层,增强模型表达能力。
7. 典型应用场景
- 文本生成:根据上文预测下一个词。
- 机器翻译:将源语言序列映射为目标语言序列。
- 情感分析:根据句子序列判断情感倾向。
- 时间序列预测:股票价格、天气预测等。
8. 代码示例(PyTorch)
import torch.nn as nn# 定义RNN模型(输入维度=10,隐藏层维度=20,1层)
rnn = nn.RNN(input_size=10, hidden_size=20, num_layers=1, batch_first=True)# 输入数据(batch_size=3,序列长度=5,特征维度=10)
inputs = torch.randn(3, 5, 10)# 初始隐藏状态
h0 = torch.zeros(1, 3, 20) # (num_layers, batch_size, hidden_size)# 前向传播
output, hn = rnn(inputs, h0)
9. RNN 与 Transformer 的对比
- RNN 的不足:无法并行计算(依赖时间步顺序),长距离依赖仍可能丢失。
- Transformer 的优势:通过自注意力机制(Self-Attention)并行处理序列,更适合长序列任务(如 BERT、GPT)。
总结
- RNN 擅长:短序列任务、实时流数据处理。
- LSTM/GRU:解决长序列梯度问题,但计算成本较高。
- Transformer:当前主流的序列模型,但在某些场景(如在线推理)仍需RNN的变体。