深度学习中梯度消失和梯度爆炸的根本原因及其缓解方法

  • 一、梯度消失和爆炸的根本原因
    • 1. 深层网络角度
    • 2. 激活函数角度
  • 二、梯度消失、爆炸的解决方案
    • 1. 梯度剪切、正则
    • 2. 采用其他的激活函数
      • 2.1 Relu
      • 2.2 LeakRelu
    • 3. BatchNorm
    • 4. 残差结构

一、梯度消失和爆炸的根本原因

首先解释一下什么是梯度消失和梯度爆炸,
梯度消失:梯度趋近于零,网络权重无法更新或更新的很微小,网络训练再久也不会有效果;
梯度爆炸:梯度呈指数级增长,变的非常大,然后导致网络权重的大幅更新,使网络变得不稳定。

其实不管是梯度消失还是梯度爆炸本质上都是由于——深度神经网络的反向传播造成的。

可以通过两个角度去解释:一是在深层网络中,二是采用的激活函数导致的。

1. 深层网络角度

我们先来回顾一下神经网络反向传播的机理:

简单的三层神经网络

先看其中某一层的反算机制,上图中红色线的部分:

X表示本层的输入/上一层的输出,Y表示本层的输出

公式一

公式二

公式一表示:传到前一层的梯度大小,其值跟后一层传过来的梯度以及本层的权重W有关
公式二表示:本层更新权重W时的梯度值,其值跟后一层传过来的梯度以及本层的输入X有关
这两个概念很重要,从数学角度上解释了反向更新时的影响因子X和W。

深度学习本质就是通过学习不断更新权重,以找到合适的值使损失下降的最低以完美的匹配输入和输出。
更新权重公式表示如下:

其中:

对于处理复杂任务时,深度网络比浅层的网络具有更好的效果。而多层深度网络更新权重时的反向传播采用的是链式法则,简单的理解就是n个公式二连乘。
当 ∂Loss/∂w 部分大于1时,那么层数增多的时候,最终的求出的梯度更新将以指数形式增加,即发生梯度爆炸;
当 ∂Loss/∂w 部分小于1时,那么随着层数增多,求出的梯度更新信息将会以指数形式衰减,即发生了梯度消失。

接着我们加入激活函数,来看看在深度网络中会发生什么情况:
从上述的公式二可知,

更新权重的梯度不仅与本层的输入X有关还和下一层传过来的梯度有关。
通过网络结构可知,输入除了经过Affine (wx+b)层,还会经过激活函数,再传输到下一层。因此反向传播时,下一层传过来的梯度也会分别计算这两部分。

假设用sigmoid作为激活函数:

其导数图像为:

该导数在s′(0)=0.25时达到最高,
如果我们使用标准方法(均值为0标准差为1的高斯分布)来初始化网络中的权重,那么权重通常会满足|W| < 1,则W*S′(y) < 1/4。
当所有这些项的乘积时,最终结果肯定会指数级下降:项越多,乘积的下降也就越快。

假设现在有四层网络,我们想比较一下第一层网络的梯度和第三层的网络的梯度大小:

σ′(z)表示sigmoid的导数,z1-z4表示当前层的输出,w2-w4表示当前层的权重。

由上述公式可知,由于W*σ′(z) < 1/4的约束,因此∂C/∂b1要小于∂C/∂b3,即第一层网络的梯度要小于第三层的网络梯度。

一般情况中,梯度爆炸很少会发生(因为对输出会做归一化),大多会发生梯度消失,而越往前面传播,梯度就越小,因此靠近输入的前几层权重可能只会有很小的更新。

总结:从深层网络角度来讲,不同的层学习的速度差异很大,表现为网络中靠近输出的层学习的情况很好,靠近输入的层学习的很慢,有时甚至训练了很久,前几层的权值和刚开始随机初始化的值差不多。 因此,梯度消失、爆炸,其根本原因在于反向传播训练法则,属于先天不足。

2. 激活函数角度

上文中提到计算权值更新信息的时候需要计算前层偏导信息,因此如果激活函数选择不合适,比如使用sigmoid,tanh这种容易饱和的函数,梯度消失就会比较明显。
sigmoid作为损失函数,其梯度是不可能超过0.25的,这样经过链式求导之后,很容易发生梯度消失,在前文中已经解释过了。
现在我们来看一下tanh函数及其导数:

