梯度不稳定概念和解决方法

  • 梯度消失和梯度爆炸问题
    • 概念
    • 原理详解
    • 解决方法
      • 更改激活函数(Relu、Leaky-Relu、P-Relu等)
      • 权重初始化
      • 加入BN层(Batch Normalization)
      • 梯度剪切、权重正则(针对梯度爆炸)
      • 使用预训练模型进行finetue
      • 使用ResNet残差结构

梯度消失和梯度爆炸问题

概念

  • 梯度消失是因为随着网络深度的加深,网络反向传播的小于1的导数经过逐层累积而导致其越靠近输入层,其值越小,因此靠近输入层的权值更新就会非常缓慢甚至停滞不前,那么网络深度的加深就失去了其意义,网络只等价于后面基层浅层网络的学习。
  • 梯度爆炸一般出现深层网络和权值初始化值太大的情况下。随着网络的深度的加深,大于1的导数经过逐层累积,变得非常大,梯度值太大,会导致权值瞬间跳跃,指向不应该指向的位置,导致训练收敛缓慢,甚至陷入局部最小值。

原理详解

以梯度消失中的Sigmoid激活函数为例,下面四个图分别是Sigmod原函数公式及曲线和其导数公式及曲线。


观察Sigmoid函数曲线,可以知道其输出分布在【0,1】区间,而且在输入值较大和较小的情况,其输出值变化都会比较小,仅仅当输入值接近为0时,它们才对输入强烈敏感。Sigmod单元的广泛饱和性会使得基于梯度的学习变得非常困难。因为这个原因,现在已经不鼓励将它们作为前馈网络的隐藏单元。

观察Simod导数曲线,呈现一个类似高斯分布的驼峰装,其取值范围在【0,0.25】之间,而我们初始化后的网络权值通常小于1,因此当层数增多时,小于0的值不断相乘,最后就会导致梯度消失的情况出现。而梯度爆炸则是当权值过大,导致其导数大于1,大于1的数不断相乘,发生梯度爆炸。
同时Sigmoid还有其他缺点,如输出不是以0为中心,而是0.5,这样在求解权重的梯度时,梯度总是正或负的,指数计算耗时。

总之不推荐使用sigmoid饱和激活函数。

不过sigmoid和tanh在RNN(LSTM、注意力机制等)结构上有所应用,作为门控或者概率值。

这里关于tanh为什么比simoid收敛快有一个比较好的说法,这里引用了:

梯度消失问题程度
tanh′(x)=1−tanh(x)2∈(0,1)tanh′⁡(x)=1−tanh⁡(x)2∈(0,1)
sigmoid: s′(x)=s(x)×(1−s(x))∈(0,1/4)sigmoid: s′(x)=s(x)×(1−s(x))∈(0,1/4)
可以看出tanh(x)的梯度消失问题比sigmoid要轻.梯度如果过早消失,收敛速度较慢.
以零为中心的影响
如果当前参数(w0,w1)的最佳优化方向是(+d0, -d1),则根据反向传播计算公式,我们希望 x0 和 x1 符号相反。但是如果上一级神经元采用 Sigmoid 函数作为激活函数,sigmoid不以0为中心,输出值恒为正,那么我们无法进行最快的参数更新,而是走 Z 字形逼近最优解。

解决方法

更改激活函数(Relu、Leaky-Relu、P-Relu等)

参考我的这篇博客 深度学习—非线性激活函数全面(Sigmoid、tanh、ReLU、Leaky ReLU、PReLU、RReLU、ELU、SELU、Swish、Maxout 10种)

权重初始化

不同的激活函数可能适用于不同的初始化方法,比如ReLU使用MSRA的初始化方法,tanh使用xavier的初始化方式。
第一选择应该是ReLU,但是如果效果不佳可以尝试使用其变体或者Maxout激活函数。
可以尝试tanh正切函数(以零点为中心,零点处梯度为1)。

加入BN层(Batch Normalization)

paper:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

最初来自于Google的Inception-v2,因为效果非常好,加快收敛速度明显。加上计算复杂度不高,目前大多数网络模型都会添加BN层,使得输出值在输入到非线性激活函数之前映射到【0,1】区间。而且可以减少前一层参数的变化对后一层输入值的影响,每一层独立训练,具有一定的正则化效果。

梯度剪切、权重正则(针对梯度爆炸)

梯度剪切是设置一个剪切阈值,如果更新梯度时,梯度大于此阈值,那么会将梯度拉回到阈值范围内,可以防止梯度爆炸。
权重正则,是防止过拟合的一个方法,但是当发生梯度爆炸时,权值的范数就会非常大,因此通过正则化项的限制,也可以防止梯度爆炸。

使用预训练模型进行finetue

这个方法和初始化的思想类似。原始思想是逐层进行训练,然后再对整个网络进行finetune,不过现阶段,大家普遍都是拿Imagenet上的预训练模型进行finetune。
finetune会使得网络权值分布在一个相对较好的区间内,在更新的时候,会降低梯度变得过大过小的可能性。

使用ResNet残差结构

来自何的大作,被认为是深度学习模型的里程碑,后来很多模型以及其他任务上的深度学习方法,都或多或少的参考了ResNet的skip connection结构。其在一定程度可以防止梯度消失。甚至在网络达到152层的时候,依然具有卓越的性能。


参考链接:
激活函数(ReLU, Swish, Maxout)
梯度消失和梯度爆炸问题详解
https://blog.csdn.net/qq_25737169/article/details/78847691


2019.10.30
希望能帮到你。


