训练深度神经网络,使用反向传播算法,产生梯度消失和梯度爆炸问题的原因?

🍉 CSDN 叶庭云https://yetingyun.blog.csdn.net/


反向传播是神经网络训练的精髓。它是根据上一个迭代获得的误差(即损失)对神经网络的权重进行微调的做法。权重的适当调整可确保较低的误差,从而通过提高模型的泛化能力使其变得可靠。反向传播算法的核心思想和工作原理可分为以下几个方面:

核心思想

  1. 链式求导法则的应用:反向传播算法的核心思想是链式求导法则的反复应用。在神经网络中,每个神经元的输出都是基于激活函数对加权输入的处理结果。整个网络的输出误差则是由所有神经元输出值与实际值之间的差值所决定的函数。利用链式法则,我们可以计算出误差相对于每个参数(包括权重和偏置)的偏导数,即梯度。这些梯度为参数的优化提供了明确的方向和幅度。

  2. 误差反向传播:反向传播算法的名称来源于其工作机制 —— 误差从输出层反向传递至输入层,逐层计算每个参数的误差梯度。这意味着,算法首先计算输出误差(即预测值与实际值之间的差异),然后将这个误差反向传播回网络,通过计算误差对每层权重的影响(偏导数),以此来更新权重和偏置。

工作原理

  1. 前向传播:在反向传播之前,首先进行前向传播。在前向传播过程中,输入数据被送入网络,并通过每一层的神经元,每个神经元对输入数据进行加权求和并应用激活函数,最终得到输出值。

  2. 计算误差:计算网络输出与实际值之间的误差。这一步通常使用损失函数来完成,常见的损失函数有交叉熵(用于分类)和均方误差(用于回归)等。

  3. 反向传播误差:利用链式法则计算损失函数对于网络中每个权重参数的梯度。这一过程从输出层开始,逐层向输入层反向进行。在每一层,根据输出误差计算该层权重的梯度,并将误差反向传播到前一层

  4. 更新权重和偏置:根据计算得到的梯度,使用优化算法(如梯度下降)调整每个权重和偏置,以减少输出误差。权重更新的方向是使损失函数值最小化的方向

  5. 迭代优化:重复上述步骤,直到满足停止条件,如达到预定的迭代次数或损失值降至某一阈值以下。

反向传播算法通过这样的迭代过程,逐渐调整神经网络中的参数,使网络的预测输出接近于实际值,从而提升网络的泛化性能。此外,反向传播算法的实现通常依赖于自动微分工具(如 TensorFlow 或 PyTorch),这些工具能够自动计算和优化大规模深层神经网络。

梯度消失和梯度爆炸问题

在训练深度神经网络时,使用反向传播算法可能会遇到梯度消失和梯度爆炸的问题,主要原因如下:

  1. 深度网络的复合效应:深度神经网络由多个层次的非线性映射组成,每一层的输出都是下一层的输入。在反向传播过程中,梯度通过链式法则从输出层向输入层传播。如果网络非常深,这种复合效应会导致梯度在传播过程中逐渐减小或增大,最终造成梯度消失或梯度爆炸问题。

  2. 激活函数的选择:使用某些激活函数(如 Sigmoid 或 Tanh)可能导致梯度消失问题。这是因为这些激活函数的导数在输入很大或很小的时候会接近于 0,这意味着梯度在反向传播过程中会迅速减小,导致网络前几层的参数几乎不更新。

  3. 权重初始化:不恰当的权重初始化也可能导致梯度消失或爆炸。如果权重初始化得太小,可能导致梯度消失;反之,如果权重初始化得太大,则可能导致梯度爆炸。