tanh数学表达为:

从图像中我们可以看出tanh比sigmoid的梯度值要高,不过值也是小于1的,两边也会出现饱和,也会引起梯度消失的现象。

二、梯度消失、爆炸的解决方案

1. 梯度剪切、正则

梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
权重正则化也是解决度爆炸的手段,比较常见的是L1正则,和L2正则,正则化是通过对网络权重做正则,防止w过大,限制过拟合,正则项在损失函数的形式为:

α为超参数,是正则项系数

通过公式一可知,W越大,传到上一层的梯度就越大,连乘之后,就容易发生梯度爆炸,因此,对W做正则化就是约束W的取值,可以部分限制梯度爆炸的发生。
除了对W做正则化,在初始权重的时候可以加上标准化,使W符合均值为0,标准差为1的高斯分布,也能限制部分梯度爆炸的发生。

2. 采用其他的激活函数

2.1 Relu

relu思想很简单,如果激活函数的导数为1,那么就不存在梯度消失爆炸的问题了,每层的网络都可以得到相同的更新速度,relu就这样应运而生。

relu的数学表达式

relu的函数图像及其导数 从上图中,我们可以很容易看出,relu函数的导数在正数部分是恒等于1的,因此在深层网络中使用relu激活函数就不会导致梯度消失和爆炸的问题。

relu的主要贡献在于:

  • 解决了梯度消失、爆炸的问题
  • 计算方便,计算速度快
  • 加速了网络的训练

缺点:

  • 由于负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决)
  • 输出不是以0为中心的

2.2 LeakRelu

LeakRelu就是为了解决Relu的0区间带来的影响,其数学表达为:LeakRelu=max(k∗x,x)LeakRelu=max(k∗x,x)LeakRelu=max(k∗x,x)

其中k是leak系数,一般选择0.01或者0.02,或者通过学习而来。

LeakRelu的函数图像

3. BatchNorm

BatchNorm具有加速网络收敛速度,提升训练稳定性的效果,本质上是解决反向传播过程中的梯度问题。BatchNorm全名是batch normalization,简称BN,即批归一化,通过规范化操作将输出信号X归一化保证网络的稳定性。
根据公式二可知,


更新权重的梯度和上一层的输出X有关,如果输出过大或过小,就会导致产生梯度爆炸和梯度消失,BatchNorm就是通过对每一层的输出规范为均值和方差一致的方法,消除了X带来的放大缩小的影响,进而解决梯度消失和爆炸的问题,或者可以理解为BN将输出从饱和区拉倒了非饱和区。

关于BN更加详细的解释可以看这篇文章:
https://www.jianshu.com/p/b4d186cca6be

4. 残差结构

残差学习单元

残差中有很多这样的跨层连接结构,其实就是在前向传播的过程中,输出端的值加上输入X再传到下一层网络结构中,这样的结构在反向传播中具有很大的好处。
因为旁边的分支结构是直接传递过来的,没有带权重,因此反向传播时该分支的梯度始终为1,这样即使主干梯度值很小,加上分支的梯度再传给上一层网络时,梯度也不会很小,从而很大程度上缓解了梯度消失。
所以利用残差结构,可以轻松的构建几百层网络结构,而不用担心梯度消失过快的问题。

参考文章:
https://blog.csdn.net/qq_25737169/article/details/78847691

