人工智能之核心技术 深度学习 第四章 循环神经网络(RNN)与序列模型

人工智能之核心技术 深度学习

第四章 循环神经网络(RNN)与序列模型


文章目录

  • [人工智能之核心技术 深度学习](#人工智能之核心技术 深度学习)
  • [前言:循环神经网络(RNN)与序列模型 ------ 自然语言处理基础](#前言:循环神经网络(RNN)与序列模型 —— 自然语言处理基础)
    • [一、RNN 基础](#一、RNN 基础)
      • [1.1 结构与原理:建模时序依赖](#1.1 结构与原理:建模时序依赖)
      • [1.2 RNN 的局限性](#1.2 RNN 的局限性)
    • [二、RNN 变体:解决长期依赖](#二、RNN 变体:解决长期依赖)
      • [2.1 LSTM(Long Short-Term Memory)](#2.1 LSTM(Long Short-Term Memory))
        • 三大门控:
        • [单元状态(Cell State):](#单元状态(Cell State):)
      • [2.2 GRU(Gated Recurrent Unit)](#2.2 GRU(Gated Recurrent Unit))
      • [2.3 双向 RNN(Bi-RNN / Bi-LSTM)](#2.3 双向 RNN(Bi-RNN / Bi-LSTM))
    • 三、序列模型应用场景
      • [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) 提出,通过门控机制精确控制信息流动。

三大门控:
  1. 遗忘门(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)
  2. 输入门(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)
  3. 输出门(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》

相关推荐
蘑菇物联2 小时前
蘑菇物联入选“预见·2026”年度双榜,以AI技术赋能制造业绿色转型!
大数据·人工智能
无忧智库2 小时前
智慧城市核心标准全景解析:从顶层设计到落地实践的深度解读(PPT)
人工智能·智慧城市
2501_942191772 小时前
【YOLOv26实战】健身器材物体检测与识别:从模型优化到实际应用
人工智能·yolo·目标跟踪
m0_466525292 小时前
东软与葫芦岛市民政局签约 共建智慧养老服务平台
大数据·人工智能
乐居生活官2 小时前
2026五大功能全面的电商软件测评:打造全链路智能运营体系
大数据·人工智能
百***35482 小时前
2026年GEO服务商选择指南:从信息过载中构建品牌清晰度
人工智能
audyxiao0012 小时前
会议热点扫描|智慧教育顶级会议AIED 2025的研究热点可视化分析
人工智能·智慧教育·会议热点·aied
执笔论英雄2 小时前
【梯度检查点】
人工智能
虫小宝2 小时前
电商AI导购系统工程化实践:模型训练、部署与在线推理的架构设计
人工智能