通俗易懂循环神经网络(RNN)指南

本文用直观类比、图表和代码,带你轻松理解RNN及其变体(LSTM、GRU、双向RNN)的原理和应用。


什么是循环神经网络

循环神经网络(Recurrent Neural Network, RNN)是一类专门用于处理序列数据的神经网络。与前馈神经网络不同,RNN具有“记忆”能力,能够利用过去的信息来帮助当前的决策。这使得RNN特别适合处理像语言、语音、时间序列这样具有时序特性的数据。

类比:你在阅读一句话时,会基于前面看到的单词来理解当前单词的含义。RNN就像有记忆力的神经网络。


RNN的核心思想

RNN的核心思想非常简单而巧妙:网络会对之前的信息进行记忆并应用于当前输出的计算中。也就是说,隐藏层的输入不仅包括输入层的输出,还包括上一时刻隐藏层的输出。

公式表示:

ht=f(W⋅xt+U⋅ht−1+b)h_t = f(W \cdot x_t + U \cdot h_{t-1} + b)ht=f(Wxt+Uht1+b)

其中:

  • hth_tht:当前时刻的隐藏状态
  • xtx_txt:当前时刻的输入
  • ht−1h_{t-1}ht1:上一时刻的隐藏状态
  • W,UW, UW,U:权重矩阵
  • bbb:偏置项
  • fff:非线性激活函数(如tanh或ReLU)

RNN结构图

输入x₁
隐藏层h₁
输出y₁
输入x₂
隐藏层h₂
输出y₂
输入x₃
隐藏层h₃
输出y₃

RNN的工作机制举例

假设我们要预测句子中的下一个单词:

输入序列:“我” → “爱” → “机器”

  1. 处理第一个词“我”:
    • 输入:“我”的向量表示
    • 初始隐藏状态h0h_0h0通常设为全零
    • 计算h1=f(W⋅x1+U⋅h0+b)h_1 = f(W \cdot x_1 + U \cdot h_0 + b)h1=f(Wx1+Uh0+b)
    • 输出y1=g(V⋅h1+c)y_1 = g(V \cdot h_1 + c)y1=g(Vh1+c)
  2. 处理第二个词“爱”:
    • 输入:“爱”的向量表示
    • 使用之前的隐藏状态h1h_1h1
    • 计算h2=f(W⋅x2+U⋅h1+b)h_2 = f(W \cdot x_2 + U \cdot h_1 + b)h2=f(Wx2+Uh1+b)
    • 输出y2=g(V⋅h2+c)y_2 = g(V \cdot h_2 + c)y2=g(Vh2+c)
  3. 处理第三个词“机器”:
    • 输入:“机器”的向量表示
    • 使用之前的隐藏状态h2h_2h2
    • 计算h3=f(W⋅x3+U⋅h2+b)h_3 = f(W \cdot x_3 + U \cdot h_2 + b)h3=f(Wx3+Uh2+b)
    • 输出y3=g(V⋅h3+c)y_3 = g(V \cdot h_3 + c)y3=g(Vh3+c)

RNN的优缺点

优点:

  1. 能够处理变长序列数据
  2. 考虑了序列中的时间/顺序信息
  3. 模型大小不随输入长度增加而变化
  4. 可以处理任意长度的输入(理论上)

缺点:

  1. 梯度消失/爆炸问题:在反向传播时,梯度会随着时间步长指数级减小或增大,导致难以学习长期依赖关系
  2. 计算速度较慢(因为是顺序处理,无法并行化)
  3. 简单的RNN结构难以记住很长的序列信息


长短期记忆网络(LSTM)

为了解决RNN的长期依赖问题,Hochreiter和Schmidhuber在1997年提出了长短期记忆网络(Long Short-Term Memory, LSTM)。LSTM是RNN的一种特殊变体,能够学习长期依赖关系。

LSTM的核心结构

LSTM的关键在于它的“细胞状态”(cell state)和三个“门”结构:

