【深度学习 | 梯度那些事】 梯度爆炸或消失导致的模型收敛困难?挑战与解决方案一览, 确定不来看看?

news2024/11/25 20:20:23

在这里插入图片描述

🤵‍♂️ 个人主页: @AI_magician
📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。
👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!🐱‍🏍
🙋‍♂️声明:本人目前大学就读于大二,研究兴趣方向人工智能&硬件(虽然硬件还没开始玩,但一直很感兴趣!希望大佬带带)

在这里插入图片描述

该文章收录专栏
[✨— 《深入解析机器学习:从原理到应用的全面指南》 —✨]

梯度爆炸与消失

前置条件:先弄懂反向传播算法之后才能快速领悟。

梯度爆炸是指在使用梯度下降算法时,由于某些原因导致梯度值变得非常大,从而对参数的更新产生巨大影响。这可能会导致模型无法收敛或收敛速度过慢。

当神经网络层数较多、学习率设置过高或损失函数设计不合理时,就容易发生梯度爆炸现象。以下是一些可能引起梯度爆炸的原因(这其实就是根据反向传播的三个函数链式求导,一个是上一个神经元激活函数,一个是损失函数导数,一个是激活函数导数:

  1. 激活函数选择(损失函数导数):如果在神经网络中使用了具有饱和性质(如Sigmoid)的激活函数,并且权重初始化不当,则可能会出现数值上溢问题。当反向传播通过每一层传递时,sigmoid函数在中间区域的斜率很敏感变化很大,最终使得梯度变得异常大
  2. 参数初始化(激活函数导数):如果权重参数初始化过大,则在前向传播和反向传播过程中都容易造成数值溢出问题。特别是在深层神经网络中,在后面的层级上发生累积效应并放大了初始错误。
  3. 学习率设置(上一个神经元激活函数):学习率决定了每次迭代更新参数时所采用的步长大小。如果学习率设置太大,每次更新时参数的变化就会非常剧烈,(即权重变大,数值上溢)可能导致梯度值爆炸。

饱和性质的激活函数是指在输入数据较大或较小时,激活函数的导数趋近于0,导致梯度消失或爆炸。这种情况下,神经网络可能会面临训练困难、收敛缓慢等问题。

常见的饱和性质的激活函数有Sigmoid函数和双曲正切(Tanh)函数。它们在输入接近极端值时,导数接近于0。对于Sigmoid函数而言,在输入非常大或非常小时,输出值会趋向于1或-1,并且导数几乎为0;对于Tanh函数而言,在输入非常大或非常小时,输出值也会趋向于1或-1,并且导数同样几乎为0。

相比之下,不饱和性质的激活函数没有上述问题并具有更好的表达能力。以下是两个例子:

ReLU(Rectified Linear Unit):
ReLU是一种简单但广泛使用的不饱和性质的激活函数。当输入为正时,ReLU将保持原始值作为输出;当输入为负时,则返回零作为输出。ReLU在实践中被证明可以有效地解决梯度消失问题,并提高神经网络模型的训练速度与效果。

Leaky ReLU:
Leaky ReLU是对ReLU的改进,它在输入为负时不返回零,而是返回一个小的非零值。这样可以避免ReLU中出现的“神经元死亡”问题(即某些神经元永远不会被激活),并且有助于增加模型的表达能力。

总结起来,饱和性质的激活函数可能导致梯度消失或爆炸问题,并且限制了神经网络模型能够学习复杂特征表示的能力。而不饱和性质的激活函数(如ReLU、Leaky ReLU等)则可以解决这些问题,并提供更好的训练效果。选择适当的激活函数取决于具体任务需求和实际情况。

为了解决梯度爆炸问题,可以采取以下措施:

  1. 权重初始化:合理选择权重的初始化方法,例如使用**Xavier(饱和函数)或He(不饱和函数)**等经典的初始化方法,并避免初始权重过大。

  2. 激活函数选择:选用具有较小饱和区域并且能够缓解梯度爆炸问题的激活函数(如ReLU、Leaky ReLU)。

  3. 梯度裁剪:通过限制梯度值的范围来防止其过大。一种常见做法是设置一个阈值,在反向传播过程中对超出阈值范围的梯度进行裁剪。

  4. 调整学习率:降低学习率可以减轻梯度爆炸现象。可以逐步减小学习率或者使用自适应优化算法(如Adam、Adagrad),使得模型在训练过程中更加稳定。

总而言之,当发生梯度爆炸时,需要检查神经网络结构、参数初始化和学习率设置等因素,并根据情况采取相应调整以解决该问题。

梯度消失是指在深层神经网络中,**随着反向传播过程的进行,较早层的权重更新变得非常小或趋近于零,导致这些层对整个网络参数的学习贡献几乎为零。**这可能会导致模型无法有效地学习和优化。

以下是一些常见导致梯度消失问题的原因:

1. 激活函数选择不当:

  • 一些常用的激活函数(如sigmoid、tanh)在输入值接近饱和区域时具有很小的斜率(求导很小)。
  • 当网络层数增加时,在多次应用这些激活函数后,梯度逐渐缩小到接近于零(求导后累乘下溢)。

2. 权重初始化不合适:

  • 在深层神经网络中使用统一或过大/过小范围内初始化权重,可能会引发梯度消失问题(不平衡分布,每个隐藏单元计算出来的特征表示也将高度相似(对称性),在更新参数时无法利用到各个隐藏单元之间不同特征的差异,导致网络学习能力受限。)
  • 如果初始权重太小,则每次通过网络传播的信号将被削弱(激活值小);如果初始权重太大,则容易使得某些神经元进入饱和状态(斜率变化小)。

3. 大规模架构设计不良:

  • 构建一个非常深且复杂的神经网络结构时,信息必须通过多个层级进行传递,并且错误的设计可能会导致梯度消失。
  • 过深的网络结构使得梯度在反向传播过程中需要经历多次相乘操作,从而容易受到数值计算误差和指数级衰减的影响(下溢或者上溢)。

4. 数据预处理不当:

  • 不恰当的数据标准化或归一化方法可能导致输入特征分布不均匀(输入值或大或小,同样是导致上溢或者下溢,进而引发梯度消失问题。

为了应对梯度消失问题,可以尝试以下方法:

  • 使用其他激活函数(如ReLU、Leaky ReLU等),它们不饱和具有更大的斜率并且在一定程度上缓解了梯度消失问题。
  • 采用合适的权重初始化策略,例如Xavier初始化或He初始化。

Xavier初始化和He初始化是两种常用的权重初始化策略,它们旨在帮助神经网络模型更好地学习和收敛。

Xavier初始化(也称为Glorot初始化):
Xavier初始化适用于激活函数为sigmoid或tanh的神经网络层。该方法根据输入和输出节点数量来确定初始权重值的范围,使得信号在前向传播时能够保持一定程度上的平衡。(由 Xavier Glorot 和 Yoshua Bengio 在2010年提出。)

具体步骤如下:

  1. 针对每个权重矩阵W,在[-a, a]之间均匀随机采样初始值,其中a = sqrt(6 / (n_in + n_out))。
    • n_in是输入节点数
    • n_out是输出节点数

这种方式通过考虑输入和输出维度来推导合适的初始范围(节点数越多权重值越小),并避免了梯度消失或爆炸等问题。实验证明,在训练深度神经网络时使用Xavier初始化可以加速收敛并提高模型性能。

He初始化:He初始化,也称为He正态分布初始化,是一种用于神经网络权重初始化的方法。它由Kaiming He等人在2015年提出,并被广泛应用于深度学习模型中。He初始化旨在解决激活函数为线性修正单元(Rectified Linear Unit, ReLU)时可能导致的梯度消失或爆炸问题。在**传统的随机权重初始化方法(如高斯分布、均匀分布)**下,如果网络较深且使用ReLU作为激活函数,则容易发生梯度消失或爆炸现象。

  • He初始化通过将每个神经元层输入与一个服从标准差为sqrt(2/n) 的高斯分布进行采样来设置初始权重。 (其中n表示前一层神经元数量,输入点)

确保了输出信号在前向传播时能够更好地得到激活。He初始化在使用ReLU或其变种(如Leaky ReLU)作为激活函数时表现良好。其是一种针对ReLU等非线性激活函数的权重初始化方 法。

  • 使用正则化技术(如批量归一化)来规范网络层之间的输入分布,并加速训练过程。
  • 考虑使用残差连接(如Resnet)、跳跃连接等架构设计技术来减轻信息传递路径中信号被削弱或消失的影响。

跳跃连接指的是将输入数据直接添加到网络某一层输出之上。这种设计使得信息可以更自由地流动,并且保留了原始输入数据中的细节和语义信息。 使信息更容易传播到后面的层次,避免了信息丢失。跳跃连接通常会通过求和操作或拼接操作来实现。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZsRhf9bZ-1691997448878)(classical algorithm.assets/skip-connection.png)]

