人工智能之核心技术 深度学习 第四章 循环神经网络(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》

相关推荐
艾莉丝努力练剑7 分钟前
hixl vs NCCL:昇腾生态通信库的独特优势分析
运维·c++·人工智能·cann
梦帮科技8 分钟前
Node.js配置生成器CLI工具开发实战
前端·人工智能·windows·前端框架·node.js·json
程序员泠零澪回家种桔子9 分钟前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构
Echo_NGC223712 分钟前
【FFmpeg 使用指南】Part 3:码率控制策略与质量评估体系
人工智能·ffmpeg·视频·码率
纤纡.22 分钟前
PyTorch 入门精讲:从框架选择到 MNIST 手写数字识别实战
人工智能·pytorch·python
大大大反派23 分钟前
CANN 生态中的自动化部署引擎:深入 `mindx-sdk` 项目构建端到端 AI 应用
运维·人工智能·自动化
程序猿追24 分钟前
深度解读 AIR (AI Runtime):揭秘 CANN 极致算力编排与调度的核心引擎
人工智能
2601_9495936529 分钟前
深入解析CANN-acl应用层接口:构建高效的AI应用开发框架
数据库·人工智能
●VON31 分钟前
CANN安全与隐私:从模型加固到数据合规的全栈防护实战
人工智能·安全
刘大大Leo37 分钟前
GPT-5.3-Codex 炸了:第一个「自己造自己」的 AI 编程模型,到底意味着什么?
人工智能·gpt