当前位置: 首页 > news >正文

【梯度消失|梯度爆炸】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 初始化:适用于 sigmoidtanh 激活函数的网络,权重会根据输入和输出节点数的平方根进行缩放。
  • 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 消费方式

在消息传递系统中&#xff0c;“推&#xff08;Push&#xff09;”和“拉&#xff08;Pull&#xff09;”是两种不同的消息消费方式&#xff0c;RocketMQ 也支持这两种模式。下面是对这两种模式的详细解释&#xff1a; 1. 推模式&#xff08;Push Model&#xff09; 模式简介…...

初始爬虫7

针对数据提取的项目实战&#xff1a; 补充初始爬虫6的一个知识点&#xff1a; etree.tostring能够自动补全html缺失的标签&#xff0c;显示原始的HTML结构 # -*- coding: utf-8 -*- from lxml import etreetext <div> <ul> <li class"item-1">…...

深入理解Appium定位策略与元素交互

深入理解Appium定位策略与元素交互 在移动应用测试领域&#xff0c;Appium作为一款流行的跨平台自动化测试工具&#xff0c;其强大而灵活的元素定位能力对于构建稳定、高效的测试脚本至关重要。本文将深入探讨Appium支持的各种定位方法&#xff0c;并分享如何通过高级技巧和最…...

java基础面试题总结

java基础面试题总结 目录 前言 1. JVM vs JDK vs JRE的了解 2. 谈谈你对编程、编译、运行的理解 3. 什么是字节码?采用字节码的好处是什么? 5. java中的注解有几种&#xff0c;分别是什么&#xff1f; 6. 字符型常量和字符串常量 7.标识符和关键字的认识 8. 泛型&#xff…...

Typescript 的类型断言

类型断言&#xff08;Type Assertion&#xff09;是 TypeScript 中的一种机制&#xff0c;允许开发者手动指定某个值的类型&#xff0c;而不是让 TypeScript 自动推断类型。类型断言通常用于在编译时告诉 TypeScript 编译器某个值的具体类型&#xff0c;以便在后续代码中进行类…...

【设计模式】单例模式详解及应用实例

单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;保证一个类在整个程序的生命周期中只有一个实例&#xff0c;并提供一个全局访问点。单例模式广泛用于需要全局唯一实例的场景&#xff0c;比如数据库连接池、日志对象、线程池等。 单例模式…...

学习图解算法 使用C语言

图解算法 使用C语言 也就是通过C语言实现各种算法 链接&#xff1a;百度云盘 提取码&#xff1a;1001...

基于Netty实现TCP客户端:封装断线重连、连接保持

文章目录 引言I 基于Netty实现TCP客户端基于 Netty 创建客户端 时序图封装思路NettyClient 封装II 客户端的断线重连本质使用过程中断线重连重试策略III 心跳机制心跳检测处理器心跳机制实现逻辑IV 同步等待消息返回V 工具ForkJoinPoolByteConvertUtilsee also处理假死把handle…...

手游刚开服就被攻击怎么办?如何防御DDoS?

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

前端导出带有合并单元格的列表

// 导出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库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

10-Oracle 23 ai Vector Search 概述和参数

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

基于 TAPD 进行项目管理

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

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...