rnn/lstm

tip:本人比较小白,看到july大佬的文章受益匪浅,现在其文章基础上加上自己的归纳、理解,以及gpt的答疑,如果有侵权会删。 july大佬文章来源:如何从RNN起步,一步一步通俗理解LSTM_rnn lstm-CSDN博客

-------------------------------------------------------------------------------------------------------------------

1.RNN

1.1 从单层网络到经典的RNN结构

在学习LSTM之前,得先学习RNN,而在学习RNN之前,首先要了解一下最基本的单层网络,它的结构如下图所示:

输入是x,经过变换Wx+b和激活函数f,得到输出y。相信大家对这个已经非常熟悉了。

在实际应用中,我们还会遇到很多序列形的数据:

如:

        1. 自然语言处理问题。x1可以看做是第一个单词,x2可以看做是第二个单词,依次类推
        2. 语音处理。此时,x1、x2、x3……是每帧的声音信号。
        3. 时间序列问题。例如每天的股票价格等等

而其中,序列形的数据就不太好用原始的神经网络处理了。

为了建模序列问题,RNN引入了隐状态h(hidden state)的概念,隐状态h可以对序列形的数据提取特征,接着再转换为输出。

--------------------------------------------------------------------------------------------------------------------

1.2 由x到h

先从h的计算开始看:

图示中记号的含义是:

  • a)圆圈或方块表示的是向量。
  • b)一个箭头就表示对该向量做一次变换。如上图中h_{0}x_{1}分别有一个箭头连接,就表示对h_{0}x_{1}各做了一次变换

说白了,h_1基于上一个隐藏层的状态h_{0}和当前的输入x_{1}计算得来,且提前说一嘴,泛化到任一时刻,便是h_{t}=f\left(W h_{t-1}+U x_{t}\right),而这里的f一般是tanh、sigmoid、ReLU等非线性的激活函数。

\rightarrow  且在实践中,h_t一般只包含前面若干步而非之前所有步的隐藏状态

在 RNN 模型(或者神经网络模型)中,权重矩阵W和偏置向量 b初始时一般是随机生成的(在之后不断训练)

(即上面的U、W、b参数)

  1. 在计算时,每一步使用的参数U、W、b都是一样的,也就是说每个步骤的参数都是共享的,这是RNN的重要特点,一定要牢记;
  2. 而下文马上要看到的LSTM中的权值则不共享,因为它是在两个不同的向量中。而RNN的权值为何共享呢?很简单,因为RNN的权值是在同一个向量中,只是不同时刻而已。

依次计算剩下来的(使用相同的参数U、W、b):

 我们这里为了方便起见,只画出序列长度为4的情况,实际上,这个计算过程可以无限地持续下去。

------------------------------------------------------------------------------------------------------------------------------

1.3 tip: 为什么要用到激活函数?

如果没有激活函数,那么公式就是一个线性映射:

对于序列数据的多个时间步,如果在每一层计算时都没有激活函数,输出将是输入的线性组合。最终,整个 RNN 变成一个线性模型,即:

这里的W是个向量。 

这是一个简单的线性变换,无法捕捉复杂的非线性关系,而我们通常需要通过神经网络处理非线性问题。

  • 序列数据(如自然语言、时间序列)中的依赖关系往往是复杂且非线性的。激活函数(如 Tanh 或 ReLU)能够让神经网络捕捉这些非线性模式,使得模型能够学习复杂的时间依赖关系。
  • TanhSigmoid 是常见的激活函数,用于控制隐藏状态的更新。Tanh 的输出范围是 [-1, 1],能够有效捕捉输入数据的正负变化;Sigmoid 的输出范围是[0,1],适合用于门控机制。

---------------------------------------------------------------------------------------------------------------------------------


1.4 由h到y 


我们目前的RNN还没有输出,得到输出值的方法就是直接通过h进行计算。

这里从h到y又有不同的说法了,即是否也选择激活函数,比如上面出现了softmax函数。

在 RNN 的每一个时间步t,我们有一个隐藏状态 ht​,它保存了当前时间步的特征表示。在这个时间步中,我们希望将隐藏状态映射为一个输出 yt。

  • 分类任务:预测某个类别(如情感分析)。
  • 回归任务:预测数值(如股价、温度)。
  • 语言模型:预测下一个单词。

核心公式如下:

根据任务的不同,我们会选择不同的激活函数f:

  1. 分类任务(如多分类的文本分类):

                使用 Softmax 激活函数,将输出变为概率分布。    

其中​。Softmax 确保所有输出值都在 0 到 1之间,并且所有类别的概率和为 1。 

