【深度学习】梯度消失与梯度爆炸的原因分析与解决策略
前言
梯度消失和梯度爆炸是深度网络训练过程中容易遇到的问题,由于网络层数的加深,梯度的膨胀或缩小效应不断累积,最终很容易造成模型无法收敛。除了模型本身的深度,发生的原因往往与参数初始化及模型设置,这里列举一些场景的原因与解决策略,以供参考。
一、发生原因
梯度消失与梯度爆炸出现的原因基本一致,一般可能是网络层数过深、激活函数、损失函数设置与参数初始化问题。学过梯度下降理论就很好理解,无非就是求梯度过程某个值过大过小或链式法则层数过多导致累积效果过大。
梯度消失:隐层过多;不合适的激活函数(也有可能产生梯度爆炸)
梯度爆炸:隐层过多;权重初始值过大
深层网络
反向传播算法根据链式求导法则,如果某部分比如激活函数求导的值持续小于1,那么随着网络变深效果累积就会导致梯度以指数形式衰减,即发生了梯度消失;相应的如果持续大于1,那么最终的梯度信息会以指数形式增加,最终发生了梯度爆炸。
这张图就可以很好的说明这个现象,对于layer1,反向传播过程链式法则的项数较多,如果持续小于1那么梯度会变得很小,学习的速度也会相应变得很慢,正是由于这种累积效应,速度差异达到很多数量级。(这里那能不能对于深层区域通过设计优化算法采用更高的学习率使之一致呢
总结一下,从深层网络角度来讲,不同的层学习的速度差异很大,表现为网络中靠近输出的层学习的情况很好,靠近输入的层学习的很慢,有时甚至训练了很久,前几层的权值和刚开始随机初始化的值差不多。因此,梯度消失、爆炸,其根本原因在于反向传播训练法则,属于先天不足。
激活函数
这个可以参考之前对激活函数介绍的博文。很多激活函数例如sigmoid的导数本身值域就很小,甚至在一定范围的输入下十分接近零,这就导致很容易发生梯度消失。而tanh虽然好一点,但导数值域还是小于等于1的,效果也不够理想。
初始化
这个就比较好理解了,初始化值如果过大其梯度很容易发散,导致梯度爆炸。
二、解决方案
为了解决梯度消失和梯度爆炸的问题,可以从问题原因角度出发。例如激活函数、参数分布(初始化来限制初始情况、正则项来限制更新),或者采用一些特殊结构来限制过深网络的退化现象,甚至强制性的对问题结果即梯度爆炸进行截断
激活函数
例如使用relu、leakrelu、elu之类的激活函数,如果激活函数的导数为1,那么就不存在梯度消失爆炸的问题了,每层的网络都可以得到相同的更新速度
- relu解决了梯度消失、爆炸的问题
- 计算方便,计算速度快
- 加速了网络训练
但是因为负数部分恒为零会导致一些神经元无法激活,但不会因此导致学习能力下降,只是需要更多的神经元,具体可以看之前激活函数那篇文章中的解释。
这个是从激活函数的角度出发
参数初始化方式
例如使用He初始化方法
这个也是从数据分布角度出发
batch norm
Batchnorm是深度学习发展以来提出的最重要的成果之一了,目前已经被广泛的应用到了各大网络中,具有加速网络收敛速度,提升训练稳定性的效果,Batchnorm本质上是解决反向传播过程中的梯度问题。batchnorm全名是batch normalization,简称BN,即批规范化,通过规范化操作将输出信号x规范化保证网络的稳定性。
反向传播式子中有xxx的存在,所以xxx的大小影响了梯度的消失和爆炸,batchnorm就是通过对每一层的输出规范为均值和方差一致的方法,消除了xxx带来的放大缩小的影响,进而解决梯度消失和爆炸的问题,或者可以理解为BN将输出从饱和区拉倒了非饱和区。
这个是从数据分布的角度出发
残差结构
Residual Unit中加入了shortcut来降低梯度丢失现象
这个是通过特殊结构来抑制梯度消失
LSTM
通过其内部复杂的门来进行记忆,从而使之不那么容易“梯度消失”
这个也是通过特殊结构来抑制梯度消失
梯度剪切
设置一个梯度剪切的阈值,更新梯度的时候如果超过这个阈值那么就将之限制在这个范围内,防止梯度爆炸
权重正则化
正则化是通过对网络权重做正则限制过拟合同时也能防止梯度爆炸,如果发生梯度爆炸那么权值范数会很大,而通过正则化项可以限制梯度爆炸的发生
参考资料
https://blog.csdn.net/qq_25737169/article/details/78847691
【深度学习】梯度消失与梯度爆炸的原因分析与解决策略相关推荐
- 深度学习网络训练中出现nan的原因分析
报错: nan:Not a Number 该错误导致的后果:造成训练准确率的断崖式下跌 错误原因分析: 1)在loss函数中出现nan 出现原因:一般是因为tf中的log函数输入了'负数'或'0'值( ...
- 1.10 梯度消失与梯度爆炸-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
←上一篇 ↓↑ 下一篇→ 1.9 归一化输入 回到目录 1.11 神经网络的权重初始化 梯度消失与梯度爆炸 (Vanishing/Expanding Gradients) 训练神经网络,尤其是深度神经 ...
- 【深度学习】梯度消失和梯度爆炸问题的最完整解析
作者丨奥雷利安 · 杰龙 来源丨机械工业出版社<机器学习实战:基于Scikit-Learn.Keras和TensorFlow> 编辑丨极市平台 1 梯度消失与梯度爆炸 正如我们在第10章中 ...
- 梯度消失和梯度爆炸_知识干货-动手学深度学习-05 梯度消失和梯度爆炸以及Kaggle房价预测...
梯度消失和梯度爆炸 考虑到环境因素的其他问题 Kaggle房价预测 梯度消失和梯度爆炸 深度模型有关数值稳定性的典型问题是消失(vanishing)和爆炸(explosion). 当神经网络的层数较多 ...
- [深度学习-优化]梯度消失与梯度爆炸的原因以及解决方案
首先让我们先来了解一个概念:什么是梯度不稳定呢? 概念:在深度神经网络中的梯度是不稳定的,在靠近输入层的隐藏层中或会消失,或会爆炸.这种不稳定性才是深度神经网络中基于梯度学习的根本问题. 产生梯度不稳 ...
- 深度学习的实用层面 —— 1.10 梯度消失与梯度爆炸
训练神经网络,尤其是深度神经网络所面临的一个问题是梯度消失或者梯度爆炸,也就是说,当你训练深度网络时导数或坡度有时会变得非常大或非常小,甚至以指数方式变小,这加大了训练的难度,这里我们将会了解梯度爆炸 ...
- 动手学深度学习(PyTorch实现)(四)--梯度消失与梯度爆炸
梯度消失与梯度爆炸 1. 梯度消失与梯度爆炸 2. 模型参数的初始化 2.1 PyTorch的默认随机初始化 2.2 Xavier随机初始化 3. 环境因素 3.1 协变量偏移 3.2 标签偏移 3. ...
- 深度学习中梯度消失和梯度爆炸的根本原因及其缓解方法
深度学习中梯度消失和梯度爆炸的根本原因及其缓解方法 一.梯度消失和爆炸的根本原因 1. 深层网络角度 2. 激活函数角度 二.梯度消失.爆炸的解决方案 1. 梯度剪切.正则 2. 采用其他的激活函数 ...
- 动手学深度学习-过拟合、欠拟合及其解决方案;梯度消失、梯度爆炸;循环神经网络进阶
一.过拟合.欠拟合及其解决方案 前序知识点 模型选择 正则化:添加参数的惩罚项,防止过拟合.有L2正则化与L1正则化. 奥卡姆剃刀原则:有多个假设模型时,应该选择假设条件最少的. 模型的泛化能力:指模 ...
- 深度学习中的梯度消失、梯度爆炸问题
写在前面: 有些博主对这个问题的解释很好,这里参考了: 详解机器学习中的梯度消失.爆炸原因及其解决方法 我在这方面的工作经验和知识面还不够,还需要积累后再做出更为专业的解答. 参考我之前转发过的一篇文 ...
最新文章
- 数据密集型应用系统设计 [Designing Data-Intensive Applications]
- Sqlserver 2000 迷你、便携企业管理器(10M),支持Dts编辑
- ubuntu 下的文件搜索
- vuex 源码分析_Vuex源码解析(一):Module初始化
- 禁止屏幕保护使用密码
- 单元测试的必要性 从bug修复 费用成本和时间成本综合考虑
- mssql数据库单表导入、导出
- 红色警戒2修改器原理百科(六)
- 【得之我幸,失之我命】分享下研究生阶段, IEEE论文投稿的心态和心路历程
- 手持车辆管理的神器插件,移动端车牌识别技术
- HTML+CSS案例京东静态界面
- python语言实现读取菜谱_通过Python语言实现美团美食商家数据抓取
- threejs粒子效果
- 调用聚合数据新闻头条API接口
- 点集拓扑学习(一)拓扑空间
- 15. R的bnlearn包中的per.node.score函数的学习探究
- Word2019中Visio对象图片插入题注时自动删除标签与编号前的空格,编号后添加空格
- MATLAB基础学习(一)
- 基于服务树的动态资源管理方法
- 计算机网络重点题型总结
热门文章
- html绘制波形图,Html5 canvas 绘制心电波形图
- Tiny6410 的NandFlash(K9GAG08U0E)
- 激荡三十年(珍藏图文版)
- 【线性代数】P8 逆矩阵矩阵方程以及逆矩阵的性质
- idea社区版激活_使用IntelliJ IDEA社区版代替付费版
- 如何使用虚拟机下载和安装Centos
- 不爬山的人很少摔跤——Celeste蔚蓝的叙事理念与关卡设计(一)
- 货币金融学(米什金)笔记:金融体系、货币相关
- 太极图正确画法_来氏太极图的画法及六行太极图的演示
- 微软 rms服务器端,RMS 客户端部署说明 - Azure 信息保护 | Microsoft Docs