当前位置: 首页 > 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…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...