为了解决或缓解这些问题,研究者们提出了多种方法:

  • 使用 ReLU 及其变体作为激活函数:ReLU 激活函数在正数部分的导数恒等于 1,这可以缓解梯度消失的问题。此外,还有 Leaky ReLU、ELU 等变体可以在一定程度上保持梯度的稳定

  • 权重初始化技术:如 Kaiming 初始化、Xavier 初始化等,这些方法可以在网络初始化时保持激活值和梯度的分布,从而防止梯度消失或爆炸。

  • 使用 Batch Normalization:Batch Normalization 可以减少内部协变量偏移(Internal Covariate Shift),通过规范化层的输入使其保持相近的分布,这有助于缓解梯度消失和爆炸问题。

  • 梯度裁剪和权重正则化:对于梯度爆炸问题,可以通过限制梯度的最大值(梯度剪切)或使用权重正则化(如 L1、L2 正则化)来控制权重的大小,防止梯度过大。

  • 使用残差连接:在深度网络中引入残差结构可以让梯度直接通过跨层连接传播,减少梯度消失的问题。

总的来说,梯度消失和梯度爆炸问题的根本原因在于深度网络的层次结构和反向传播算法的工作机制。在反向传播过程中,误差梯度需要通过每一层传回到输入层,而每通过一层,都会与该层的权重梯度相乘。对于深度网络而言,这意味着梯度必须通过许多层的传播,导致梯度在传播过程中可能发生指数级的衰减或增长。为了解决这些问题,研究者提出了多种策略和方法,如使用 ReLU 等非饱和激活函数来避免梯度消失,梯度裁剪和权重正则化来防止梯度爆炸,以及批量规范化(Batch Normalization)和残差结构(ResNet)等技术来提高网络的稳定性和训练效果。

另外,补充两个知识点:

激活函数的梯度饱和是指当激活函数的输入值非常大或非常小导致其输出值接近于激活函数的上限或下限时,激活函数对输入的微小变化变得不敏感,其导数(梯度)接近于零的现象。简而言之,当激活函数输出接近其饱和区域(即输出范围的边界)时,对输入的小变化几乎不产生输出的变化,这就是所谓的梯度饱和。梯度饱和主要出现在像 Sigmoid 或 Tanh 这样的传统饱和激活函数中,它们在输入值非常大或非常小时会导致输出饱和,从而使梯度接近零。知乎文章:激活函数 Sigmoid、Tanh 的求导过程以及可视化

梯度饱和会导致一系列问题,最主要的是梯度消失问题。梯度消失是指在神经网络的反向传播过程中,由于激活函数的梯度接近于零,造成梯度信息在多层网络中迅速衰减,使得网络中的权重更新变得非常缓慢,甚至停止更新,从而影响网络的学习效率和训练效果。为了解决梯度饱和和梯度消失问题,研究人员提出了非饱和激活函数,如 ReLU(Rectified Linear Unit)及其变种。ReLU 函数在输入大于零时保持线性,因此在正区间内梯度恒定,不会饱和,这有助于缓解梯度消失问题,并提高网络训练的效率。然而,值得注意的是,虽然 ReLU 函数在正区间内能有效避免梯度饱和,但它在负区间内仍然存在梯度消失的问题,这被称为 “ReLU Dying” 问题。

总结来说,激活函数的梯度饱和是指激活函数在其输出值接近于上限或下限时,对输入的变化变得不敏感,导致其导数(梯度)接近于零的现象。这种现象会引起梯度消失问题,影响神经网络的训练效率和性能。通过使用非饱和激活函数如 ReLU,可以在一定程度上缓解这一问题。

