深度学习查漏补缺:1.梯度消失、梯度爆炸和残差块

news/2025/2/3 22:42:17 标签: 深度学习, 人工智能

一、梯度消失

梯度消失的根本原因在于 激活函数的性质和链式法则的计算

  1. 激活函数的导数很小

    • 常见的激活函数(例如 Sigmoid 和 Tanh)在输入较大或较小时,输出趋于饱和(Sigmoid 的输出趋于 0 或 1),其导数接近于 0。
    • 在反向传播中,每一层的梯度都会乘以激活函数的导数。如果导数很小,乘积就会导致梯度逐渐变小。
  2. 链式法则的多次相乘

    假设网络有 nn 层,梯度从输出层传到第 ii 层时,会经历多次链式相乘:
    • \frac{\partial L}{\partial w_i} = \frac{\partial L}{\partial x_n} \cdot \frac{\partial x_n}{\partial x_{n-1}} \cdot \frac{\partial x_{n-1}}{\partial x_{n-2}} \cdots \frac{\partial x_{i+1}}{\partial x_i}

      如果每一项的导数都小于 1(例如 0.5),那么多次相乘后梯度将变得非常小,接近于 0。
  3. 深层网络的结构

    层数越多,梯度消失的积累效应越明显,导致靠近输入层的权重几乎无法更新。

1.4 梯度消失带来的问题
  • 网络无法有效学习:靠近输入层的权重无法更新,网络的学习能力只集中在靠近输出层的部分,导致模型性能受限。
  • 训练时间增加:梯度很小,优化器调整参数的速度变慢,训练需要更多的时间。

二、梯度爆炸

1 梯度爆炸的现象

        与梯度消失相反,当网络层数较深时,梯度在反向传播过程中可能会逐渐变大,甚至变得非常大。这种现象被称为梯度爆炸

        由于梯度过大,模型的参数更新幅度也会非常大,可能导致:

  • 参数出现巨大波动,训练过程不稳定;
  • 损失值(Loss)变得非常大,甚至出现 NaN
  • 模型无法收敛,最终无法学习任何规律。

2 为什么会发生梯度爆炸?

梯度爆炸的原因与梯度消失类似,主要是由于链式法则的多次相乘,但此时乘积中的值大于 1:

  1. 权重初始化不当

    • 如果网络的初始权重过大,在反向传播时,梯度的值也会变得很大。
    • 例如,如果每层的权重初始化为 5,经过 10 层的链式积累,梯度可能会变成 5^{10} = 9,765,625
  2. 激活函数的导数较大

    • 如果激活函数的导数值很大,梯度在多次相乘后会迅速变大。
  3. 深层网络的结构

    • 网络层数越多,链式法则的积累效应越明显,导致梯度爆炸的概率增大。

3 梯度爆炸带来的问题
  • 训练不稳定:梯度过大,导致参数更新过快,训练过程可能无法收敛。
  • 损失发散:梯度爆炸会导致损失值发散,模型无法学习有效特征。

三、残差块

        残差块(Residual Block)是深度学习ResNet(Residual Network) 网络的核心组件,它最早由微软研究院的何凯明(Kaiming He)等人在 2015 年提出。残差块通过引入跳跃连接(skip connection),解决了深层神经网络训练中的梯度消失、梯度爆炸和退化问题,使得网络能够训练得更深、性能更好。

为什么需要残差块?

在深层神经网络中,随着网络深度的增加(层数增多),存在以下问题:

  1. 梯度消失(Vanishing Gradient):反向传播时,梯度在逐层传递过程中可能逐渐变小,从而无法有效更新靠近输入层的权重。
  2. 梯度爆炸(Exploding Gradient):反之,梯度可能会在逐层传递过程中变得过大,导致模型训练不稳定。
  3. 退化问题(Degradation Problem):当网络层数增加时,模型的训练误差反而会变大,甚至性能比浅层网络更差。

这些问题的根本原因在于,随着层数增加,网络在拟合复杂非线性变换时可能会难以优化。残差块通过引入跳跃连接,允许网络直接学习相对较小的残差(Residual),从而降低优化难度。


残差块的结构

一个标准的残差块具有以下结构:

  1. 主路径(Main Path):通过若干个卷积、批归一化(Batch Normalization)、激活函数(如 ReLU)组成,是网络的主要信息传递路径。
  2. 跳跃连接(Skip Connection):从输入直接添加到输出,为网络提供了一条“捷径”。

输出形式为:

y=F(x)+x

其中:

  • x:残差块的输入。
  • F(x):主路径中卷积、激活等操作的输出。
  • y:残差块的最终输出。

