循环神经网络(RNN)

循环神经网络(RNN)

循环神经网络(Recurrent Neural Network,简称 RNN)是一类用于处理序列数据的神经网络模型。与传统的前馈神经网络(如多层感知机)不同,RNN 具有反馈结构,能够在处理当前输入的同时保持之前的计算结果,从而更好地处理序列数据,如时间序列、语音、文本等。

1. RNN 的基本原理

RNN 的核心思想是通过“循环连接”使得网络能够在序列的每一步保持对之前状态的记忆。具体来说,RNN 在每一个时间步都接收输入,同时更新其隐藏状态,并将该状态传递到下一个时间步。

1.1 数学公式

假设输入序列为
x 1 , x 2 , … , x T x_1, x_2, \dots, x_T x1,x2,,xT,对应的隐藏状态为 h 1 h_1 h1, h 2 h_2 h2, … \dots , h T h_T hT,输出为 y 1 , y 2 , … , y T y_1, y_2, \dots, y_T y1,y2,,yT,RNN 的计算过程可以用以下公式表示:

  1. 隐藏状态更新公式:

h t = f ( W h ⋅ h t − 1 + W x ⋅ x t + b h ) h_t = f(W_h \cdot h_{t-1} + W_x \cdot x_t + b_h) ht=f(Whht1+Wxxt+bh)

其中:

  • h t h_t ht:时间步 t t t 的隐藏状态
  • h t − 1 h_{t-1} ht1:上一时间步的隐藏状态
  • x t x_t xt:当前时间步的输入
  • W h , W x W_h, W_x Wh,Wx:权重矩阵
  • b h b_h bh:偏置项
  • f f f:激活函数(通常是 sigmoid, a n h anh anh 或 ReLU)
    在这里插入图片描述
  1. 输出计算公式:

y t = W y ⋅ h t + b y y_t = W_y \cdot h_t + b_y yt=Wyht+by

其中:

  • y t y_t yt:时间步 t t t的输出
  • W y W_y Wy:输出层的权重矩阵
  • b y b_y by:输出层的偏置项

1.2 反馈结构

RNN 中的反馈结构允许网络“记忆”之前的输入信息。具体来说,当前的隐藏状态不仅依赖于当前的输入 x t x_t xt,还依赖于上一时刻的隐藏状态 h t − 1 h_{t-1} ht1,使得 RNN 能够捕捉序列中长期以来的信息。

2. RNN 的问题与挑战

尽管 RNN 在处理序列数据时表现出色,但它也存在一些问题,尤其是梯度消失和梯度爆炸问题。这些问题会导致模型在训练时难以学习长期依赖。

2.1 梯度消失与梯度爆炸

在反向传播过程中,梯度会通过链式法则传递。如果网络非常深(即时间步数很大),梯度会在多次传播后变得非常小(梯度消失),或者变得非常大(梯度爆炸)。这会导致网络无法有效训练。

2.2 长期依赖问题

RNN 在处理长序列时,容易遗忘之前的输入。虽然 RNN 可以通过循环连接保留信息,但它的能力有限,尤其是在序列较长时。

3. 改进 RNN 的方法

为了解决 RNN 的问题,研究者提出了许多改进版本的 RNN,最著名的包括长短时记忆网络(LSTM)和门控循环单元(GRU)。

3.1 LSTM(长短时记忆网络)

LSTM 是一种特殊的 RNN 架构,能够通过引入“门”机制(输入门、遗忘门和输出门)来控制信息的流动,从而避免梯度消失和梯度爆炸问题。LSTM 可以更好地捕捉长时间依赖关系。

LSTM 的更新公式如下:

  1. 遗忘门:

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

  1. 输入门:

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

  1. 候选记忆单元:

i l d e C t = a n h ( W C ⋅ [ h t − 1 , x t ] + b C ) ilde{C}_t = anh(W_C \cdot [h_{t-1}, x_t] + b_C) ildeCt=anh(WC[ht1,xt]+bC)

  1. 更新记忆单元:

C t = f t ⋅ C t − 1 + i t ⋅ i l d e C t C_t = f_t \cdot C_{t-1} + i_t \cdot ilde{C}_t Ct=ftCt1+itildeCt

  1. 输出门:

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

  1. 隐藏状态更新:

h t = o t ⋅ a n h ( C t ) h_t = o_t \cdot anh(C_t) ht=otanh(Ct)

3.2 GRU(门控循环单元)

