首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >循环神经网络(RNN)如何记忆与处理序列数据

循环神经网络(RNN)如何记忆与处理序列数据

作者头像
索旭东
发布2026-03-31 18:52:57
发布2026-03-31 18:52:57
1530
举报
文章被收录于专栏:具身小站具身小站

1

RNN 是什么?

RNN 的全称是 Recurrent Neural Network(循环神经网络) 。它是一种专门用于处理 序列数据 的神经网络架构。

核心思想:让网络拥有“记忆”

传统的神经网络(如全连接网络、CNN)假设输入之间是相互独立的——它们一次处理一个输入,下一个输入和上一个输入没有关系。但现实中有大量数据是 前后依赖 的:

  • 一句话中,当前词的含义依赖于前面的词
  • 一段音乐中,当前的音符受到之前音符的制约
  • 股票价格的变化是时间序列

RNN 通过引入 循环连接 ,使得网络可以保留之前的信息,并将其应用于当前的计算。这个保留的信息叫做 隐藏状态 (Hidden State),可以理解为网络的“记忆”。

一个形象的比喻

想象你在阅读一本小说:

  • 你读第一个字时,脑子里形成了初步的印象
  • 读第二个字时,你会结合第一个字的印象来理解第二个字
  • 读第三个字时,你会结合前两个字的累积印象……这样不断更新你的“理解状态”

RNN 的工作方式正是如此:它有一个内部状态,每读一个输入,就更新一次状态,然后用这个状态来帮助理解当前输入,并产生输出。

2

RNN 的核心特点

特点

说明

意义

处理变长序列

可以接受任意长度的输入序列

非常灵活,适用于文本、语音、时间序列等

参数共享

在每个时间步,RNN 使用相同的权重矩阵

大大减少了参数量,也体现了“同一个处理机制适用于所有时间步”的思想

隐藏状态

维护一个状态向量,传递序列中的信息

实现了“记忆”功能,让网络能够利用历史信息

时间依赖性

当前输出不仅取决于当前输入,还依赖于过去的信息

能够建模序列中的时序依赖关系

3

RNN 的工作流程

1. 基本结构

一个简单的 RNN 单元可以用以下公式表示:

2. 按时间展开(Unfolding)

为了理解 RNN 的训练过程,通常会将 RNN 按时间步“展开”成一个很深的 前馈网络 。例如,对于一个长度为 3 的序列,展开后的结构如下:

代码语言:javascript
复制
        y1        y2        y3
        ↑         ↑         ↑
        h1    ←   h2    ←   h3
        ↑         ↑         ↑
        x1        x2        x3

注意:虽然展开后看起来很“深”,但所有时间步的权重 $W{hh},W{xh},W_{hy}$ 都是 共享 的,所以参数量不会随着序列长度增加。

3. 训练方法:BPTT(通过时间反向传播)

RNN 的训练使用一种称为 BPTT 的算法,它本质上就是在展开后的网络上应用标准的反向传播。大致步骤:

  1. 前向传播:按时间顺序计算每个时间步的隐藏状态和输出
  2. 计算损失:通常是将每个时间步的输出与真实标签比较,累加损失
  3. 反向传播:从最后一个时间步开始,将梯度往回传递到第一个时间步
  4. 更新权重:使用梯度下降更新所有共享的权重

4. 三种常见的使用模式

根据输入和输出的形式,RNN 可以有多种应用模式:

模式

图示

典型应用

多对一

输入序列 → 一个输出

情感分类(将一句话映射为正面/负面)

一对多

一个输入 → 输出序列

图像描述(输入一张图,输出一段描述)

多对多(同步)

输入序列 → 输出序列(长度相同)

词性标注、视频帧分类

多对多(异步)

输入序列 → 输出序列(长度可变)

机器翻译(编码器-解码器架构)

4

RNN 的变体:LSTM 和 GRU

简单的 RNN 在处理长序列时有一个严重的问题: 梯度消失或梯度爆炸 。由于反向传播穿过多个时间步,梯度会反复相乘,导致长距离的信息难以被学习。为了解决这个问题,研究者提出了两种著名的变体。

1. LSTM(长短期记忆网络)

LSTM 通过引入 门控机制 来控制信息的流动:

  • 遗忘门 :决定要丢弃哪些旧信息
  • 输入门 :决定要存储哪些新信息
  • 输出门 :决定要输出哪些信息

LSTM 还有一个 细胞状态 (Cell State),它像一条传送带,可以让信息在长序列中几乎无损地传递。这使得 LSTM 能够捕捉长达几百步的依赖关系。

2. GRU(门控循环单元)

GRU 是 LSTM 的简化版本,将遗忘门和输入门合并为一个 更新门 ,并将细胞状态和隐藏状态合并。它参数更少,训练更快,效果与 LSTM 相当,因此在很多任务中成为首选。

5

如何使用 RNN?(以 PyTorch 为例)

在现代深度学习框架中,使用 RNN 非常简单。以下是一个使用 PyTorch 构建简单 RNN 进行文本分类的示意代码:

代码语言:javascript
复制
import torch
import torch.nn as nn

class SimpleRNN(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, num_classes):
        super(SimpleRNN, self).__init__()
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        self.rnn = nn.RNN(input_size, hidden_size, num_layers, batch_first=True)
        self.fc = nn.Linear(hidden_size, num_classes)

    def forward(self, x):
        # 初始化隐藏状态
        h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)

        # 前向传播 RNN
        out, _ = self.rnn(x, h0)  # out: (batch_size, seq_length, hidden_size)

        # 只取最后一个时间步的输出进行分类
        out = out[:, -1, :]
        out = self.fc(out)
        return out

6

RNN 的优缺点

优点

  • 自然处理序列 :天生适合变长序列数据
  • 参数共享 :模型简洁,参数量小
  • 有记忆 :能够利用历史信息
  • 可解释性 :可以观察隐藏状态的演化,理解网络如何逐步处理信息

缺点

  • 难以并行 :必须按时间步串行计算,训练速度慢
  • 梯度问题 :简单 RNN 难以学习长距离依赖(LSTM/GRU 缓解但未完全解决)
  • 长序列效率低 :随着序列变长,内存和计算开销线性增长
  • 已被 Transformer 超越 :Transformer 通过自注意力实现了并行处理和全局依赖捕捉,在大多数 NLP 任务上表现更好

7

RNN 与 CNN、Transformer 的关系

模型

擅长处理

核心机制

并行

长距离依赖

CNN

空间结构数据(图像)

卷积、局部连接

需堆叠层数扩大感受野

RNN

时序序列数据

循环、状态传递

有梯度问题,LSTM 部分缓解

Transformer

任意序列(文本、图像、视频)

自注意力、位置编码

全局依赖直接建模

在实际应用中,RNN 逐渐被 Transformer 取代,但在以下场景中 RNN 仍有价值:

  • 低资源/边缘设备 :RNN(尤其是 GRU)参数量小,计算开销低
  • 实时流式处理 :RNN 可以逐个时间步处理,延迟低
  • 小规模序列任务 :如短文本分类、简单时间序列预测
  • 与 CNN 结合 :如视频理解中,用 CNN 提取空间特征,用 RNN 建模时间动态
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 具身小站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档