梯度消失和梯度爆炸问题及其解决方法详解相关推荐

  1. 第五人格服务器维修中怎么进,第五人格进不去怎么办 游戏进不去解决方法详解[多图]...

    第五人格开启测试已经有一段时间,许多玩家都会遇到各种问题,其中游戏进不去是让玩家最头痛的,今天安族小编来给大家介绍一下游戏进不去解决方法详解. 第五人格进不去解决方法 大家在玩的时候,肯定都会遇到卡顿 ...

  2. html页面在ie上出现404怎么解决,ie浏览器网页上有错误解决方法详解

    ie浏览器网页上有错误解决方法详解 最近网友反馈我的浏览器左下角总显示"网页上有错误",我已经修复过IE了,可是不管用.然后在浏览器上看不到网上的视频和图片的播放.在QQ空间上输入 ...

  3. 忍者必须死3 通关 服务器维护,忍者必须死3进不去怎么办 进不去解决方法详解[多图]...

    忍者必须死3有不少的玩家在玩登录游戏的时候会出现进不去的情况,但又没有维护,不知道是什么原因,下面安族小编给大家介绍一下进不去解决方法详解. 忍者必须死3服务器进不去解决办法 网络问题 如果是进不去游 ...

  4. 绝地腾讯手游登入显示服务器满了,绝地求生刺激战场注册已满什么意思 注册已满解决方法详解[多图]...

    绝地求生刺激战场2月9日正式开启全平台测试,不过有许多玩家出现注册已满的情况,无法进行游戏,下面安族小编给大家介绍一下注册已满解决方法详解. 绝地求生刺激战场今日注册上限解决办法 有玩家在网上说自己早 ...

  5. 计算机蓝屏代码0x000000ED,蓝屏代码0x000000ed的4大解决方法详解!蓝屏0x000000ed的原因和解决方法!...

    说到电脑问题,就不得不提蓝屏的问题.最近有位朋友的电脑开机的时候,并没有进入正常的启动程序,反而进入了蓝色界面,显示代码0x000000ed,不知道为什么会这样,也不知道如何去解决.下面就来看看蓝屏0 ...

  6. Dede后台验证码不显示解决方法详解

    1检查看看有没有开启gd,用<?php phpinfo();?>检查. 2在include/common.inc.php打开错误报告error_reporting(E_ALL); // 报 ...

  7. 刀塔霸业未能连接到服务器,刀塔霸业进不去怎么解决 进不去解决方法详解[多图]...

    刀塔霸业有很多玩家爱下好游戏之后却进不去,不知道什么原因,下面安族小编带大家来看一下进不去解决方法详解,相信对大家会有帮助. 刀塔霸业玩不了解决办法 1.游戏需要的手机配置 iOS系统需要至少1.5内 ...

  8. js php 中文乱码怎么解决_探讨PHP JSON中文乱码的解决方法详解

    我们知道在使用Ajax技术与PHP后台交互时,中文乱码是常有的事,JSON作为与XML类似的数据交换格式,在PHP用来进行交互时也会出现中 文乱码的情况,解决PHP JSON中文乱码的方法思路其实与P ...

  9. dede 验证码不显示 vdimgck.php,Dede后台验证码不显示解决方法详解(dedecms 5.7)

    本地与服务器上安装了dedecms5.7无法显示验证码,一般这种情况很少见,一般情况就是服务器设置问题,还有临时目录的权限问题. Dede后台验证码不显示或不正常分三种情况,下面来逐一分析 Dede后 ...

最新文章

  1. 大数据揭秘:北京每天这些道路“最红”
  2. 安徽理工大学计算机学院蒋群,计算机学院2001级校友十周年聚会
  3. [易学易懂系列|golang语言|零基础|快速入门|(一)]
  4. c++面向对象高级编程 学习二 带指针的类
  5. 【有容云案例系列】基于Jenkins和Kubernetes的CI工作流
  6. ASP/COM+组件开发辅助软件之补充
  7. iOS 点击tabbarItem的时候根据登录状态判断加载哪个视图控制器
  8. Keil5在线调试汇总及基本操作教程
  9. iOS底层 - 符号解析(dSYM 系统符号)Go语言版本
  10. 农产品管理系统-毕设
  11. NET F/T六维力传感器使用
  12. vue 中引入阿里云的云盾防水墙
  13. 读《不要等到毕业以后》后感
  14. Springcloud笔记超级详细
  15. ROS1云课→18一键配置
  16. 图解TCP/IP网络知识轻松入门 读书笔记(五)
  17. pandas计算方差,平均值,分位数,中位数
  18. NVIDIA Jetson TK1 rosrun rviz segmentation fault的解决方法
  19. 笔记︱联邦学习与隐私计算的案例集锦(一)
  20. Timed-Elastic-Band局部路径规划算法

热门文章

  1. idea java complier 编译级别的问题
  2. JavaScript快速排序算法
  3. 尚硅谷Web前端ES6教程详细笔记,涵盖ES6-ES11
  4. 中职组网络安全2023年山东省赛zip文件破解
  5. 大一计算机基础ppt练习题,计算机基础习题八——PowerPoint部分
  6. 中国邮政邮科院 X StarRocks:统一OLAP平台,大幅降低运维成本
  7. 高校BBS爆笑之无敌终结版
  8. 三层架构:表示层-业务逻辑层-数据访问层2
  9. 使用Hexo从0到1搭建个人博客详细教程(超详细,超简单)
  10. Glide centerCrop fitCenter和ImageView的scaleType的关系,互相影响的探讨