PyTorch循环神经网络(Pytotch)

文章目录

  • 循环神经网络(RNN)
    • 简单的循环神经网络
    • 长短期记忆网络(LSTM)
    • 门控循环单元(GRU)

循环神经网络(RNN)

  • 循环神经网络(RecurrentNeuralNetwork,RNN)又称递归神经网络,它是常规前馈神经网络(FeedforwardNeuralNetwork,FNN)的扩展,本节介绍几种常见的循环神经网络。

简单的循环神经网络

  • 循环神经网络(RNN)会遍历所有序列的元素,每个当前层的输出都与前面层的输出有关,会将前面层的状态信息保留下来。理论上,RNN应该可以处理任意长度的序列数据,但为了降低一定的复杂度,实践中通常只会选取与前面的几个状态有关的信息。
  • 简单的循环神经网络如图:
    在这里插入图片描述
  • x是输入,y是输出,中间由一个箭头表示数据循环更新的是隐藏层,主要由中间部分实现时间记忆功能。
  • 神经网络输入x并产生输出y,最后将输出的结果反馈回去。假设在一个时间t内,神经网络的输入除来自输入层的 x ( t ) x(t) x(t)外,还有上一时刻的输出 y ( t − 1 ) y(t-1) y(t1),两者共同输入产生当前层的输出 y ( t ) y(t) y(t)
  • 将这个神经网络按照时间序列形式展开:
    在这里插入图片描述
  • 每个神经元的输出都是根据当前的输入 x ( t ) x(t) x(t)和上一时刻的 y ( t − 1 ) y(t-1) y(t1)共同决定。它们对应的权重分别是 W x W_x Wx W y W_y Wy,单个神经元的输出计算如下:
    y t = O ( x t T ⋅ W x + y t − 1 T ⋅ W y + b ) \boldsymbol { y } _ { t } = \mathcal { O } ( \boldsymbol { x } _ { t } ^ { \mathrm { T } } \cdot \boldsymbol { W } _ { x } + \boldsymbol { y } _ { t - 1 } ^ { \mathrm { T } } \cdot \boldsymbol { W } _ { y } + b ) yt=O(xtTWx+yt1TWy+b)
  • 将隐藏层的层级展开,结果如下图:
    在这里插入图片描述
  • RNN单元在时间 t t t的状态记作 h t h_t ht U U U表示此刻输入的权重, W W W表示前一次输出的权重, V V V表示此刻输出的权重。
  • t = 1 t=1 t=1时刻,一般 h 0 h_0 h0表示初始状态为0,随机初始化 U 、 W 、 V U、W、V UWV,公式如下:
    h 1 = f ( U x 1 + W h 0 + b h ) O 1 = g ( V h 1 + b o ) \begin {array} { l } { h _ { 1 } = f ( U x _ { 1 } + W h _ { 0 } + b _ { h } ) } \\ { O _ { 1 } = g ( V h _ { 1 } + b _ { o } ) } \\ \end{array} h1=f(Ux1+Wh0+bh)O1=g(Vh1+bo)
  • f 和 g 均为激活函数(光滑的曲线函数), f f f可以是Sigmoid、ReLU、Tanh等激活函数, g g g通常是Softmax损失函数。 b h b_h bh是隐藏层的偏置项, b 0 b_0 b0是输出层的偏置项。
  • 前向传播算法,按照时间 t t t向前推进,而此时隐藏状态 h 1 h_1 h1是参与下一个时间的预测过程。
    h 2 = f ( U x 2 + W h 1 + b h ) O 2 = g ( V h 2 + b o ) \begin {array} { l } { h _ { 2 } = f ( U x _ { 2 } + W h _ { 1 } + b _ { h } ) } \\ { O _ { 2 } = g ( V h _ { 2 } + b _ { o } ) } \\ \end{array} h2=f(Ux2+Wh1+bh)O2=g(Vh2+bo)
  • 以此类推,最终可得到输出公式为:
    h t = f ( U x t + W h t − 1 + b h ) O t = g ( V h t + b o ) \begin {array} { l } { h _ { t } = f ( U x _ { t } + W h _ { t-1 } + b _ { h } ) } \\ { O _ { t } = g ( V h _ { t } + b _ { o } ) } \\ \end{array} ht=f(Uxt+Wht1+bh)Ot=g(Vht+bo)
  • 权重共享机制通过统一网络参数(W、U、V及偏置项)实现了三方面优势:一是降低计算复杂度,二是增强模型泛化能力,三是实现对可变长度连续序列数据的特征提取。该机制不仅能捕捉序列特征的时空连续性,还通过位置无关的特性避免了逐位置规则学习,但保留了序列位置的识别能力。
  • 尽管RNN网络在时序数据处理上表现优异,其基础结构仍存在显著缺陷。理论上RNN应具备长期记忆能力和任意长度序列处理能力,但实际应用中会出现梯度消失现象。该问题源于两方面:一是BP算法的固有缺陷(前馈神经网络中随深度增加出现训练失效),二是RNN特有的长程依赖问题(时间跨度导致记忆衰减)。从数学视角看,当激活函数导数小于1时,多层网络梯度呈指数衰减;反之若导数大于1则引发指数级梯度膨胀,造成网络失稳(即梯度爆炸问题)。
  • 针对这些局限性,学界提出了两种主流改进架构:长短期记忆网络(LSTM)和门控循环单元(GRU)。