GRU 是另一种改进的 RNN,它通过结合遗忘门和输入门来简化 LSTM 结构,减少了计算复杂度。GRU 的更新公式如下:

  1. 更新门:

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

  1. 重置门:

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

  1. 候选隐藏状态:

i l d e h t = a n h ( W h ⋅ [ r t ⋅ h t − 1 , x t ] + b h ) ilde{h}_t = anh(W_h \cdot [r_t \cdot h_{t-1}, x_t] + b_h) ildeht=anh(Wh[rtht1,xt]+bh)

  1. 隐藏状态更新:

h t = ( 1 − z t ) ⋅ h t − 1 + z t ⋅ i l d e h t h_t = (1 - z_t) \cdot h_{t-1} + z_t \cdot ilde{h}_t ht=(1zt)ht1+ztildeht

📚 MLP前馈神经网络 vs RNN循环神经网络

比较维度MLP(Multilayer Perceptron)RNN(Recurrent Neural Network)
结构前馈结构,无状态有循环连接,带隐藏状态
输入处理每次处理一个独立输入处理输入序列,时间步之间有关联
时间建模能力❌ 无时间记忆✅ 能建模时间依赖
输入长度固定可变长度序列
隐藏状态有 ( h_t ),可传递过去信息
梯度传播标准反向传播(BP)时间反向传播(BPTT)
训练速度快,支持并行慢,时序依赖,不易并行
适用任务图像识别、静态数据分类等自然语言、语音识别、机器人轨迹学习等

🧠 简单理解

  • MLP 是“无记忆”的,每次都“从零开始判断”。
  • RNN 是“有记忆”的,能“记住过去”,适合处理序列。

🤖 举例对比:机器人下一步往哪走?

  • MLP:输入 当前状态,不考虑过去 → 容易误判。
  • RNN:输入 过去几步的状态序列,能捕捉趋势 → 更稳健。

✍ 数学表示:

MLP:

output = f(Wx + b)

RNN:

h_t = f(Wx_t + Uh_{t-1} + b)
output_t = g(h_t)

✅ 什么时候用 RNN 更合适?

  • 状态观测不完整,需要推理历史
  • 任务具有时序依赖:如动态平衡、导航、跳跃动作
  • 你希望策略“有记忆”而不是“当前状态拍脑袋决定”
  1. 标准 RNN(Vanilla RNN)

    特点:标准的 RNN 是最基本的形式。它通过隐藏层将当前输入和先前的状态一起传递,并计算输出。其核心思想是在每个时间步使用相同的权重和偏置来更新隐藏状态,从而处理序列数据。

    缺点:标准 RNN 在处理长序列时可能会遇到梯度消失或梯度爆炸的问题,因此它并不适合长时间依赖的任务。

  2. 长短时记忆网络(LSTM)

    特点:LSTM 是一种改进版的 RNN,它引入了 遗忘门(Forget Gate)、输入门(Input Gate) 和 输出门(Output Gate) 来控制信息的流动。通过这些门机制,LSTM 可以更好地捕捉长时间依赖关系,避免了标准 RNN 中的梯度消失问题。

    优点:LSTM 能够学习并记住长时间跨度的信息,特别适合语音识别、自然语言处理等任务。

    缺点:相较于标准 RNN,LSTM 计算更为复杂,训练时所需的时间和资源较多。

  3. 门控循环单元(GRU)

    特点:GRU 是另一种改进型的 RNN,与 LSTM 类似,它也使用门控机制来控制信息的流动。GRU 将 LSTM 中的遗忘门和输入门合并为一个更新门(Update Gate),从而简化了模型结构。

    优点:GRU 相比于 LSTM 更加高效,参数较少,计算速度较快,适用于资源有限的情况。

    缺点:GRU 虽然简化了 LSTM 的结构,但可能无法捕获 LSTM 中某些复杂的长期依赖关系。

  4. 双向 RNN(Bidirectional RNN)

    特点:双向 RNN 通过将两个 RNN 层相结合来增强模型的表达能力。一个 RNN 层处理输入序列的正向信息,另一个 RNN 层处理反向信息。通过这种方式,双向 RNN 可以同时考虑过去和未来的上下文信息。

    优点:双向 RNN 在处理时序数据时可以更全面地捕捉上下文信息,尤其适用于需要考虑未来信息的任务(如语音识别、文本标注等)。

    缺点:双向 RNN 计算量较大,因为它需要同时处理正向和反向的序列。

  5. 深度 RNN(Deep RNN)

    特点:深度 RNN 是一种具有多个隐藏层的 RNN。这些隐藏层堆叠在一起,使得网络能够学习更加复杂的特征。深度 RNN 可以通过多个时间步之间的交互,捕捉更高层次的抽象信息。

    优点:深度 RNN 可以捕捉更加复杂和丰富的序列信息,适合处理更复杂的任务。

    缺点:深度 RNN 可能会导致梯度消失或梯度爆炸问题,训练时需要较大的计算资源。

  6. 注意力机制(Attention Mechanism)

    特点:虽然注意力机制本身并不完全是 RNN 的一种类型,但它经常与 RNN(特别是 LSTM 和 GRU)结合使用,以增强模型的性能。注意力机制通过加权输入序列中的每个部分,使模型能够“关注”输入中的重要部分,从而更好地处理长距离依赖。

    优点:通过注意力机制,模型可以自动学习哪些部分对当前任务最为重要,减少对长时间序列的全局依赖。

    缺点:增加了计算复杂度,但提升了性能。

  7. Transformer

    特点:Transformer 是一种基于注意力机制的架构,虽然它不依赖于传统的 RNN 结构,但它常常被视为 RNN 的替代方案。Transformer 使用多头自注意力机制(Self-Attention)来处理序列数据,而不是依赖递归连接。这使得 Transformer 能够并行处理序列中的所有元素,从而大大提高计算效率。

    优点:Transformer 适用于非常长的序列,并且能够并行处理数据。由于其在 NLP 任务中的表现优越,Transformer 成为许多现代 NLP 模型(如 BERT、GPT、T5 等)的基础架构。

    缺点:Transformer 对于短序列数据的处理效率较低。

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

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

