【梯度消失|梯度爆炸】Vanishing Gradient|Exploding Gradient——为什么我的卷积神经网络会不好呢?
【梯度消失|梯度爆炸】Vanishing Gradient|Exploding Gradient——为什么我的卷积神经网络会不好呢?
【梯度消失|梯度爆炸】Vanishing Gradient|Exploding Gradient——为什么我的卷积神经网络会不好呢?
文章目录
- 【梯度消失|梯度爆炸】Vanishing Gradient|Exploding Gradient——为什么我的卷积神经网络会不好呢?
- 1.什么是梯度消失和梯度爆炸?
- 梯度消失
- 梯度爆炸
- 2.梯度消失和梯度爆炸的产生原因
- 3.避免梯度消失和梯度爆炸的方法
- 3.1合理的权重初始化
- 3.2使用合适的激活函数
- 3.3 梯度裁剪(Gradient Clipping)
- 3.4 使用正则化方法
- 3.5使用归一化技术
- 3.6使用合适的优化器
- 4. 梯度消失和梯度爆炸的检测
- 5. 总结与实施方案
1.什么是梯度消失和梯度爆炸?
梯度消失
- 定义:梯度消失指的是在反向传播过程中,网络的梯度值逐渐变得非常小,接近于零,导致模型参数更新缓慢或根本无法更新。
- 问题:深层网络的前几层由于梯度变得非常小,几乎不会更新,使得这些层无法学习有效的特征,导致训练停滞。
- 典型场景:梯度消失常发生在使用饱和激活函数(如 sigmoid 或 tanh)的大深度网络中。
梯度爆炸
- 定义:梯度爆炸是指在反向传播过程中,梯度值逐渐变得非常大,导致模型的参数更新过大,可能使得权重发散或模型无法收敛。
- 问题:当梯度过大时,模型参数会被大幅度更新,导致模型不稳定,损失函数无法收敛。
- 典型场景:
梯度爆炸通常发生在长序列的递归神经网络(RNN)中,或深层网络中层数太多,梯度没有合理控制。
2.梯度消失和梯度爆炸的产生原因
这两类问题的根本原因来自反向传播中链式法则的应用。在反向传播过程中,梯度从输出层向输入层传播,当网络层数较深时,会出现:
- 梯度逐层乘积变小,导致梯度消失。
- 梯度逐层乘积变大,导致梯度爆炸。
尤其是当权重初始化不当或激活函数的导数值处于某个饱和区间时,这种现象更为严重。例如:
- 对于
sigmoid
激活函数,其导数在接近 0 和 1 的区间非常小,容易导致梯度消失。 - 过大或不合理的权重初始值,可能导致梯度的指数级增长,导致梯度爆炸。
3.避免梯度消失和梯度爆炸的方法
3.1合理的权重初始化
不合理的权重初始化可能导致梯度的过度放大或缩小。常用的初始化方法可以有效减少梯度消失或爆炸的风险。
- Xavier/Glorot 初始化:适用于
sigmoid
和tanh
激活函数的网络,权重会根据输入和输出节点数的平方根进行缩放。 - He 初始化:适用于 ReLU 激活函数的网络,权重根据输入节点数进行缩放。
代码示例(PyTorch 中使用 Xavier/He 初始化):
import torch
import torch.nn as nn
import torch.nn.functional as Fclass SimpleModel(nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.fc1 = nn.Linear(784, 256)self.fc2 = nn.Linear(256, 10)# 使用 Xavier 初始化nn.init.xavier_uniform_(self.fc1.weight)nn.init.xavier_uniform_(self.fc2.weight)# 对 ReLU 激活函数可以使用 He 初始化# nn.init.kaiming_uniform_(self.fc1.weight, nonlinearity='relu')def forward(self, x):x = F.relu(self.fc1(x))x = self.fc2(x)return x
3.2使用合适的激活函数
- ReLU:ReLU(Rectified Linear Unit)激活函数能够减轻梯度消失问题,因为它的导数在大部分区间内为 1,避免了梯度消失。然而,ReLU 可能存在“神经元死亡”问题(当输入小于 0 时输出恒为 0,导致该神经元永不激活)。
- Leaky ReLU:通过引入负值的“泄露”,避免了神经元死亡问题。
- ELU、SELU:这些激活函数也可以在一定程度上缓解梯度消失问题。
3.3 梯度裁剪(Gradient Clipping)
梯度裁剪是应对梯度爆炸的常用方法,尤其在递归神经网络(RNN)中使用较为广泛。通过限制梯度的最大范数,确保梯度不会无限增大。
代码示例(PyTorch 中进行梯度裁剪):
# 假设有一个损失函数 loss
loss.backward()# 在反向传播后进行梯度裁剪,设定最大范数为 1.0
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)# 更新权重
optimizer.step()
3.4 使用正则化方法
- L2 正则化(权重衰减):通过在损失函数中加入权重参数的惩罚项,防止权重变得过大,间接避免梯度爆炸。
- Dropout:通过随机丢弃部分神经元,避免过拟合,也有助于减少梯度爆炸。
代码示例(在 Keras 中添加 L2 正则化):
from tensorflow.keras import regularizers# 添加 L2 正则化到模型层
model = tf.keras.models.Sequential([tf.keras.layers.Dense(128, activation='relu', kernel_regularizer=regularizers.l2(0.01)),tf.keras.layers.Dense(10, activation='softmax')
])
3.5使用归一化技术
Batch Normalization:批量归一化在每一层计算的过程中标准化输出,使得数据具有均值为 0,方差为 1 的分布。这可以有效缓解梯度消失和梯度爆炸问题,同时加速模型收敛。
代码示例(在 PyTorch 中添加 Batch Normalization):
class SimpleModelWithBN(nn.Module):def __init__(self):super(SimpleModelWithBN, self).__init__()self.fc1 = nn.Linear(784, 256)self.bn1 = nn.BatchNorm1d(256) # 添加 Batch Normalizationself.fc2 = nn.Linear(256, 10)def forward(self, x):x = F.relu(self.bn1(self.fc1(x))) # 在激活函数前加入归一化x = self.fc2(x)return x
3.6使用合适的优化器
- 自适应学习率优化器:如 Adam、RMSprop 等优化器,能够动态调整每个参数的学习率,防止某些参数的梯度过大或过小,有效应对梯度爆炸和梯度消失问题。
代码示例(使用 Adam 优化器):
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
4. 梯度消失和梯度爆炸的检测
为了及时发现梯度消失和梯度爆炸问题,可以监控每一层的梯度变化。通过监测每个 epoch 中的梯度,可以提前发现问题并采取措施。
代码示例(监控 PyTorch 中每一层的梯度):
for name, param in model.named_parameters():if param.grad is not None:print(f'Layer: {name}, Grad Norm: {param.grad.norm()}')
5. 总结与实施方案
避免梯度消失:
- 使用非饱和激活函数如 ReLU、Leaky ReLU、ELU。
- 采用合适的权重初始化方法(Xavier 初始化、He 初始化)。
- 在深层网络中使用 Batch Normalization。
避免梯度爆炸:
- 使用梯度裁剪技术,限制梯度的最大范数。
- 使用正则化技术,如 L2 正则化。
- 使用自适应学习率优化器如 Adam 或 RMSprop。
相关文章:
【梯度消失|梯度爆炸】Vanishing Gradient|Exploding Gradient——为什么我的卷积神经网络会不好呢?
【梯度消失|梯度爆炸】Vanishing Gradient|Exploding Gradient——为什么我的卷积神经网络会不好呢? 【梯度消失|梯度爆炸】Vanishing Gradient|Exploding Gradient——为什么我的卷积神经网络会不好呢? 文章目录 【梯度消失|梯度爆炸】Vanishing Gradi…...
MAC 地址简化概念(有线 MAC 地址、无线 MAC 地址、MAC 地址的随机化)
一、MAC 地址 MAC 地址(Media Access Control Address),即媒体访问控制地址,也称为物理地址、硬件地址或链路层地址 MAC 地址有时也被称为物理地址,但这并不意味着 MAC 地址属于网络体系结构中的物理层,它…...

