深入了解梯度消失与梯度爆炸

news2024/11/24 6:11:12

本文探讨深度学习中经常会提到的概念–梯度消失与梯度爆炸。他们是影响模型收敛,学习好坏的一个重要因素,对此现象也提出了对应的解决方案。在此记录其概念,原因和相关的解决方案,仅供参考。

目录

  • 概念
  • 原因
  • 解决方案
    • 1. 参数初始化
    • 2. 梯度裁剪(Gradient Clipping)
    • 3. 正则化
    • 4. 激活函数
      • 4.1. Relu函数
      • 4.2 LeakyRelu函数
      • 4.3 ELU函数
    • 4. Batch Normalization
    • 5. 残差结构
    • 6. LSTM网络

概念

梯度爆炸就是在梯度更新时偏导数很大,导致更新参数无法收敛到最值(总会跳到其他不好的地方)。
梯度消失就是在梯度更新时偏导数很小,导致更新参数无法收敛到最值(训不动)。
参数更新公式:
w = w − α ∂ J ( w ) ∂ w w = w-\alpha\frac{\partial J(w)}{\partial w} w=wαwJ(w)

原因

主要原因有三点,反向传播在网络较深时出现梯度累积,激活函数的导数,权重初始化参数过小或过大。

  • 训练方式:在反向传播的链式求导过程中,如果权重乘以激活函数导数这部分大于1,随着层数加深时,梯度更新会以指数的形式增加,则会梯度爆炸;如果这部分小于1,随着层数加深,梯度会指数衰减,则会出现梯度消失。
  • z = wx+b a= σ ( z ) \sigma(z) σ(z) a-> y ^ \hat{y} y^ L( y ^ \hat{y} y^,y)
  • 对于某一层:da/dx = da/dz * dz/dx =(激活函数导数)✖️w 得到da/dx 用于梯度传播
  • dw = da/dz * x x就是[dz/dw] 用于更新本层的权重参数
  • 这一层的dx相当于下一层的da 则继续相乘计算下一层的dx