LSTM单元
遗忘
写入
遗忘门
输入xₜ
上时刻隐藏hₜ₋₁
细胞状态Cₜ₋₁
输入门
输出门
输出hₜ
  • 遗忘门(Forget Gate):决定从细胞状态中丢弃哪些信息

    ft=σ(Wf⋅[ht−1,xt]+bf)f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)ft=σ(Wf[ht1,xt]+bf)

  • 输入门(Input Gate):决定哪些新信息将被存储到细胞状态中

    it=σ(Wi⋅[ht−1,xt]+bi)i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i)it=σ(Wi[ht1,xt]+bi)

    C~t=tanh⁡(WC⋅[ht−1,xt]+bC)\tilde{C}_t = \tanh(W_C \cdot [h_{t-1}, x_t] + b_C)C~t=tanh(WC[ht1,xt]+bC)

  • 输出门(Output Gate):决定输出什么信息

    ot=σ(Wo⋅[ht−1,xt]+bo)o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o)ot=σ(Wo[ht1,xt]+bo)

    ht=ot∗tanh⁡(Ct)h_t = o_t * \tanh(C_t)ht=ottanh(Ct)

  • 细胞状态更新

    Ct=ft∗Ct−1+it∗C~tC_t = f_t * C_{t-1} + i_t * \tilde{C}_tCt=ftCt1+itC~t


LSTM如何解决长期依赖问题

LSTM通过精心设计的“门”机制解决了传统RNN的梯度消失问题:

  1. 细胞状态像一条传送带:信息可以几乎不变地流过整个链条
  2. 门结构控制信息流:决定哪些信息应该被记住或遗忘
  3. 梯度保护机制:在反向传播时,梯度可以更稳定地流动,不易消失

门控循环单元(GRU)

GRU(Gated Recurrent Unit)是2014年提出的LSTM变体,结构更简单,性能相近。

GRU结构图

输入xₜ
更新门
上时刻隐藏hₜ₋₁
重置门
输出hₜ
  • 重置门(Reset Gate):决定如何将新输入与之前的记忆结合

    rt=σ(Wr⋅[ht−1,xt]+br)r_t = \sigma(W_r \cdot [h_{t-1}, x_t] + b_r)rt=σ(Wr[ht1,xt]+br)

  • 更新门(Update Gate):决定多少过去信息被保留,多少新信息被加入

    zt=σ(Wz⋅[ht−1,xt]+bz)z_t = \sigma(W_z \cdot [h_{t-1}, x_t] + b_z)zt=σ(Wz[ht1,xt]+bz)

  • 隐藏状态更新

    h~t=tanh⁡(W⋅[rt∗ht−1,xt]+b)\tilde{h}_t = \tanh(W \cdot [r_t * h_{t-1}, x_t] + b)h~t=tanh(W[rtht1,xt]+b)

    ht=(1−zt)∗ht−1+zt∗h~th_t = (1 - z_t) * h_{t-1} + z_t * \tilde{h}_tht=(1zt)ht1+zth~t


GRU vs LSTM

特性LSTMGRU
门数量3个(遗忘门、输入门、输出门)2个(重置门、更新门)
参数数量较多较少(比LSTM少约1/3)
计算效率较低较高
性能在大多数任务上表现优异在多数任务上与LSTM相当
适用场景需要长期记忆的复杂任务资源受限或需要更快训练的场景

双向RNN(Bi-RNN)

标准RNN只能利用过去的信息,但有时未来的信息也同样重要。双向RNN通过结合正向和反向两个方向的RNN来解决这个问题。

双向RNN结构图

输入x₁
正向h₁→
输入x₂
正向h₂→
输入x₃
正向h₃→
反向h₃←
反向h₂←
反向h₁←
输出y₁
输出y₂
输出y₃

简单RNN/LSTM/GRU代码实现(PyTorch)

下面是用PyTorch实现的基础RNN、LSTM和GRU的示例代码(以字符序列为例):

