当前位置: 首页 > news >正文

神经网络中的梯度消失与梯度爆炸

在深层次的神经网络中很容易出现梯度消失与梯度爆炸的问题。这篇博客就详细介绍一下为什么会产生梯度消失与梯度爆炸的问题,以及如何解决。

首先梯度是什么

类比快递员送包裹

  • 神经网络训练时,需要根据预测错误(损失函数)调整每层的参数(比如权重)。
  • 梯度就像 “错误快递员”,它从最后一层(输出层)出发,反向传播到每一层,告诉该层 “参数需要调多少”。
  • 目标:让梯度顺利送达每一层,指导参数更新,减少预测错误。

梯度消失 / 爆炸的本质:反向传播时 “快递员迷路或暴走”

假设一个 100 层的神经网络,反向传播时梯度要从第 100 层传到第 1 层。
每经过一层,梯度会被该层的权重矩阵激活函数的导数“放大或缩小”。

1.梯度消失--快递员送到最后没有力气了

  • 常见场景

    • 每层权重矩阵的绝对值普遍小于 1(比如初始化时权重很小),或激活函数导数小于 1(如 Sigmoid 函数导数最大值 0.25)。
    • 每经过一层,梯度就乘以一个小于 1 的数(类似 “打折扣”)。
    • 100 层后:梯度可能从初始值(如 0.5)变成0.5100,几乎接近 0,无法更新前面层的参数。
  • 类比
    想象你托朋友的朋友的朋友……(100 个朋友)传一句话到老家。
    每传一次,话的清晰度打 8 折(比如 “今晚吃饭” 传成 “今晚吃”,再传成 “今晚”……),传到最后可能只剩噪音。

2.梯度爆炸--快递员突然发疯乱送

  • 常见场景

    • 每层权重矩阵的绝对值普遍大于 1(如初始化时权重很大),或激活函数导数大于 1(理论上 ReLU 导数为 1,但实际可能因参数缩放导致放大)。
    • 每经过一层,梯度就乘以一个大于 1 的数(类似 “滚雪球”)。
    • 100 层后:梯度可能从初始值(如 2)变成2100,数值大到无法控制,参数更新时 “乱跳”。
  • 类比
    你让朋友的朋友……(100 个朋友)帮忙传 “借 100 元”,每传一次金额翻倍,传到最后可能变成 “借 1 亿”,完全失控。

为什么深层网络更容易出问题?

1.链式反应的累积效应

  • 反向传播的数学本质是链式求导(每层梯度是多个导数的乘积)。
  • 层数越多,乘积项越多:
    • 若每个因子都略小于 1,多层后乘积趋近于 0(消失);
    • 若每个因子都略大于 1,多层后乘积趋近于无穷大(爆炸)。

2. 激活函数的 “先天缺陷”

  • 早期常用 Sigmoid/Tanh
    • 导数范围小(Sigmoid 导数≤0.25,Tanh 导数≤1),容易导致梯度消失。
    • 示例:假设每层导数都是 0.25,10 层后梯度变为0.2510≈0.0000059,几乎消失。
  • ReLU 缓解消失但无法根治爆炸
    • ReLU 导数在正数区域为 1,梯度不会因激活函数缩小,但权重矩阵仍可能放大梯度。

为什么浅层网络不容易出问题?

  • 层数少,链式乘积项少
    比如 5 层网络,即使每层梯度乘 0.5,5 次后是0.55=0.03125,仍有一定幅度,能有效更新参数。
  • 梯度 “路程短”
    信号从输出层传到输入层只需经过几层,“衰减” 或 “放大” 的程度有限。

解决方案

  • 核心矛盾:深度带来更强的表达能力,但反向传播时梯度难以稳定传递。
  • 比喻
    就像水管太长时,水压会衰减(消失)或因水流太急爆管(爆炸),导致末端(浅层)得不到正常供水(有效梯度)。
  • ResNet 的解决方案
    通过残差连接增加 “旁路水管”,让梯度可以绕过部分层直接传递,减少链式乘积的层数,从而缓解消失 / 爆炸。

总结

梯度在深层网络中就像传话筒,传的人越多(层数越多),声音越容易变弱(消失)或变吵(爆炸),ResNet 则给它加了个 “扩音器”(残差连接)。

http://www.xdnf.cn/news/768313.html

相关文章:

  • cnn训练并用grad-cam可视化
  • 基于遥感图像深度学习的海洋测深
  • 2024年数维杯国际大学生数学建模挑战赛C题时间信号脉冲定时噪声抑制与大气时延抑制模型解题全过程论文及程序
  • 题目 3230: 蓝桥杯2024年第十五届省赛真题-星际旅行
  • [蓝桥杯]约瑟夫环
  • web架构2------(nginx多站点配置,include配置文件,日志,basic认证,ssl认证)
  • 2025年5月24日系统架构设计师考试题目回顾
  • 【RAG 应用的可视化框架】
  • 【C++】类的构造函数
  • 【iOS(swift)笔记-13】App版本不升级时本地数据库sqlite更新逻辑一
  • 软件测评师教程 第2章 软件测试基础 笔记
  • 大数据-275 Spark MLib - 基础介绍 机器学习算法 集成学习 随机森铃 Bagging Boosting
  • 【C++进阶篇】C++11新特性(上篇)
  • 【笔记】在 Clang 工具链中降级 NumPy 到 2.2.4
  • JavaWeb预习(jsp)
  • 【AI智能体】Spring AI MCP 从使用到操作实战详解
  • 手机隐藏玩法有哪些?
  • 从线性方程组角度理解公式 s=n−r(3E−A)
  • Android Studio 配置之gitignore
  • Day43
  • 九(3).引用作为方法别名返回
  • 抖音商城抓包 分析
  • LangChain输出格式化实践:提升测试工程师LLM开发效率的完整指南
  • 类和对象:实现日期类
  • mybatisplus的总结
  • 消除F/1噪声
  • Spring Boot 3.X 下Redis缓存的尝试(一):初步尝试
  • CSS 3D 变换中z-index失效问题
  • Ubuntu上进行VS Code的配置
  • 简单工厂模式