举个例子:

        2. 二分类任务(如情感分析:积极 vs 消极):

                使用 Sigmoid 激活函数,将输出限制在 0 到 1 之间,表示属于某一类别的概率。

        3. 回归任务(如股价预测、温度预测):

                不需要激活函数,直接使用线性输出:

----------------------------------------------------------------------------------------------------------------------

1.5 RNN 的正向传播

这里先从x到h,再从h到y,总体来看是x到y,这个步骤就是rnn的正向传播

而总的来说,在 RNN 中输入和输出的序列长度不需要相同。具体情况要看任务需求,可以是一对一多对多一对多多对一 等多种形式。每一种模式都有其适用的场景和特点。

除了刚才图上面的多对多相互对应的情况(相当于即时反馈),还有其他常见的场景。比如下面一对多和多对一:

 以及序列长度不同的多对多:

 

1.6 RNN 的训练:反向传播算法

RNN 的训练与普通神经网络类似,也是通过梯度下降法来优化参数。但由于 RNN 的参数在每个时间步共享,因此要用一种特殊的算法,叫做 BPTT(Backpropagation Through Time,时间反向传播算法)

上面的W是向量。反向传播和正向传播是对应的,正向传播从头到尾得到返回值y,反向传播则从末尾到开头连续修正相应参数。

---------------------------------------------------------------------------------------------------------------------------

1.7 正向与反向传播的关系

  • 单次正向传播:给定一个输入序列 x1,x2,…,xT,RNN 会从第一个时间步传递到最后一个时间步,得到输出序列 y1,y2,…,yT和损失值。
  • 单次反向传播(BPTT):从损失函数开始,从时间步 T 向前传播误差,依次传递回到时间步 1。这会更新每一层的参数。

整个训练过程中:RNN 需要多轮(epoch)训练,即对整个数据集多次进行正向和反向传播。

--------------------------------------------------------------------------------------------------------------------------

1.8 RNN 中的梯度消失与梯度爆炸问题

1. 梯度消失问题:

  • 在反向传播(BPTT)过程中,误差需要沿时间轴逐步传播。由于每次传播都会涉及到链式求导,当激活函数(如 sigmoid 或 tanh)将输出限制在(0,1) 或 (−1,1)范围内时,梯度的值会越来越小。
  • 经过多次时间步的传播后,远处时间步的梯度会指数级缩小,导致模型在更新参数时,无法有效调整靠前时间步的权重。这就是梯度消失

2. 梯度爆炸问题:

  • 这是指在某些情况下,梯度的值会变得非常大,导致模型参数更新不稳定甚至发散。
  • 梯度爆炸通常出现在训练初期或权重初始化不当的情况下,但这不是图中所描述问题的主要原因。

解决方案:

  • 梯度裁剪(Gradient Clipping):将梯度限制在一个最大值范围内,防止梯度爆炸。
  • LSTM / GRU:引入门控机制来解决梯度消失问题。

梯度消失在实际例子上的体现(前部序列信息权重降低):

在 RNN 中,隐藏状态ht会从前一时刻 ht​-1 传递到下一时刻 ht+1​。这种逐步传播的特点使得距离较远的时间步(例如 x1对应的状态)信息可能会在后面的时间步中变得越来越不重要。

梯度爆炸的例子倒是挺少见,反正就是梯度消失的相反面,由于某些不好的原因导致的梯度过于大,导致模型参数更新不稳定甚至发散。

2. LSTM

2.1 为什么要从rnn到lstm(解决梯度消失和梯度爆炸)

LSTM 通过引入细胞状态门控机制(遗忘门、输入门和输出门),实现了信息的线性传递,避免了多次非线性激活导致的梯度消失。同时,遗忘门动态调节信息的保留与遗忘,避免无关信息的累积,减少梯度爆炸的风险。这种设计使得梯度在长时间步上传递时更加稳定,从而有效解决了 RNN 中的梯度消失和梯度爆炸问题,让模型能够捕捉长期依赖关系。

再具体一点:

LSTM 通过以下方式解决了 RNN 中的梯度消失和梯度爆炸问题:

  1. 细胞状态的线性传递:信息可以跨多个时间步不受抑制地传递,缓解了梯度消失问题。
  2. 门控机制的动态调节:输入门、遗忘门、输出门选择性地更新状态,避免了无关信息的累积,减少了梯度爆炸的风险。
  3. 减少梯度缩放的次数:LSTM 通过线性更新状态,将非线性变换限制在局部,使梯度的稳定性更好。
  4. 遗忘门控制信息流:有效控制长期状态中的冗余信息,进一步缓解梯度爆炸问题。