import torch
import torch.nn as nn# 简单RNN单元
class SimpleRNN(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(SimpleRNN, self).__init__()self.rnn = nn.RNN(input_size, hidden_size, batch_first=True)self.fc = nn.Linear(hidden_size, output_size)def forward(self, x):out, _ = self.rnn(x)out = self.fc(out[:, -1, :])return out# LSTM单元
class SimpleLSTM(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(SimpleLSTM, self).__init__()self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)self.fc = nn.Linear(hidden_size, output_size)def forward(self, x):out, _ = self.lstm(x)out = self.fc(out[:, -1, :])return out# GRU单元
class SimpleGRU(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(SimpleGRU, self).__init__()self.gru = nn.GRU(input_size, hidden_size, batch_first=True)self.fc = nn.Linear(hidden_size, output_size)def forward(self, x):out, _ = self.gru(x)out = self.fc(out[:, -1, :])return out# 示例:假设输入为(batch, seq_len, input_size)
input_size = 10
hidden_size = 20
output_size = 5
x = torch.randn(32, 15, input_size)model = SimpleLSTM(input_size, hidden_size, output_size)
output = model(x)
print(output.shape)  # torch.Size([32, 5])

RNN及变体的典型应用案例

循环神经网络及其变体在实际中有广泛应用,尤其在处理序列数据的任务中表现突出。

1. 自然语言处理(NLP)

  • 文本生成:如自动写诗、对话机器人、新闻摘要。
  • 机器翻译:将一句话从一种语言翻译为另一种语言。
  • 命名实体识别、词性标注:识别文本中的专有名词、标注词性。
  • 情感分析:判断一段文本的情感倾向。
输入句子
RNN/LSTM/GRU编码
输出标签/翻译/情感

2. 语音识别

  • 语音转文字:将语音信号转为文本。
  • 语音合成:将文本转为自然语音。
  • 说话人识别:识别说话人身份。
语音信号
声学特征提取
RNN/BiLSTM建模
文字输出

3. 时间序列预测

  • 金融预测:如股票价格、汇率、销售额等的趋势预测。
  • 气象预测:温度、降雨量等气象数据的预测。
  • 设备故障预警:工业传感器数据异常检测。
历史数据序列
RNN/LSTM/GRU建模
未来预测值

4. 生物信息学

  • DNA/RNA序列分析:基因序列的功能预测、蛋白质结构预测。

5. 视频分析

  • 动作识别:分析视频帧序列,识别人物动作。
  • 视频字幕生成:为视频自动生成描述性字幕。

总结

循环神经网络及其变体是处理序列数据的强大工具。从基本的RNN到LSTM、GRU,再到双向结构,每一种创新都解决了前一代模型的特定问题。理解这些模型的原理和差异,有助于我们在实际应用中选择合适的架构。

虽然Transformer架构近年来在某些任务上表现更优,但RNN家族仍然在许多场景下保持着重要地位,特别是在资源受限、序列较短或需要在线处理的场景中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90203.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SVM】支持向量机实例合集

基于Java的SVM(支持向量机)实例合集 以下是一个基于Java的SVM(支持向量机)实例合集,包含核心代码示例和应用场景说明。这些例子基于流行的机器学习库(如LIBSVM、Weka、JSAT)实现。 数据准备与加载 使用LIBSVM格式加载数据集: // 加载LIBSVM格式数据 svm_problem pr…

Python100个库分享第38个—lxml(爬虫篇)

目录专栏导读📚 库简介🎯 主要特点🛠️ 安装方法Windows安装Linux/macOS安装验证安装🚀 快速入门基本使用流程HTML vs XML解析🔍 核心功能详解1. XPath选择器2. CSS选择器支持3. 元素操作🕷️ 实战爬虫案例…

imx6ull-系统移植篇17——linux顶层 Makefile(上)

目录 前言 顶层 Makefile 源码简析 版本号 MAKEFLAGS 变量 命令输出 静默输出 设置编译结果输出目录 代码检查 模块编译 设置目标架构和交叉编译器 调用 scripts/Kbuild.include 文件 交叉编译工具变量设置 头文件路径变量 导出变量 make xxx_defconfig 过程 …

OpenCV 官翻6 - Computational Photography

文章目录图像去噪目标理论OpenCV中的图像去噪1、cv.fastNlMeansDenoisingColored()2、cv.fastNlMeansDenoisingMulti()附加资源图像修复目标基础概念代码补充资源练习高动态范围成像(HDR)目标理论基础曝光序列HDR1、将曝光图像加载到列表中2、将曝光序列…

APT32F1732RBT8爱普特微电子 32位MCU国产芯片 智能家居/工业控制 首选

APT32F1732RBT8 爱普特微电子,32位MCU国产芯片一、产品简介APT32F1732RBT8 是爱普特微电子(APT)推出的高性能32位ARM Cortex-M0内核MCU,主频高达48MHz,内置64KB Flash8KB RAM,专为智能家居、工业控制、消费…

Smart Tomcat

本篇博客的内容是教你借助idea中的插件,把tomcat集成到idea中安装 Smart Tomcat 插件搜索下载 ,如果一直处于加载界面,就尝试一下科学上网配置 Smart Tomcat 插件 点击右上角的 "Add Configuration"选择左侧的 "Smart Tomcat" 在 Name 这一栏填写一个名字(…

Linux_shell编写

title: Linux_4 shell编写 shell pwd (/root/A/2025_7/19/myshell) 首先需要设计命令行提示 (MakeCommandLine()) 首先获取相关信息 getenv(“name”) // 获取用户名 const char* GetUserName() {const char* name getenv("USER");if (name …

【数据结构】栈的深入解析--用C语言实现

文章目录1.栈的概念2.栈的底层结构3.栈的功能4.栈的实现4.1.栈结构的定义4.2.栈的初始化4.3.栈的销毁4.4.入栈4.5.出栈4.6.取栈顶元素4.7.获取栈中有效元素个数5.完整代码Stack.hStack.cmain.c运行结果1.栈的概念 是一种特殊的线性表,只允许数据在固定的一段进行插…

Git仓库核心概念与工作流程详解:从入门到精通

Git仓库的基本概念版本库(Repository)是Git的核心概念,你可以简单理解为一个被Git管理的目录。这个目录里的所有文件都能被Git跟踪,记录每次修改和删除,让你可以随时追溯历史或在未来某个时刻"还原"文件。Gi…

Web开发 05

1 React库(人话详解版)别慌,React 刚接触时是会有点懵,咱们用 “人话 类比” 一步步拆:核心概念先抓牢组件(Component)把它想成 “乐高积木”,比如做个社交 App,顶部导航…

RustDesk 自建中继服务器教程(Mac mini)

📖 教程目标 在家里的 Mac mini 上部署 RustDesk 中继服务器 (hbbs hbbr),让你从办公室、笔电或手机 低延迟、安全 地远程控制家里的 Windows 和 Mac mini。 ✅ 不依赖第三方服务器 ✅ 支持 P2P 和中继双模式 ✅ 全流量可控、跨平台 🏗️ 架…

数据库—修改某字段默认值

前言有时候,数据库的字段默认值没有正确设置,这时候需要改默认值。以下是我做的改默认值的记录,希望对网友有所帮助。1.SQL SERVER下面的示例假设你要修改名为 YourColumnName 的字段,并为其设置一个新的默认值 NewDefaultValue。…

Spring快速整合Mybatis

MyBatis是一个优秀的持久层框架&#xff0c;Spring则是广泛使用的Java应用框架。可以将两者整合可以充分发挥各自的优势。 1、Spring整合MyBatis的基本配置 添加依赖&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spri…

基于深度学习的语音识别:从音频信号到文本转录

前言 语音识别&#xff08;Automatic Speech Recognition, ASR&#xff09;是人工智能领域中一个极具挑战性和应用前景的研究方向。它通过将语音信号转换为文本&#xff0c;为人们提供了更加自然和便捷的人机交互方式。近年来&#xff0c;深度学习技术在语音识别领域取得了显著…

本地部署Nacos开源服务平台,并简单操作实现外部访问,Windows 版本

Nacos 是一款阿里开源的动态服务发现、配置、管理平台&#xff0c;拥有易于集成、高可用与可扩展等特点。它提供了动态服务注册和发现能力&#xff0c;使得服务自动注册到服务器并且消费真能够发现提供者。本文将详细介绍如何在本地安装 Nacos &#xff0c;以及结合nat123端口映…

数据结构:反转字符串(Reversing a String)

目录 方法一&#xff1a;双指针法 方法二&#xff1a;辅助数组 方法对比总结&#xff1a; 问题定义 给定一个字符串&#xff0c;例如&#xff1a; char str[] "hello";我们的目标是把它反转成&#xff1a; "olleh"&#x1f4cc; 输入特点&#xff…

Redis Copy-on-Write机制:

Copy-on-Write机制&#xff1a; 父子进程共享内存页 当父进程修改数据时&#xff0c;内核会复制被修改的页 这可能导致内存使用量暂时增加 通俗的话描述一下可以用一个生活中的例子来通俗解释 Copy-on-Write&#xff08;写时复制&#xff09; 机制&#xff1a;&#x1f4d6; 比…

iOS加固工具有哪些?从零源码到深度混淆的全景解读

在iOS安全加固领域&#xff0c;不同项目类型对保护需求有着本质差异&#xff1a;“我有源码”与“我只有IPA”两条路径决定了你该用什么工具。本文将从 无需源码处理整个IPA包 到 源码级编译期混淆&#xff0c;分层探讨主流工具如何发挥价值&#xff0c;并附上适配方案建议。工…

Composer 可以通过指定 PHP 版本运行

是的&#xff0c;Composer 可以通过指定 PHP 版本运行&#xff0c;尤其是在服务器上有多个 PHP 版本时&#xff08;如 PHP 7.x 和 PHP 8.x&#xff09;。以下是几种常见方法&#xff1a;方法 1&#xff1a;使用 php 命令指定版本 Composer 依赖系统中的 php 命令&#xff0c;因…

vscode文件颜色,只显示自己更改的文件颜色

这个主要是因为你github git下来以后&#xff0c;用vscode打开会默认显示更改了&#xff0c;你只要在这里先手动取消更改就行了&#xff0c;注意不要把你自己更改的取消了