深度学习 精选笔记(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.其它

深度学习框架通常实现十几种不同的启发式方法。 此外,参数初始化一直是深度学习基础研究的热点领域。 其中包括专门用于参数绑定(共享)、超分辨率、序列模型和其他情况的启发式算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/712484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

带你快速初步了解Python列表

1.列表 列表主要是用来存储多个数据,是有序的集合 2.创建列表 """ 语法:变量名 [数据1,数据2,数据3......] 注意:列表中的数据类型可以是各种不同的数据类型 """ 创建空列表 list1 [] print(list1) …

Gitlab: 私有化部署

目录 1. 说明 2. 资源要求 3. 安装 4. 配置实践 4.1 服务器 4.2 人员与项目 4.2 部署准备 4.2.1 访问变量及用户账号设置 4.2.2 Runner设置 4.2.3 要点 5. 应用项目 CI/CD 6. 参考 1. 说明 gitlab是一个强大且免费的代码管理/部署工具,能统一集成代码仓…

AngularJS入门

1. AngularJS简介 AngularJS是一个JavaScript框架,用js编写的库 <script src="https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"></script> <!-- 放在<body> 元素的底部。提高网页加载速度 -->1.1. AngularJS 扩展了 HTML …

Freesia项目目录结构

目录结构 前端目录&#xff1a; &#xff08;目录结构来自layui-vue-admin&#xff09; src文件下 api&#xff08;前端请求后端服务的路由&#xff09;assert&#xff08;一些内置或必要的资源文件&#xff09;layouts&#xff08;全局框架样式组件&#xff09;router&…

Unity(第十九部)射线

在Unity中&#xff0c;射线检测通常用于碰撞检测&#xff0c;比如&#xff1a;在游戏中&#xff0c;开枪射击时&#xff0c;需要判断击中的物体、子弹击中的位置&#xff1b;用鼠标来控制物体的移动&#xff1b;用鼠标拾取某个物体。 射线&#xff0c;顾名思义&#xff0c;在数…

【转载】深度学习笔记——详解损失函数

原文链接: https://blog.csdn.net/weixin_53765658/article/details/136360033 CSDN账号: Purepisces github账号: purepisces 希望大家可以Star Machine Learning Blog https://github.com/purepisces/Wenqing-Machine_Learning_Blog 损失函数 根据您使用的神经网络类型和数…

第四十七回 一丈青单捉王矮虎 宋公明二打祝家庄-强大而灵活的python装饰器

四面全是埋伏&#xff0c;宋江和众人一直绕圈跑不出去。正在慌乱之时&#xff0c;石秀及时赶到&#xff0c;教大家碰到白杨树就转弯走。走了一段时间&#xff0c;发现围的人越来越多&#xff0c;原来祝家庄以灯笼指挥号令。花荣一箭射下来红灯龙&#xff0c;伏兵自己就乱起来了…

Northwestern University-844计算机科学与技术/软件工程-复试注意事项【考研复习】

本文提到的西北大学是位于密歇根湖泊畔的西北大学。西北大学&#xff08;英语&#xff1a;Northwestern University&#xff0c;简称&#xff1a;NU&#xff09;是美国的一所著名私立研究型大学。它由九人于1851年创立&#xff0c;目标是建立一所为西北领地地区的人服务的大学。…

【力扣白嫖日记】550.游戏玩法分析IV

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 550.游戏玩法分析IV 表&#xff1a;Activity 列名类型player_idintdevice_idintevent_datedategames_played…

从 iOS 设备恢复数据的 20 个iOS 数据恢复工具

作为 iPhone、iPad 或 iPod 用户&#xff0c;您可能普遍担心自己可能会丢失存储在珍贵 iOS 设备中的所有宝贵数据。数据丢失的原因多种多样&#xff0c;这里列出了一些常见原因&#xff1a; 1. iOS 软件更新 2. 恢复出厂设置 3. 越狱 4. 误操作删除数据 5. iOS 设备崩溃 …

C++笔记(五)--- 虚函数(virtual)

目录 虚函数介绍 虚函数、覆盖和重载区别 虚函数介绍 C的虚函数是多态性的表现 1.构造函数不能为虚函数2.子类继承时虚函数仍为虚函数3.虚函数类外实现时&#xff0c;不需要加virtual4.有虚函数的类&#xff0c;析构函数一定要写成虚函数&#xff08;否则可能会造成内存泄漏&…

【代码随想录python笔记整理】第十六课 · 出现频率最高的字母

前言:本笔记仅仅只是对内容的整理和自行消化,并不是完整内容,如有侵权,联系立删。 一、哈希表初步 在之前的学习中,我们使用数组、字符串、链表等等,假如需要找到某个节点,则都要从头开始,逐一比较,直到找到为止。为了能够直接通过要查找的记录找到其存储位置,我们选…

设备像素、css像素、设备独立像素、dpr、ppi 之间的区别

设备像素、CSS 像素、设备独立像素 (DIP)、设备像素比 (DPR) 和每英寸像素密度 (PPI) 是与屏幕分辨率和显示质量相关的概念。它们之间的区别如下&#xff1a; 设备像素&#xff1a;设备像素是物理屏幕上的最小可见单元&#xff0c;用于实际渲染图像或文本。它表示硬件像素点的数…

、JMETER与它的组件们

os进程取样器 这个取样器可以让jmeter直接调用python写的测试数据 这样就可以调用python写的测试数据给到jmeter进行调用 注意&#xff1a;1建议python返回转json格式dumps一下&#xff1b;2py文件中需要把结果打印出来&#xff0c;可以不用函数直接编写 传到jmeter之后可以用…

你真的了解C语言中的【柔性数组】吗~

柔性数组 1. 什么是柔性数组2. 柔性数组的特点3. 柔性数组的使用4. 柔性数组的优势 1. 什么是柔性数组 也许你从来没有听说过柔性数组这个概念&#xff0c;但是它确实是存在的。 C99中&#xff0c;结构体中的最后⼀个元素允许是未知大小的数组&#xff0c;这就叫做柔性数组成员…

MyBatis 学习(五)之 高级映射

目录 1 association 和 collection 介绍 2 案例分析 3 一对一关联和一对多关联 4 参考文档 1 association 和 collection 介绍 在之前的 SQL 映射文件中提及了 resultMap 元素的 association 和 collection 标签&#xff0c;这两个标签是用来关联查询的&#xff0c;它们的属…

算法--时空复杂度分析以及各个数据量对应的可使用的算法(C++;1s内)

这里写目录标题 由数据范围反推算法时间复杂度以及算法内容分析时间复杂度看循环实例1实例2 固定时间复杂度快排和归并排序二分高精度算法双指针算法单链表插入删除操作栈和队列的操作单调栈和单调队列KMPTire并查集堆哈希表BFS、DFS图的深度优先、宽度优先遍历dijkstra算法朴素…

题目 1037: [编程入门]宏定义的练习

问题描述&#xff1a; 输入两个整数&#xff0c;求他们相除的余数。用带参的宏来实现&#xff0c;编程序。 样例输入&#xff1a; 3 2 样例输出&#xff1a; 1 代码分析&#xff1a; 这段代码实现了输入两个整数&#xff0c;然后使用带参数的宏计算它们相除的余数&…

「MySQL」深入理解MySQL中常用的SQL函数

「MySQL」深入理解MySQL中常用的SQL函数 窗口函数参考文章1. COALESCE 函数2. USING 函数3. LEAD 函数4. interval 函数5. INSTR 函数6. substring_index 函数7. LENGTH 函数和 CHAR_LENGTH 函数 窗口函数参考文章 SQL窗口函数 1. COALESCE 函数 COALESCE 函数的作用是从一…

瑞_Redis_Redis的Java客户端

文章目录 1 Redis的Java客户端1.1 Jedis快速入门1.1.1 入门案例1.1.1.1 项目构建1.1.1.2 引入依赖1.1.1.3 建立连接1.1.1.4 释放资源1.1.1.5 测试1.1.1.6 完整测试类代码 1.1.2 Jedis连接池1.1.2.1 连接池工具类1.1.2.2 改造原始代码 &#x1f64a; 前言&#xff1a;本文章为瑞…