RNN(循环神经网络)详解

1️⃣ RNN介绍

前馈神经网络(CNN,全连接网络)的流程是前向传播、反向传播和参数更新,存在以下不足:

  • 无法处理时序数据:时序数据长度一般不固定,而前馈神经网络要求输入和输出的维度是固定的,不能改变
  • 缺少记忆:前馈神经网络没有机制去记忆和处理之前的输入数据,因此无法处理像语言、股票走势或天气预报等 序列化时间依赖性强的数据

针对前馈神经网络上述问题,RNN引入以下机制:

  • 不同时间步的隐藏层之间是相连的
  • 在时刻t,隐藏层的输入包括两部分,当前时刻的输入 x t x_t xt和上一个时间步隐藏层的输出 s t − 1 s_{t-1} st1

通过这两条机制,模型能够记忆之前的输入数据,捕捉序列的上下文信息

看完这几句话你一定在想,这说的是个啥?太晕了,没关系,慢慢往下看

多说一句,RNN在很久之前就提出了,Jordan RNN于1986被提出,Elman RNN于1990年提出。


2️⃣ 原理介绍

接下来,讲讲具体原理,解决一下上面的迷惑。看下面这张图,分析一下 o t o_t ot的表达式:
在这里插入图片描述

  • x t x_t xt是t时刻的输入
  • s t s_t st是t时刻的记忆, s t = f ( U ⋅ x t + W ⋅ s t − 1 ) s_t=f(U\cdot x_t+W\cdot s_{t-1}) st=f(Uxt+Wst1),f表示激活函数, s t − 1 s_{t-1} st1表示t-1时刻的记忆
  • o t o_t ot是t时刻的输出, o t = s o f t m a x ( V ⋅ s t ) o_t=softmax(V\cdot s_t) ot=softmax(Vst)

看完上面这张图,对于W是什么疑惑很大,我一开始学习的时候也是这样,W到底是啥呢?来看下面这张图:
在这里插入图片描述

看完这张图,对于W的描述一目了然。W是在不同的时间步 隐藏层之间递归的权重。在RNN中,不同时间步使用相同的W,为了保证信息能够传递下去。

其实这里还有一个疑惑,按照我之前的认知,神经网络可训练的参数w和b都是在神经元上的,例如下面这张图。那么问题来了,RNN隐藏层神经元上参数是啥样的呢?
在这里插入图片描述
虽然下面的左图是这样画的,搞得好像参数U,W,V“漂浮在空中一般”,实际上,它们都在神经元上。准确的来说应该是右图的形式,U和W都在隐藏层神经元上,V在输出层神经元上。所以之前理解的神经元是一个神经元上只有一种参数。对于RNN来说,隐藏层神经元上有两种参数U和W。终于搞懂了,爽!
在这里插入图片描述
分析完RNN中参数的具体含义,来看看参数的尺寸:
U = 隐藏层神经元个数 × 输入尺寸 W = 隐藏层神经元个数 × 隐藏层神经元个数 V = 输出尺寸 × 隐藏层神经元个数 U=隐藏层神经元个数×输入尺寸\\ W=隐藏层神经元个数×隐藏层神经元个数\\ V=输出尺寸×隐藏层神经元个数 U=隐藏层神经元个数×输入尺寸W=隐藏层神经元个数×隐藏层神经元个数V=输出尺寸×隐藏层神经元个数
这样最简单的RNN就分析完了。


3️⃣ 代码

接下来看一下最简单的代码:

import torch
import torch.nn as nn# 参数设置
input_size = 2    # 每个时间步的特征维度
hidden_size = 5   # 隐层神经元数量
num_layers = 1    # RNN层数
output_size = 3   # 假设输出的维度# RNN对象实例化
rnn = nn.RNN(input_size, hidden_size, num_layers, batch_first=True)# U:输入到隐藏状态的权重矩阵
U = rnn.weight_ih_l0  # 输入到隐藏状态的权重矩阵
print("矩阵 U 的大小 (输入到隐藏层):", U.shape)  # 应为 (hidden_size, input_size)# W:隐藏状态到隐藏状态的权重矩阵
W = rnn.weight_hh_l0  # 隐藏状态之间的递归权重矩阵
print("矩阵 W 的大小 (隐藏层到隐藏层):", W.shape)  # 应为 (hidden_size, hidden_size)# V:输出层权重矩阵
# 在 PyTorch 中没有直接实现,可以添加一个 Linear 层来模拟
V_layer = nn.Linear(hidden_size, output_size)  # 定义线性层
V = V_layer.weight  # V 就是隐藏状态到输出层的权重矩阵
print("矩阵 V 的大小 (隐藏层到输出层):", V.shape)  # 应为 (output_size, hidden_size)

