NLP(四)一文搞懂 RNN:它是什么?能做什么?有哪些变体?

0 阅读6分钟

📚 一文搞懂 RNN:它是什么?能做什么?有哪些变体?

1. RNN是什么

RNN(Recurrent Neural Network,循环神经网络)  是一类专门用于处理序列数据的神经网络。

核心特征

特征说明
循环连接网络在处理当前输入时,会接收上一个时间步的输出作为“记忆
隐藏状态(Hidden State)承载前文信息的载体,随时间步不断更新
参数共享同一组权重在所有时间步上重复使用

一句话理解

RNN = 有“记忆”的神经网络,能按顺序处理文本、语音等序列数据。


2. RNN解决什么问题

核心问题:顺序依赖

传统神经网络(如全连接网络)假设输入之间相互独立,无法处理“顺序”信息。

示例:

  • “我打你” ≠ “你打我”
  • “狼来了” ≠ “来了狼”

词相同,顺序不同,含义截然相反。

RNN的解决方案

通过隐藏状态在时间步之间传递信息,让模型在处理当前词时,能够“记住”之前看过的内容。

应用场景

任务类型示例
文本分类判断评论是正面还是负面
情感分析“这部电影太棒了” → 正面
意图识别“帮我订张票” → 订票意图
机器翻译英文 → 中文
命名实体识别识别出“李明”是人名
语音识别语音信号 → 文字
时间序列预测股票价格预测

3. RNN的核心机制

3.1 数据处理流程

以处理句子  “我爱读书”  为例:

时间步1: 输入“我” → 输出 h₁(对“我”的总结)
时间步2: 输入“爱” + 上一个总结 h₁ → 输出 h₂(对“我爱”的总结)
时间步3: 输入“读书” + 上一个总结 h₂ → 输出 h₃(对“我爱读书”的总结)

3.2 可视化理解

deepseek_mermaid_20260904_48e563.png

关键点:每个时间步的输出(隐藏状态)都携带了“当前词 + 之前所有词”的摘要信息。

3.3 隐藏状态的数学表达

# 伪代码:RNN的更新公式
h_t = tanh(W_hh * h_{t-1} + W_xh * x_t + b_h)
# h_t: 当前时间步的隐藏状态
# h_{t-1}: 上一个时间步的隐藏状态(记忆)
# x_t: 当前时间步的输入

4. RNN的输入与输出

4.1 在PyTorch中的定义

import torch.nn as nn

# 定义RNN层
rnn = nn.RNN(
    input_size=8,     # 每个词的向量维度(与Embedding的embedding_dim一致)
    hidden_size=16,   # 隐藏状态维度(自由设定)
    num_layers=1,     # RNN层数
    batch_first=True  # 输入形状为 [批次, 序列长度, 特征维度],
                      # 如果是False就会颠倒为 [序列长度, 批次, 特征维度]
    bidirectional=False  # 是否是输入的双向网络层。False表示单项,True表示双项
)

4.2 输入输出形状

假设:句子长度=3,词向量维度=8,隐藏层维度=16,批次大小=1

数据形状含义
输入[1, 3, 8]1句话,3个词,每个词8维向量
output[1, 3, 16]每个时间步的隐藏状态
hidden[1, 1, 16]最后一个时间步的隐藏状态(整个句子的总结)

4.3 output vs hidden 的区别

句子:"我 爱 读书"

output[0] = 处理完"我"后的状态(对"我"的总结)
output[1] = 处理完"我爱"后的状态(对"我爱"的总结)
output[2] = 处理完"我爱读书"后的状态(对整个句子的总结)

hidden = output[2]  ← 最终总结,可用于分类等任务

5. RNN的分类

5.1 按输入输出结构分类

类型结构应用场景
N vs N输入输出等长词性标注、合辙诗句生成
N vs 1输入序列→单个输出文本分类、情感分析
1 vs N单个输入→输出序列图片生成文字描述
N vs M输入输出长度不限(Seq2Seq)机器翻译、文本摘要

5.2 N vs 1(文本分类)示意图

deepseek_mermaid_20260904_cd7bb6.png

5.3 N vs M(Seq2Seq)示意图

deepseek_mermaid_20260904_36a45d.png


6. RNN的内部构造变体

6.1 演进脉络

传统RNN(基础,有局限)
    ↓
LSTM(解决长期依赖问题)
    ↓
GRU(LSTM的简化版,更快)
    ↓
Bi-LSTM / Bi-GRU(双向,捕捉更完整上下文)

6.2 各变体对比

变体核心特点优点缺点适用场景
传统RNN最简单的循环结构计算快,易理解梯度消失,记不住长句子教学演示,极短序列
LSTM引入遗忘门、输入门、输出门解决长期依赖,效果好参数多,计算较慢长文本,复杂任务
GRULSTM的简化版(2个门)参数少,速度快效果略逊于LSTM数据量小,追求效率
Bi-LSTM双向LSTM利用前后文信息参数量翻倍文本分类,命名实体识别
Bi-GRU双向GRU兼顾双向和效率同GRU需要上下文,又追求速度

7. 如何选择RNN变体

决策流程图

deepseek_mermaid_20260904_265f8b.png

选择建议

场景推荐方案理由
刚入门学习从GRU开始结构简单,效果足够好
处理长文本(>50词)LSTM 或 Bi-LSTM记忆能力强
文本分类/命名实体识别Bi-LSTM 或 Bi-GRU双向能看到完整上下文
数据量大LSTM能发挥复杂模型的优势
数据量小,追求速度GRU参数少,不易过拟合
生产环境需要快速推理GRU 或 Bi-GRU计算效率更高

8. RNN的局限与演进

8.1 RNN的主要局限

局限说明
串行计算必须按顺序逐个处理,无法并行加速
梯度消失/爆炸长序列中信息容易丢失或失控
长期依赖难以关联句子首尾的信息

8.2 演进方向:Transformer

deepseek_mermaid_20260904_fdc09b.png Transformer 通过自注意力机制解决了 RNN 的两大痛点:

  • 并行计算:一次性处理所有词,训练更快
  • 长距离依赖:任意两个词之间都可以直接建立联系

8.3 RNN的现状

领域RNN的地位
自然语言处理(NLP)大部分被Transformer取代
时间序列预测依然广泛使用(LSTM/GRU)
语音信号处理与Transformer并存
流式数据处理仍有不可替代的优势

9. 总结

核心要点

  1. RNN是什么:通过“记忆”来处理顺序信息的网络

  2. 解决什么问题:让模型能理解文本的“顺序”和“上下文”

  3. 怎么用:根据任务选择不同的输入输出结构(N vs 1、N vs M等)

  4. 进阶选型

    • LSTM:解决长依赖问题,经典可靠
    • GRU:LSTM的简化版,快而有效
    • Bi-LSTM/GRU:双向,看得更全

演进脉络一句话

从RNN到LSTM,是为了“记得更牢”;从LSTM到GRU,是为了“跑得更快”;加上“Bi-”,是为了“看得更全”。