相关文章

iOS rootless无根越狱检测方案

不同于安卓的开源生态,iOS一直秉承着安全性更高的闭源生态,系统中的硬件、软件和服务会经过严格审核和测试,来保障安全性与稳定性。 据FairGurd观察,虽然iOS系统具备一定的安全性,但并非没有漏洞,如市面上…

【React】基于 React+Tailwind 的 EmojiPicker 选择器组件

1.背景 React 写一个 EmojiPicker 组件,基于 emoji-mart 组件二次封装。支持添加自定义背景 、Emoji 图标选择!并在页面上展示! 2.技术栈 emoji-mart/data 、emoji-mart : emoji 图标库、元数据 tailwindcss: 原子化 CSS 样式库 antd : 组…

skynet.socket.limit 使用详解

目录 核心作用方法定义使用场景场景 1:限制接收缓冲区(防御大包攻击)场景 2:动态调整限制(应对不同负载) 底层机制注意事项完整示例:带流量控制的 Echo 服务总结 在 Skynet 框架中,s…

electron打包vue2项目流程

1,安装一个node vue2 的项目 2,安装electron: npm install electron -g//如果安装还是 特比慢 或 不想安装cnpn 淘宝镜像查看是否安装成功:electron -v 3,进入到项目目录:cd electron-demo 进入项目目录…

【面试八股】:常见的锁策略

常见的锁策略 synchronized (标准库的锁不够你用了)锁策略和 Java 不强相关,其他语言涉及到锁,也有这样的锁策略。 1. 悲观锁,乐观锁(描述的加锁时遇到的场景) 悲观锁:预测接下来…

【数据分享】基于联合国城市化程度框架的全球城市边界数据集(免费获取/Shp格式)

在全球城市化进程不断加快的今天,如何精准定义和测量“城市”成为关键问题。不同国家和机构采用不同的标准,导致全球城市化水平的统计结果存在较大差异。同时,由于数据来源分散、标准不统一,获取一套完整、可比的全球城市边界数据…

acwing 每日一题4888. 领导者

目录 题目简述: 思路梳理: 总代码: https://www.acwing.com/problem/content/description/4891/ 题目简述: 有两个品种的奶牛,分别为G和H,我们要在每个品种中各找一头牛当领导者,最后输出全…

在Windows下VSCodeSSH远程登录到Ubuntu

Window用VSCode通过SSH远程登录Ubuntu SSH 服务开启Windows远程登录 SSH 服务开启 首先要确保 Ubuntu 的 SSH 服务开启了,开启 Ubuntu 的 SSH 服务以后我们就可以在 Windwos 下使用终端软件登陆到 Ubuntu 开启 SSH sudo apt-get install openssh-serverWindows远…