输出:

矩阵 U 的大小 (输入到隐藏层): torch.Size([5, 2])
矩阵 W 的大小 (隐藏层到隐藏层): torch.Size([5, 5])
矩阵 V 的大小 (隐藏层到输出层): torch.Size([3, 5])

4️⃣ 总结

  • 标准的RNN存在梯度消失梯度爆炸问题,无法捕捉长时间序列的关系。因此LSTM和GRU被提出

5️⃣ 参考

  • 深度学习-神经网络-循环神经网络(一):RNN(Recurrent Neural Network,循环神经网络;1990年)
  • 理解循环神经网络(RNN)

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

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

相关文章

解剖C++模板(2) —— 模板匹配规则及特化

众所周知,模板声明部分的尖括号中的内容是声明模板形参,而调用模板时的尖括号是给模板传参。然而这样理解仅仅停留于现象,只是将模板形参传参和函数传参的过程划等号了。C 的函数重载匹配并非真的进行匹配,因为函数名修饰规则导致…

题目讲解15 合并两个排序的链表

原题链接: 合并两个排序的链表_牛客题霸_牛客网 思路分析: 第一步:写一个链表尾插数据的方法。 typedef struct ListNode ListNode;//申请结点 ListNode* BuyNode(int x) {ListNode* node (ListNode*)malloc(sizeof(ListNode));node->…

高性能Web网关:OpenResty 基础讲解

一:概述 OpenResty是由国人章亦春开发的一个基于Nginx的可伸缩的Web平台。 openresty 是一个基于 nginx 与 lua 的高性能 web 平台,其内部集成了大量精良的 lua 库、第三方模块以及大数的依赖项。用于方便搭建能够处理超高并发、扩展性极高的动态 web 应…

OceanBase JDBC (Java数据库连接)的概念、分类与兼容性

本章将介绍 OceanBase JDBC的 概念与分类,已帮助使用 JDBC 的用户及技术人员更好的 了解JDBC,以及 OceanBase JDBC在与 MySQL 及 Oracle 兼容性方面的相关能力。 一、JDBC 基础 1.1 JDBC 的概念 JDBC 一般指 Java 数据库连接。Java 数据库连接&#xf…

关于Django 模型字段 `choices`自定义数据类型的枚举——补充

