梯度消失和梯度爆炸

embedded/2024/11/20 8:02:55/

梯度消失梯度爆炸

这两个问题通常在深度神经网络中出现,特别是在反向传播过程中,会严重影响网络的训练效果。


1. 梯度消失(Vanishing Gradient)

现象

在反向传播时,梯度值逐层减小,导致靠近输入层的权重几乎没有更新,网络难以学习有效特征。

原因
  • 激活函数的特性
    如Sigmoid和Tanh的梯度范围较小。当输入较大或较小时,梯度趋近于0(函数饱和区域)。
    例如,Sigmoid函数的导数:
    f ′ ( x ) = f ( x ) ( 1 − f ( x ) ) f'(x) = f(x)(1 - f(x)) f(x)=f(x)(1f(x))
    x → ± ∞ x \to \pm\infty x±,导数趋近于0。

  • 链式法则
    在反向传播中,梯度通过链式法则逐层传递:
    ∂ L ∂ w 1 = ∂ L ∂ w n ⋅ ∏ i = 2 n ∂ h i ∂ h i − 1 \frac{\partial L}{\partial w_1} = \frac{\partial L}{\partial w_n} \cdot \prod_{i=2}^n \frac{\partial h_i}{\partial h_{i-1}} w1L=wnLi=2nhi1hi
    若每层的梯度值小于1,梯度会指数级衰减。

影响
  • 深层网络前几层权重更新缓慢或停止。
  • 导致模型难以捕捉数据中的复杂模式。

2. 梯度爆炸(Exploding Gradient)

现象

在反向传播时,梯度值逐层增大,最终导致权重更新过大,数值溢出或训练不稳定。

原因
  • 不合理的权重初始化
    初始权重过大,反向传播时梯度随层数增加而指数级放大。

  • 链式法则
    若每层梯度值大于1,梯度会指数级增长。

  • 过深的网络结构
    深度增加时,累乘的梯度可能引发爆炸。

影响
  • 损失函数值变为NaN,无法收敛。
  • 模型训练过程极其不稳定。

如何缓解梯度消失梯度爆炸

1. 梯度消失的解决方法
  • 激活函数选择

    • 用ReLU、Leaky ReLU或Swish替代Sigmoid/Tanh。
    • 它们的梯度不会饱和,例如ReLU的导数是常数1(正区间)。
  • 权重初始化技巧

    • Xavier初始化:适用于Sigmoid和Tanh。
      W ∼ U ( − 6 n i n + n o u t , 6 n i n + n o u t ) W \sim \mathcal{U}\left(-\sqrt{\frac{6}{n_{in} + n_{out}}}, \sqrt{\frac{6}{n_{in} + n_{out}}}\right) WU(nin+nout6 ,nin+nout6 )
    • He初始化:适用于ReLU。
      W ∼ N ( 0 , 2 n i n ) W \sim \mathcal{N}(0, \frac{2}{n_{in}}) WN(0,nin2)
  • 归一化层
    使用Batch Normalization来保持输入在较好的范围内。

  • 使用残差网络(ResNet)
    残差块通过跳跃连接缓解梯度消失


2. 梯度爆炸的解决方法
  • 梯度裁剪(Gradient Clipping)
    限制梯度的最大范数:
    g = g max ⁡ ( 1 , ∥ g ∥ clip_value ) g = \frac{g}{\max(1, \frac{\|g\|}{\text{clip\_value}})} g=max(1,clip_valueg)g

  • 权重正则化
    添加正则化项(如L2正则化)限制权重大小。

  • 优化器选择
    使用具有自适应学习率的优化器,如Adam或RMSprop。

  • 网络结构改进

    • 减少网络深度,或者使用更合理的层设计。
    • 添加残差连接或门控机制(如LSTM的遗忘门)。

总结

  • 梯度消失主要与激活函数和权重初始化有关,常用ReLU等激活函数、BatchNorm和ResNet等技术来解决。
  • 梯度爆炸主要通过梯度裁剪和权重正则化来避免。
    掌握这些技巧有助于训练更深、更复杂的神经网络。

http://www.ppmy.cn/embedded/139019.html

相关文章

用 Python 从零开始创建神经网络(五):损失函数(Loss Functions)计算网络误差

用损失函数(Loss Functions)计算网络误差 引言1. 分类交叉熵损失(Categorical Cross-Entropy Loss)2. 分类交叉熵损失类(The Categorical Cross-Entropy Loss Class)展示到目前为止的所有代码3. 准确率计算…

Android从Drawable资源Id直接生成Bitmap,Kotlin

Android从Drawable资源Id直接生成Bitmap,Kotlin val t1 System.currentTimeMillis()val bmp getBmpFromDrawId(this, R.mipmap.ic_launcher_round)Log.d("fly", "1 ${bmp?.byteCount} h${bmp?.height} w${bmp?.width} cost time${System.currentTimeMillis…

from sklearn.preprocessing import Imputer.处理缺失数据的工具

在 Python 的 scikit-learn 库中,Imputer 类是一个用于处理缺失数据的工具。它可以用来填充数据集中的缺失值(通常表示为 NaN 或 None)。Imputer 类提供了几种不同的填充策略,包括: 均值填充(mean&#xf…

Spring Cloud Alibaba [Gateway]网关。

1 简介 网关作为流量的入口,常用功能包括路由转发、权限校验、限流控制等。而springcloudgateway 作为SpringCloud 官方推出的第二代网关框架,取代了Zuul网关。 1.1 SpringCloudGateway特点: (1)基于Spring5,支持响应…

微服务网关聚合swagger(knife4j版本)

前言 简单集成&#xff0c;最小的依赖及配置&#xff0c;采取默认为主 步骤 依赖<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-gateway-spring-boot-starter</artifactId><version>4.4.0</version> &…

面向对象编程的局限性与适用场景分析

文章目录 1. 性能敏感的应用2. 简单的脚本或小型程序3. 资源受限的环境4. 高并发场景5. 功能单一的应用6. 需要高度定制化和灵活性的应用7. 数据密集型计算8. 需要严格控制内存的应用结论 1. 性能敏感的应用 限制原因&#xff1a; 对象实例化开销&#xff1a;面向对象编程中&…

【支持向量机(SVM)】:算法原理及核函数

文章目录 1 SVM算法原理1.1 目标函数确定1.2 约束条件优化问题转换1.3 对偶问题转换1.4 确定超平面1.5 计算举例1.6 SVM原理小节 2 SVM核函数2.1 核函数的作用2.2 核函数分类2.3 高斯核函数2.3 高斯核函数API2.4 超参数 γ \gamma γ 1 SVM算法原理 1.1 目标函数确定 SVM思想…

力扣题解3243 新增道路查询后的最短距离 I

题目&#xff1a; 给你一个整数 n 和一个二维整数数组 queries。 有 n 个城市&#xff0c;编号从 0 到 n - 1。初始时&#xff0c;每个城市 i 都有一条单向道路通往城市 i 1&#xff08; 0 < i < n - 1&#xff09;。 queries[i] [ui, vi] 表示新建一条从城市 ui 到城市…