长短期记忆网络(LSTM)

  • 长短期记忆网络(Long Short-Term Memory,LSTM)主要为了解决标准RNN在处理长序列数据时面临的梯度消失等问题。
  • 基本的LSTM结构单元如图:
    在这里插入图片描述
  • 图中四个矩形即图标1,2,3,4是普通神经网络的隐藏层结构。其中 f ( t ) , i t , o ( t ) f_{(t),i_{{t}},o_(t)} f(t)ito(t)都是Logistic函数, g ( t ) g_{(t)} g(t)是Tanh函数。
  • LSTM单元状态分为长时记忆和短时记忆,其中短时记忆i用向量 h ( t ) h_{(t)} h(t)表示,长时记忆用 c ( t ) c_{(t)} c(t)表示。
  • LSTM单元结构中还有三个门限控制器:忘记门限,输入门限和输出门限。三个门限都使用Logistic函数,如果输出值为1,表示门限打开;如果输出值为0,表示门限关闭。
    • 忘记门限:主要用 f ( t ) f_{(t)} f(t)控制着长时记忆是否被遗忘。
    • 输入门限:主要由 i ( t ) i_{(t)} i(t) g t g_{{t}} gt i ( t ) i_{(t)} i(t)用于控制 g t g_{{t}} gt用于增强记忆的部分。
    • 输出门限:主要由 o ( t ) o_{(t)} o(t)控制应该在该时刻被读取和输出的部分。
  • LSTM单元的基本流程如下:随着短时记忆 c ( t ) c_{(t)} c(t)从左到右横穿整个网络,它首先经过一个遗忘门,丢弃一些记忆,然后通过输入门限来选择增加一些新记忆,最后直接输出 c ( t ) c_{(t)} c(t)。此外,增加记忆这部分操作中,长时记忆先经过Tanh函数,然后被输出门限过滤,产生了短时记忆ht)。
  • 综上所述,LSTM可以识别重要的输入(输入门限的作用),并将这些信息在长时记忆中存储下来,通过遗忘门保留需要的部分,以及在需要的时候能够提取它。

  • LSTM单元结构中的三个门限控制器、两种状态以及输出:
    i ( t ) = σ ( w × i ⊤ ⋅ x ( t ) + w h i ⊤ ⋅ h ( t − 1 ) + b i ) f ( t ) = σ ( w × j ⊤ ⋅ x ( t ) + w h j ⊤ ⋅ h ( t − 1 ) + b f ) o ( t ) = σ ( w x o ⊤ ⋅ x ( t ) + w h o ⊤ ⋅ h ( t − 1 ) + b o ) g ( t ) = T a n h ( w x g ⊤ ⋅ x ( t ) + w h g ⊤ ⋅ h ( t − 1 ) + b g ) c ( t ) = f ( t ) ⊗ c ( t − 1 ) + i ( t ) ⊗ g ( t ) y ( t ) = h ( t ) = o ( t ) ⊗ T a n h ( c ( t ) ) \begin{array} { r l } & { i _ { ( t ) } = \sigma ( w _ { \times i } ^ { \top } \cdot x _ { ( t ) } + w _ { h i } ^ { \top } \cdot h _ { ( t - 1 ) } + b _ { i } ) } \\ & { f _ { ( t ) } = \sigma ( w _ { \times j } ^ { \top } \cdot x _ { ( t ) } + w _ { h j } ^ { \top } \cdot h _ { ( t - 1 ) } + b _ { f } ) } \\ & { o _ { ( t ) } = \sigma ( w _ { x o } ^ { \top } \cdot x _ { ( t ) } + w _ { h o } ^ { \top } \cdot h _ { ( t - 1 ) } + b _ { o } ) } \\ & { g _ { ( t ) } = \mathrm { T a n h } ( w _ { x g } ^ { \top } \cdot x _ { ( t ) } + w _ { h g } ^ { \top } \cdot h _ { ( t - 1 ) } + b _ { g } ) } \\ & { c _ { ( t ) } = f _ { ( t ) } \otimes c _ { ( t - 1 ) } + i _ { ( t ) } \otimes g _ { ( t ) } } \\ & { y _ { ( t ) } = h _ { ( t ) } = o _ { ( t ) } \otimes \mathrm { T a n h } ( c _ { ( t ) } ) } \end{array} i(t)=σ(w×ix(t)+whih(t1)+bi)f(t)=σ(w×jx(t)+whjh(t1)+bf)o(t)=σ(wxox(t)+whoh(t1)+bo)g(t)=Tanh(wxgx(t)+whgh(t1)+bg)c(t)=f(t)c(t1)+i(t)g(t)y(t)=h(t)=o(t)Tanh(c(t))
  • w x i 、 w x f 、 w x o 、 w x g w_{xi}、w_{xf}、w_{xo}、w_{xg} wxiwxfwxowxg是每一层连接到 x ( t ) x_{(t)} x(t)的权重, w h i 、 w h f 、 w h o 、 w h g w_{hi}、w_{hf}、w_{ho}、w_{hg} whiwhfwhowhg是每层连接到前一个短时记忆 h ( t − 1 ) h_{(t-1)} h(t1)的权重, b i 、 b f 、 b o 、 b g b_i、b_f、b_o、b_g bibfbobg是每一层的偏置项。