深度学习中梯度消失和梯度爆炸的根本原因及其缓解方法相关推荐

  1. 深度学习中多层全连接网络的梯度下降法及其变式

    深度学习中多层全连接网络的梯度下降法及其变式 1 梯度下降法 2 梯度下降的变式 1.SGD 2.Momentum 3.Adagrad 4.RMSprop 5.Adam 6.小结 1 梯度下降法 梯度 ...

  2. 深度学习中的激活函数与梯度消失

    转载请注明出处:http://www.cnblogs.com/willnote/p/6912798.html 前言 深度学习的基本原理是基于人工神经网络,信号从一个神经元进入,经过非线性的激活函数,传 ...

  3. nfa确定化 dfa最小化_深度学习中的优化:梯度下降,确定全局最优值或与之接近的局部最优值...

    深度学习中的优化是一项极度复杂的任务,本文是一份基础指南,旨在从数学的角度深入解读优化器. 一般而言,神经网络的整体性能取决于几个因素.通常最受关注的是网络架构,但这只是众多重要元素之一.还有一个常常 ...

  4. 深度学习中的梯度消失、梯度爆炸问题

    写在前面: 有些博主对这个问题的解释很好,这里参考了: 详解机器学习中的梯度消失.爆炸原因及其解决方法 我在这方面的工作经验和知识面还不够,还需要积累后再做出更为专业的解答. 参考我之前转发过的一篇文 ...

  5. 深度学习中的梯度消失与梯度爆炸及解决方案

    1.梯度消失与梯度爆炸 反向传播算法在神经网络中非常常见,可以说是整个深度学习的基石.在反向传播中,经常会出现梯度消失与梯度爆炸的问题.梯度消失产生的原因一般有两种情况:一是结构较深的网络,二是采用了 ...

  6. 1.10 梯度消失与梯度爆炸-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 1.9 归一化输入 回到目录 1.11 神经网络的权重初始化 梯度消失与梯度爆炸 (Vanishing/Expanding Gradients) 训练神经网络,尤其是深度神经 ...

  7. 【深度学习】梯度消失和梯度爆炸问题的最完整解析

    作者丨奥雷利安 · 杰龙 来源丨机械工业出版社<机器学习实战:基于Scikit-Learn.Keras和TensorFlow> 编辑丨极市平台 1 梯度消失与梯度爆炸 正如我们在第10章中 ...

  8. 梯度消失和梯度爆炸_知识干货-动手学深度学习-05 梯度消失和梯度爆炸以及Kaggle房价预测...

    梯度消失和梯度爆炸 考虑到环境因素的其他问题 Kaggle房价预测 梯度消失和梯度爆炸 深度模型有关数值稳定性的典型问题是消失(vanishing)和爆炸(explosion). 当神经网络的层数较多 ...

  9. [深度学习-优化]梯度消失与梯度爆炸的原因以及解决方案

    首先让我们先来了解一个概念:什么是梯度不稳定呢? 概念:在深度神经网络中的梯度是不稳定的,在靠近输入层的隐藏层中或会消失,或会爆炸.这种不稳定性才是深度神经网络中基于梯度学习的根本问题. 产生梯度不稳 ...

最新文章

  1. 在浏览器中进行深度学习:TensorFlow.js (四)用基本模型对MNIST数据进行识别
  2. Hadoop YARN
  3. (送书和红包)快人一步,掌握前端函数式编程
  4. 1万字30张图说清TCP协议
  5. syncthing下载_Syncthing中继服务器和发现服务器
  6. 支撑200并发_搞清楚系统到底怎样支撑高并发以及架构图的绘制(面试向)
  7. c51单片机c语言交通灯的程序设计,基于51单片机的交通灯设计(三)-编写c51程序
  8. PPT:华为数字化转型实践分享(附下载)
  9. windows实用工具集
  10. SpringBoot解决XSS跨站脚本攻击
  11. 《缠中说禅108课》56:530 印花税当日行情图解
  12. WWW15年:改变世界的15个网站
  13. linux系统修改Mac地址
  14. 重复工作到底有没有意义
  15. winedit使用教程_latex及winedit入门指导教程.pdf
  16. 私有云服务器和公有云服务器有什么区别
  17. spring boot静态资源文件的访问以及自定义
  18. 绝望而沉重的爱·《致我们终将逝去的青春》
  19. 基于Django的照相馆预约系统的设计与实现
  20. 2020年最值得加入的互联网公司有哪些?

热门文章

  1. MC34063+MOSFET扩流 12V-5V 折腾出了高效率电路(转)
  2. C语言编程习惯和修养
  3. 仅需三步学会使用低代码ThingJS与森数据DIX数据对接
  4. 神经网络参数个数计算,神经网络的参数设置
  5. 3D打印机T3升级corexy  制作过程(二)
  6. java第三方类库Guava开源组件使用
  7. FTP指的是什么协议?由什么组成?有什么作用?
  8. 1090 Highest Price in Supply Chain(天上人间,潇潇共雨。曼珠红遍,流水忘川。)
  9. 3、★☛基于STM32的手机通过wifi控LED灯√♠★
  10. 如何自动隐藏win10任务栏