深度学习 精选笔记(8)梯度消失和梯度爆炸
学习参考:
- 动手学深度学习2.0
- Deep-Learning-with-TensorFlow-book
- pytorchlightning
①如有冒犯、请联系侵删。
②已写完的笔记文章会不定时一直修订修改(删、改、增),以达到集多方教程的精华于一文的目的。
③非常推荐上面(学习参考)的前两个教程,在网上是开源免费的,写的很棒,不管是开始学还是复习巩固都很不错的。
深度学习回顾,专栏内容来源多个书籍笔记、在线笔记、以及自己的感想、想法,佛系更新。争取内容全面而不失重点。完结时间到了也会一直更新下去,已写完的笔记文章会不定时一直修订修改(删、改、增),以达到集多方教程的精华于一文的目的。所有文章涉及的教程都会写在开头、一起学习一起进步。
一、数值稳定性的重要性
到目前为止,实现的每个模型都是根据某个预先指定的分布来初始化模型的参数。
有人会认为初始化方案是理所当然的,忽略了如何做出这些选择的细节。甚至有人可能会觉得,初始化方案的选择并不是特别重要。
相反,初始化方案的选择在神经网络学习中起着举足轻重的作用, 它对保持数值稳定性至关重要。 此外,这些初始化方案的选择可以与非线性激活函数的选择有趣的结合在一起。 选择哪个函数以及如何初始化参数可以决定优化算法收敛的速度有多快。 糟糕选择可能会导致我们在训练时遇到梯度爆炸或梯度消失。
考虑一个具有 𝐿 层、输入 𝐱和输出 𝐨的深层网络。 每一层 𝑙由变换 𝑓𝑙定义, 该变换的参数为权重 𝐖(𝑙) , 其隐藏变量是 𝐡(𝑙)(令 𝐡(0)=𝐱)。 网络可以表示为:
如果所有隐藏变量和输入都是向量, 可以将 𝐨关于任何一组参数 𝐖(𝑙) 的梯度写为下式,该梯度是 𝐿−𝑙
个矩阵 𝐌(𝐿)⋅…⋅𝐌(𝑙+1)
与梯度向量 𝐯(𝑙)
的乘积。
因此,上面公式计算的结果容易受到数值下溢问题的影响. 当将太多的概率乘在一起时,这些问题经常会出现。 在处理概率时,一个常见的技巧是切换到对数空间, 即将数值表示的压力从尾数转移到指数。 不幸的是,上面的问题更为严重: 最初,矩阵 𝐌(𝑙)
可能具有各种各样的特征值。 他们可能很小,也可能很大; 他们的乘积可能非常大,也可能非常小。
不稳定梯度带来的风险不止在于数值表示; 不稳定梯度也威胁到优化算法的稳定性。
可能面临一些问题:
梯度爆炸(gradient exploding)问题
: 参数更新过大,破坏了模型的稳定收敛;梯度消失(gradient vanishing)问题
: 参数更新过小,在每次更新时几乎不会移动,导致模型无法学习。
二、梯度消失
在深度神经网络中,梯度消失指的是在反向传播过程中,梯度逐渐变小并接近零,导致较深层的网络参数无法得到有效更新,从而影响模型的训练效果。
梯度消失通常发生在使用激活函数导数具有较小值
的情况下,尤其是在使用 sigmoid 或 tanh 激活函数时。
sigmoid函数 1/(1+exp(−𝑥))
很流行, 因为它类似于阈值函数。 由于早期的人工神经网络受到生物神经网络的启发, 神经元要么完全激活要么完全不激活(就像生物神经元)的想法很有吸引力。 然而,它却是导致梯度消失问题的一个常见的原因。下图是sigmoid函数变化图和梯度变化图。
%matplotlib inline
import tensorflow as tf
from d2l import tensorflow as d2lx = tf.Variable(tf.range(-8.0, 8.0, 0.1))
with tf.GradientTape() as t:y = tf.nn.sigmoid(x)
d2l.plot(x.numpy(), [y.numpy(), t.gradient(y, x).numpy()],legend=['sigmoid', 'gradient'], figsize=(4.5, 2.5))
当sigmoid函数的输入很大或是很小时,它的梯度都会消失。 此外,当反向传播通过许多层时,除非在刚刚好的地方, 这些地方sigmoid函数的输入接近于零,否则整个乘积的梯度可能会消失。 当网络有很多层时,除非很小心,否则在某一层可能会切断梯度。
事实上,这个问题曾经困扰着深度网络的训练。 因此,更稳定的ReLU系列函数已经成为从业者的默认选择(虽然在神经科学的角度看起来不太合理)。
三、梯度爆炸
梯度爆炸则是指在反向传播过程中,梯度变得非常大,超过了数值范围,导致参数更新过大,模型无法稳定训练。
梯度爆炸通常出现在网络层数较多、权重初始化不当或者学习率设置过高
的情况下。
相反,梯度爆炸可能同样令人烦恼。 为了更好地说明这一点,生成100个高斯随机矩阵,并将它们与某个初始矩阵相乘。 对于我们选择的尺度(方差 𝜎²=1
),矩阵乘积发生爆炸。 当这种情况是由于深度网络的初始化所导致时,导致没有机会让梯度下降优化器收敛。
M = tf.random.normal((4, 4))
print('一个矩阵 \n', M)
for i in range(100):M = tf.matmul(M, tf.random.normal((4, 4)))print('乘以100个矩阵后\n', M.numpy())
一个矩阵 tf.Tensor(
[[ 3.7436965 2.652792 0.5994665 -0.17366047][ 0.6720035 -0.7297903 0.3705189 -0.5043682 ][ 0.53814566 -0.94948226 0.09689955 -0.4441989 ][ 0.6737587 0.41651404 -0.9230542 0.1903977 ]], shape=(4, 4), dtype=float32)
乘以100个矩阵后[[-1.9263415e+26 1.5658991e+27 3.4174752e+26 -9.1476850e+25][ 1.4916346e+24 -1.2148971e+25 -2.6495698e+24 7.0983965e+23][ 2.5503458e+25 -2.0726612e+26 -4.5202026e+25 1.2112884e+25][ 1.2258523e+25 -9.9649782e+25 -2.1730161e+25 5.8238054e+24]]
四、解决梯度消失和梯度爆炸的方法
梯度裁剪(Gradient Clipping)
:限制梯度的大小,防止梯度爆炸。使用恰当的激活函数
:如 ReLU 可以缓解梯度消失问题。参数初始化
:使用合适的参数初始化方法,如 Xavier 或 He 初始化。批归一化(Batch Normalization)
:通过规范化每层输入,有助于缓解梯度消失和梯度爆炸问题。残差连接(Residual Connections)
:在深层网络中使用残差连接有助于减轻梯度消失问题。
五、模型参数初始化
解决(或至少减轻)上述问题(梯度消失、梯度爆炸)的一种方法是进行参数初始化, 优化期间的注意和适当的正则化也可以进一步提高稳定性。
选择适当的参数初始化方法取决于网络的结构、激活函数的选择以及具体任务的要求。良好的参数初始化可以帮助加速模型的收敛速度,提高模型的性能,并有助于避免梯度消失和梯度爆炸等问题。
1.默认初始化
使用正态分布来初始化权重值。如果不指定初始化方法, 框架将使用默认的随机初始化方法,对于中等难度的问题,这种方法通常很有效。
2.Xavier初始化
Xavier初始化(Xavier Initialization):也称为Glorot初始化,根据输入和输出的神经元数量来初始化参数。这种方法旨在使每一层的激活值保持在一个合理的范围内,有助于避免梯度消失和梯度爆炸问题。
3.He初始化(He Initialization)
与Xavier初始化类似,但是在计算方差时只考虑了输入神经元的数量,适用于使用ReLU激活函数的网络。
4.正交初始化(Orthogonal Initialization)
通过生成一个正交矩阵来初始化权重,有助于避免梯度消失和梯度爆炸问题。
5.自适应方法(Adaptive Methods)
如自适应矩估计(Adagrad)、RMSProp、Adam等优化算法,这些算法在训练过程中会自动调整学习率,有助于更好地初始化参数。
6.其它
深度学习框架通常实现十几种不同的启发式方法。 此外,参数初始化一直是深度学习基础研究的热点领域。 其中包括专门用于参数绑定(共享)、超分辨率、序列模型和其他情况的启发式算法。
相关文章:

深度学习 精选笔记(8)梯度消失和梯度爆炸
学习参考: 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增),以达到集多方教程的精华于一文的目的。 ③非常推荐上面(学习参考&#x…...

linux操作docker
docker地址 官方地址 centos7安装docker 卸载旧版本docker sudo //在前面表示以管理员权限操作yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine安装docker //安装所需资…...
k8s Pod 进阶(资源限制,健康检查探针详解,启动退出,pod生命周期,)
目录 资源限制 查看资源控制字段 Pod 资源限制方式 Pod 和容器中定义资源请求和限制的具体字段 CPU资源单位 内存资源单位 示例 健康检查(探针) 探针的三种规则 存活探针(Liveness Probe) 就绪探针(Readines…...
SpringBoot整合ActiveMQ步骤
SpringBoot整合ActiveMQ主要涉及以下几个步骤: 添加依赖:在SpringBoot项目的pom.xml文件中添加ActiveMQ的依赖。 <dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-spring</artifactId><ver…...
MySQL的单表和多表查询
我们在前面曾构建过三个用于实验的表格,下面将基于这三个表进行实践。 # 建立一个用于实验的三个表格 mysql> create table emp (-> empno varchar(10),-> ename varchar(50),-> job varchar(50),-> mgr int,-> hiredate timestamp,-&…...

攻防世界例题wp
1.看到_wakeup()函数第一反应要么触发,要么绕过在这里绕过 2.构造payload实例化一个对象后反序列化 3构造脚本如下: 4.因为它是一个绕过的方法所以我们要使用绕过的方法。 5.继续构造payload将上图的1换成2进行绕过 最终的payload为 O:4:"xctf…...

仿牛客网项目---显示评论和添加评论功能的实现
这篇文章,我来介绍一下我的项目中的另外一个功能:显示评论和添加评论。 其实这两个功能都不怎么重要,我感觉最重要的应该是用户注册登录功能,这个也了解一下,知道这么一回事儿就好。 首先设计DAO层。 Mapper public …...

idea集成git详解教程(实用篇)
0.Git常用命令 Git常用命令-CSDN博客 1.下载git Git - Downloads 一路傻瓜式安装即可(NEXT) 2.软件测试 在Windows桌面空白处,点击鼠标右键,弹出右键菜单 Git软件安装后,会在右键菜单中增加两个菜单 Git GUI He…...

搭建LNMP环境并配置个人博客系统
LNMP是Linux(操作系统)、Nginx(Web服务器)、MySQL(数据库)和PHP(脚本解释器)的组合,常用于部署高性能的动态网站,如WordPress等博客平台 一、安装Linux操作系…...

为什么网络安全缺口这么大,还是这么缺网络安全工程师?
为啥网安领域缺口多达300多万人,但网安工程师(白帽黑客)却很少,难道又是砖家在忽悠人??? 主要原因为这三点: 首先是学校的原因,很多学校网络安全课程用的还都是十年前的老教材&…...
创新洞察|诺奖获得者埃德蒙·费尔普斯谈未来:中国创新从何而来?
当下,全球宏观经济形势正在发生深刻变化,以创新推进高质量发展被推向前所未有的高度。作为多年与中国经济结伴而行的经济学家、2006年诺贝尔经济学奖得主,埃德蒙费尔普斯认为:创新无处不在,而中国人具有巨大的创新活力…...

SpringMVC 学习(六)之视图
目录 1 SpringMVC 视图介绍 2 JSP 视图 3 Thymeleaf 视图 4 FreeMarker 视图 5 XSLT 视图 6 请求转发与重定向 6.1 请求转发 (Forward) 6.2 重定向 (Redirect) 7 视图控制器 (view-controller) 1 SpringMVC 视图介绍 在 SpringMVC 框架中,视图可以是一个 J…...

ROS 2基础概念#1:计算图(Compute Graph)| ROS 2学习笔记
在ROS中,计算图(ROS Compute Graph)是一个核心概念,它描述了ROS节点之间的数据流动和通信方式。它不仅仅是一个通信网络,它也反映了ROS设计哲学的核心——灵活性、模块化和可重用性。通过细致探讨计算图的高级特性和实…...
一本通 1403:素数对
在判断素数对的两个数是否都为素数时可以只判断数的一半 #include<bits/stdc.h> using namespace std; bool su(int a,int b){ for(int i2;i<sqrt(a);i){ if(a%i0){ return 0; } } for(int i2;i<sqrt(b);i){ if(…...

华为---RSTP(四)---RSTP的保护功能简介和示例配置
目录 1. 技术背景 2. RSTP的保护功能 3. BPDU保护机制原理和配置命令 3.1 BPDU保护机制原理 3.2 BPDU保护机制配置命令 3.3 BPDU保护机制配置步骤 4. 根保护机制原理和配置命令 4.1 根保护机制原理 4.2 根保护机制配置命令 4.3 根保护机制配置步骤 5. 环路保护机…...
Android基础控件介绍
在Android应用程序开发中,使用基础控件是非常常见的。这些控件允许您在用户界面中显示文本、图像、按钮等元素,以及接收用户输入。本文将介绍几种常见的基础控件,并给出每个控件在示例XML中使用的属性的详细说明。 1. TextView TextView 是…...

【总结】Maxwell学习笔记
1.Maxwell简介 Maxwell 是一款用Java编写的MySQL变更数据抓取软件,它会实时监控Mysql数据库的数据变更操作(包括insert、update、delete),并将变更数据以 JSON 格式发送给 Kafka、Kinesi等流数据处理平台 官网地址:M…...
AFL fork server和fuzzer的交互
看了一些博客,都是在说fuzzer和fork server进行交互,由fork server fork出子进程来执行程序,但是不太明白这两者到底是如何在代码层面进行交互的。 run_target中有这么一段代码,大概意思是fuzzer给fork server传递prev_timed_out…...

Java SE:多线程(Thread)
1. 线程两个基本概念 并发:即线程交替运行多个指令并行:即多个线程同时运行指令 并发并行不矛盾,两者可同时发生,即多个线程交替运行指令 2. 多线程3种实现方式 2.1 直接创建线程对象 /*** 方式1:* 1. 创建thread类的…...

你敢信?软件测试万能面试脚本他来了?
写在前面: 过春节了,四舍五入接下来马上要年底了,新一波的跳槽旺季马上来临,不知道你是不是已经安于现状,还是蓄势待发呢?最近我和我的哈皮群友们一顿讨论,拟写了大家可能会遇到的面试情况&…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

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

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...