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

【深度学习笔记 Ⅱ】5 梯度消失和梯度爆炸

在深度学习中,**梯度消失(Vanishing Gradients)梯度爆炸(Exploding Gradients)**是训练深层神经网络时的两大常见问题,它们与反向传播中的梯度计算直接相关。以下是详细解析:


1. 梯度消失与梯度爆炸的定义

(1) 梯度消失
  • 现象:在反向传播过程中,梯度逐层指数级减小,导致浅层网络的权重几乎不更新。
  • 后果:浅层网络无法有效学习,模型仅依赖深层特征,性能下降。
(2) 梯度爆炸
  • 现象:梯度逐层指数级增大,最终超过数值表示范围(如NaN)。
  • 后果:权重更新过大,模型无法收敛,甚至引发数值溢出。

2. 原因分析

(1) 数学根源

反向传播通过链式法则计算梯度。假设网络有 (L) 层,每层的梯度计算为:
在这里插入图片描述

(2) 典型诱因
因素梯度消失梯度爆炸
激活函数Sigmoid、Tanh(导数<1)ReLU(无上界)
权重初始化过小(如N(0, 0.01))过大(如N(0, 1))
网络深度深层网络更易发生深层网络更易发生
优化器学习率过小可能加剧学习率过大直接引发

3. 解决方案

(1) 梯度消失的缓解方法
  • 使用合适的激活函数

    • ReLU 及其变种(LeakyReLU、PReLU、Swish):导数在正区间为1,避免连乘衰减。
    • 避免Sigmoid/Tanh(尤其深层网络)。
  • 权重初始化
    在这里插入图片描述

  • 残差连接(ResNet)

    • 通过跳跃连接(Skip Connection)绕过部分层,梯度可直接回传。
      在这里插入图片描述
  • Batch Normalization

    • 保持每层输入的分布稳定,缓解梯度幅度波动。
(2) 梯度爆炸的缓解方法
  • 梯度裁剪(Gradient Clipping)

    • 设定阈值,强制梯度不超过该值。
    torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
    
  • 权重正则化

    • L2正则化惩罚大权重,限制梯度幅度。
  • 降低学习率

    • 避免单步更新过大。
(3) 通用策略
  • 使用LSTM/GRU(RNN中)
    • 门控机制控制梯度流动,缓解时序上的梯度问题。
  • 监控梯度
    • 打印各层梯度范数,早期发现问题。
    for name, param in model.named_parameters():if param.grad is not None:print(f"{name}: {param.grad.norm()}")
    

4. 代码示例

(1) 梯度裁剪(PyTorch)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
for epoch in range(epochs):optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()# 梯度裁剪(阈值=1.0)torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)optimizer.step()
(2) 权重初始化(ReLU网络)
import torch.nn as nndef init_weights(m):if isinstance(m, nn.Linear):nn.init.kaiming_normal_(m.weight, mode='fan_in', nonlinearity='relu')m.bias.data.fill_(0.01)model.apply(init_weights)

5. 现象对比

特征梯度消失梯度爆炸
梯度表现趋近于0数值溢出(NaN/Inf)
训练现象浅层权重几乎不变损失剧烈震荡或突变为NaN
典型激活函数Sigmoid、TanhReLU(无上界)
解决方案ReLU、残差连接、BN梯度裁剪、权重初始化

6. 总结

  • 梯度消失梯度爆炸本质是反向传播中链式法则的连乘效应导致的数值不稳定问题。
  • 关键解决思路
    • 控制梯度流动(如残差连接、门控机制)。
    • 稳定数值范围(如BN、梯度裁剪)。
    • 优化初始化与激活函数。
  • 实践建议:深层网络中优先使用ReLU+He初始化+残差连接,并监控梯度动态。
http://www.dtcms.com/a/287663.html

相关文章:

  • 猎板:在 5G 与 AI 时代,印制线路板如何满足高性能需求
  • GeoPandas 城市规划:Python 空间数据初学者指南
  • gitee 分支切换
  • 【kafka4源码学习系列】kafka4总体架构介绍
  • Gerrit workflow
  • 3-大语言模型—理论基础:生成式预训练语言模型GPT(代码“活起来”)
  • 2、Redis持久化详解
  • 【iOS】编译和链接、动静态库及dyld的简单学习
  • 历史数据分析——国药现代
  • ABP VNext + Kubernetes Istio:微服务网格实战指南
  • 基于Socket来构建无界数据流并通过Flink框架进行处理
  • 读书笔记:最好使用C++转型操作符
  • 【C++】初识C++(2)
  • c#泛型集合(ArrayList和List、Dictionary的对比)
  • 记录我coding印象比较深刻的BUG
  • 支付宝支付
  • fastjson2 下划线字段转驼峰对象
  • 链路聚合技术(思科链路聚合实验)
  • 【Linux驱动-快速回顾】简单了解一下PinCtrl子系统:设备树如何被接解析与匹配
  • 【取消分仓-分布式锁】
  • PCIe RAS学习专题(3):AER内核处理流程梳理
  • windows docker-03-如何一步步学习 docker
  • VSCode用Python操作MySQL:环境配置与代码验证
  • CentOS 清理技巧
  • 音视频学习(四十):H264码流结构
  • Tailwind CSS中设定宽度和高度的方法
  • ubuntu下好用的录屏工具
  • TCP 和 UDP 在创建套接字(Socket)时的区别
  • Claude Code 最新详细安装教程
  • 在 Solidity 中,abi是啥