在这里插入图片描述

  • 激活函数:如果选用sigmoid激活函数, S ( x ) = 1 1 + e − x S(x) = \frac{1}{1+e^{-x}} S(x)=1+ex1,值在0到1之间。其导数为 S ′ ( x ) = e − x ( 1 + e − x ) 2 = S ( x ) ( 1 − S ( x ) ) S^{'}(x) = \frac{e^{-x}}{(1+e^{-x})^2} =S(x)(1-S(x)) S(x)=(1+ex)2ex=S(x)(1S(x)),导数最大值为0.25,因此很容易梯度消失。
    在这里插入图片描述

  • 权重初始值:一般会使用均值为0方差为1的高斯分布初始化参数,这种方式使得权重集中在-1到1之间,因此很容易出现梯度消失。如果初始化的值很大,就会出现梯度爆炸。

解决方案

1. 参数初始化

可以采用好的参数初始化方法,比如He方法,对梯度爆炸和梯度消失都有作用。具体来说,使得前向传播时,每一层卷积计算结果的方差为1.在反向传播时,每一层向前传的梯度方差为1。
与Xavier方法一样,希望初始化后正向传播时,状态值方差保持不变,反向时,关于下一层激活值的梯度方差保持不变。初始化方法:nl表示l层的神经元个数。
W ∼ N ( 0 , 2 n l ) W \sim N(0,\sqrt{\frac{2}{n_l}}) WN(0,nl2 )

2. 梯度裁剪(Gradient Clipping)

这种方式是解决梯度爆炸的一种高效的方法,这里简单介绍一下对梯度的L2范数进行裁剪,L2范数也就是对所有参数的偏导数求平方和再开方。
设定裁剪阈值为C=max_norm, ∥ g ∥ 2 = g 1 2 + g 2 2 + . . \Vert g \Vert _2=\sqrt{g^2_1+g^2_2+..} g2=g12+g22+.. ,当其小于C时不变;当其大于C时,进行裁剪,具体公式如下:
g = C ∥ g ∥ 2 ⋅ g g = \frac{C}{\Vert g \Vert _2} \cdot g g=g2Cg

3. 正则化

采用权重正则化主要目的是限制过拟合,但也可以抑制梯度爆炸,比较常见的是L1正则,L2正则;
在各个深度框架下有相应的API可以使用正则化;比如在pytorch中的优化器有一个自带的参数weight_decay,用于指定权重衰减率,相当于L2正则化的 α \alpha α参数:
L o s s = ( y − W T X ) + α ∥ W ∥ 2 Loss = (y-W^TX)+\alpha {\Vert W \Vert}^2 Loss=(yWTX)+αW2
针对优化器的weight_decay参数,官网解释

weight_decay (float, optional): weight decay (L2 penalty) (default: 0)
optimizer = optim.Adam(model.parameters(),lr=learning_rate,weight_decay=0.01)

4. 激活函数

4.1. Relu函数

在这里插入图片描述
如果激活函数的导数为1,每层网络都尽量获得相同的更新速度,

  • 其贡献主要是缓解梯度消失和梯度爆炸;计算方便;加速网络训练。
  • 缺点是负数部分恒为0,导致一些神经元完全失活(可通过设置小学习率部分解决);输出不是以0为中心。

4.2 LeakyRelu函数

在这里插入图片描述
LeakyReLU就是为了解决ReLU的0区间带来的影响,该函数输出对负值输入有很小的坡度,由于导数总是不为零,这能减少静默神经元的出现,允许基于梯度的学习(虽然会很慢),解决了ReLU函数进入负区间后,导致神经元不学习的问题。

4.3 ELU函数

在这里插入图片描述

  • 融合了Sigmoid和Relu,左侧具有软饱和性,右侧无饱和性;
  • 右侧线性部分可以缓解梯度消失,而左侧软饱和可以使得对输入变化和噪声更加鲁棒。

梯度饱和常常是和激活函数相关的,比如sigmod和tanh就属于典型容易进入梯度饱和区的函数,即自变量进入某个区间后,梯度变化会非常小,表现在图上就是函数曲线进入某些区域后,越来越趋近一条直线,梯度变化很小,梯度饱和会导致训练过程中梯度变化缓慢,从而造成模型训练缓慢

4. Batch Normalization

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

反向传播式子中有w的存在,所以w的大小影响了梯度的消失和爆炸,BN就是通过对每一层的输出规范为均值和方差一致的方法,消除了w带来的放大缩小的影响,进而解决梯度消失和爆炸的问题,或者可以理解为BN将输出从饱和区拉倒了非饱和区

有关Batch Normalization详细的内容可以参考这篇博客:BN原理和代码详解

5. 残差结构

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

6. LSTM网络

在这里插入图片描述

这里也是缓解梯度消失。
LSTM是循环神经网络RNN的变体,全称是长短期记忆网络(long-short term memory networks),它是不那么容易发生梯度消失的,主要原因在于LSTM内部复杂的“门”结构,LSTM通过它内部的“门”可以接下来更新的时候“记住”前几次训练的“残留记忆” ,因此,经常用于生成文本中。LSTM解释

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/519874.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vim学习笔记【Ch00,Ch01】

Vim学习笔记 GitHub的Learn-Vim仓库学习笔记Ch00 前言Ch01 Starting VimVim的官方链接Windows10下载和安装VimVim初级使用打开Vim退出Vim保存文件打开文件帮助文档helpargument参数打开多个窗口暂停 GitHub的Learn-Vim仓库学习笔记 仓库地址:https://github.com/ig…

Qt--数据库--增删改查操作

目录 1. Qt数据库简介 2. 连接与关闭 3. 建表 dialog.h dialog.cpp dialog.ui 4. 增删改 1.添加数据 dialog.h dialog.cpp 2.删除数据 dialog.h dialog.cpp 3.修改数据 dialog.h dialog.cpp 5. 查询 dialog.h dialog.cpp 判断数据是否存在 dialog.h dialog.cpp 1. Qt数据库简介…

如何在IVD行业运用IPD?

IVD(体外诊断,In Vitro Diagnostic)是指对人体样本(血液、体液、组织)进行定性或定量的检测,进而判断疾病或机体功能的诊断方法。IVD目前已经成为疾病预防、诊断治疗必不可少的医学手段,约80%左…

ChatGPT国内使用办法,无需魔法上网,免费使用ChatGPT,长期更新!!

新建了一个网站 每天给大家更新可用的免翻国内可用chatGPT https://ai.weoknow.com/ 2023.5.7新增一个 软件名称ChatGPT✦ ▌ 软件摘要 软件名称:ChatGPT 适用设备:浏览器 文件大小:0MB ▌ 软件简介 ChatGPT非常强大,但国内合…

12-CSS-语法和选择器

一、语法格式: 选择器指向需要设置样式的 HTML 元素。声明块包含一条或多条用分号分隔的声明。每条声明都包含一个 CSS 属性名称和一个值,以冒号分隔。多条 CSS 声明用分号分隔,声明块用花括号括起来。 二、选择器: CSS 选择器…

第一章 计算机系统概述

1.1 计算机发展历程 1.1.1 计算机硬件的发展 计算机系统硬件软件 计算机硬件的发展: 第一代计算机:(使用电子管),第二代计算机:(使用晶体管),第三代计算机:(使用较小规模的集成),第四代计算…

Strategy 模式

文章目录 💡问题引入💡概念💡例子💡总结 💡问题引入 软件为什么总是隔一段时间就要更新迭代?当然是因为不同的需求而发生了改变。 在软件构建过程中,某些对象使用的算法可能多种多样&#xff…

MySQL——通过C语言连接

文章目录 1、前置安装2、正式连接增加删除修改select 1、前置安装 前提: 如果你的mysql是通过yum安装的,那么那些库文件依赖,都是有的,不用你安装了。 但是如果是用 rpm包安装的,就需要去官网下载对应的包。 这些是…

操作系统与进程调度

文章目录 一、计算机操作系统1.操作系统(Operating System)2.计算机系统示意图 二、进程1.进程/任务(Process/Task)2.进程控制块抽象(PCB Process Control Block)3.进程调度(Process Scheduling)4.内存管理&#xff08…

知识点回顾(一)

1.final,finally ,finalize final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final&…

ChatGPT潜能无限:多个震撼应用场景一一揭晓

ChatGPT 具有对个人、公司和各个行业非常有用的各种应用程序。在本文中,我们继续解释ChatGPT 应用(基础应用场景,请点击这里查看)。 看完此篇文章中,你会非常惊讶于起潜能无限的应用场景及其强大的功能,那…

Nginx之rewrite实现URL重写

1.开篇 rewrite是nginx服务器提供的一个重要功能,用于实现URL的重写。例如我们访问https://aa.qq.com,打开的是https://age.qq.com/,这就是使用URL重写的特性来实现的。 ngx_http_rewrite_module为实现URL重写提供了指令支持。 官方文档地…

ChatGPT教程(终极版)

新建了一个网站 https://ai.weoknow.com/ 每天给大家更新可用的国内可用chatGPT 这是一篇姗姗来迟的ChatGPT教程。 小白对ChatGPT的介绍足以让你阅读我的文章。 如果你已经使用过ChatGPT,那么祝贺你发现了宝藏。未来的先进技术一定会帮助你有所收获。 前提是你可…

我的『1024』创作纪念日

记得,2020年07月22日我撰写了第1篇技术博客:《遗传算法实例解析》在这平凡的一天,我赋予了它不平凡的意义也许是立志成为一名专业T作者、也许是记录一段刚实践的经验但在那一刻,我已在创作这趟旅程中出发今天,是我成为…

百度蜘蛛简介

百度蜘蛛简介 工作机制百度蜘蛛的工作要素百度蜘蛛原理的应用Baiduspider对一个网站服务器造成的访问压力如何?Baiduspider多长时间之后会重新抓取我的网页? 工作机制 百度蜘蛛的构建的原理。搜索引擎构建一个调度程序,来调度百度蜘蛛的工作…

2023.5.13>>Eclipse+exe4j打包Java项目及获取exe所在文件的路径

Eclipseexe4j打包Java项目及获取exe所在文件的路径 1、打包exe文件1.1 打jar包1.2 打包exe2、在程序中获取exe所在路径3、遇到问题4、JDK version和class file version(Class编译版本号)对应关系5、参考文章 1、打包exe文件 1.1 打jar包 右单击项目选择“Export…” 1.2…

软考A计划-真题-分类精讲汇总-第三章(数据库)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

小程序开发中的插件、组件、控件到底有什么区别?

小程序插件代码由一些自定义组件和 JS 代码文件构成,插件开发者在发布插件时,这些代码被上传到后台保存起来。当小程序使用插件时,使用者需填写插件的 AppID 和版本号,就可从后台获取相应的插件代码。小程序代码编译时&#xff0c…

基于 CentOS 7 构建 LVS-DR 群集

如有错误,敬请谅解! 此文章仅为本人学习笔记,仅供参考,如有冒犯,请联系作者删除!! 前言: 对比 LVS 负载均衡群集的 NAT 模式和 DR 模式其各自的优势 DR 模式 原理:首先…

Hadoop之block切片

切片是一个逻辑概念 在不改变现在数据存储的情况下,可以控制参与计算的节点数目 通过切片大小可以达到控制计算节点数量的目的 有多少个切片就会执行多少个Map任务 hdfs上数据存储的一个单元,同一个文件中块的大小都是相同的 因为数据存储到HDFS上不可变&#xff0…