深度学习基础—循环神经网络的梯度消失与解决

引言

深度学习基础—循环神经网络(RNN)icon-default.png?t=O83Ahttps://blog.csdn.net/sniper_fandc/article/details/143417972?fromshare=blogdetail&sharetype=blogdetail&sharerId=143417972&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link深度学习基础—语言模型和序列生成icon-default.png?t=O83Ahttps://blog.csdn.net/sniper_fandc/article/details/143418185?fromshare=blogdetail&sharetype=blogdetail&sharerId=143418185&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link深度学习基础—序列采样icon-default.png?t=O83Ahttps://blog.csdn.net/sniper_fandc/article/details/143457214?fromshare=blogdetail&sharetype=blogdetail&sharerId=143457214&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

        在前面的博客中,我们已经了解很多RNN网络的结构和相关基础,基本的RNN网络的前向传播和反向传播比较了解了,但是RNN还有一个比较重要的问题需要解决,就是梯度消失,让我们一起来了解一下。

1.梯度消失

        现在有两个需要训练的序列:“The cat, which already ate ……, was full.”和“The cats, which already ate ……, were full.”,省略号表示中间还有很多词。当主语是cat(单数)时,应该用was;当主语时cats(复数),应该用were。这就意味着序列前后有长期的依赖,最前面的单词对句子后面的单词有影响。但是基础的RNN模型不擅长捕捉长期依赖效应,正是梯度消失造成了这样的影响。

        前面已经讨论过,当神经网络很深的时候,会产生梯度消失现象,同理基础的RNN也会有这样的现象。因为梯度消失问题,反向传播的时候后面层的输出误差很难传播到前面层,这就意味着很难让神经网络能够意识到它要记住看到的是单数名词还是复数名词,然后在序列后面生成依赖单复数形式的was或者were。

        实际上,基本的RNN模型会有很多局部影响,比如y3这个输出(上图编号9所示)主要受y3附近的值(上图编号10所示)的影响,上图编号11所示的一个数值主要与附近的输入(上图编号12所示)有关,上图编号6所示的输出,基本上很难受到序列靠前的输入(上图编号10所示)的影响。

        注意:RNN也会出现梯度爆炸问题,但是这里不讨论,因为梯度爆炸容易察觉(网络的参数会变的很大直到崩溃),如果出现梯度爆炸问题,我们需要通过梯度修剪来解决。梯度修剪就是观察梯度向量,如果它大于某个阈值,缩放梯度向量,保证它不会太大。

        这就是RNN的梯度消失,它与网络的长期依赖效应相关,想要解决,我们可以用GRU单元或者LSTM网络,这里我们先介绍一下GRU单元。

2.GRU单元

        上图是基本的RNN网络的单元,此时引入GRU单元,GRU单元用变量c表示,代表记忆细胞。在目前这个情况,c的值和激活值a一样,即:

        之所以GRU单元叫记忆细胞,就是它能通过记忆某个时间步t时的激活值,然后通过一定的时间步后,将这个值传递给此刻的输入。因此我们使用公式1表示:

        式1中c上面带波浪的符号表示候选值,供某个时间步的c来选择,其表达式如下式2:

        上式中,符号Γ表示门,下标r是relevance相关性的意思,主要告诉t-1时间步的c值和t时间步的候选值有多少相关性。表达式3如下:

        式1中下标u是update的意思,表示更新门,更新门的公式4如下:

        σ是sigmoid函数,因此更新门的值为[0,1]之间,实际上,sigmoid函数的输出往往非常接近0或1,假设更新门的值为1,式1就等价于:

        此时说明选择更新操作,表示记忆细胞选择将自己记忆的信息更新到当前时间步,因此有利于捕捉序列中短期依赖关系。而如果更新门的值为0,式1等价于:

        此时说明选择不更新,更有利于捕捉序列中长期依赖关系。

        实际上,c是一个向量,c、候选值、更新门的值是同一个维度,比如c是100维向量,那么他们都是100维向量。而更新门的每一个元素都表示一种更新状态,可能这个元素接近0就表示不更新,那个元素接近1就表示更新。每种更新状态表示要记忆的状态,可能需要记忆主语的单复数,也需要记忆时态等等状态。

        GRU单元最核心的就是公式1,比如现在在时间步1,记忆细胞记忆了cat是单数的,在时间步7,需要处理的问题是was还是were。那么这中间的时间步中更新门对应的位置都应该是0,表示不更新,然后在时间步7更新门对应的位置是1,表示更新,此时就会把cat单数的情况告诉这个单元,网络就有了捕捉长期依赖关系的能力,也解决了梯度消失的问题。

3.长短期记忆(LSTM)

