循环神经网络RNN原理与优化
目录
前言
RNN背景
RNN原理
上半部分:RNN结构及按时间线展开图
下半部分:RNN在不同时刻的网络连接和计算过程
LSTM
RNN存在的问题
LSTM的结构与原理
数学表达层面
与RNN对比优势
应用场景拓展
从简易但严谨的代码来看RNN和LSTM
RNN
LSTM
前言
绕循环神经网络(RNN)、注意力机制(Attention)以及相关模型(如 LSTM、Transformer、BERT、GPT 等)在深度学习中的应用展开,介绍了其原理、结构、算法流程和实际应用场景。
RNN背景
RNN 产生的原因:深度神经网络(DNN)在处理输入时,每个输入之间相互独立,无法处理序列信息。然而在自然语言处理(NLP)和视频处理等任务中,需要考虑输入元素之间的关联性,因此引入 RNN。以 NLP 中的词性标注任务为例,需处理单词序列才能准确标注词性,仅单独理解每个单词是不够的。
RNN 的结构与公式:RNN 在结构上引入了循环层,其隐藏层状态St不仅取决于当前输入Xt,还与上一时刻的隐藏层状态相关。具体公式为
![]()
输出
![]()
这样的结构使RNN网络能够对序列信息进行处理
RNN原理

上半部分:RNN结构及按时间线展开图
RNN结构:
输入层(Input Layer):标记为“x”,接收输入数据。
隐藏层(Hidden Layer):标记为“s”,是RNN的核心部分,包含循环连接。图中显示了权重矩阵“U”(连接输入层和隐藏层)和“W”(隐藏层的循环连接)(输入层的)。
输出层(Output Layer):标记为“o”,通过权重矩阵“V”与隐藏层相连(输出层的),产生最终输出。
按时间线展开:
将RNN在时间维度上展开,展示了不同时刻(t-1, t, t+1)的网络状态。每个时刻都有输入x_t、隐藏层状态s_t和输出o_t。权重矩阵“U”、“W”和“V”在不同时刻保持不变,体现了RNN在时间上共享参数的特性。
下半部分:RNN在不同时刻的网络连接和计算过程
t-1时刻:
展示了隐藏层状态s的向量形式,s=[s1, s2, ..., sn],其中每个元素代表隐藏层的一个神经元状态。权重矩阵“W”连接了t-1时刻的隐藏层神经元。
t时刻:
输入层:输入向量X=[x1, x2, ..., xm],其中m是输入维度。
隐藏层:通过权重矩阵“U”接收输入层的信息,并通过权重矩阵“W”接收t-1时刻的隐藏层状态信息。图中显示了隐藏层的计算过程,即
,
其中f是激活函数。
输出层:根据隐藏层状态S_t,通过权重矩阵“V”计算输出
,
其中g是输出层的激活函数。
LSTM
LSTM(Long - Short - Term Memory,长短期记忆网络)是为解决传统循环神经网络(RNN)存在的问题而设计的。
RNN存在的问题
RNN有两个主要问题。一是短期记忆问题,当处理足够长的序列时,它难以将早期时间步的信息传递到后期。比如处理一段文本进行预测时,可能会遗漏开头的重要信息。二是梯度消失问题,在反向传播过程中,梯度随着时间反向传播而缩小。当梯度值变得极小,对神经网络权重更新的贡献就很小,导致早期的层停止学习,这也使得RNN在处理长序列时容易遗忘之前的信息。
LSTM的结构与原理

输入:

门:

当前时刻的输出及保存当前细胞状态(传递给下一个‘细胞’):
LSTM通过引入“细胞状态(cell state)”和“门(gate)”机制来解决上述问题:
细胞状态:就像一条传送带,在整个网络中运行,它可以在序列的不同时间步之间传递信息,使得LSTM能够处理长序列而不容易丢失早期信息。
门:
遗忘门(forget gate):决定从细胞状态中丢弃哪些信息。它读取当前输入和上一时刻隐藏状态,输出一个0 - 1之间的值,1表示“完全保留”,0表示“完全丢弃”。
输入门(input gate):确定要在细胞状态中存储哪些新信息。它包含一个sigmoid层来决定更新哪些值,以及一个tanh层来创建新的候选值向量,这些候选值可能会被添加到细胞状态中。
输出门(output gate):确定LSTM的输出。它首先通过sigmoid层决定细胞状态的哪些部分将被输出,然后将细胞状态通过tanh层(将值映射到 - 1到1之间),并将其与sigmoid层的输出相乘,得到最终的输出。
通过这些机制,LSTM能够更好地处理长序列数据,有选择性地记忆和遗忘信息,有效克服了RNN的短期记忆和梯度消失问题,这也是LSTM在后续的一些自然语言处理、语音识别等领域得到广泛应用的主要原因。
数学表达层面
遗忘门计算:
![]()
,其中W_f是权重矩阵,[h_{t - 1},x_t]是上一时刻隐藏状态和当前输入的拼接(‘细胞’传递),b_f是偏置项(截距),sigma是sigmoid激活函数,输出值在0 - 1之间,决定从细胞状态中遗忘的信息比例。
输入门计算:
![]()
确定更新值比例,
![]()
生成候选值向量,二者后续用于更新细胞状态。
细胞状态更新:
![]()
,
是逐元素相乘,即结合遗忘门输出、上一时刻细胞状态、输入门输出和候选值向量来更新细胞状态。
输出门计算:
![]()
决定输出比例,
![]()
得到最终隐藏状态输出。
与RNN对比优势
长期依赖处理:RNN受限于梯度消失难以保持长期依赖,LSTM通过门控机制控制细胞状态信息流,能有效保存和传递长距离信息,比如在处理长篇小说文本时,可记住开头人物关系等信息用于后续情节理解和生成。
学习效率:RNN因梯度问题早期层学习困难,LSTM通过门控灵活控制信息流动,更高效学习,在训练时间和收敛速度上表现更好,在语音识别任务中,可更快学习到语音序列中的特征模式。
应用场景拓展
自然语言处理:除常见的文本生成、机器翻译、情感分析,在文本摘要提取中,能抓住长文本关键信息;在命名实体识别中,准确识别不同类型实体。
时间序列预测:在金融领域,预测股票价格、汇率等波动;在能源领域,预测电力负荷、能源消耗等,利用其对时间序列中长短期信息的捕捉能力提高预测准确性。
视频处理:分析视频帧序列,用于动作识别、视频内容理解与生成,如判断视频中人物动作类别,生成符合逻辑的视频字幕等。
从简易但严谨的代码来看RNN和LSTM
通过pytorch框架来定义只有一个’细胞‘的RNN和LSTM,进一步理解这两个网络的架构的应用
RNN
import torch
import torch.nn as nn# 定义RNN模型
class SimpleRNN(nn.Module):def __init__(self, input_size, hidden_size, num_layers, output_size):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, output_size)def forward(self, x):
h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)
out, _ = self.rnn(x, h0)
out = self.fc(out[:, -1, :])return out# 示例参数
input_size = 10
hidden_size = 20
num_layers = 1
output_size = 5
batch_size = 3
seq_length = 8# 创建输入数据
x = torch.randn(batch_size, seq_length, input_size)# 实例化RNN模型
model = SimpleRNN(input_size, hidden_size, num_layers, output_size)# 前向传播
output = model(x)
print(output.shape)
说明:
定义了一个简单的SimpleRNN类继承自nn.Module。在构造函数中,初始化了 RNN 层和全连接层。nn.RNN指定了输入维度input_size、隐藏层维度hidden_size、层数num_layers,并设置batch_first=True表示输入数据的形状为(batch_size, seq_length, input_size)。
forward方法中,首先初始化隐藏状态h0,然后将输入数据x和初始隐藏状态传入 RNN 层,获取输出out。最后将 RNN 最后一个时间步的输出传入全连接层得到最终输出。
LSTM
import torch
import torch.nn as nn# 定义LSTM模型
class SimpleLSTM(nn.Module):def __init__(self, input_size, hidden_size, num_layers, output_size):super(SimpleLSTM, self).__init__()
self.hidden_size = hidden_size
self.num_layers = num_layers
self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)def forward(self, x):
h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)
c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)
out, _ = self.lstm(x, (h0, c0))
out = self.fc(out[:, -1, :])return out# 示例参数
input_size = 10
hidden_size = 20
num_layers = 1
output_size = 5
batch_size = 3
seq_length = 8# 创建输入数据
x = torch.randn(batch_size, seq_length, input_size)# 实例化LSTM模型
model = SimpleLSTM(input_size, hidden_size, num_layers, output_size)# 前向传播
output = model(x)
print(output.shape)
说明:
1.定义了SimpleLSTM类,同样继承自nn.Module。构造函数中初始化了 LSTM 层和全连接层,nn.LSTM的参数设置与 RNN 类似。
2.forward方法里,除了初始化隐藏状态h0,还初始化了细胞状态c0,然后将输入x、h0和c0传入 LSTM 层,获取输出out,最后经全连接层得到最终结果。
相关文章:
循环神经网络RNN原理与优化
目录 前言 RNN背景 RNN原理 上半部分:RNN结构及按时间线展开图 下半部分:RNN在不同时刻的网络连接和计算过程 LSTM RNN存在的问题 LSTM的结构与原理 数学表达层面 与RNN对比优势 应用场景拓展 从简易但严谨的代码来看RNN和LSTM RNN LSTM 前言 绕循环神经…...
Python正则表达式处理中日韩字符过滤全解析
Python正则表达式处理中日韩字符过滤全解析 一、核心原理:Unicode字符范围定位 中日韩字符在Unicode中的分布: 中文:\u4e00-\u9fff(基本区) \u3400-\u4dbf(扩展A区) \U00020000-\U0002a6df…...
Zabbix 7.2实操指南:基于OpenEuler系统安装Zabbix 7.2
原文出处:乐维社区 部署环境 openEuler 22.03 LTS PHP 8.0 Apache Mysql 8.0 MySQL数据库 6.0 以上版本需要安装mysql8.0以上版本的数据库(以mysql为例子)。 欧拉系统自带 mysql8.0 的源,无需要安装额外的源。 安装mysql …...
扩展阅读-Elasticsearch 通过索引阻塞实现数据保护深入解析
目录 前言 1、索引阻塞的种类 2、什么时候使用阻塞? 场景1:进行系统维护场景。 场景2:保护数据不被随意更改场景。 场景3:优化资源使用的场景。 场景4:遵守安全规则场景。 3、添加索引阻塞API 4、解除设置 AP…...
SpringMVC重定向接口,参数暴露在url中解决方案!RedirectAttributes
OK,首先描述下业务场景,终端数量限制登录 1.首先访问项目login的get接口 2.输入账号密码点击登录后,会请求login的POST接口 3.后台对终端数量逻辑处理不允许登录跳回到登录页面 4.因代码原因需在后台进行多次重定向接口,最后跳…...
硬件学习笔记--46 电能表影响量试验梳理
目录 1.电流和电压电路中的谐波影响试验 1)电流和电压电路中谐波——第5次谐波试验 2)电流和电压电路中谐波——方顶波波形试验 3)电流和电压电路中谐波——尖顶波波形试验 4)电流和电压电路中谐…...
大数据技术之HBase操作归纳
HBase基本命令总结表(实际操作方式) 进入Hbase:hbase shell 方式一:命令行窗口来操作HBase 1.通用性命令 version 版本信息 status 查看集群当前状态 whoami 查看登入者身份 help 帮助2.HBase DDL操作(对象级操作) 2.1、namespace命名空间(相当…...
后端Java Stream数据流的使用=>代替for循环
API讲解 对比 示例代码对比 for循环遍历 package cn.ryanfan.platformback.service.impl;import cn.ryanfan.platformback.entity.Algorithm; import cn.ryanfan.platformback.entity.AlgorithmCategory; import cn.ryanfan.platformback.entity.DTO.AlgorithmInfoDTO; im…...
遗传算法与深度学习实战系列,自动调优深度神经网络和机器学习的超参数
遗传算法与深度学习实战系列文章 目录 进化深度学习生命模拟及其应用生命模拟与进化论遗传算法中常用遗传算子遗传算法框架DEAPDEAP框架初体验使用遗传算法解决N皇后问题使用遗传算法解决旅行商问题使用遗传算法重建图像遗传编程详解与实现粒子群优化详解与实现协同进化详解与…...
体验用ai做了个python小游戏
体验用ai做了个python小游戏 写在前面使用的工具2.增加功能1.要求增加视频作为背景。2.我让增加了一个欢迎页面。3.我发现中文显示有问题。4.我提出了背景修改意见,欢迎页面和结束页面背景是视频,游戏页面背景是静态图片。5.提出增加更多游戏元素。 总结…...
谷粒商城—分布式高级②.md
认证服务 1. 环境搭建 创建gulimall-auth-server模块,导依赖,引入login.html和reg.html,并把静态资源放到nginx的static目录下 2. 注册功能 (1) 验证码倒计时 //点击发送验证码按钮触发下面函数 $("#sendCode").click(function () {//如果有disabled,说明最近…...
阿里云ECS命名规则解析与规格选型实战指南
阿里云ECS实例的命名规则通常采用 “ecs.{实例族}.{规格大小}” 的结构,各部分含义如下: 命名字段说明ecs代表“弹性计算服务”(Elastic Compute Service)。{实例族}标识实例的用途和代次(如 g7、c7、r7),由字母+数字组成。{规格大小}表示实例的资源配置(如 large、2xl…...
Spring MVC 的核心以及执行流程
Spring MVC的核心 Spring MVC是Spring框架中的一个重要模块,它采用了经典的MVC(Model-View-Controller)设计模式。 MVC是一种软件架构的思想,它将软件按照模型(Model)、视图(View)…...
ai json处理提示词
在解析JSON数据时,提示词的设计需要明确任务目标、输入格式以及期望的输出格式。以下是一些常用的提示词示例,适用于不同的JSON解析场景: 1. 提取特定字段 用于从JSON中提取特定字段的值。 示例: 从以下JSON数据中提…...
2025开源数据工程全景图
作者 | Alireza Sadeghi 译自Practical Data Engineering 2025年开源数据工程领域呈现蓬勃创新与生态重构的双重态势,九大技术赛道在实时化、轻量化与云原生架构驱动下加速演进。一份来自外网的2025年开源数据工程全景图全面地展示了这一领域的发展态势与走向&…...
438. 找到字符串中所有字母异位词(LeetCode 热题 100)
题目来源: 438. 找到字符串中所有字母异位词 - 力扣(LeetCode) 题目内容: 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 示例 1: 输入: s &…...
c++标准io与线程,互斥锁
封装一个 File 类, 用有私有成员 File* fp 实现以下功能 File f "文件名" 要求打开该文件 f.write(string str) 要求将str数据写入文件中 string str f.read(int size) 从文件中读取最多size个字节, 并将读取到的数据返回 析构函数 #…...
java简单实现请求deepseek
1.deepseek的api创建 deepseek官网链接 点击右上API开放平台后找到API keys 创建APIkey: 注意:创建好的apikey只能在创建时可以复制,要保存好 2.java实现请求deepseek 使用springbootmaven 2.1 pom文件: <?xml version&…...
Ext系列文件系统 -- 磁盘结构,磁盘分区,inode,ext文件系统,软硬链接
目录 1.理解硬盘 1.1 磁盘、服务器、机柜、机房 1.2 磁盘物理结构 1.3 磁盘的存储结构 1.4 磁盘的逻辑结构 1.4.1 理解逻辑结构 1.4.2 真实过程 1.5 CHS地址和LBA地址的相互转换 2.引入文件系统 2.1 “块”概念 2.2 “分区”概念 2.3 “inode”概念 3.ext2文件系…...
PyTorch Tensor 形状变化操作详解
PyTorch Tensor 形状变化操作详解 在深度学习中,Tensor 的形状变换是非常常见的操作。PyTorch 提供了丰富的 API 来帮助我们调整 Tensor 的形状,以满足模型输入、计算或数据处理的需求。本文将详细介绍 PyTorch 中常见的 Tensor 形状变换操作࿰…...
人工智能学习路线:小白到专家的进阶指南【2026首发】
本文系统介绍人工智能学习的完整路线,分为入门(Python、数学基础、机器学习)、中级(深入学习算法、项目实践)、进阶(自然语言处理、计算机视觉)和高级(深度强化学习、生成模型&#…...
2025_NIPS_Towards Thinking-Optimal Scaling of Test-Time Compute for LLM Reasoning
文章总结与翻译 一、主要内容 本文聚焦大语言模型(LLM)推理任务中测试时计算量缩放的核心问题,深入探讨了思维链(CoT)长度与推理性能的关系,提出了最优思维缩放策略(TOPS)并验证其有效性。 核心研究背景 当前基于System-2思维的研究(如OpenAI的o1模型)通过延长Co…...
C++ MCP网关性能翻倍实录(Linux内核级调优+DPDK加速全链路拆解)
更多请点击: https://intelliparadigm.com 第一章:C MCP网关高吞吐量设计全景概览 C MCP(Message Control Protocol)网关是现代微服务架构中承载实时控制信令与状态同步的关键中间件,其设计核心在于突破传统阻塞式I/O…...
基于安卓的社区儿童托管预约平台毕业设计
博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在设计并实现一款基于安卓平台的社区儿童托管预约系统以解决当前城市社区中儿童托管服务供需失衡与管理效率低下等问题。随着我国城市化进程加速及双职工…...
UnityFigmaBridge终极指南:从设计到开发的完整高效协作方案
UnityFigmaBridge终极指南:从设计到开发的完整高效协作方案 【免费下载链接】UnityFigmaBridge Easily bring your Figma Documents, Components, Assets and Prototypes to Unity 项目地址: https://gitcode.com/gh_mirrors/un/UnityFigmaBridge 你是否曾为…...
为AI编码助手注入Azure专家知识:Agent-Skills项目实战指南
1. 项目概述:为AI编码助手注入Azure专家级知识如果你是一名Azure开发者,或者正在学习云原生开发,那么你一定经历过这样的场景:在IDE里向GitHub Copilot或Cursor提问“如何在Azure Functions里配置Durable Functions的持久化存储&a…...
SpringBoot + WebSocket实战:从零手搓一个能实时收发消息和好友申请的聊天室(附完整源码)
SpringBoot WebSocket实战:构建高可用实时聊天系统的架构设计与实现 1. 现代实时通信系统的技术选型 在当今互联网应用中,实时交互功能已成为标配需求。传统HTTP协议的请求-响应模式难以满足即时消息、在线协作等场景,而WebSocket协议凭借其…...
5分钟为WPF应用注入专业Office界面:Fluent.Ribbon终极指南
5分钟为WPF应用注入专业Office界面:Fluent.Ribbon终极指南 【免费下载链接】Fluent.Ribbon WPF Ribbon control like in Office 项目地址: https://gitcode.com/gh_mirrors/fl/Fluent.Ribbon 想要让你的WPF应用程序拥有像Microsoft Office那样专业、直观的用…...
别再只盯着准确率了!用sklearn的classification_report看懂你的模型到底行不行
别再只盯着准确率了!用sklearn的classification_report看懂你的模型到底行不行 当你第一次训练完一个分类模型,看到测试集上90%的准确率时,是不是觉得大功告成了?别高兴太早——在真实的业务场景中,准确率可能是最会&q…...
5分钟掌握WinUtil:Windows终极系统优化与软件批量安装工具
5分钟掌握WinUtil:Windows终极系统优化与软件批量安装工具 【免费下载链接】winutil Chris Titus Techs Windows Utility - Install Programs, Tweaks, Fixes, and Updates 项目地址: https://gitcode.com/GitHub_Trending/wi/winutil 还在为Windows系统卡顿…...