SQL_yog安装和使用演示--mysql三层结构
目录 1.什么是SQL_yog 2.下载安装 3.页面介绍 3.1链接主机 3.2创建数据库 3.3建表操作 3.4向表里面填内容 3.5使用指令查看效果 4.连接mysql的指令 4.1前提条件 4.2链接指令 编辑 4.3创建时的说明 4.4查看是不是连接成功 5.mysql的三层结构 1.什么是SQL_yog 我…...
蓝桥杯-STM32G431RBT6(解决LCD与LED引脚冲突的问题)
一、LCD与LED为什么会引脚冲突 LCD与LED引脚共用。 网上文章是在LCD_WriteRAM、LCD_WriteRAM_Prepare、LCD_WriteReg中添加,但问题并没有解决。 二、使用步骤 在如下函数中加入uint16_t tempGPIOC->ODR; GPIOC->ODRtemp; LCD_Init(); void LCD_C…...
ESP-01S,ESP8266设置客户端透传模式
ESP-01S,ESP8266设置透传(透明传输)模式 例子 ATCWMODE_DEF1 //station模式 ATRST //重启 ATCWLAP //查看周围热点 ATCWJAP_DEF"ssid","password" //连接热点 ATCIFSR //查看ip ATCIPSTA_DEF"192.168.82.66","192.168.6.1&…...