门控循环单元(GRU)

  • 门控循环单元(GateRecurrentUnit,GRU)是循环神经网络(RNN)的一个变种,它旨在解决标准RNN中梯度消失的问题。GRU结构更简单,效果更好。

  • GRU的设计初衷是解决长期依赖问题,即标准RNN难以捕捉长序列中较早时间步的信息。通过引入更新门和重置门,GRU能够学习到何时更新或忽略某些信息,从而更好地处理序列数据。

  • 相较于LSTM,GRU有更少的参数和计算复杂度,特别是在资源受限的情况下训练更快,同时也能取得不错的性能表现,。GRU已被广泛应用于各种序列建模任务,如语言模型、机器翻译、语音识别等领域。

  • GRU如图所示:
    在这里插入图片描述

  • GRU中包含三个激活函数,分别为Logistic、Logistic、Tanh函数。

  • 如图所示,GRU通过精简门控机制提升了计算效率,其核心特征如下:

  1. 门控结构简化

    • 采用**重置门(r)更新门(z)**双门架构,激活函数缩减至3个(使用Sigmoid或Logistic函数,输出0~1的门控信号)。
    • 合并状态向量为单一隐藏状态 h t h_t ht,简化信息流动路径。
  2. 门控功能详解

    • 重置门(r):控制前一时刻隐藏状态 h t − 1 h_{t-1} ht1对当前候选状态的影响程度。门值越接近0,丢弃的历史信息越多,主层(如Tanh激活单元)将更多依赖当前输入 x t x_t xt 重新计算候选状态。
    • 更新门(z):调节 h t − 1 h_{t-1} ht1 传递至当前状态 h t h_t ht 的比例。门值越接近1,保留的历史信息比例越高,新生成的信息比例越低。
  3. 工作流程

    • 步骤1:根据 h t − 1 h_{t-1} ht1 x t x_t xt 计算重置门 r t r_t rt 和更新门 z t z_t zt
    • 步骤2:利用 r t r_t rt 重置 h t − 1 h_{t-1} ht1,生成候选状态 h ~ t \tilde{h}_t h~t(通常通过Tanh激活)。
    • 步骤3:通过 z t z_t zt 加权融合 h t − 1 h_{t-1} ht1 h ~ t \tilde{h}_t h~t,输出最终状态 h t h_t ht

  • GRU单元结构的计算过程:
    z ( t ) = σ ( w x z T ⋅ x ( t ) + w h z T ⋅ h ( t − 1 ) ) r ( t ) = σ ( w x r T ⋅ x ( t ) + w h r T ⋅ h ( t − 1 ) ) g ( t ) = T a n h ( w x g T ⋅ x ( t ) + w h g T ⋅ ( r ( t ) ⊗ h ( t − 1 ) ) ) h ( t ) = ( 1 − z ( t ) ) ⊗ T a n h ( w x g T ⋅ h ( t − 1 ) + z ( t ) ⊗ g ( t ) ) \begin{array} { r l } & { z _ { ( t ) } = \sigma ( w _ { x z } ^ { \mathrm { T } } \cdot x _ { ( t ) } + w _ { h z } ^ { \mathrm { T } } \cdot h _ { ( t - 1 ) } ) } \\ & { r _ { ( t ) } = \sigma ( w _ { x r } ^ { \mathrm { T } } \cdot x _ { ( t ) } + w _ { h r } ^ { \mathrm { T } } \cdot h _ { ( t - 1 ) } ) } \\ & { g _ { ( t ) } = \mathrm { T a n h } ( w _ { x g } ^ { \mathrm { T } } \cdot x _ { ( t ) } + w _ { h g } ^ { \mathrm { T } } \cdot ( r _ { ( t ) } \otimes h _ { ( t - 1 ) } ) ) } \\ & { h _ { ( t ) } = ( 1 - z _ { ( t ) } ) \otimes \mathrm { T a n h } ( w _ { x g } ^ { \mathrm { T } } \cdot h _ { ( t - 1 ) } + z _ { ( t ) } \otimes g _ { ( t ) } ) } \end{array} z(t)=σ(wxzTx(t)+whzTh(t1))r(t)=σ(wxrTx(t)+whrTh(t1))g(t)=Tanh(wxgTx(t)+whgT(r(t)h(t1)))h(t)=(1z(t))Tanh(wxgTh(t1)+z(t)g(t))
  • w x z 、 w x r w_{xz}、w_{xr} wxzwxr w x g w_{xg} wxg是每一层连接到输入 x ( t ) x(t) x(t)的权重, W h z 、 W h r , W_{hz}、W_{hr}, WhzWhr, W h g W_{hg} Whg 是每一层连接到前一个短时记忆 h ( t − 1 ) h_{(t-1)} h(t1)的权重。

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

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