---------------------------------------------------------------------------------------------------------------------------------

2.2 忘记门--Forget Gate(ft)

内容来自如何从RNN起步,一步一步通俗理解LSTM_rnn lstm-CSDN博客

可以点进网页里看动图,支持原作者july。

2.3 输入门--Input Gate(it)and 候选状态--Candidate State(~Ct)

 2.4 细胞状态--Cell State(Ct)

 2.5 输出门--Output Gate(ot)

2.6 数据形状(向量、矩阵等) 

上面提到的公式中大部分符号(如xt、ht、Ct等)都代表向量矩阵,而不是标量。这是因为 LSTMRNN 处理的是高维数据,如词向量、时间序列中的多特征数据等。

 其中,batch_size 表示一个批次中的样本数量,hidden_size 是隐藏状态的维度。

2.7 提到的权值是否共享问题

在遗忘门部分,july哥提到的rnn和lstm权值是否共享问题,其实很容易理解,rnn和lstm在不同时间步之间都是共享的,而在lstm不同门里,不同门有独立的参数。

  • RNN 中:所有时间步的参数共享,即所有时间步使用相同的权重矩阵 W,U。
  • LSTM 中:不同的门(遗忘门、输入门、输出门、候选单元)之间的权重不共享,但在同一门的不同时间步之间权重是共享的。

2.8 激活函数(sigmoid 或 tanh)的选择

  1. sigmoid 用于比例控制(信息保留、写入、输出),因为其输出在0−1 之间。
  2. tanh 用于状态表示(候选状态和隐藏状态),因为其输出在 −1 到 1之间,允许正负信息的存在。

通过这种组合,LSTM 能够精确控制信息的流动,避免梯度消失,并有效捕捉长时间依赖关系。

具体机制大致如下:

 

 2.9 lstm的参数调整(反向传播)

lstm也是通过反向传播来调节参数,先介绍下在调参层面上lstm和rnn之间的关系。

LSTM 和 RNN 在反向传播中主要区别和联系是:

  • RNN 由于简单且高效,适合处理 短序列或短期依赖问题。但它的梯度消失问题使得它难以捕捉长时间的依赖关系。
  • LSTM 通过 细胞状态的线性传递和门控机制 缓解了梯度消失问题,因此更适合处理 长时间序列。但代价是训练时的计算量更大,参数更新更复杂。

lstm调参在大方向上类似于rnn,先正向传播,后计算损失。

然后是反向传播调参,即把损失函数对各参数求偏导(梯度)

然后结合旧的参数和学习率,得到新的参数,此外还提到了一些优化算法,能更好的调整学习率。

  

 最后,有一些超参数调节。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Docker大揭秘】

Docker 调试一天的血与泪的教训:设备条件:对应的build preparation相应的报错以及修改 作为记录 构建FASTLIO2启动docker获取镜像列出镜像运行containerdocker中实现宿主机与container中的文件互传 调试一天的血与泪的教训: 在DOCKER中跑通F…

APISQL企业版离线部署教程