NFT Insider #147:Sandbox 人物化身九月奖励上线;Catizen 付费用户突破百万
市场数据 加密艺术及收藏品新闻 Doodles 动画特别剧《Dullsville and The Doodleverse》在多伦多国际电影节首映 Doodles 最近在多伦多国际电影节(TIFF)首映了其动画特别剧《Dullsville and The Doodleverse》,这是该品牌的一个重要里程碑。…...

103.WEB渗透测试-信息收集-FOFA语法(3)
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:102.WEB渗透测试-信息收集-FOFA语法(2) FOFA使用实例 组件框架 …...

SpringDataJPA基础增删改查
添加:save(对象) 删除:delete(主键或者带有主键的对象) 修改:save(对象) 对象中没有id,执行添加操作 对象中有id id不存在:执行添加 id存在: 其余数据…...

好代码网同款wordpress主题,完全开源无加密可二开
这个其实就是好代码网站的早期整站打包代码,当时售价198的,现在里面的部分数据已经过期了,只能展示效果,没法下载。所以就只当做主题分享给大家使用。 资源下载类网站目前还是红利期,搞个特价主机和域名,再…...
如何在@GenericGenerator中显式指定schema
现在的情况是,在MySQL中有db1和db2两个数据库。项目使用Hibernate,可同时访问db1和db2,默认数据库为db1。表table2在db2中。且table2的主键名为ids,是自增长字段(Auto Increment)。 table2和ids的定义为&a…...

感知器神经网络
1、原理 感知器是一种前馈人工神经网络,是人工神经网络中的一种典型结构。感知器具有分层结构,信息从输入层进入网络,逐层向前传递至输出层。根据感知器神经元变换函数、隐层数以及权值调整规则的不同,可以形成具有各种功能特点的…...

【C++】——继承详解
目录 1、继承的概念与意义 2、继承的使用 2.1继承的定义及语法 2.2基类与派生类间的转换 2.3继承中的作用域 2.4派生类的默认成员函数 <1>构造函数 <2>拷贝构造函数 <3>赋值重载函数 <4析构函数 <5>总结 3、继承与友元 4、继承与静态变…...
RocketMQ 消费方式
在消息传递系统中,“推(Push)”和“拉(Pull)”是两种不同的消息消费方式,RocketMQ 也支持这两种模式。下面是对这两种模式的详细解释: 1. 推模式(Push Model) 模式简介…...

初始爬虫7
针对数据提取的项目实战: 补充初始爬虫6的一个知识点: etree.tostring能够自动补全html缺失的标签,显示原始的HTML结构 # -*- coding: utf-8 -*- from lxml import etreetext <div> <ul> <li class"item-1">…...
深入理解Appium定位策略与元素交互
深入理解Appium定位策略与元素交互 在移动应用测试领域,Appium作为一款流行的跨平台自动化测试工具,其强大而灵活的元素定位能力对于构建稳定、高效的测试脚本至关重要。本文将深入探讨Appium支持的各种定位方法,并分享如何通过高级技巧和最…...

java基础面试题总结
java基础面试题总结 目录 前言 1. JVM vs JDK vs JRE的了解 2. 谈谈你对编程、编译、运行的理解 3. 什么是字节码?采用字节码的好处是什么? 5. java中的注解有几种,分别是什么? 6. 字符型常量和字符串常量 7.标识符和关键字的认识 8. 泛型ÿ…...
Typescript 的类型断言
类型断言(Type Assertion)是 TypeScript 中的一种机制,允许开发者手动指定某个值的类型,而不是让 TypeScript 自动推断类型。类型断言通常用于在编译时告诉 TypeScript 编译器某个值的具体类型,以便在后续代码中进行类…...
【设计模式】单例模式详解及应用实例
单例模式(Singleton Pattern)是一种创建型设计模式,保证一个类在整个程序的生命周期中只有一个实例,并提供一个全局访问点。单例模式广泛用于需要全局唯一实例的场景,比如数据库连接池、日志对象、线程池等。 单例模式…...

学习图解算法 使用C语言
图解算法 使用C语言 也就是通过C语言实现各种算法 链接:百度云盘 提取码:1001...
基于Netty实现TCP客户端:封装断线重连、连接保持
文章目录 引言I 基于Netty实现TCP客户端基于 Netty 创建客户端 时序图封装思路NettyClient 封装II 客户端的断线重连本质使用过程中断线重连重试策略III 心跳机制心跳检测处理器心跳机制实现逻辑IV 同步等待消息返回V 工具ForkJoinPoolByteConvertUtilsee also处理假死把handle…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...