相关文章

用算术右移实现逻辑右移及用逻辑右移实现算术右移

函数srl()用算术右移实现逻辑右移,函数sra()用逻辑右移实现算术右移。 程序代码 int sra(int x,int k); unsigned int srl(unsigned int x, int k);void main() {int rx1,k,x1;unsigned int rx2,x2;k3;x10x8777;x20x8777;rx1sra(x1, k);rx2srl(x2, k);while(1); }…

pojo层、dao层、service层、controller层的作用

在Java Web开发中,常见的分层架构(如Spring Boot项目)通常包含POJO层、DAO层、Service层和Controller层,各层职责明确,协同工作。以下是各层的作用及相互关系: 1. POJO层(Model/Entity层&#…

【Linux网络】五种IO模型与阻塞IO

IO 在Linux网络环境里,IO(Input/Output)指的是网络数据在系统与外部网络(像其他设备、服务器或者客户端)之间进行传输的过程。 它是网络编程和系统性能优化的核心内容。 IO :INPUT和OUTPUT(站…

入门OpenTelemetry——应用自动埋点

埋点 什么是埋点 埋点,本质就是在你的应用程序里,在重要位置插入采集代码,比如: 收集请求开始和结束的时间收集数据库查询时间收集函数调用链路信息收集异常信息 这些埋点数据(Trace、Metrics、Logs)被…

大数据场景下数据导出的架构演进与EasyExcel实战方案

一、引言:数据导出的演进驱动力 在数字化时代,数据导出功能已成为企业数据服务的基础能力。随着数据规模从GB级向TB级甚至PB级发展,传统导出方案面临三大核心挑战: ‌数据规模爆炸‌:单次导出数据量从万级到亿级的增长…

拓展运算符与数组解构赋值的区别

拓展运算符与数组解构赋值是ES6中用于处理数组的两种不同的特性,它们有以下区别: 概念与作用 • 拓展运算符:主要用于将数组展开成一系列独立的元素,或者将多个数组合并为一个数组,以及在函数调用时将数组作为可变参…

2025年全国青少年信息素养大赛初赛真题(算法创意实践挑战赛C++初中组:文末附答案)

2025年全国青少年信息素养大赛初赛真题(算法创意实践挑战赛C++初中组:文末附答案) 一、单项选择题(每题 5 分) C++ 程序流程控制的基本结构不包括以下哪项? A. 分支结构 B. 数据结构 C. 循环结构 D. 顺序结构 以下哪段代码能将数组 int a[4] = {2, 4, 6, 8}; 的所有元素变…

计算机视觉与深度学习 | Python实现EMD-CNN-LSTM时间序列预测(完整源码、数据、公式)

EMD-CNN-LSTM 1. 环境准备2. 数据生成(示例数据)3. EMD分解4. 数据预处理5. CNN-LSTM模型定义6. 模型训练7. 预测与重构8. 性能评估核心公式说明1. 经验模态分解(EMD)2. CNN-LSTM混合模型参数调优建议扩展方向典型输出示例以下是使用Python实现EMD-CNN-LSTM时间序列预测的完…

React 19中useContext不需要Provider了。

文章目录 前言一、React 19中useContext移除了Provider&#xff1f;二、使用步骤总结 前言 在 React 19 中&#xff0c;useContext 的使用方式有所更新。开发者现在可以直接使用 作为提供者&#xff0c;而不再需要使用 <Context.Provider>。这一变化简化了代码结构&…

单片机-STM32部分:14、SPI

飞书文档https://x509p6c8to.feishu.cn/wiki/VYYnwOc9Zi6ibFk36lYcPQdRnlf 什么是SPI SPI 是英语Serial Peripheral interface的缩写&#xff0c;顾名思义就是串行外围设备接口。是Motorola(摩托罗拉)首先在其MC68HCXX系列处理器上定义的。 SPI&#xff0c;是一种高速的&…

Vue 3 动态 ref 的使用方式(表格)

一、问题描述 先给大家简单介绍一下问题背景。我正在开发的项目中&#xff0c;有一个表格组件&#xff0c;其中一列是分镜描述&#xff0c;需要支持视频上传功能。用户可以为每一行的分镜描述上传对应的视频示例。然而&#xff0c;在实现过程中&#xff0c;出现了一个严重的问…

构建 TypoView:一个富文本样式预览工具的全流程记录

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 在一次和 CodeBuddy 的日常交流中&#xff0c;我提出了一个构想&#xff1a;能不能帮我从零构建一个富文本样式…

AI:OpenAI论坛分享—《AI重塑未来:技术、经济与战略》

AI&#xff1a;OpenAI论坛分享—《AI重塑未来&#xff1a;技术、经济与战略》 导读&#xff1a;2025年4月24日&#xff0c;OpenAI论坛全面探讨了 AI 的发展趋势、技术范式、地缘政治影响以及对经济和社会的广泛影响。强调了 AI 的通用性、可扩展性和高级推理能力&#xff0c;以…

Bash fork 炸弹 —— :(){ :|: };:

&#x1f9e0; 什么是 Fork 炸弹&#xff1f; Fork 炸弹是一种拒绝服务&#xff08;DoS&#xff09;攻击技术&#xff0c;利用操作系统的 fork() 系统调用不断创建新进程&#xff0c;直到系统资源&#xff08;如进程表、CPU、内存&#xff09;被耗尽&#xff0c;从而使系统无法…

<前端小白> 前端网页知识点总结

HTML 标签 1. 标题标签 h1到h6 2. 段落标签 p 3. 换行 br 水平线 hr 4. 加粗 strong 倾斜 em 下划线 ins 删除 del 5. 图像标签 img src-图像的位置 alt- 图片加载失败显示的文字 替换文本 title--- 鼠标放到图片上显示的文字 提示…

tomcat查看状态页及调优信息

准备工作 先准备一台已经安装好tomcat的虚拟机&#xff0c;tomcat默认是状态页是默认被禁用的 1.添加授权用户 vim /usr/local/tomcat/conf/tomcat-users.xml22 <role rolename"manager-gui"/>23 <user username"admin" password"tomcat&q…

.NET NativeAOT 指南

目录 1. 引言 2. 什么是 .NET NativeAOT&#xff1f; 2.1 NativeAOT 的定义 2.2 NativeAOT 与传统 JIT 的对比 2.3 NativeAOT 的适用场景 3. NativeAOT 的核心优势 3.1 性能提升 3.2 简化部署 3.3 更小的应用体积 3.4 知识产权保护 4. NativeAOT 的基本用法 4.1 环境…

产品周围的几面墙

不能把排序&#xff0c;当单选题做。 2025年的杭州咖啡馆&#xff0c;味道最浓的不是咖啡&#xff0c;是聊各种项目和创业的卷味。 在过去几年&#xff0c;聊项目的也不少&#xff0c;那时候带着更加浓烈的自信和松弛感&#xff0c;不过今年略带几分忐忑和试探的口吻。 看到网…

例举3种强制类型转换和2种隐式

1. 强制类型转换 强制类型转换是指程序员显式地将一个数据类型的值转换为另一种数据类型。这种转换通常是通过使用特定的函数或运算符来完成的。 常用的强制类型转换方法&#xff1a; 使用Number()函数 let value "123"; let num Number(value); // 强制转换为数字…

UI-TARS本地部署

UI-TARS本地部署 UI-TARS本地部署 UI-TARS 论文&#xff08;arXiv&#xff09; UI-TARS 官方仓库&#xff1a;包含部署指南、模型下载链接及示例代码。 UI-TARS-Desktop 客户端&#xff1a;支持本地桌面应用的交互控制。 模型部署框架&#xff1a;vLLM本地部署 1.下载项目…