针对政务、国企、医院、军工等内网物理隔离的客户,有时需要多次摆渡才能到达要安装软件的服务器。本教程将指导您使用Linux和Docker Compose编排服务,实现APISQL的离线部署。 准备 准备一台Linux(x86_64)服务器。 安装Docker Engine(推荐版本…

音视频入门基础:AAC专题(11)——AudioSpecificConfig简介

音视频入门基础:AAC专题系列文章: 音视频入门基础:AAC专题(1)——AAC官方文档下载 音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件 音视频入门基础:AAC…

docker 可用镜像服务地址(2024.10.25亲测可用)

1.错误 Error response from daemon: Get “https://registry-1.docker.io/v2/” 原因:镜像服务器地址不可用。 2.可用地址 编辑daemon.json: vi /etc/docker/daemon.json内容修改如下: {"registry-mirrors": ["https://…

【AI应用落地实战】智能文档处理本地部署——可视化文档解析前端TextIn ParseX实践

湘江之畔,秋风送爽。前不久,2024长沙中国1024程序员节在长沙盛大举行。今年的程序员节主题为“智能应用新生态”,以科技为纽带,搭建起了一个共筑智能应用新生态的交流平台,众多技术大咖齐聚一堂,探讨智能应…

echarts实现 水库高程模拟图表

需求背景解决思路解决效果index.vue 需求背景 需要做一个水库高程模拟的图表&#xff0c;x轴是水平距离&#xff0c;y轴是高程&#xff0c;需要模拟改水库的形状 echarts 图表集链接 解决思路 配合ui切图&#xff0c;模拟水库形状 解决效果 index.vue <!--/*** author:…

Kubeadm搭建k8s

一、架构 节点名称规格IP地址安装组件master012C/4G&#xff0c;cpu核心数要求大于2192.168.88.76docker、kubeadm、kubelet、kubectl、flannelnode012C/2G192.168.88.20docker、kubeadm、kubelet、kubectl、flannelnode022C/2G192.168.88.21docker、kubeadm、kubelet、kubect…

transformers和bert实现微博情感分类模型提升

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【LSTM模型实现光伏发电功率的预测】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模…

【Apache Zookeeper】

一、简介 1、场景 如何让⼀个应⽤中多个独⽴的程序协同⼯作是⼀件⾮常困难的事情。开发这样的应⽤&#xff0c;很容易让很多开发⼈员陷⼊如何使多个程序协同⼯作的逻辑中&#xff0c;最后导致没有时间更好地思考和实现他们⾃⼰的应⽤程序逻辑&#xff1b;又或者开发⼈员对协同…

了解lwip

lwIP是一个小型的开源的TCP/IP协议栈&#xff08;精简版的TCP/IP协议&#xff09;&#xff0c;博客借用了其他博客的内容在此声明。 TCP/IP协议栈结构 应用层&#xff1a;HTTP,MQTT,NTP、FTP....... 传输层:TCP协议&#xff08;用于不可靠设备可靠传输&#xff09;&#xff…

基于Springboot+微信小程序的房产交易租赁服务平台设计与实现 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统…

《Linux运维总结:基于ARM64+X86_64架构CPU使用docker-compose一键离线部署redis 6.2.14容器版哨兵集群》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;《Linux运维篇&#xff1a;Linux系统运维指南》 一、部署背景 由于业务系统的特殊性&#xff0c;我们需要面向不通的客户安装我们的业务系统&…

【计算机网络 - 基础问题】每日 3 题(五十九)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…

Dolphins 简介——一种新颖的多模态语言模型

背景问题 现在的自动驾驶系统在处理复杂的多变的现实驾驶场景时&#xff0c;往往缺乏人类驾驶员的全面理解&#xff0c;及时学习和适应能力以及错误纠正能力&#xff0c;为了实现能够像人类一样理解和响应复杂现实世界场景的完全自主车辆(AV)一直是一个重要目标。Dolphins 是一…

LabVIEW汽车状态监测系统

LabVIEW汽车状态监测系统通过模拟车辆运行状态&#xff0c;有效地辅助工程师进行故障预测和维护计划优化&#xff0c;从而提高汽车的可靠性和安全性。 项目背景&#xff1a; 现代汽车工业面临着日益增长的安全要求和客户对于车辆性能的高期望。汽车状态监测系统旨在实时监控汽…

面试经典 150 题.P26. 删除有序数组中的重复项(003)

本题来自&#xff1a;力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解&#xff1a; class Solution {public int removeDuplicates(int[] nums) …

FPGA时序分析和约束学习笔记(3、Timequest时序路径详解和优化)

FPGA时序分析和约束学习笔记&#xff08;3、Timequest时序路径详解和优化&#xff09; Timequest中Data Path分析 Data Arrival Path clock path&#xff1a;时钟信号到达源寄存器时钟端口的时间 data path&#xff1a;数据从源寄存器Q端口出发到达目标寄存器D端口的时间 D…

浮动+flex布局

一.浮动 1.介绍 2.效果 <style> .one{ width: 100px; height: 100px; background-color: red; float: left; } .two{ width: 200px; height: 200px; background-color: blue; float: right; } </style> </head> <body> <div class"one&quo…

yandex企业邮箱:烽火域名邮箱有哪些优势?

yandex企业邮箱申请教程&#xff1f;如何用yandex免费域名邮箱&#xff1f; yandex企业邮箱作为一款备受推崇的企业邮箱服务&#xff0c;凭借其独特的优势&#xff0c;成为了众多企业的首选。烽火将深入探讨yandex企业邮箱的优势&#xff0c;特别是与烽火域名邮箱相比&#xf…

Python CGI编程-上传和下载文件file

文件上传&#xff1a;form表单需要设置enctype属性为 multipart/form-data&#xff0c;请求的网址是&#xff1a;http://localhost/post.html点击上传&#xff0c;页面跳转到&#xff1a;http://localhost/cgi-bin/hello.py上传的文件存在了/temp路径下文件下载&#xff0c;文件…