文章目录

  • 一、梯度爆炸
    • 1.什么是梯度爆炸?
    • 2.有何影响?
  • 二、梯度消失
    • 1.定义
  • 2.有何影响?
  • 三、共同点
    • 1.产生原因
    • 2.解决办法
      • a. 方案1-预训练加微调
      • b. 方案2-梯度剪切、正则化
      • c. 方案3-relu、leakrelu、elu等激活函数
      • 解决方案4-batchnorm/批规范化
      • 解决方案5-残差结构
      • 解决方案6-LSTM

梯度消失与梯度爆炸其实差不多,两种情况下梯度消失经常出现,一是在深层网络中,二是采用了不合适的损失函数。那么如何解决这种情况呢?

一、梯度爆炸

1.什么是梯度爆炸?

误差梯度是神经网络训练过程中计算的方向和数量,用于以正确的方向和合适的量更新网络权重。 在深层网络或循环神经网络中,误差梯度可在更新中累积,变成非常大的梯度,然后导致网络权重的大幅更新,并因此使网络变得不稳定。在极端情况下,权重的值变得非常大,以至于溢出,导致 NaN 值。 网络层之间的梯度(值大于 1.0)重复相乘导致的指数级增长会产生梯度爆炸。 梯度爆炸引发的问题 在深度多层感知机网络中,梯度爆炸会引起网络不稳定,最好的结果是无法从训练数据中学习,而最坏的结果是出现无法再更新的 NaN 权重值。
……梯度爆炸导致学习过程不稳定。
——《深度学习》,2016.

2.有何影响?

没找到可信度高的资料,但在我自己学习的过程中,我遇到的问题是局部跳跃?

二、梯度消失

1.定义

没找到中文定义,出去扒了一个。

Same as exploding gradient, vanishing gradient is largely caused by Wt−k. If |W|<1, then |Wt−k| would quickly shrink to 0, especially with sigmoid nonlinearity. The gradient will become 0 for previous long-distance steps, which makes RNN hard to learn long-range dependencies.Vanishing gradient is more problematic than exploding gradient, because it is a general problem not only to RNN, but also to any deep neural network with many layers.

和爆炸梯度一样,消失梯度很大程度上是由Wt - k引起的。如果|W|<1,则|Wt−k|会迅速缩小到0,特别是在s型非线性的情况下。对于之前的长距离步骤,梯度将变为0,这使得RNN很难学习长距离依赖关系。消失梯度比爆炸梯度问题更大,因为它不仅是RNN的普遍问题,而且是任何多层深度神经网络的普遍问题。

wiki定义

In machine learning, the vanishing gradient problem is a difficulty found in training artificial neural networks with gradient-based learning methods and backpropagation. In such methods, each of the neural network’s weights receive an update proportional to the partial derivative of the error function with respect to the current weight in each iteration of training. The problem is that in some cases, the gradient will be vanishingly small, effectively preventing the weight from changing its value. In the worst case, this may completely stop the neural network from further training. As one example of the problem cause, traditional activation functions such as the hyperbolic tangent function have gradients in the range (0, 1), and backpropagation computes gradients by the chain rule. This has the effect of multiplying n of these small numbers to compute gradients of the “front” layers in an n-layer network, meaning that the gradient (error signal) decreases exponentially with n while the front layers train very slowly.

说人话:某些情况下梯度趋近于0导致无法更新。

在某些情况下,梯度会变得非常小,有效地阻止了权重值的变化。在最坏的情况下,这可能会完全停止神经网络的进一步训练。例如,传统的激活函数(如双曲正切函数)具有范围(0,1)内的梯度,反向传播通过链式法则计算梯度。这样做的效果是,用这些小数字的n乘以n来计算n层网络中“前端”层的梯度,这意味着梯度(误差信号)随n呈指数递减,而前端层的训练非常缓慢。

2.有何影响?

如上所述,无法更新,更新停滞。

三、共同点

1.产生原因