以图像分类任务为例,假设我们使用卷积神经网络进行特征提取,在每个卷积层后面都加入一个池化层来减小特征图尺寸。然而,池化操作可能导致信息损失。通过添加一个跳跃连接,将原始输入直接与最后一个池化层输出相加或拼接起来,可以保留原始图像中更多的细节和语义信息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XnGUTcWk-1691997448879)(classical algorithm.assets/dense-block.png)]

如果感兴趣了解更多,建议阅读文章:
非常经典的文章《All You Need to Know About Skip Connections》: https://www.analyticsvidhya.com/blog/2021/08/all-you-need-to-know-about-skip-connections/

残差网络(Residual Network),也被称为ResNet,是一种深度神经网络架构,旨在解决梯度消失和训练困难的问题。它的核心思想是通过引入残差块(residual blocks)来构建网络,并通过跳跃连接将输入直接添加到层输出上。

具体而言,在每个块或子模块内部,输入被加到该块/子模块计算后得到的输出上,并且这两者尺寸必须相同。然后再将此结果送入下一个块/子模块进行处理。

残差网络(Residual Network),也被称为ResNet,是一种深度神经网络架构,旨在解决梯度消失和训练困难的问题。它的核心思想是通过引入残差块(residual blocks)来构建网络,并通过跳跃连接将输入直接添加到层输出上。

