【深度学习】梯度消失与梯度爆炸的原因分析与解决策略

前言

梯度消失和梯度爆炸是深度网络训练过程中容易遇到的问题,由于网络层数的加深,梯度的膨胀或缩小效应不断累积,最终很容易造成模型无法收敛。除了模型本身的深度,发生的原因往往与参数初始化及模型设置,这里列举一些场景的原因与解决策略,以供参考。

一、发生原因

梯度消失与梯度爆炸出现的原因基本一致,一般可能是网络层数过深、激活函数、损失函数设置与参数初始化问题。学过梯度下降理论就很好理解,无非就是求梯度过程某个值过大过小或链式法则层数过多导致累积效果过大。
梯度消失:隐层过多;不合适的激活函数(也有可能产生梯度爆炸)
梯度爆炸:隐层过多;权重初始值过大

深层网络

反向传播算法根据链式求导法则,如果某部分比如激活函数求导的值持续小于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

  • 9
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值