采用了不合适的损失函数, 如果我们使用标准化初始w,那么各个层次的相乘都是0-1之间的小数,而激活函数f的导数也是0-1之间的数,其连乘后,结果会变的很小,导致梯度消失。若我们初始化的w是很大的数,w大到乘以激活函数的导数都大于1,那么连乘后,可能会导致求导的结果很大,形成梯度爆炸。

2.解决办法

【此部分来自https://zhuanlan.zhihu.com/p/33006526?from_voters_page=true】

a. 方案1-预训练加微调

此方法来自Hinton在2006年发表的一篇论文,Hinton为了解决梯度的问题,提出采取无监督逐层训练方法,其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。Hinton在训练深度信念网络(Deep Belief Networks中,使用了这个方法,在各层预训练完成后,再利用BP算法对整个网络进行训练。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。

b. 方案2-梯度剪切、正则化

梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。

注:在WGAN中也有梯度剪切限制操作,但是和这个是不一样的,WGAN限制梯度更新信息是为了保证lipchitz条件。

另外一种解决梯度爆炸的手段是采用权重正则化(weithts regularization)比较常见的是l1正则,和l2正则,在各个深度框架中都有相应的API可以使用正则化。

关于正则化,可以参考我转载这篇博文【超强知识,点击就送】:什么是机器学习正则化?https://blog.csdn.net/ftimes/article/details/105839043

c. 方案3-relu、leakrelu、elu等激活函数

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


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

relu的主要贡献在于:

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

同时也存在一些缺点

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

  • 输出不是以0为中心的

2. leakrelu
leakrelu就是为了解决relu的0区间带来的影响,其数学表达为: [公式] 其中k是leak系数,一般选择0.1或者0.2,或者通过学习而来

解决方案4-batchnorm/批规范化

Batchnorm是深度学习发展以来提出的最重要的成果之一了,目前已经被广泛的应用到了各大网络中,具有加速网络收敛速度,提升训练稳定性的效果,Batchnorm本质上是解决反向传播过程中的梯度问题。batchnorm全名是batch normalization,简称BN,即批规范化,通过规范化操作将输出信号x规范化到均值为0,方差为1保证网络的稳定性。

解决方案5-残差结构

残差结构说起残差的话,不得不提这篇论文了:Deep Residual Learning for Image Recognition,关于这篇论文的解读,可以参考机器学习算法全栈工程师知乎专栏文章链接:https://zhuanlan.zhihu.com/p/31852747这里只简单介绍残差如何解决梯度的问题。

事实上,就是残差网络的出现导致了image net比赛的终结,自从残差提出后,几乎所有的深度网络都离不开残差的身影,相比较之前的几层,几十层的深度网络,在残差网络面前都不值一提,残差可以很轻松的构建几百层,一千多层的网络而不用担心梯度消失过快的问题,原因就在于残差的捷径(shortcut)部分,其中残差单元如下图所示:

解决方案6-LSTM

LSTM全称是长短期记忆网络(long-short term memory networks),是不那么容易发生梯度消失的,主要原因在于LSTM内部复杂的“门”(gates),如下图,LSTM通过它内部的“门”可以接下来更新的时候“记住”前几次训练的”残留记忆“,因此,经常用于生成文本中。目前也有基于CNN的LSTM,感兴趣的可以尝试一下。

梯度爆炸与梯度消失是什么?有什么影响?如何解决?相关推荐

  1. 详解梯度爆炸和梯度消失

    那么为什么会出现梯度消失的现象呢?因为通常神经网络所用的激活函数是sigmoid函数,这个函数有个特点,就是能将负无穷到正无穷的数映射到0和1之间,并且对这个函数求导的结果是f′(x)=f(x)(1− ...

  2. 梯度消失和梯度爆炸_梯度消失梯度爆炸-Gradient Clip

    梯度爆炸与梯度消失 实际现象: 当我们使用sigmoid function作为激活函数时,随着神经网络的隐藏层数增加,训练误差反而增大,造成了深度网络的不稳定. 梯度弥散: 靠近输出层的hidden ...

  3. 梯度消失和梯度爆炸_梯度消失和梯度爆炸详解

    在中文搜索引擎搜索梯度爆炸或者梯度消失,出现的往往是一篇文章复制黏贴多次,而且这篇文章讲的并不清晰,比方说下面这种在文章中出现的图一,反正我是根本看不懂这张图描述的实什么,因此那篇被复制黏贴无数次的文 ...

  4. 什么是梯度爆炸与梯度消失

    梯度爆炸(Gradient Explosion)和梯度消失(Gradient Vanishing)是深度学习训练过程中的两种常见问题. 梯度爆炸是指当训练深度神经网络时,梯度的值会快速增大,造成参数的 ...

  5. 【转载】梯度爆炸和梯度消失

    写得很全的一篇知乎上的介绍 一.梯度消失 梯度消失出现的原因: 在深层网络中,如果激活函数的导数小于1,根据链式求导法则,靠近输入层的参数的梯度因为乘了很多的小于1的数而越来越小,最终就会趋近于0,例 ...

  6. 为什么会出现梯度爆炸和梯度消失现象?怎么缓解这种现象的发生?

    前言:梯度消失现象在深度神经网络训练过程中表现得尤为突出,随着网络层数的加深,损失在反向传播时梯度在不断减小,导致浅层网络的学习进行不下去,参数得不到有效更新.为什么会出现这种现象呢?下面小编将从神经 ...

  7. 神经网络梯度爆炸、梯度消失原因及解决方案

    本文参考:深度网络梯度爆炸的原因.产生的影响和解决方法(常用激活函数)_凝眸伏笔的博客-CSDN博客 产生原因: 网络层数太深,链式求导时的连乘效应会导致梯度爆炸或梯度消失. 如果梯度值均小于1,则会 ...

  8. 梯度消失和梯度爆炸_梯度消失、爆炸的原因及解决办法

    一.引入:梯度更新规则 目前优化神经网络的方法都是基于反向传播的思想,即根据损失函数计算的误差通过梯度反向传播的方式,更新优化深度网络的权值.这样做是有一定原因的,首先,深层网络由许多非线性层堆叠而来 ...

  9. 如何理解梯度爆炸和梯度消失

    如何理解梯度爆炸和梯度消失 何为梯度消失,产生的原因是什么? 梯度消失的最核心原因是,选择的优化方法不能很好的应对多层结构.在利用链式法则,求导的过程中导致梯度逐层衰减,最后消失.反之如果每次求导之后 ...

最新文章

  1. python字典练习题
  2. CSS Sprites (转)
  3. 架构师应具备的概要技能
  4. .NET Core 3.0 System.Text.Json 和 Newtonsoft.Json 行为不一致问题及解决办法
  5. 我的世界java版使用剑_我的世界:JAVA版藏“私货”内置绝世好剑与神功,你玩的版本有吗...
  6. ES6学习(十)—async 函数
  7. Python中隐藏了你不知道的10个彩蛋
  8. python生成词云_词云制作没那么难,Python 10 行代码就实现了!
  9. oracle左连接没用_Oracle左连接,右连接
  10. micropython常用模块有那个_Python17个常用内置模块总结
  11. 【合集】SAP 成都研究院开发工程师们精彩纷呈的工作和生活片段
  12. 计算机组装要哪些硬件,DIY组装电脑要买哪些硬件
  13. EPLAN之设备编号
  14. CuraEngine VS2017
  15. [图论] 平面图 平面性的判定
  16. Echarts 柏拉图
  17. From detailed models to formal spiking neurons
  18. 485传感器接入串口交换机采集方案
  19. Genexus第5篇-WebPanel
  20. Bailian3712 电话号码生成英语单词【查表】

热门文章

  1. linux中获取系统时间的几种方法
  2. GOM登录器配置免费生成图文教程
  3. ES学习看这一篇文章就够了
  4. 选中DataGridView行,将数据返填到TextBox控件
  5. Maplab系列15:Inverted File
  6. 计算机网络知识点全面总结(一篇全懂)
  7. springboot志愿者活动报名服务系统jsp ssm maven
  8. [数学]三角函数与双曲函数及其导数和不定积分
  9. String.prototype.padStart()
  10. svn主从备份以及开机启动脚本