当前位置:网站首页>为什么会出现梯度爆炸和梯度消失现象?怎么缓解这种现象的发生?
为什么会出现梯度爆炸和梯度消失现象?怎么缓解这种现象的发生?
2022-07-30 05:44:00 【CV技术指南】
前言:梯度消失现象在深度神经网络训练过程中表现得尤为突出,随着网络层数的加深,损失在反向传播时梯度在不断减小,导致浅层网络的学习进行不下去,参数得不到有效更新。为什么会出现这种现象呢?下面小编将从神经网络反向传播(BP)原理上揭露出现梯度消失和梯度爆炸现象本质以及如何缓解。
目录
1、梯度消失和梯度爆炸的原因
以下图为例,通过推导反向传播过程来讲解网络训练过程中梯度消失和梯度爆炸现象产生的原因。

假设训练时需要使用梯度下降法对
、
、
进行参数更新,那么就需要损失反向传播分布对这三个参数求取梯度。
①针对
,

②针对
,

③针对
,根据链式求导法则可知,有3条路径可以到达
,如图中的红黄蓝3条线,对
的偏导等于这3条路径之和,为了方便,就以红色这条线为例,其中非线性变换部分
,
是非线性函数。

由上面3式求导过程可以推广,当网络深度大大增加,损失对浅层网络权重参数的偏导可以表示为:

其中
表示大致的网络层数,
表示非线性变换的次数。
根据上面求参数梯度的公式不难发现,如果要细分的话,梯度消失和梯度爆炸有以下几种原因:①网络深度过大;②激活函数选择不当;③参数初始化不当,导致参数
过大或过小;④损失函数选择不当;⑤神经元激活值的分布不当,神经元值过大或过小。在网络的实际学习过程中,①②③项是导致梯度消失和梯度爆炸现象发生的主要因素,但梯度消失和梯度爆炸问题的根源都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。总之,不管发生梯度爆炸还是梯度消失现象,都会导致网络很难学习下去,所以在深度学习任务中要尽量避免这些现象的发生。
2、解决办法
(1)预训练+微调(pre-training+fine-tunning):其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。
(2)梯度剪切(对梯度设定阈值):这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内,这可以防止梯度爆炸。
(3)权重正则化:另外一种解决梯度爆炸的手段是采用权重正则化,正则化主要是通过对网络权重做正则来限制过拟合。如果发生梯度爆炸,那么权值就会变的非常大,反过来,通过正则化项来限制权重的大小,也可以在一定程度上防止梯度爆炸的发生。
(4)选择relu等梯度大部分落在常数上(梯度越接近1越好)的激活函数:relu函数的导数在正数部分是恒等于1的,因此在深层网络中使用relu激活函数就不会导致梯度消失和爆炸的问题。
(5)BN:其可以有效解决梯度的理由参考文章https://blog.csdn.net/Mike_honor/article/details/125915321?spm=1001.2014.3001.5501。
(6)残差网络结构

相比较于以前网络的直来直去结构,残差网络中有很多这样的跨层连接结构,这样的结构在反向传播中具有很大的好处,因为跨层连接结构(短路机制)可以无损地传播梯度,不会导致梯度消失。
(7)LSTM的“门(gate)”结构
LSTM全称是长短期记忆网络(long-short term memory networks),是不那么容易发生梯度消失的,主要原因在于LSTM内部复杂的“门”(gates),如下图,LSTM通过它内部的“门”可以接下来更新的时候“记住”前几次训练的”残留记忆“。

边栏推荐
- Invalid bound statement (not found)出现的原因和解决方法
- Bubble sort, selection sort, insertion sort, quick sort
- 十二、Kotlin进阶学习:一、Lambda 表达式;二、高阶函数;
- sql中 exists的用法
- 第一个WebAssembly程序
- Competition WP in May
- A Spark task tuning 】 【 one day suddenly slow down how to solve
- [MATLAB] Image Processing - Recognition of Traffic Signs
- 使用PyQt5为YoloV5添加界面(一)
- 【调优】一个 Spark 任务某天突然变慢怎么解决
猜你喜欢

线程的5种状态

使用PyQt5为YoloV5添加界面(一)
![CTFSHOW command execution [web29-web124] unfinished to be continued](/img/89/786fbe65af4c9f269530bf2d08e1a0.png)
CTFSHOW command execution [web29-web124] unfinished to be continued
Go简单实现协程池

十二、Kotlin进阶学习:一、Lambda 表达式;二、高阶函数;

Twenty-two, Kotlin advanced learning: simply learn RecyclerView to achieve list display;

sqli-labs less3/4 Targeting Notes

九、Kotlin基础学习:1、Companion的扩展方法和扩展属性;2、一般类的扩展方法和扩展属性;3、委托;

Detailed introduction to the usage of Nacos configuration center

Defense Ideas for a Type of SMS Vulnerability
随机推荐
C# WPF下限制TextBox只输入数字、小数点、删除等键
七、Kotlin基础学习:1、创建类;2、构造函数;3、继承;4、封装;5、抽象类;6、接口;7、嵌套类;8、内部类;9、枚举类
Redis 客户端常见异常分析
sql concat()函数
Request请求体重新封装,解决请求体只能获取一次的问题
Flink CDC implements Postgres to MySQL streaming processing transmission case
"MySQL Advanced Chapter" four, the storage structure of the index
nodejs PM2监控及报警邮件发送(二)
uni-app: The use of uni-icons and how to customize icons
The types of data structures and MySQL index
MySQL 索引的数据结构及类型
Detailed explanation of ClickHouse query statement
SQL Server database generation and execution of SQL scripts
Arthas 命令解析(watch/tt/sc)
十六、Kotlin进阶学习:协程详细学习。
21. Kotlin Advanced Learning: Implementing Simple Network Access Encapsulation
Flink-流/批/OLAP一体得到Flink引擎
MYSQL一站式学习,看完即学完
使用PyQt5为YoloV5添加界面(一)
MySQL 特殊语句及优化器