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

引言

深度学习基础—循环神经网络(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.xdnf.cn/news/7051.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

并查集算法详解

文章目录 并查集概念并查集的常见操作构建并查集合并并查集和查找 关于find函数 并查集概念 并查集&#xff08;Union-Find&#xff09;是一种树型的数据结构&#xff0c;用于处理一些不交集的合并及查询问题。其主要应用是判断两个元素是否在同一个集合中&#xff0c;以及合并…

新书速览|Java网络爬虫精解与实践

《Java网络爬虫精解与实践》 本书内容 《Java网络爬虫精解与实践》全面而系统地介绍与网络爬虫程序相关的理论知识&#xff0c;并包含大量的实践操作案例。 《Java网络爬虫精解与实践》共分为 8 章。第 1 章以自动化框架为基础&#xff0c;介绍网络爬虫程序的入门开发实践。第…

多模态大模型微调实践!PAI+LLaMA Factory搭建AI导游

一、引言 AI的快速发展推动了各行各业的智能化转型和创新&#xff0c;随之而来的是对AI应用的迫切需求。 如何微调大模型、高效搭建AI应用成为了开发者们广泛关注的技术方向。阿里云人工智能平台PAI&#xff0c;联合开源低代码大模型微调框架LLaMA Factory &#xff0c;共同打…

提升安全上网体验:Windows 11 启用 DOH(阿里公共DNS)

文章目录 阿里公共 DNS 介绍免费开通云解析 DNS 服务Windows 编辑 DNS 设置配置 IPv4配置 IPv6 路由器配置 DNS 阿里公共 DNS 介绍 https://alidns.com/ 免费开通云解析 DNS 服务 https://dnsnext.console.aliyun.com/pubDNS 开通服务后&#xff0c;获取 DOH 模板&#xff0…

[C语言]strstr函数的使用和模拟实现

1.strstr函数的使用 char * strstr ( const char *str1, const char * str2); 返回一个指向str1中str2第一次出现的指针&#xff0c;如果str2中没有str1则返回 NULL。。 实例&#xff1a; #include <stdio.h> #include <string.h> int main() {char str[] "…

【HTML】——VSCode 基本使用入门和常见操作

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 零&#xff1a;HTML开发工具VSCode的使用 1&#xff1a;创建项目 2&#xff1a;创建格式模板&#x…

区块链的安全性与透明性:Web3如何重塑信任机制

在数字化时代的浪潮中&#xff0c;信任机制的建立显得尤为重要。随着Web3的崛起&#xff0c;区块链技术以其独特的安全性与透明性&#xff0c;正在重塑我们对信任的理解。区块链不仅为去中心化的互联网架构提供了基础&#xff0c;还通过加密技术和分布式账本&#xff0c;实现了…

[OS] Assignment 3-VM

虚拟机设置 虚拟机登录与使用说明 因为项目3基于 xv6 系统运行&#xff0c;它需要一系列支持工具链。我们已经为您准备好了所有必要的环境。 我们提供了 CSC3150_a3_xv6.ova 文件供 x64 架构 用户使用&#xff08;可以导入到 VirtualBox 或 VMware 中&#xff09;&#xff0…

Redis 位图实现签到之长时间未签到预警

#目前通行系统项目中有一个新需求【通过对通行记录数据定时分析&#xff0c;查询出长时间没 有刷卡/刷脸通行的学生】 #一看到通行签到相关&#xff0c;就想到了redis的位图&#xff0c;理由也有很多帖子说明了&#xff0c;最大优点占用空间小。 一.redis命令行 SETBIT&#…

java 多态

1.认识多态 class animals{String name"animals";public void run(){} } class cat extends animals{String name"cat";Overridepublic void run(){System.out.println("cat run");} } class dog extends animals{String name"dog";Ov…

Android TextView自动换行文本显示不全解决

某些情况下&#xff0c;TextView自动换行后&#xff0c;会出现每行结尾处显示不全的问题&#xff0c; 如图&#xff1a; 常见解决方案&#xff1a; 设置TextView的“ellipsize”属性为“end” 实测无效&#xff01;将TextView外部的Layout改为RelativeLayout 实测无效&…

基于springboot+vue实现的养老院管理系统(源码+L文+ppt)

基于springbootvue实现的养老院管理系统&#xff08;源码L文ppt&#xff09;4-106 养老院系统管理是一个综合性养老在线平台&#xff0c;旨在综合并简化养老机构中的照护流程。该系统集成了多种功能&#xff0c;以支持医生、护士、家属及管理员等不同角色的需求。对于医务人员而…

智慧城市的守护者——智能井盖监测终端

城市化进程的加速推进使得基础设施建设成为提升城市品质的关键环节。然而&#xff0c;在这一进程中&#xff0c;市政公用设施中的井盖与地下线缆的安全问题却日益凸显。由于缺乏有效的实时监控与管理体系&#xff0c;给犯罪分子留下了可趁之机&#xff0c;频繁发生的井盖被盗及…

uniApp之uni-file-picker使用踩坑

标题党~也不算坑吧 就是初体验 上传是需要存储一下子的&#xff0c;我以为uniApp是自己免费开的服务给大家中转使用&#xff0c;就没管这个事&#xff0c;但是官网是这么说的&#xff1a; 就我是怎么发现的&#xff0c;使用了一段时间后&#xff0c;上传的图片都裂了&#xff…

动态规划理论基础和习题【力扣】【算法学习day.23】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…

Docker:介绍与安装

Docker官网与仓库地址 docker官网&#xff1a;http://www.docker.comopenDocker Hub官网: https://hub.docker.com/open Docker三要素 镜像 (Image) 镜像是Docker的核心概念之一&#xff0c;它是不可变的、只读的&#xff0c;并包含了一套文件系统&#xff0c;里面包含了运…

基于SpringBoot的微信小程序学生运动打卡系统【附源码】

基于SpringBoot的微信小程序学生运动打卡系统 效果如下&#xff1a; 系统主页面 论坛页面 登陆页面 我的页面 系统登录页面 管理员主页面 公告信息页面 研究背景 随着数字化时代的到来&#xff0c;大学生的生活节奏日益加快&#xff0c;学习压力与社交活动并行不悖。如何在繁…

【go从零单排】go中的nil到底是啥意思?

Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 nil 在Go语言中&#xff0c;nil 是一个预定义的标识符&#xff0c;用于表示指针、切片、映射、通道、接口和函数的…

forEach可以遍历不可枚举属性吗

首先第一个问题,forEach能不能遍历对象的属性 const obj { a: 1, b: 2, c: 3 }; obj.forEach((item) > console.log(item))运行这段代码我们发现发生了一个错误 这说明forEach是不可以遍历对象的属性的 在js中,forEach 方法用于遍历数组或类数组对象&#xff08;如 NodeL…

书生大模型实战营第四期-入门岛-1. Linux前置基础

入门岛-Linux前置基础 书生大模型实战营-第四期-Linux前置基础&#xff1a; 任务&#xff1a;https://github.com/InternLM/Tutorial/blob/camp4/docs/L0/linux/task.md 文档&#xff1a;https://github.com/InternLM/Tutorial/tree/camp4/docs/L0/linux 任务描述完成所需时…