通过直接将输入 x 加到输出 F(x) 上,残差块能够显式学习 F(x)=H(x)−x,即学习输入与目标值之间的残差。如果 H(x) 是目标映射函数,那么 F(x)F(x) 是残差函数。

1. 一般形式的残差块

以两个卷积层为例,残差块的结构如下:

  • 输入:x
    1. 第一层卷积(Conv1d/Conv2d),带激活函数(如 ReLU)。
    2. 第二层卷积(Conv1d/Conv2d)。
    3. 跳跃连接:直接将 xx 与经过两层卷积后的结果相加。
    4. 激活函数(如 ReLU)。

数学表达式为:

y=ReLU(F(x)+x)

2. 带维度变换的残差块

如果输入和输出的特征维度不同(例如通道数或空间维度变化),需要使用额外的线性变换对输入 x 进行升维或降维(Projection Shortcut),使得尺寸匹配。

y=F(x)+Ws x

其中 Ws是一个线性变换(通常是 1×1 卷积)。


直观解释残差块的作用

1. 更容易优化深层网络

        通过学习残差 F(x)=H(x)−x,残差块将复杂的非线性映射 H(x)转换为一个简单的优化问题。即使网络层数增加,残差块可以将输入直接传递到更深层,减轻梯度消失的影响。

2. 提供信息的捷径

        跳跃连接允许信息直接从输入传递到输出,让网络更容易捕捉重要的特征,同时保留原始特征。

3. 防止退化问题

        在普通深层网络中,增加更多的层可能会导致模型性能退化,反而不如浅层网络。残差块通过添加跳跃连接,可以显式地学习哪些层需要参与计算,哪些层可以跳过,从而有效防止退化。


http://www.niftyadmin.cn/n/5841084.html

相关文章

蓝桥杯C语言程序设计赛备赛指南

蓝桥杯全国软件和信息技术专业人才大赛是国内最具影响力的编程竞赛之一,其C语言程序设计赛项以算法为核心,注重选手的逻辑思维和代码实现能力。如何在有限时间内高效备赛?以下从**基础夯实、算法强化、实战模拟、心态调整**四方面提供系统化建…

2025年02月02日Github流行趋势

项目名称:oumi 项目地址url:https://github.com/oumi-ai/oumi 项目语言:Python 历史star数:1416 今日star数:205 项目维护者:xrdaukar, oelachqar, taenin, wizeng23, kaisopos 项目简介:构建最…

【PyQt】lambda函数,实现动态传递参数

为什么需要 lambda? 在 PyQt5 中,clicked 信号默认会传递一个布尔值(表示按钮是否被选中)。如果我们希望将按钮的文本内容传递给槽函数,需要通过 lambda 函数显式传递参数。 这样可以实现将按钮内容传递给槽函数&…

Shadow DOM举例

这东西具有隔离效果&#xff0c;对于一些插件需要append一些div倒是不错的选择 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"utf-8"> <title>演示例子</title> </head> <body> <style&g…

系统URL整合系列视频一(需求方案)

视频 系统URL整合系列视频一&#xff08;需求方案&#xff09; 视频介绍 &#xff08;全国&#xff09;某大型分布式系统Web资源URL整合需求实现方案讲解。当今社会各行各业对软件系统的web资源访问权限控制越来越严格&#xff0c;控制粒度也越来越细。安全级别提高的同时也增…

《 C++ 点滴漫谈: 二十五 》空指针,隐秘而危险的杀手:程序崩溃的真凶就在你眼前!

摘要 本博客全面解析了 C 中指针与空值的相关知识&#xff0c;从基础概念到现代 C 的改进展开&#xff0c;涵盖了空指针的定义、表示方式、使用场景以及常见注意事项。同时&#xff0c;深入探讨了 nullptr 的引入及智能指针在提升代码安全性和简化内存管理方面的优势。通过实际…

【华为OD-E卷 - 最大矩阵和 100分(python、java、c++、js、c)】

【华为OD-E卷 - 最大矩阵和 100分&#xff08;python、java、c、js、c&#xff09;】 题目 给定一个二维整数矩阵&#xff0c;要在这个矩阵中选出一个子矩阵&#xff0c;使得这个子矩阵内所有的数字和尽量大&#xff0c;我们把这个子矩阵称为和最大子矩阵&#xff0c;子矩阵的…

uv 安装包

是的&#xff0c;你可以使用 uv 来安装 Python 包。uv 是一个高性能的 Python 包安装器和解析器&#xff0c;由 astral.sh 团队开发&#xff0c;旨在替代 pip 和 pip-tools&#xff0c;提供更快的包安装体验。 ### 如何使用 uv 安装包 1. **安装 uv**&#xff1a; 如果你还…