使用 ReLU 激活函数时,神经元死亡的现象主要由几个因素导致

  1. 异常输入导致的大梯度:当神经网络接收到异常的输入数据时,如果这些输入与神经元的权重相乘后的结果非常大,那么经过 ReLU 激活函数后的输出也会很大。如果这个大的输出值与期望的输出值(ground truth)存在很大差异,那么在损失函数计算过程中会产生很大的梯度。在反向传播过程中,这个大梯度可能会导致权重参数更新过度,使得权重变为一个很大的负数。因此,在后续的前向传播过程中,这个神经元对于所有的输入几乎都会输出 0,因为 ReLU 函数在输入小于 0 时输出为 0,从而导致神经元 “死亡”。

  2. 高学习率:如果学习率设置得过高,那么在梯度下降过程中参数的更新步长会很大,这可能会导致权重或偏置在一次更新中就变得非常大或非常小,使得神经元输出持续为 0,从而导致神经元死亡。

  3. 大的负偏置值:如果在训练过程中,由于某些原因(如大的梯度更新),神经元的偏置值变成了一个很大的负数,那么即使是正常范围内的输入数据也可能导致 ReLU 激活前的加权输入值为负,从而使得该神经元的输出持续为 0,进一步导致神经元死亡。

ReLU 激活函数由于其在输入小于 0 时导数为 0 的特性,一旦神经元进入了这种 “关闭状态”,在后续的训练中就很难 “复活”,因为这时梯度为 0,权重和偏置的更新就停止了。这就是 ReLU 激活函数引发神经元死亡的主要原因。为了缓解这一问题,学术界提出了多种策略,如使用 Leaky ReLU 激活函数来保持负输入的一定梯度,或者通过调整学习率和初始化偏置来降低神经元死亡的风险。

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

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

相关文章

Android Glide 获取动图的第一帧

一、说明 Glide 可以加载 2 种动图,一种是 Gif 图,另一种是 Webp 动图。 有时候我们需要获取动图的第一帧,并以封面的形式显示,那该怎样获取呢? 二、获取 Webp 第一帧 我这儿的 Webp 显示用到了一个三方库&#xf…

【LLM】系统的评估与优化

文章目录 系统的评估与优化评估 LLM 应用的方式人工评估简单自动评估使用大模型进行评估混合评估 评估并优化生成部分提升直观回答质量标明知识来源,提高可信度构造思维链增加一个指令解析 评估并优化检索部分评估检索效果优化检索的思路 思考对比各种LLM评估方法的…

将游戏界面与注册/登录界面连接到一起

