人工智能之核心技术 深度学习
第四章 循环神经网络(RNN)与序列模型
文章目录
- [人工智能之核心技术 深度学习](#人工智能之核心技术 深度学习)
- [前言:循环神经网络(RNN)与序列模型 ------ 自然语言处理基础](#前言:循环神经网络(RNN)与序列模型 —— 自然语言处理基础)
- [一、RNN 基础](#一、RNN 基础)
- [1.1 结构与原理:建模时序依赖](#1.1 结构与原理:建模时序依赖)
- [1.2 RNN 的局限性](#1.2 RNN 的局限性)
- [二、RNN 变体:解决长期依赖](#二、RNN 变体:解决长期依赖)
- 三、序列模型应用场景
- [3.1 文本分类 & 情感分析](#3.1 文本分类 & 情感分析)
- [3.2 文本生成](#3.2 文本生成)
- [3.3 机器翻译入门(Seq2Seq)](#3.3 机器翻译入门(Seq2Seq))
- 四、配套代码实现(PyTorch)
- [示例 1:LSTM 文本分类](#示例 1:LSTM 文本分类)
- [示例 2:GRU 文本生成(简化版)](#示例 2:GRU 文本生成(简化版))
- [五、补充:RNN 的现代地位](#五、补充:RNN 的现代地位)
- 六、总结对比
- 资料关注
前言:循环神经网络(RNN)与序列模型 ------ 自然语言处理基础
如果说 CNN 是处理空间结构 (如图像)的利器,那么 RNN(Recurrent Neural Network) 就是专为时间序列/顺序数据设计的深度学习模型。它在自然语言处理(NLP)、语音识别、时间序列预测等领域扮演着核心角色。
一、RNN 基础
1.1 结构与原理:建模时序依赖
人类理解语言时会"记住"上下文。例如:
"我今天吃了 ___。" → 听到"吃",你会预期后面是"饭"、"苹果"等食物。
RNN 模拟这种记忆机制:将上一时刻的隐藏状态传递给下一时刻。
核心公式:
h t = tanh ( W h h t − 1 + W x x t + b h ) y t = W y h t + b y \begin{aligned} h_t &= \tanh(W_h h_{t-1} + W_x x_t + b_h) \\ y_t &= W_y h_t + b_y \end{aligned} htyt=tanh(Whht−1+Wxxt+bh)=Wyht+by
- x t x_t xt:t 时刻输入(如词向量)
- h t h_t ht:t 时刻隐藏状态("记忆")
- y t y_t yt:t 时刻输出(如预测下一个词)
x₁
RNN Cell
h₀=0
h₁
y₁
x₂
RNN Cell
h₂
y₂
x₃
RNN Cell
h₃
y₃
💡 关键思想 :参数共享 !所有时间步使用同一组权重 W h , W x W_h, W_x Wh,Wx,使模型能处理任意长度序列。
1.2 RNN 的局限性
尽管 RNN 能建模短期依赖,但在实践中面临两大挑战:
| 问题 | 原因 | 后果 |
|---|---|---|
| 长期依赖问题 | 信息需跨多个时间步传递 | 远距离词无法有效关联(如"猫...它") |
| 梯度消失/爆炸 | 反向传播时链式法则连乘: ∂ L ∂ W ∝ ∏ k = 1 t ∂ h k ∂ h k − 1 \frac{\partial \mathcal{L}}{\partial W} \propto \prod_{k=1}^t \frac{\partial h_k}{\partial h_{k-1}} ∂W∂L∝∏k=1t∂hk−1∂hk | - 梯度趋近 0 → 参数几乎不更新- 梯度爆炸 → 训练不稳定 |
📌 实验现象:标准 RNN 在序列长度 > 20 时几乎无法学习长期模式。
二、RNN 变体:解决长期依赖
2.1 LSTM(Long Short-Term Memory)
由 Hochreiter & Schmidhuber (1997) 提出,通过门控机制精确控制信息流动。
三大门控:
- 遗忘门(Forget Gate) :决定丢弃多少旧记忆
f t = σ ( W f [ h t − 1 , x t ] + b f ) f_t = \sigma(W_f [h_{t-1}, x_t] + b_f) ft=σ(Wf[ht−1,xt]+bf) - 输入门(Input Gate) :决定存储多少新信息
i t = σ ( W i [ h t − 1 , x t ] + b i ) i_t = \sigma(W_i [h_{t-1}, x_t] + b_i) it=σ(Wi[ht−1,xt]+bi) - 输出门(Output Gate) :决定输出多少当前记忆
o t = σ ( W o [ h t − 1 , x t ] + b o ) o_t = \sigma(W_o [h_{t-1}, x_t] + b_o) ot=σ(Wo[ht−1,xt]+bo)
单元状态(Cell State):
- 主信息流: C t = f t ⊙ C t − 1 + i t ⊙ C ~ t C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t Ct=ft⊙Ct−1+it⊙C~t
- 隐藏状态: h t = o t ⊙ tanh ( C t ) h_t = o_t \odot \tanh(C_t) ht=ot⊙tanh(Ct)
LSTM_Cell
x_t
Concat1
h_{t-圩}
Forget Gate σ
Input Gate σ
\tilde{C}t (tanh)
Output Gate σ
C{t-1}
Mult1
Mult2
Add1
C_t
tanh
Mult3
h_t
✅ 优势:细胞状态像"传送带",梯度可无损传递 → 解决长期依赖!
2.2 GRU(Gated Recurrent Unit)
Cho et al. (2014) 提出的简化版 LSTM,只有两个门:
- 重置门(Reset Gate):控制忽略过去信息的程度
- 更新门(Update Gate):控制保留多少旧状态
公式:
z t = σ ( W z [ h t − 1 , x t ] ) r t = σ ( W r [ h t − 1 , x t ] ) h ~ t = tanh ( W [ r t ⊙ h t − 1 , x t ] ) h t = ( 1 − z t ) ⊙ h t − 1 + z t ⊙ h ~ t \begin{aligned} z_t &= \sigma(W_z [h_{t-1}, x_t]) \\ r_t &= \sigma(W_r [h_{t-1}, x_t]) \\ \tilde{h}t &= \tanh(W [r_t \odot h{t-1}, x_t]) \\ h_t &= (1 - z_t) \odot h_{t-1} + z_t \odot \tilde{h}_t \end{aligned} ztrth~tht=σ(Wz[ht−1,xt])=σ(Wr[ht−1,xt])=tanh(W[rt⊙ht−1,xt])=(1−zt)⊙ht−1+zt⊙h~t
⚡ 优点 :参数更少、训练更快;性能与 LSTM 相当 → 现代 NLP 常用
2.3 双向 RNN(Bi-RNN / Bi-LSTM)
标准 RNN 只能利用过去 信息。但很多任务需要上下文双向信息,例如:
"他把__送到医院。" → 空格处可能是"病人"或"医生",需看后文"送到医院"才能确定。
Bi-RNN 同时运行两个 RNN:
- 前向 RNN: \\overrightarrow{h_t} = \\text{RNN}_{\\text{forward}}(x_1, ..., x_t)
- 后向 RNN: \\overleftarrow{h_t} = \\text{RNN}_{\\text{backward}}(x_T, ..., x_t)
- 最终表示: h_t = \[\\overrightarrow{h_t}; \\overleftarrow{h_t}\]
x1
F1
x2
F2
x3
F3
B3
B2
B1
h₁ = [→h₁; ←h₁]
h₂ = [→h₂; ←h₂]
h₃ = [→h₃; ←h₃]
📌 应用:命名实体识别(NER)、情感分析、机器翻译编码器
三、序列模型应用场景
3.1 文本分类 & 情感分析
- 任务:判断句子情感(正面/负面)
- 模型 :
Embedding → Bi-LSTM → MaxPooling → Dense - 输出:单个概率值(Sigmoid)或类别(Softmax)
3.2 文本生成
- 任务:给定开头,生成连贯文本(如诗歌、新闻)
- 方法 :自回归 (Autoregressive)
P(w_1, w_2, ..., w_T) = \\prod_{t=1}\^T P(w_t \| w_{\ - 训练:Teacher Forcing(用真实历史词作为输入)
- 推理:逐词生成(贪心搜索 / Beam Search)
3.3 机器翻译入门(Seq2Seq)
Sequence-to-Sequence(Seq2Seq) 架构:
- 编码器(Encoder) :Bi-LSTM 将源句压缩为上下文向量 c c c
- 解码器(Decoder) :LSTM 根据 c c c 和已生成词预测下一个词
Decoder
Encoder
'I'
LSTM
'love'
'you'
Context Vector
LSTM
'Je'
LSTM
't'aime'
LSTM
🔜 后续演进:Attention 机制(Bahdanau et al., 2015)→ Transformer(2017)
四、配套代码实现(PyTorch)
示例 1:LSTM 文本分类
python
import torch
import torch.nn as nn
class LSTMClassifier(nn.Module):
def __init__(self, vocab_size, embed_dim, hidden_dim, num_classes, num_layers=1):
super().__init__()
self.embedding = nn.Embedding(vocab_size, embed_dim, padding_idx=0)
self.lstm = nn.LSTM(embed_dim, hidden_dim, num_layers,
batch_first=True, bidirectional=True)
self.fc = nn.Linear(hidden_dim * 2, num_classes) # *2 for bidirectional
self.dropout = nn.Dropout(0.5)
def forward(self, x):
# x: [batch_size, seq_len]
x = self.embedding(x) # [B, L, embed_dim]
out, (hn, _) = self.lstm(x) # out: [B, L, hidden*2]
# Use last timestep output
out = self.dropout(out[:, -1, :]) # [B, hidden*2]
out = self.fc(out) # [B, num_classes]
return out
# 使用示例
model = LSTMClassifier(vocab_size=10000, embed_dim=128, hidden_dim=256, num_classes=2)
x = torch.randint(0, 10000, (32, 20)) # batch=32, seq_len=20
output = model(x)
print(output.shape) # torch.Size([32, 2])
示例 2:GRU 文本生成(简化版)
python
class GRUGenerator(nn.Module):
def __init__(self, vocab_size, embed_dim, hidden_dim):
super().__init__()
self.embedding = nn.Embedding(vocab_size, embed_dim)
self.gru = nn.GRU(embed_dim, hidden_dim, batch_first=True)
self.fc = nn.Linear(hidden_dim, vocab_size)
def forward(self, x, hidden=None):
x = self.embedding(x) # [B, L, E]
out, hidden = self.gru(x, hidden) # out: [B, L, H]
out = self.fc(out) # [B, L, V]
return out, hidden
# 训练时:输入整个序列(含目标)
# 推理时:逐字生成
五、补充:RNN 的现代地位
虽然 Transformer 已成为 NLP 主流(如 BERT、GPT),但 RNN 仍有其价值:
- 低资源场景:RNN 计算开销小,适合移动端
- 时间序列预测:金融、IoT 数据仍常用 LSTM/GRU
- 教学意义:理解序列建模的基础
✅ 选择建议:
- 新项目 → 优先尝试 Transformer
- 资源受限 / 简单任务 → Bi-LSTM / GRU
六、总结对比
| 模型 | 门控机制 | 参数量 | 长期依赖 | 速度 |
|---|---|---|---|---|
| RNN | 无 | 少 | ❌ 差 | 快 |
| LSTM | 3 个门 | 多 | ✅ 强 | 慢 |
| GRU | 2 个门 | 中 | ✅ 强 | 中 |
| Bi-LSTM | 双向 + LSTM | 很多 | ✅✅ 最强 | 慢 |
是
否
是
否
序列任务
需要双向上下文?
Bi-LSTM / Bi-GRU
资源充足?
LSTM
GRU
资料关注
公众号:咚咚王
gitee:https://gitee.com/wy18585051844/ai_learning
《Python编程:从入门到实践》
《利用Python进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第3版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow机器学习实战指南》
《Sklearn与TensorFlow机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》
《自然语言处理综论 第2版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨+&+张孜铭
《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战AI大模型》
《AI 3.0》