【AI知识点】梯度消失(Vanishing Gradient)和梯度爆炸(Exploding Gradient)
梯度消失(Vanishing Gradient) 和梯度爆炸(Exploding Gradient) 是神经网络训练中的常见问题,特别是在深层神经网络(DNN)或递归神经网络(RNN)中。这两者主要与反向传播算法中的梯度计算有关,它们会导致模型在训练过程中收敛困难,甚至无法正确学习。
1. 梯度消失(Vanishing Gradient)
a. 定义
梯度消失问题是指在训练深层神经网络时,随着网络层数的增加,反向传播过程中早期层(靠近输入层)的梯度逐渐接近于零,导致这些层的参数几乎无法更新。这样,网络中的某些参数将无法被有效学习,模型训练停滞不前。
b. 数学解释
在神经网络中,反向传播算法用于通过链式法则(Chain Rule)计算损失函数相对于网络中每一层权重的偏导数。在深层网络中,链式法则会不断地乘以每一层的激活函数的导数。如果激活函数的导数非常小(小于 1),随着层数增加,梯度会逐层缩小。
对于每一层 l l l,反向传播的梯度计算公式为:
∂ L ∂ W [ l ] = ∂ L ∂ z [ l ] ⋅ ∂ z [ l ] ∂ W [ l ] \frac{\partial \mathcal{L}}{\partial W^{[l]}} = \frac{\partial \mathcal{L}}{\partial z^{[l]}} \cdot \frac{\partial z^{[l]}}{\partial W^{[l]}} ∂W[l]∂L=∂z[l]∂L⋅∂W[l]∂z[l]
如果层数很多,那么 ∂ L ∂ z [ l ] \frac{\partial \mathcal{L}}{\partial z^{[l]}} ∂z[l]∂L 中的每一项都会涉及前一层的梯度,最终导致梯度的乘积在反向传播过程中逐渐变小。这样在靠近输入层时,梯度几乎为 0,参数更新幅度极小,导致网络的训练效率大大降低,甚至无法训练。
c. 常见原因
-
激活函数问题:某些常用的激活函数(如 Sigmoid 和 Tanh)在输入值较大或较小时,它们的导数趋近于零,导致梯度在反向传播过程中缩小。例如:
- 对于 Sigmoid 函数:
Sigmoid ( z ) = 1 1 + e − z \text{Sigmoid}(z) = \frac{1}{1 + e^{-z}} Sigmoid(z)=1+e−z1
其导数:
d d z Sigmoid ( z ) = Sigmoid ( z ) ⋅ ( 1 − Sigmoid ( z ) ) \frac{d}{dz} \text{Sigmoid}(z) = \text{Sigmoid}(z) \cdot (1 - \text{Sigmoid}(z)) dzdSigmoid(z)=Sigmoid(z)⋅(1−Sigmoid(z))
当 z z z 非常大或非常小时,导数接近 0。
- 对于 Sigmoid 函数:
-
深度网络结构:网络层数越深,梯度乘积的次数越多,梯度消失的风险越大。
d. 梯度消失的影响
- 网络中的靠近输入层的权重更新非常缓慢甚至几乎不更新,导致这些层在训练中无法学习有效的表示。
- 网络的训练效率降低,模型很难收敛,特别是在处理复杂的任务时效果不佳。
e. 解决方法
-
使用合适的激活函数:
- ReLU(Rectified Linear Unit):ReLU 是一种在正值区域保持线性,而在负值区域输出为零的激活函数。它的导数在正区间为 1,因此能有效缓解梯度消失问题:
ReLU ( x ) = max ( 0 , x ) \text{ReLU}(x) = \max(0, x) ReLU(x)=max(0,x)
它的导数为:
d d x ReLU ( x ) = { 1 if x > 0 0 if x ≤ 0 \frac{d}{dx} \text{ReLU}(x) = \begin{cases} 1 & \text{if } x > 0 \\ 0 & \text{if } x \leq 0 \end{cases} dxdReLU(x)={10if x>0if x≤0 - 其他变种激活函数(如 Leaky ReLU、ELU)也能有效缓解梯度消失问题。
- ReLU(Rectified Linear Unit):ReLU 是一种在正值区域保持线性,而在负值区域输出为零的激活函数。它的导数在正区间为 1,因此能有效缓解梯度消失问题:
-
使用残差网络(ResNet):
- 残差网络(ResNet) 通过引入跳跃连接(Skip Connections),允许梯度在反向传播过程中绕过一些层,缓解了梯度消失问题。
-
批归一化(Batch Normalization):
- Batch Normalization 通过在每一层归一化激活值,使得输出的分布更加稳定,从而减少了梯度消失的发生。
2. 梯度爆炸(Exploding Gradient)
a. 定义
梯度爆炸是指在训练深层神经网络时,反向传播过程中梯度变得非常大,导致参数更新的幅度过大,最终导致模型的权重值溢出,损失函数出现异常情况(如 NaN),模型无法收敛。
b. 数学解释
梯度爆炸的问题与梯度消失相反。如果反向传播过程中每一层的梯度都大于 1,那么在链式法则的作用下,梯度会不断累积放大,最终导致前几层的梯度值过大,导致参数更新幅度过大,甚至可能使权重变得非常大。
在深层网络中,每层梯度的乘积计算公式为:
∂ L ∂ W [ l ] = ∂ L ∂ z [ l ] ⋅ ∂ z [ l ] ∂ W [ l ] \frac{\partial \mathcal{L}}{\partial W^{[l]}} = \frac{\partial \mathcal{L}}{\partial z^{[l]}} \cdot \frac{\partial z^{[l]}}{\partial W^{[l]}} ∂W[l]∂L=∂z[l]∂L⋅∂W[l]∂z[l]
如果梯度 ∂ L ∂ z [ l ] \frac{\partial \mathcal{L}}{\partial z^{[l]}} ∂z[l]∂L 的值非常大,那么靠近输入层的梯度将迅速增长,导致梯度爆炸。
c. 常见原因
-
权重初始化不当:如果网络的权重初始化得过大,那么在反向传播中,梯度的值可能会不断放大,导致梯度爆炸。
-
学习率过大:如果学习率设置过高,那么每次梯度更新的步长就会过大,导致权重迅速变大,引发梯度爆炸。
-
深度网络结构:在非常深的网络中,累积的梯度可能会迅速增大,导致前几层梯度的指数式增长。
d. 梯度爆炸的影响
- 梯度过大导致网络的权重更新幅度过大,网络的训练变得不稳定,甚至导致权重值溢出。
- 损失函数可能出现 NaN(非数值),训练中止或模型无法收敛。
e. 解决方法
-
梯度裁剪(Gradient Clipping):
- 梯度裁剪 是一种常用的方法,在每次反向传播时,如果梯度的值超过了某个阈值,就将其裁剪到该阈值范围内,防止梯度过大。这样可以有效避免梯度爆炸。
-
权重初始化:
- 使用适当的权重初始化方法可以避免梯度爆炸。常见的初始化方法包括:
- Xavier 初始化:适用于 Sigmoid 和 Tanh 激活函数,保持权重的方差在每一层中保持平衡。
- He 初始化:适用于 ReLU 激活函数,它通过缩小初始权重范围减少梯度爆炸的可能性。
- 使用适当的权重初始化方法可以避免梯度爆炸。常见的初始化方法包括:
-
降低学习率:
- 如果学习率过高,可以适当调低学习率,使梯度更新时的步长减小,减少爆炸的可能性。
-
使用批归一化(Batch Normalization):
- 批归一化 也可以缓解梯度爆炸。它在每一层对激活值进行标准化,防止输出值过大,从而限制了梯度的增大。
相关文章:

【AI知识点】梯度消失(Vanishing Gradient)和梯度爆炸(Exploding Gradient)
梯度消失(Vanishing Gradient) 和梯度爆炸(Exploding Gradient) 是神经网络训练中的常见问题,特别是在深层神经网络(DNN)或递归神经网络(RNN)中。这两者主要与反向传播算…...

在 ArkTS 网络请求中,重新封装一下 http 模块
在ArkTS中,重新封装http模块可以提供一个更简洁、更易于使用的API,同时隐藏底层细节,使开发者能够更专注于业务逻辑。以下是一个简单的示例,展示了如何重新封装鸿蒙系统的kit.NetworkKit中的http模块: // 创建一个新的…...

Microsoft 更新 Copilot AI,未來將能使用語音並看到你瀏覽的網頁
不過受到 Recall 事件的影響,更新的推出將更緩慢謹慎。 Microsoft 也同步對其網頁版及行動版的 Copilot AI 進行大改版。這主要是為網頁版換上了一個較為簡單乾淨的介面,並增加了一些新的功能,像是 Copilot Voice 能讓你與 AI 助手進行對話式…...

系统架构设计师-论文题(2021年下半年)
1.试题一 论面向方面的编程技术及其应用针对应用开发所面临的规模不断扩大、复杂度不断提升的问题,面向方面的编程Aspect Oriented Programming,AOP技术提供了一种有效的程序开发方法。为了理解和完成一个复杂的程序,通常要把程序进行功能划分和封装。一…...

selenium的webdriver常用方法和属性介绍(2)
selenium的webdriver介绍 从selenium导入webdriver模块,在pycharm中跳转webdriver模块的__init__.py文件,内容如图所示:从selenium包的子目录中导入了很多模块并做了重命名,用于支持如下 Chrome/Edge/Ie/Firefox/Safari浏览器。 使…...

73.【C语言】C/C++的内存区域划分
目录 1.内存里的几个区域 2.示意图 3.解释 1.内存里的几个区域 除了耳熟能详的栈区,堆区,静态区,还有内核空间,内存映射段,数据段,代码段 2.示意图 3.解释 栈区(stack area):局部变量,函数参数,返回数据,返回地址 内存映射段:将文件映射到内存 映射的含义: 如果看过李忠…...

k8s 中存储之 hostPath 卷
目录 1 hostPath 卷介绍 2 hostPath 卷实际应用操作 2.1 创建 pod 资源类型 2.2 修改清单文件增加 hostPath 对应的参数配置 2.3 查看是否创建 卷 和 pod 2.4 创建发布文件测试是否正常访问 1 hostPath 卷介绍 EmptyDir中数据不会被持久化,它会随着Pod的结束而销…...

Cherno游戏引擎笔记(73~90)
------- scene viewport ---------- 》》》》做了两件事:设置视口和设置相机比例 》》》》为什么要设置 m_ViewportSize 为 glm::vec2 而不是 ImVec2 ? 因为后面需要进行 ! 运算,而 ImVec2 没有这个运算符的定义,只有 glm::vec2 有这个运算…...

helm 测试卸载或删除(redis)
作者:程序那点事儿 日期:2024/02/07 18:30 查看redis 集群实例 kubectl get all -n redis 卸载集群实例 helm uninstall redis -n redis 删除pvc kubectl get pvc -n redis kubectl delete pvc redis-data-redis-master-0 redis-data-redis-replicas…...

关于Qt音乐播放器进度条拖拽无用的问题解决方案
在使用Qt编写音乐播放器的时候,进度条关联播放音乐基本是必须的。那么在设计的过程中你可能会碰到一个奇怪的问题就是拖拽进度条的时候,可能会报错如下: 然后音乐就卡着不动了。。。 connect(ui->volume_toolButton,&VolumeToolBtn::…...

Redis:初识Redis
Redis:初识Redis Redis 介绍分布式架构Redis特性安装Redis Redis 介绍 在官网中,是如下介绍Redis的: in-memory data store used by millions of developers as a cache, vector database, document database, streaming engine, and messag…...

【React】增量传输与渲染
增量传输 增量传输是一种高效的文件传输方式,其核心原理在于只传输文件中发生变化的部分,而不是整个文件。以下是增量传输的详细解析: 定义与原理: 增量传输通过比对原始文件和目标文件,找出两者之间的差异部分&#…...

【回眸】Tessy 单元测试软件使用指南(四)常见报错及解决方案与批量初始化的经验
前言 分析时Tessy的报错 1.fatal error: Tricore/Compilers/Compilers.h: No such file or directory 2.error: #error "Compiler unsupported" 3.warning: invalid suffix on literal;C11 requires a space between literal and string macro 4.error: unknown…...

2024 - 10 :生物药学: 如何获取对应核心靶点基因的激酶
如何获取对应核心靶点基因的激酶 步骤 1:收集蛋白质信息 获取 UniProt ID: 对于每个基因,使用 UniProt 数据库获取其对应的蛋白质信息,包括 UniProt ID、序列和功能注释。UniProt 网站:https://www.uniprot.org/ 示…...

STM32 HAL库UART查询方式实例
本文中介绍USART编程涵盖了三种主要方法,详细介绍STM32F407微控制器结合HAL库,通过UART的查询方式来实现一个实用的密码验证程序。提示用户键入一个字符作为密码。只有当用户精准地输入字符6时,系统才会反馈“密码正确”的确认信息。反之&…...

数据结构--线性表双向链表的实现
目录 思路设计 总体思维导图 插入部分 头插法尾插法 任意位置插入 删除部分 头结点 尾节点 中间节点 只有头结点且删除的就是头结点 编辑 清空链表部分 遍历清空链表的所有节点 不遍历清空 各部分代码 Main部分 MyListedList部分 IndexOutOfException部分 …...

第一个Flutter应用(一)
1、创建项目 1.1 新建 1.2 选择Flutter SDK的位置 1.3 项目名称 英文单词加下划线起名规范,其他默认即可。 1.4 点击运行 发生报错显示我们的JAVA版本不符合 1.5 更改版本设置 1.6 再次启动项目 2、分析页面代码 以下是lib/main.dart的源代码(为了阅…...

批量查询快递单号物流信息:高效掌握最后更新动态
在电商和物流行业蓬勃发展的今天,快递单号的物流信息追踪显得尤为重要。对于商家和客户来说,了解包裹的最后更新物流状态是确保货物安全、及时送达的关键。本文将介绍如何批量查询快递单号的物流信息,帮助您高效掌握每个包裹的最新动态。 1运…...

随着硬件水平的提升,LabVIEW有哪些过去的编程方法被淘汰掉了
随着硬件水平的不断提升,尤其是处理器性能、存储能力、通信速度等方面的飞跃,LabVIEW的一些早期编程方法逐渐被更高效、现代的编程技术所取代。以下是一些随着硬件升级而逐步淘汰的LabVIEW编程方法和技术: 1. 低效的数据流传输方式 过去由于…...

Leetcode 206.反转链表
题目链接:206. 反转链表 - 力扣(LeetCode) 题目描述: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 解题思路…...

基于springboot和vue.js 养老院管理系统设计与实现
博主介绍:专注于Java(springboot ssm springcloud等开发框架) vue .net php phython node.js uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆…...

高效数据处理:MapReduce与Hive的实战应用
文章目录 hive分析汇总互联网日志分析1.项目需求2.数据说明3.算法思路 用户电影推荐1.项目需求2.数据说明3.算法思路4.解题步骤 简单数据统计WordCount数据说明 疫情数据分析1.项目需求2.数据说明step1:创建ods层数据表step2:创建dwd层数据表step3:创建d…...

【含开题报告+文档+PPT+源码】基于springboot的迎新系统
开题报告 大学迎新系统是为了满足大学在新生入学时的信息化处理需求而开发的系统。在传统方式下,我们新生接待工作是需要新生报名表,就使得我们需要耗费大量的纸张,这将造成资源浪费。在接待新生的时候需要让新生勾选、填写大量的表格&#…...

C#-委托delegate
C#-委托delegate 通常情况下,函数内部需要调用其他函数来实现代码的重用,但这样有一个问题: 如果需要更换所调用的函数则需要对该函数的定义再次修改, 事实上,在程序运行过程中,函数也是作为一个存储在堆中…...

编译Thingsboard3.7.0的过程记录
1、首先去掉test测试,否则会有一堆问题,pom.xml修改如下: <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>${surefire.version}</ve…...

vulnhub-THE PLANETS-EARTH靶机
下载并导入靶机至VMWare,设置网络模式为NAT,开机 开启攻击机(kali),也设置为Nat模式,与靶机处于同一网段 扫描靶机ip Nmap 192.168.114.0/24 扫描网段内活跃的主机 可以推断靶机ip为192.168.114.129 扫描…...

【C语言】分支和循环(2)
🤔个人主页: 起名字真南 😙个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 关系操作符2 条件操作符3 逻辑操作符 :|| ,&& ,!3.1 逻辑取反运算符3.2 与运算符3.3 或运算符3.4 练习闰年判断3.5 短…...

Python数据分析-远程办公与心理健康分析
一、研究背景 随着信息技术的飞速发展和全球化的推进,远程工作(Remote Work)成为越来越多企业和员工的选择。尤其是在2020年新冠疫情(COVID-19)爆发后,全球范围内的封锁措施使得远程工作模式迅速普及。根据…...

LabVIEW提高开发效率技巧----使用动态事件
在LabVIEW开发过程中,用户交互行为可能是多样且不可预知的。为应对这些变化,使用动态事件是一种有效的策略。本文将从多个角度详细介绍动态事件的概念及其在LabVIEW开发中的应用技巧,并结合实际案例,说明如何通过动态事件提高程序…...

【STM32开发之寄存器版】(五)-窗口看门狗WWDG
一、前言 窗口看门狗简介: 窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新,看门狗电路在达到预置的时间周期时,会产生一个M…...