文章目录 1. 处理 datetime 类型的 choices2. 处理 time 类型的 choices3. 处理 Decimal 类型的 choices4. 处理 UUID 类型的 choices5. 处理 float 类型的 choices 在 Choices 类的基础上扩展,可以将 choices 与特定数据类型(如 date 或 datetime&a…

小程序中引入下载到本地的iconfont字体图标加载不出来问题解决

我这个是uniapp项目,字体图标都是一样的,在vue项目中web端、uniapp运行到h5都没问题,但是运行到小程序加载不出来,报错如下: 不让用本地路径,所以我们要转为base64编码,这里给大家提供一个工具,它可以把本地字体文件转为base64:transfonter 进入官网后,第一步: …

如何在 Ubuntu 24.04 上安装和配置 Fail2ban ?

确保你的 Ubuntu 24.04 服务器的安全是至关重要的,特别是如果它暴露在互联网上。一个常见的威胁是未经授权的访问尝试,特别是通过 SSH。Fail2ban 是一个强大的工具,可以通过自动阻止可疑活动来帮助保护您的服务器。 在本指南中,我…

大模型论文精华—20241111

使用大型语言模型进行神经病理诊断的初步探索 研究问题 本研究探讨了大型语言模型(LLMs)在辅助医生进行神经病理学诊断中的潜在应用。具体来说,研究人员通过设计特定的问题和病例背景,询问多个流行的LLMs,并根据这些…

量化交易系统开发-实时行情自动化交易-3.4.2.2.Okex交易数据

19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来聊聊基于Okex交易所API获取交易数…

多商户中英双语电商系统设计与开发 PHP+mysql

随着全球电商市场的扩展,多商户平台成为了越来越多商家参与全球贸易的重要方式。为了适应不同语言用户的需求,尤其是中英双语用户的需求,设计一个支持中英双语的电商系统显得尤为重要。本文将重点探讨如何设计一个多商户中英双语电商系统&…

关于 3D Engine Design for Virtual Globes(三维数字地球引擎设计)

《3D Engine Design for Virtual Globes》是一本专注于三维虚拟地球引擎设计的专业书籍。这本书由Patrick Cozzi和Kevin Ring编写,覆盖了设计适用于虚拟球面环境的三维引擎的各个方面。虚拟地球引擎作为地理信息系统(GIS)中的一个核心组件&am…

ubuntu 20.04添加ros官方的软件源(解决下载ros软件包出现的E 无法定位软件包的问题)

ubuntu 20.04添加ros官方的软件源(解决下载ros软件包出现的E: 无法定位软件包的问题) 在 Ubuntu 20.04 上添加 ROS 官方软件源可以解决使用其他镜像源时遇到的 “E: 无法定位软件包” 的问题,主要是因为这些镜像源可能没有同步所有官方提供的…

单元测试、集成测试、系统测试有什么区别

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 单元测试、集成测试、系统测试有什么区别 1、粒度不同 集成测试bai粒度居中,单元测试粒度最小,系统du测试粒度最大。 2、测试方式不同…

CE2.【C++ Cont】练习题组2

1.数字反转 https://www.luogu.com.cn/problem/P5705 题目描述 输入一个不小于 100100 且小于 10001000,同时包括小数点后一位的一个浮点数,例如 123.4123.4 ,要求把这个数字翻转过来,变成 4.3214.321 并输出。 输入格式 一行一个…

Golang | Leetcode Golang题解之第557题反转字符串中的单词III

题目&#xff1a; 题解&#xff1a; func reverseWords(s string) string {length : len(s)ret : []byte{}for i : 0; i < length; {start : ifor i < length && s[i] ! {i}for p : start; p < i; p {ret append(ret, s[start i - 1 - p])}for i < le…

适合二开的web组态?

一、web组态的定义和背景 在深入探讨之前&#xff0c;我们先回顾一下“组态”的定义。在工业自动化领域&#xff0c;组态软件是用于创建监控和数据采集&#xff08;SCADA&#xff09;系统的工具&#xff0c;它允许工程师构建图形界面&#xff0c;实现与各种设备和机器的数据交互…

L1-4【练习7-11】 字符串逆序

输入一个字符串&#xff0c;对该字符串进行逆序&#xff0c;输出逆序后的字符串。 输入格式&#xff1a; 输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。 输出格式&#xff1a; 在一行中输出逆序后的字符串。 输入样例&#xff1a; Hello World!输…

【大数据学习 | HBASE】hbase的读数据流程与hbase读取数据

1. hbase的读数据流程 在解析读取流程之前我们还需要知道两个功能性的组件和HFIle的格式信息 HFILE 存储在hdfs中的hbase文件&#xff0c;这个文件中会存在hbase中的数据以kv类型显示&#xff0c;同时还会存在hbase的元数据信息&#xff0c;包括整个hfile文件的索引大小&…

使用 nsenter 进入 Docker 容器的操作

在容器化环境下&#xff0c;docker exec 通常是进入容器内部进行调试的常用方式&#xff0c;但在某些情况下&#xff0c;比如 Docker 容器管理工具出现问题&#xff0c;或者我们需要通过进程的命名空间来直接访问容器&#xff0c;nsenter 就成了一个非常有效的工具。本文将介绍…

什么是聚类分析,它在数据分析中的应用是什么

聚类分析是一种无监督学习方法&#xff0c;它旨在将数据集中的样本按照某种相似性准则自动进行分组。聚类分析的目标是将相似的样本划分为同一个簇&#xff0c;同时将不同簇之间的样本尽可能分离开。聚类分析的结果通常用簇的标签来表示&#xff0c;簇标签表示样本所属的簇。 …