3.1.前向传播

        上图所示就是LSTM的网络结构,经典的LSTM与GRU单元最大的区别就是:LSTM网络结构中激活值a<t>不等于c<t>,并将更新门的选择权交给了记忆细胞。让我们一起了解一下其中的细节:

        上式(公式1),由于a<t>不等于c<t>,因此候选值的计算不再依赖c<t-1>,而是a<t-1>,相当于用RNN的激活值作为候选值。

        上式(公式2),更新门同样将c<t-1>变为a<t-1>,其他不变。

        上式(公式3),增加遗忘门Γf(forget),其作用是代替4.2部分公式1的(1-Γu)部分,因为输出在[0,1]之间,因此如果输出接近1表示不遗忘,输出接近0表示遗忘之前记忆的信息c<t-1>。

        上式(公式4),增加输出门Γo,调整网络在第t个时间步的激活值的输出。

        上式(公式5),激活值的输出值不再等于c<t>,而是经过输出门调整后再输出。

        上式(公式6),也是LSTM的核心公式,由更新门决定是否使用候选值替换,由遗忘门决定是否遗忘之前的信息,由此,记忆细胞便掌握了更新权和遗忘权。这样只要正确的设置更新门和遗忘门,很容易把某个t时间步的值传递给更后面的值,即网络有了长期记忆的能力。

        注意:可能这样的LSTM结构和其他人所讲的有些不一致,还有一个版本叫:“偷窥孔连接”,即门值不仅取决于a<t-1>和x<t>,还取决于c<t-1>。结合这三个值计算三个门值。

3.2.反向传播

        对门求偏导:

        对参数求偏导,对b求偏导需要将上面4个公式(公式1、2、3、4)求和:

        对激活值、记忆值、输入求偏导:

        LSTM的优点是更加灵活和强大,GRU单元的优点是更加简洁,根据不同的场合选择合适的结构才能更好的解决问题。

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

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

相关文章

基于向量检索的RAG大模型

一、什么是向量 向量是一种有大小和方向的数学对象。它可以表示为从一个点到另一个点的有向线段。例如&#xff0c;二维空间中的向量可以表示为 (&#x1d465;,&#x1d466;) &#xff0c;表示从原点 (0,0)到点 (&#x1d465;,&#x1d466;)的有向线段。 1.1、文本向量 1…

Bartender 5 for Mac 菜单栏管理软件 安装教程【保姆级教程,操作简单小白轻松上手使用】

Mac分享吧 文章目录 Bartender 5 for Mac 菜单栏管理软件 安装完成&#xff0c;软件打开效果一、Bartender 5 菜单栏管理软件 Mac电脑版——v5.2.3⚠️注意事项&#xff1a;1️⃣&#xff1a;下载软件2️⃣&#xff1a;安装软件3️⃣&#xff1a;打开软件&#xff0c;根据自己…

国产操作系统重新安装软件商店

国产操作系统类似于手机的“应用商店”&#xff0c;都会有一个“软件商店”&#xff0c;方便用户安装管理电脑的软件。这个软件商店不仅有各种软件&#xff0c;还有各类外设驱动和移动应用环境模拟功能。软件商店可以下载安装软件&#xff0c;还可以更新、卸载软件。 软件商店 …

FastAPI中如果async def和def 路由的区别

在python的整体生态中&#xff0c;虽然已经有很多库支持了异步调用&#xff0c;如可以使用httpx或者aiohttp代替requests库发起http请求&#xff0c;使用asyncio.sleep 代替time.sleep&#xff0c; 但是依然还有很多优秀的第三方库是不支持异步调用也没有可代替的库&#xff0c…

Pinctrl子系统中Pincontroller和client驱动程序的编写

往期内容 本专栏往期内容&#xff1a; Pinctrl子系统和其主要结构体引入Pinctrl子系统pinctrl_desc结构体进一步介绍Pinctrl子系统中client端设备树相关数据结构介绍和解析inctrl子系统中Pincontroller构造过程驱动分析&#xff1a;imx_pinctrl_soc_info结构体Pinctrl子系统中c…

【C++动态规划】2435. 矩阵中和能被 K 整除的路径|1951

本文涉及知识点 C动态规划 LeetCode2435. 矩阵中和能被 K 整除的路径 给你一个下标从 0 开始的 m x n 整数矩阵 grid 和一个整数 k 。你从起点 (0, 0) 出发&#xff0c;每一步只能往 下 或者往 右 &#xff0c;你想要到达终点 (m - 1, n - 1) 。 请你返回路径和能被 k 整除的…

【QT】Qt对话框

个人主页~ Qt窗口属性~ Qt窗口 五、对话框2、Qt内置对话框&#xff08;1&#xff09;Message Box&#xff08;2&#xff09;QColorDialog&#xff08;3&#xff09;QFileDialog&#xff08;4&#xff09;QFontDialog&#xff08;5&#xff09;QInputDialog 五、对话框 2、Qt内…

视频推荐的算法(字节青训)

题目&#xff1a; 西瓜视频 正在开发一个新功能&#xff0c;旨在将访问量达到80百分位数以上的视频展示在首页的推荐列表中。实现一个程序&#xff0c;计算给定数据中的80百分位数。 例如&#xff1a;假设有一个包含从1到100的整数数组&#xff0c;80百分位数的值为80&#…