下面是详细解释残差网络的步骤:

  1. 基本结构:每个残差块由两个主要部分组成——主路径和捷径。主路径包含了一系列卷积、批归一化和非线性激活函数等操作,用于学习特征表示。捷径是一个直接连接,将输入数据“跳过”了主路径中的所有操作。

  2. 捷径连接:在传统的卷积神经网络中,信息必须从前向后依次通过每个层进行传递并逐渐轻微地改变。而在残差网络中,捷径连接允许信息更快地流动,在不同层之间形成了短路路径。

  3. 残差学习:对于每个残差块,在主路径内部会发生特征图尺寸缩小或通道数变化等情况。这样可能导致信息丢失或降低模型性能。为了解决这个问题,残差网络采用了跳跃连接将输入直接添加到输出上,使得模型可以学习到相对于期望输出的微小调整。

  4. 深度扩展:残差网络允许非常深的层次堆叠,因为捷径连接提供了一个快速通道来传播梯度和信息。通过增加更多的残差块,网络可以逐渐变得更深,并且在一定程度上能够减少过拟合现象。

  5. 预训练与微调:由于残差网络具有良好的初始化特性在大规模数据集上进行预训练后往往能够获得较好的性能。然后可以使用迁移学习(transfer learning)技术,在其他任务或数据集上进行微调以达到更好的效果。

总结起来,残差网络通过引入捷径连接和利用残差学习机制来改善深层神经网络中的梯度消失、信息流动等问题。这些方法使得网络能够更轻松地训练,并且在图像分类、目标检测和语义分割等计算机视觉任务中取得了显著成果。

理解和解决梯度消失问题是构建有效深层神经网络模型非常重要的一步。通过合理选择参数初始化、优化算法以及网络结构设计等手段可以克服这个问题,并提高模型的性能和收敛速度。
在这里插入图片描述

						  🤞到这里,如果还有什么疑问🤞
					🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩
					 	 🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳

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

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

相关文章

minio 分布式文件系统主从复制

1. 在slave节点下载mc客户端工具 下载 2. 移动或复制mc文件到/usr/local/bin/文件夹 mv mc /usr/local/bin 3. 赋值权限给 mc 文件 chmod x mc 4. 查看mc客户端版本,看是否可用 #控制台显示返回信息用下面这条 mc --version #控制台显示无返回信息用下面这条 mc --versi…

LeetCode ACM模式——二叉树篇(一)

刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com 目录 定义二叉树 创建二叉树 利用前序遍历创建二叉树 利用数组创建二叉树 打印二叉树 144. 二叉树的前序遍历 递归遍历 迭代遍历(利用栈) 145. 二…

移动端预览指定链接的pdf文件流

