消失的梯度问题:问题,原因,意义及其解决对策

消失的梯度问题:问题,原因,意义及其解决对策

本文为 AI 研习社编译的技术博客,原标题 :

The Vanishing Gradient Problem

作者 | Chi-Feng Wang

翻译 | Dddda  编辑 | 王立鱼

原文链接:

https://towardsdatascience.com/solving-nlp-task-using-sequence2sequence-model-from-zero-to-hero-c193c1bd03d1

消失的梯度问题:问题,原因,意义及其解决对策

  问题

随着越来越多的激活函数加到神经网络中,损失函数的梯度趋近于0,使得网络结构很难训练。

  原因

具体的激活函数,比如sigmoid函数,把很大的空间压缩到0和1之间。因此,sigmoid函数的输入即使变化很大也只会改变一点输出。因此,求导就变得很小。

消失的梯度问题:问题,原因,意义及其解决对策

图1:sigmoid函数以及导数

例如,图一是sigmoid函数及其导数。注意当sigmoid函数的输入变大或变小时(当|x|),导数如何接近零。

  为什么这是重要的?

对于使用激活函数的仅有几层的浅层网络结构,这不是很大的问题。然而,当使用更多层的时候,可能会造成梯度太小而不能很好的训练。

神经网络的梯度是使用反向传播来找到的。简单来说,反向传播通过将网络从最终层逐层移动到初始层来找到网络的导数。 通过链式的规则,将各层的导数乘上网络(从最终层到初始层),计算出初始层的导数。

然而,当有n个隐藏层使用像sigmoid的激活函数时,n个小的倒数相乘。因此,当我们反向传到初始层的时候,梯度会大幅度下降。

一个小的梯度意味着初始层的权重和偏差不会在训练中得到有效更新。由于这些初始层通常对识别输入数据的核心元素至关重要,因此可能导致整个网络的整体不准确。 

  解决方案

最简单的解决方案是使用激活函数,像ReLU,不会导致一个小的导数。

残差网络是另外一个解决方案,因为提供了残差与之前的层直接连接。就像图2中,残差连接直接将block的开头x的值添加到block(F(x)+x)的结尾。

这个残差连接不通过“挤压”的激活函数,从而导致block的整体倒数更大。 

消失的梯度问题:问题,原因,意义及其解决对策

图2:残差层

*************************************************************************

译者个人注解:精髓就在于直接连过来的那个x了。h(x)=f(x)+ x,h(x)对 x 求偏导,值为1,这个1直接传到block的最前端,保证了来自后一层的梯度值完好的传过了这一层然后进入到前一层,使得浅层的weights也可以得到很好的训练。

*************************************************************************

最后,batch normalization层还可以解决这个问题。如前所述,当一个大的输入空间映射到一个小的输入空间时,问题就出现了,导致导数消失。 在图1中,很清晰看到|x|变大的时候。bath normalization通过简单地规范化输入来减少这个问题,这样x就不会到达sigmoid函数的外边缘。如图3所示,它对输入进行了规范化,使其大部分落在绿色区域,其中导数不太小。

消失的梯度问题:问题,原因,意义及其解决对策

图三: 限制输入的sigmoid 函数

如果你有任何的问题或者建议,记得评论 :)

阅读以下的文章来获得更多的信息:

  • https://www.quora.com/What-is-the-vanishing-gradient-problem

  • https://en.wikipedia.org/wiki/Vanishing_gradient_problem

  • https://towardsdatascience.com/intuit-and-implement-batch-normalization-c05480333c5b

想要继续查看该篇文章相关链接和参考文献?

点击消失的梯度问题:问题、原因、意义及其解决对策即可访问!

今日资源推荐:数据科学家修炼之道

这是一本跟数据科学和数据科学家有关的“手册”,它还包含传统统计学、编程或计算机科学教科书中所没有的信息。《数据天才:数据科学家修炼之道》有3个组成部分:一是多层次地讨论数据科学是什么,以及数据科学涉及哪些其他学科;二是数据科学的技术应用层面,包括教程和案例研究;三是给正在从业和有抱负的数据科学家介绍一些职业资源。

点击链接即可获取:https://ai.yanxishe.com/page/resourceDetail/614

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
梯度消失梯度爆炸的发生原因主要与深度神经网络的结构和参数初始化有关。 梯度消失原因是由于使用一些激活函数(如sigmoid、tanh)时,这些函数在输入较大或较小的时候,梯度会变得非常小,导致在反向传播时逐渐消失。此外,深度神经网络的层数过多时,梯度会逐层相乘,使得梯度值趋近于零。 梯度爆炸的原因是由于网络中存在较大的权重或者在网络中使用了不稳定的操作(如指数运算),导致梯度在反向传播过程中指数级增长,超出了计算机所能表示的范围。 为了解决梯度消失梯度爆炸问题,以下是一些常用的解决方法: 1. 权重初始化:使用合适的权重初始化方法,如Xavier初始化(根据输入和输出维度自适应地初始化权重)可以缓解梯度消失和爆炸问题。 2. 激活函数的选择:使用具有更好梯度性质的激活函数,如ReLU、LeakyReLU等,可以有效避免梯度消失问题。 3. 梯度裁剪:限制梯度的大小,防止梯度爆炸。可以通过设置一个阈值,在梯度超过该阈值时进行裁剪。 4. 正则化方法:如L1、L2正则化或者Dropout等,可以帮助减少过拟合,稳定网络训练过程。 5. Batch Normalization:对每个小批量数据进行归一化,有助于缓解梯度消失梯度爆炸问题。 6. Residual Connections:引入跳跃连接,将输入直接与输出相加,可以缓解梯度消失问题。 7. 梯度监测:通过观察梯度的变化情况,及时发现和解决梯度消失梯度爆炸的问题。 以上是一些常见的解决方法,根据具体情况可以灵活选择和组合使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值