一、 导包 在注册页面中导入一个import subprocess包 二、 使用代码将其连接到一起 在循环中加入下面这一行代码,用来实现效果 subprocess.run(["python", "game代码.py"]

Faust勒索病毒:了解变种faust,以及如何保护您的数据

导言: 近年来,网络安全问题日益严峻,其中勒索病毒成为了一种日益猖獗的威胁。在众多勒索病毒中,.faust勒索病毒以其高度的隐秘性和破坏性引起了广泛关注。本文91数据恢复将深入剖析.faust勒索病毒的威胁特点,并提出相…

实现SpringMVC底层机制(一)

文章目录 1.环境配置1.创建maven项目2.创建文件目录3.导入jar包 2.开发核心控制器文件目录1.流程图2.编写核心控制器SunDispatcherServlet.java3.类路径下编写spring配置文件sunspringmvc.xml4.配置中央控制器web.xml5.配置tomcat,完成测试1.配置发布方式2.配置热加…

【stomp 实战】Spring websocket使用详解和基本原理

spring框架对websocket有很好的支持,stomp协议作为websocket的子协议,Spring也做了很多封装,让我们在开发中易于使用。 学习使用Spring的Websocket模块,当然最好的办法就是看官网说明了。本篇文章对官网做一些简述和个人的理解。 …

采集 Kubernetes 容器日志最佳实践

前言 指标、日志、链路是可观测的三大支柱,日志主要用于记录代码执行的痕迹,方便定位和排查问题。当前主流的应用都是以容器的方式运行在 Kubernetes 集群,由于容器的动态性,容器可能会频繁地创建和销毁。日志的采集和持久化变得…

用例整体执行及pytest.ini文件

在我们写代码的过程中,一般都是右键或者命令行去执行一个用例 但是当我们写完后,需要整体执行一遍。那应该怎么搞呢? 我们可以在根目录下新建一个main.py或者run.py之类的文件,文件内容如下: if __name__ "__ma…

Android --- SQlite数据存储

使用 SQLite 保存数据 | Android Developers (google.cn) SQLiteOpenHelper 类包含一组用于管理数据库的实用 API。当您使用此类获取对数据库的引用时,系统仅在需要时才执行可能需要长时间运行的数据库创建和更新操作,而不是在应用启动期间执行。您仅…

4-用户权限控制(后端)

在计算机系统中,用户权限控制是一种机制,用于限制用户对系统资源的访问和操作。它可以确保只有经过授权的用户可以执行特定的操作,并限制未经授权的用户的访问权限。 用户权限控制通常涉及以下几个方面: 用户认证:用户…

JAVA实现easyExcel批量导入

注解类型描述ExcelProperty导入指定当前字段对应excel中的那一列。可以根据名字或者Index去匹配。当然也可以不写,默认第一个字段就是index0,以此类推。千万注意,要么全部不写,要么全部用index,要么全部用名字去匹配。…

嵌入式前后台(Bare-Metal RTOS-Like)架构详解

前后台(Bare-Metal RTOS-Like)架构 在嵌入式系统开发中,针对资源有限的STM32微控制器,前后台(Bare-Metal RTOS-Like)架构是一种轻量级的实时性设计方法,它模拟了实时操作系统(RTOS&…

个人电脑本地部署LLM

普通电脑配置即可本地运行大模型,本地部署LLM最简单的方法 OLLAMA Ollama是一个开源框架,专门设计用于在本地运行大型语言模型(LLM)。它的主要功能是在Docker容器中部署和管理LLM,使得在本地运行大模型的过程变得非常…

python之List列表

1. 高级数据类型 Python中的数据类型可以分为:数字型(基本数据类型)和非数字型(高级数据类型) 数字型包含:整型int、浮点型float、布尔型bool、复数型complex 非数字型包含:字符串str、列表l…

CPPTest实例分析(C++ Test)

1 概述 CppTest是一个可移植、功能强大但简单的单元测试框架,用于处理C中的自动化测试。重点在于可用性和可扩展性。支持多种输出格式,并且可以轻松添加新的输出格式。 CppTest下载地址:下载地址1  下载地址2 下面结合实例分析下CppTest如…

MAC系统升级问题记录

一、 场景 新购置一台MAC mini盒子作为开发使用,系统版本为macOS Sonoma 14.2, 由于是新机器,从新开始安装开发工具,从AppStore中获取XCode 15.3 版本,编译现有工程项目,报如下错误: SDK does not contai…

Vue3+ts(day03:ref和reactive)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学,可以点心心支持一下哈(笔记是根据b站上学习的尚硅谷的前端视频【张天禹老师】,记录一下学习笔记,用于自己复盘,有需要学…

传感器在机械自动化中的应用有哪些?

传感器在机械自动化领域扮演了非常关键的角色,它们是实现高效和精准控制的基础。传感器可以检测和测量机械系统中的各种物理量,如位置、速度、温度、压力等,并将这些物理量转换成电信号,以便控制系统能够进行分析和响应。以下是一…

vue使用外部的模板

在 Vue 2 中,如果你希望使用外部的 HTML 文件内容作为模板,有几种方法可以实现,但每种方法都有其局限性或需要注意的事项。下面是一些可能的方法: 1. 使用 AJAX 加载外部 HTML 你可以使用 AJAX 来异步加载外部的 HTML 文件&…

ARCGIS PRO3 三维模型OSGB转SLPK场景数据集

1.前言 因项目工作,需要将三维模型发布到arcgisserver上,但arcgisserver只支持slpk格式的模型,于是我开启了漫长的三维模型格式转换之旅,在这里记录下本人踩过的坑。 2.三维模型数据情况 2.1 模型大小:在20GB以上&a…