软件性能测试中的“假阳性”陷阱

软件性能测试中的“假阳性”陷阱主要表现为错误警报频繁、资源浪费严重、测试可信度降低。其中,错误警报频繁是最常见且最严重的问题之一,“假阳性”现象会导致开发团队在解决不存在的问题上花费大量时间。据行业调查显示,超过30%的性能优化成…

AwesomeQt分享3(含源码)

AwesomeQt 这个项目包含了多个Qt组件的使用示例,旨在展示Qt各种强大功能的实现方式。 源码分享 github: awesome_Qtgitee: 后续同步 项目进度 QCustomPlot曲线控件示例 支持排序和筛选的列表控件示例 支持排序和筛选的表格控件示例 属性表示例 Dock窗口示例 自绘…

如何验证极端工况下的系统可靠性?

验证极端工况下系统可靠性的方法主要包括设计极限测试、环境应力筛选(ESS)、可靠性预测与建模。其中,设计极限测试最为关键,通过在试验中施加超过预期使用条件的应力,可以有效评估系统的真实承受能力和潜在弱点。这类测…

[计算机网络]网络I/O模型

欢迎来到啾啾的博客🐱。 这是一个致力于构建完善的Java程序员知识体系的博客📚,记录学习的点滴,分享工作的思考、实用的技巧,偶尔也分享一些杂谈💬。 欢迎评论交流,感谢您的阅读😄。…

MyBaitis-Plus 使用动态表名 selectPage 不生效

在使用 MyBatis-Plus 时,采用动态表名策略后,selectPage 方法无法正常生效。 MyBatis-Plus动态表名插件配置MyBatis-Plus动态表名失效原因MyBatis-Plus动态表名失效解决办法 MyBatis-Plus动态表名插件配置 以下是我项目中 MyBatis - Plus 的插件配置&am…

C语言基础—构造类型

数据类型 1.基本类型/基础类型 整型 短整型:short[int] --2字节 基本整型:int --4字节 长整型:long[int] --32位4字节/64位8字节 长长整型:long long [int] (C99) 注意:以上类型又都分为sig…

交流电机类型及其控制技术

交流电机可分为同步电机和异步电机两大种类,如果电机转子的转速与定子旋转磁场的转速相等,转子与定子旋转磁场在空间同步地旋转,这种电机就称为同步电机。如果电机转子的转速不等于定子旋转磁场的转速,转子与定子旋转磁场在空间旋…

「HTML5+Canvas实战」星际空战游戏开发 - 纯前端实现 源码即开即用【附演示视频】

纯前端实现星际空战游戏【简易版】 博主上次分享的简易版飞机大战收到了不少建议,今天再给大家来一波福利!带来全新升级的飞机大战进阶版!不仅拥有更丰富的游戏机制和更精美的游戏画面,还加入了超燃的BOSS战斗系统。源码完全免费开放,拿来即用无门槛,欢迎感兴趣的小伙伴…

7-项目负责人-添加产品

点击一个项目集,进入项目集的页面。可以进行产品、项目、人员和干系人的管理。 点击“添加产品”,为该项目集添加关联产品。一个项目集可以关联多个产品。还可以通过“产品线”管理一些列产品。 产品。

深度赋能!北京智和信通融合DeepSeek,解锁智能运维无限可能

在数字化飞速发展的今天,传统运维模式面临着设备规模激增、故障复杂度攀升、人工响应滞后等多重挑战。随着DeepSeek、腾讯元宝等AI大模型的兴起,为传统运维模式带来了新的变革。 北京智和信通基于DeepSeek大模型技术,将AI和运维场景深度融合&…

flex和bison笔记

文章目录 flex语法:定义部分:规则部分:flex全局变量:yyin: bison和flex联合编译: flex词法分析 bison语法分析 flex有两种使用方式,一种是flex单独做一个词法分析程序,另一种是flex和bison协同构建一个词法语法分析程序 我们在北…

rbpf虚拟机-call指令

文章目录 一、概述背景知识 二、call 指令的主要方法2.1 注册辅助函数2.2 执行辅助函数 三、完整代码示例与详解3.1 示例辅助函数3.2 测试虚拟机的 call 指令测试代码代码解析 四、总结 Welcome to Code Blocks blog 本篇文章主要介绍了 [rbpf虚拟机-call指令] ❤博主广交技术…