场景 直接展示外部系统返回的获取文件流时出现了跨域问题: 解决办法 1. 外部系统返回的请求头中调整(但是其他系统不会给你改的) 2. 我们系统后台获取文件流并转为新的文件流提供给前端 /** 获取传入url文件流 */ GetMapping("/get…

43 | 抖音大V人民日报粉丝数分析

背景介绍 抖音是一个面向全年龄的音乐短视频社区平台,如今已成为最火的短视频软件,无数短视频创作者通过抖音分享生活,分享技能,分享美好。其中有点赞、评论、转发、关注等功能。 我们试图分析“大 V”即粉丝数量相对较多的博主的涨粉数量和点赞、评论、转发之间的关系,…

uniapp的逆地理编码 和地理编码

1.先打开高德地图api找到那个 地理编码 2.封装好我们的请求 3.逆地理编码 和地理编码 都是固定的 记住自己封装的请求 就可以了 这个 是固定的 方式 下面这个是固定的 可以复制过去 getlocation就是uniapp提供的 获取经纬度 然后 下面的 就是高德地图提供的 方法 要想使用我…

git Authentication failed

情况是这样的,之前看代码只是clone了一份,但随着分支越来越多,有时候切换分支时必须先把修改的代码 stash 一下,觉得很麻烦,于是又clone了一份代码。然后pull代码是正常的,当push 代码的时候,去…

Python深度学习“四大名著”之一全新PyTorch版 | 送书活动

目录 前言一、序二、内容简介三、作者简介四、福利(本次活动赠书2-5本,根据阅读量,评论区抽取小伙伴送书)总结 前言 近年来,机器学习方法凭借其理解海量数据和自主决策的能力,已在医疗保健、 机器人、生物学、物理学、大众消费和互…

Java多线程编程:实现并发处理的高效利器

Java多线程编程:实现并发处理的高效利器 作者:Stevedash 发表于:2023年8月13日 20点45分 来源:Java 多线程编程 | 菜鸟教程 (runoob.com) ​ 在计算机领域,多线程编程是一项重要的技术,可以使程序同时执…

Linux 性能分析之iostat命令详解

Linux 性能分析之iostat命令详解 iostat命令是IO性能分析的常用工具,其是input/output statistics的缩写。本文将着重于下面几个方面介绍iostat命令: iostat的安装iostat命令行选项说明iostat输出内容分析如何确定磁盘IO的瓶颈iostat实际案例 命令的安…

【先进PID控制算法(ADRC,TD,ESO)加入永磁同步电机发电控制仿真模型研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Linux 介绍

Linux一切皆文件:文件就 读、写、权限 学习方式: 1、认识Linux 2、基本的命令(重点:git讲了一些基本的命令【文件操作、目录管理、文件属性、Vim编辑器、账号管理、磁盘管理…】) 3、软件的安装和部署!&am…

MongoDB 简介

什么是MongoDB ? MongoDB 是由C语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个…

kubernetes二进制部署2之 CNI 网络组件部署

CNI 网络组件部署 一:K8S提供三大接口1容器运行时接口CRI2云原生网络接口CNI3云原生存储接口CSI 部署 flannelK8S 中 Pod 网络通信:Overlay Network:VXLAN:Flannel:Flannel udp 模式的工作原理:ETCD 之 Flannel 提供说…

Springboot 实践(2)MyEclipse2019创建项目修改pom文件,加载springboot 及swagger-ui jar包

MyEclipse2019创建工程之后,需要添加Springboot启动函数、添加application.yml配置文件、修改pom文件添加项目使用的jar包。 添加Springboot启动函数 创建文件存储路径 (1)右键单击“src/main/java”文件夹,弹出对话框输入路径…

电压放大器和电荷放大器区别是什么意思

电压放大器和电荷放大器是两种常见的信号放大器。它们的区别主要在于其输入端口所呈现的电路特性不同。 电压放大器的介绍 电压放大器是一种将输入信号的电压增益放大的电路元件,其输入端口呈现高阻抗特性。即在输入端口上,电压放大器所对应的电路模型中…

为什么我不推荐任何人用C语言作为编程启蒙第一课?

前言 写了20多年的代码,之前做过阿里的高级架构师,在技术这条路上跌跌撞撞了很多,我今天分享一些我个人的自学方法给各位。为什么我会说:不推荐任何人用C语言作为编程启蒙第一课? 这里有很多同学要站出来说了&#x…

人工智能在公检系统中的应用:校对软件助推刑事侦查工作

人工智能在公检系统中的应用,尤其是校对软件的应用,可以有效地助推刑事侦查工作。 以下是校对软件在刑事侦查工作中的一些应用方面: 1.自动校对和纠错:校对软件可以自动检测和纠正刑事侦查报告中的语法、拼写和标点错误等问题。通…

使用css实现时间线布局(TimeLine)

前言 在使用uni-app开发微信小程序过程中,遇到了时间轴布局,由于每项的内容高度不一致,使用uniapp自带的扩展组件uni-steps,样式布局无法对齐竖线,于是自己造轮子,完成特殊的布局。显示效果如下&#xff1…

[保研/考研机试] KY85 二叉树 北京大学复试上机题 C++实现

题目链接: 二叉树https://www.nowcoder.com/share/jump/437195121692000296981 描述 如上所示,由正整数1,2,3……组成了一颗特殊二叉树。我们已知这个二叉树的最后一个结点是n。现在的问题是,结点m所在的子树中一共包…

【LeetCode每日一题】——41.缺失的第一个正数

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 哈希表 二【题目难度】 困难 三【题目编号】 41.缺失的第一个正数 四【题目描述】 给你一个…