线程基础知识、jmm(Java内存模型)

目录 线程基础知识 并发与并行 进程和线程 线程优先级 创建线程的方式主要有三种 休眠 作出让步 join() 方法 线程协作注意什么 理解线程状态 选择合适的协作工具 共享资源的访问控制 避免竞争条件 创建线程几种方式 线程状态&#xff0c;状态之间切换 新建&…

2.数组越界访问如何调试HardFault错误

数组越界 在项目开发过程中&#xff0c;配置串口外设是一个常见的任务&#xff0c;但在实际操作中&#xff0c;我们可能会遇到一些预料之外的问题。例如&#xff0c;在调试过程中&#xff0c;我们发现单片机只接受了一次数据后便不再接收&#xff0c;这无疑是一个棘手的问题。…

0-ARM Linux驱动开发-字符设备

一、字符设备概述 Linux 系统中&#xff0c;设备被分为字符设备、块设备和网络设备等。字符设备以字节流的方式进行数据传输&#xff0c;数据的访问是按顺序的&#xff0c;一个字节一个字节地进行读取和写入操作&#xff0c;没有缓冲区。例如&#xff0c;终端&#xff08;/dev…

openGauss数据库-头歌实验1-4 数据库及表的创建

一、创建数据库 &#xff08;一&#xff09;任务描述 本关任务&#xff1a;创建指定数据库。 &#xff08;二&#xff09;相关知识 数据库其实就是可以存放大量数据的仓库&#xff0c;学习数据库我们就从创建一个数据库开始吧。 为了完成本关任务&#xff0c;你需要掌握&a…

深入浅出 Spring Boot 与 Shiro:构建安全认证与权限管理框架

一、Shiro框架概念 &#xff08;一&#xff09;Shiro框架概念 1.概念&#xff1a; Shiro是apache旗下一个开源安全框架&#xff0c;它对软件系统中的安全认证相关功能进行了封装&#xff0c;实现了用户身份认证&#xff0c;权限授权、加密、会话管理等功能&#xff0c;组成一…

重学SpringBoot3-整合 Elasticsearch 8.x (一)客户端方式

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 这里写目录标题 1. 为什么选择 Elasticsearch&#xff1f;2. Spring Boot 3 和 Elasticsearch 8.x 的集成概述2.1 准备工作2.2 添加依赖 3. Elasticsearch 客户端配置方式…

MyBaitsPlus 基本用法简单整理

MyBaitsPlus 基本用法整理 查询单表查询查询单条数据写法一&#xff1a;&#xff08;this.getOne&#xff09;写法二&#xff1a;&#xff08;XxxMapper.selectById&#xff09;写法三&#xff1a;&#xff08;this.getById&#xff09; 查询 list 集合&#xff08;this.list&a…

基于MATLAB的战术手势识别

手势识别的研究起步于20世纪末&#xff0c;由于计算机技术的发展&#xff0c;特别是近年来虚拟现实技术的发展&#xff0c;手势识别的研究也到达一个新的高度。熵分析法是韩国的李金石、李振恩等人通过从背景复杂的视频数据中分割出人的手势形状&#xff0c;然后计算手型的质心…

Mac 配置SourceTree集成云效

1、背景 工作使用的是自己的笔记本&#xff0c;一个是比较卡&#xff0c;在一个是敏感信息比较多还是使用公司的电脑&#xff0c;但是系统是Mac就很麻烦&#xff0c;在网上找了帖子记录一下 2、配置 打开终端 ssh-keygen -t rsa #一直回车就行 cd .ssh cat id_rsa.pub #查…

【快速上手】pyspark 集群环境下的搭建(Yarn模式)

目录 前言&#xff1a; 一、安装步骤 安装前准备 1.第一步&#xff1a;安装python 2.第二步&#xff1a;在bigdata01上安装spark 3.第三步&#xff1a;同步bigdata01中的spark到bigdata02和03上 二、启动 三、可打开yarn界面查看任务 前言&#xff1a; 上一篇介绍的是…

使用Python多线程抓取某图网数据并下载图片

前言 在互联网开发领域&#xff0c;数据抓取是一项非常实用的技术。通过数据抓取&#xff0c;我们可以从网页上获取所需的信息&#xff0c;并将其转化为结构化数据&#xff0c;以便进一步分析或使用。本文将介绍如何利用Python编写一个多线程程序来抓取网页上的图片数据&#…

《IMM交互式多模型滤波MATLAB实践》专栏目录,持续更新……

专栏链接&#xff1a;https://blog.csdn.net/callmeup/category_12816762.html 专栏介绍 关于IMM的例程 双模型EKF&#xff1a; 【逐行注释】基于CV/CT模型的IMM|MATLAB程序|源代码复制后即可运行&#xff0c;无需下载三模型EKF&#xff1a; 【matlab代码】3个模型的IMM例程&…