【漫话机器学习系列】053.梯度爆炸(Exploding Gradient Problem)

devtools/2025/1/23 4:07:43/

c01237f03a8e4b5d8d3dc5cd0d6647e3.jpeg

梯度爆炸(Exploding Gradient Problem)

定义

梯度爆炸是指在深度神经网络的训练过程中,由于梯度的值在反向传播时不断累积,导致梯度变得非常大,以至于模型无法正常学习。这种现象在深层网络或循环神经网络(RNN)中尤为常见。


现象表现

  1. 权重更新不稳定
    • 梯度爆炸会导致模型的权重更新过大,甚至出现无意义的数值(如 NaN)。
  2. 损失函数波动剧烈
    • 损失值可能突然变得极大或无穷大,使训练过程失败。
  3. 模型训练卡死
    • 在极端情况下,训练过程可能会中断,无法继续。

数学解释

在神经网络中,反向传播计算梯度时,需要链式求导。对于一个 L 层的神经网络,权重的梯度为:

eq?%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20w%7D%20%3D%20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20a_L%7D%20%5Ccdot%20%5Cfrac%7B%5Cpartial%20a_L%7D%7B%5Cpartial%20a_%7BL-1%7D%7D%20%5Ccdots%20%5Cfrac%7B%5Cpartial%20a_2%7D%7B%5Cpartial%20a_1%7D%20%5Ccdot%20%5Cfrac%7B%5Cpartial%20a_1%7D%7B%5Cpartial%20w%7D

其中 eq?a_i 是第 i 层的激活值。

如果每层的梯度 eq?%5Cfrac%7B%5Cpartial%20a_i%7D%7B%5Cpartial%20a_%7Bi-1%7D%7D 大于 1,那么随着层数 L 的增加,梯度的值会以指数形式增长,最终导致梯度爆炸。


发生原因

  1. 权重初始化不当
    • 如果初始权重过大,反向传播的梯度也可能快速增长。
  2. 过深的网络结构
    • 网络层数较多时,链式求导累积更容易导致梯度膨胀。
  3. 激活函数选择不当
    • 使用某些激活函数(如未归一化的 ReLU)可能导致梯度范围扩大。
  4. 学习率过高
    • 在梯度爆炸的情况下,较高的学习率会进一步放大问题。

影响

  • 模型不收敛:梯度过大导致模型无法找到最优解。
  • 数值溢出:过大的梯度引起数值计算异常,导致训练中断。
  • 无法拟合数据:模型无法学到合理的参数,表现不佳。

解决方法

  1. 梯度裁剪(Gradient Clipping)

    • 将梯度限制在一定范围内。例如,如果梯度的范数超过一个阈值 τ\tauτ,则对其进行缩放: eq?g%20%5Cleftarrow%20%5Cfrac%7B%5Ctau%7D%7B%5C%7Cg%5C%7C%7D%20%5Ccdot%20g 其中 g 是梯度向量。
  2. 权重初始化优化

    • 使用合适的初始化方法,例如 Xavier 初始化或 He 初始化,可以减少梯度的异常增长。
  3. 正则化

    • 添加正则化项(如 L2 正则化)来约束模型的参数。
  4. 优化算法

    • 使用更稳定的优化算法,如 Adam 或 RMSProp,它们对梯度异常敏感性较低。
  5. 归一化技术

    • 在网络中加入批量归一化(Batch Normalization),缓解梯度过大的问题。
  6. 调整学习率

    • 降低学习率可以避免梯度爆炸。
  7. 激活函数选择

    • 使用更平稳的激活函数(如 Tanh 或归一化的 ReLU)减少梯度范围。

代码示例

梯度裁剪实现:

import torch
import torch.nn as nn
import torch.optim as optim# 模型定义
model = nn.Sequential(nn.Linear(10, 50),nn.ReLU(),nn.Linear(50, 1)
)# 损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练过程
for epoch in range(100):inputs = torch.randn(64, 10)  # 随机输入targets = torch.randn(64, 1)  # 随机目标值# 前向传播outputs = model(inputs)loss = criterion(outputs, targets)# 反向传播optimizer.zero_grad()loss.backward()# 梯度裁剪torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)# 参数更新optimizer.step()print(f"Epoch {epoch+1}, Loss: {loss.item()}")

运行结果 

Epoch 1, Loss: 0.9353623390197754
Epoch 2, Loss: 1.0135586261749268
Epoch 3, Loss: 1.0498164892196655
Epoch 4, Loss: 1.0166290998458862
Epoch 5, Loss: 1.078322172164917
Epoch 6, Loss: 0.8065537810325623
Epoch 7, Loss: 1.0013720989227295
Epoch 8, Loss: 1.0044411420822144
Epoch 9, Loss: 1.2215657234191895
Epoch 10, Loss: 1.0764230489730835
Epoch 11, Loss: 1.2235511541366577
Epoch 12, Loss: 1.089988350868225
Epoch 13, Loss: 1.1226621866226196
Epoch 14, Loss: 0.8689095973968506
Epoch 15, Loss: 1.0223637819290161
Epoch 16, Loss: 0.9051616787910461
Epoch 17, Loss: 1.0364428758621216
Epoch 18, Loss: 1.1008788347244263
Epoch 19, Loss: 1.068613052368164
Epoch 20, Loss: 0.9570407867431641
Epoch 21, Loss: 0.9134659171104431
Epoch 22, Loss: 0.9756873846054077
Epoch 23, Loss: 0.9149353504180908
Epoch 24, Loss: 0.9844468832015991
Epoch 25, Loss: 0.7604999542236328
Epoch 26, Loss: 1.3960868120193481
Epoch 27, Loss: 0.8202968835830688
Epoch 28, Loss: 0.8156111836433411
Epoch 29, Loss: 1.024656057357788
Epoch 30, Loss: 0.7844265699386597
Epoch 31, Loss: 0.9706763029098511
Epoch 32, Loss: 1.018797755241394
Epoch 33, Loss: 0.984021782875061
Epoch 34, Loss: 0.7703614234924316
Epoch 35, Loss: 0.8849660158157349
Epoch 36, Loss: 1.0543287992477417
Epoch 37, Loss: 0.8054167032241821
Epoch 38, Loss: 0.8437783122062683
Epoch 39, Loss: 0.6236374974250793
Epoch 40, Loss: 1.0583598613739014
Epoch 41, Loss: 0.8483368754386902
Epoch 42, Loss: 1.147507905960083
Epoch 43, Loss: 0.7888745069503784
Epoch 44, Loss: 0.8436959981918335
Epoch 45, Loss: 1.0709511041641235
Epoch 46, Loss: 0.9241514205932617
Epoch 47, Loss: 1.3219900131225586
Epoch 48, Loss: 1.1782524585723877
Epoch 49, Loss: 0.948196291923523
Epoch 50, Loss: 1.164334774017334
Epoch 51, Loss: 1.3077342510223389
Epoch 52, Loss: 1.1795661449432373
Epoch 53, Loss: 0.7945247292518616
Epoch 54, Loss: 1.0138999223709106
Epoch 55, Loss: 1.2937341928482056
Epoch 56, Loss: 0.9241679906845093
Epoch 57, Loss: 0.9352378249168396
Epoch 58, Loss: 1.2445125579833984
Epoch 59, Loss: 1.0489168167114258
Epoch 60, Loss: 0.9643220901489258
Epoch 61, Loss: 1.1172622442245483
Epoch 62, Loss: 1.1352969408035278
Epoch 63, Loss: 0.9021975994110107
Epoch 64, Loss: 0.99908846616745
Epoch 65, Loss: 1.0350050926208496
Epoch 66, Loss: 0.8825960159301758
Epoch 67, Loss: 1.322047472000122
Epoch 68, Loss: 1.022111415863037
Epoch 69, Loss: 1.0967003107070923
Epoch 70, Loss: 1.0078792572021484
Epoch 71, Loss: 0.9181473851203918
Epoch 72, Loss: 0.8504791855812073
Epoch 73, Loss: 1.2961199283599854
Epoch 74, Loss: 0.9967918395996094
Epoch 75, Loss: 0.7275142669677734
Epoch 76, Loss: 0.7401612401008606
Epoch 77, Loss: 0.7959661483764648
Epoch 78, Loss: 1.121788740158081
Epoch 79, Loss: 1.125636100769043
Epoch 80, Loss: 1.133278250694275
Epoch 81, Loss: 1.2588688135147095
Epoch 82, Loss: 1.3474342823028564
Epoch 83, Loss: 1.0902915000915527
Epoch 84, Loss: 0.9076250195503235
Epoch 85, Loss: 1.2593263387680054
Epoch 86, Loss: 0.9468114376068115
Epoch 87, Loss: 0.7691105604171753
Epoch 88, Loss: 0.8716819882392883
Epoch 89, Loss: 0.8785876631736755
Epoch 90, Loss: 1.170161485671997
Epoch 91, Loss: 0.867894172668457
Epoch 92, Loss: 1.0936464071273804
Epoch 93, Loss: 1.275876522064209
Epoch 94, Loss: 1.1516904830932617
Epoch 95, Loss: 0.9729659557342529
Epoch 96, Loss: 1.2984219789505005
Epoch 97, Loss: 1.0331567525863647
Epoch 98, Loss: 1.0300371646881104
Epoch 99, Loss: 0.9387220740318298
Epoch 100, Loss: 1.5200172662734985

 


总结

  • 梯度爆炸是深度学习中常见的问题,特别是在深层网络和循环神经网络中。
  • 通过梯度裁剪、权重初始化、优化算法和正则化等方法,可以有效缓解梯度爆炸问题。
  • 有效管理梯度是确保模型稳定性和优化性能的重要环节。

 


http://www.ppmy.cn/devtools/152773.html

相关文章

C++ 智能指针(八股总结)

C中的智能指针有哪些,各自有什么作用? 智能指针主要解决一个内存泄露的问题,它可以自动地释放内存空间。因为它本身是一个类,当函数结束的时候会调用析构函数,并由析构函数释放内存空间。智能指针分为共享指针(shared_ptr), 独占…

1.3变革之力:Transformer 如何重塑深度学习的未来

变革之力:Transformer 如何重塑深度学习的未来 在深度学习的历史上,Transformer 是一项标志性的突破,彻底改变了自然语言处理(NLP)和机器学习领域的格局。自从它在2017年由 Vaswani 等人提出以来,Transformer 便成为了处理序列数据的标准架构,其强大的表达能力和计算效…

阿里云服务器在Ubuntu上安装redis并使用

1、redis安装 sudo apt install lsb-release curl gpgcurl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpgecho "deb [signed-by/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.…

YOLOv9改进,YOLOv9检测头融合RFAConv卷积,适合目标检测、分割任务

摘要 空间注意力已广泛应用于提升卷积神经网络(CNN)的性能,但它存在一定的局限性。作者提出了一个新的视角,认为空间注意力机制本质上解决了卷积核参数共享的问题。然而,空间注意力生成的注意力图信息对于大尺寸卷积核来说是不足够的。因此,提出了一种新型的注意力机制—…

SiamCAR(2019CVPR):用于视觉跟踪的Siamese全卷积分类和回归网络

原文标题:SiamCAR: Siamese Fully Convolutional Classification and Regression for Visual Tracking 中文标题:SiamCAR:用于视觉跟踪的Siamese全卷积分类和回归 代码地址: https://github.com/ohhhyeahhh/SiamCAR Abstract 通过将视觉跟踪任务分解为两个子问题,…

vim文本编辑器三种模式的转换关系

输入模式 ———— 末行模式 输入模式和末行模式不能相互转换。 输入模式 ———— 命令模式 输入模式可以通过点击esc进入命令模式。 命令模式可以通过点击i进入输入模式。 末行模式 ———— 命令模式 末行模式可以通过点击esc进入命令模式。 命令模式可以通过shift&…

基于STM32的智能门锁安防系统(开源)

目录 项目演示 项目概述 硬件组成: 功能实现 1. 开锁模式 1.1 按键密码开锁 1.2 门禁卡开锁 1.3 指纹开锁 2. 功能备注 3. 硬件模块工作流程 3.1 步进电机控制 3.2 蜂鸣器提示 3.3 OLED显示 3.4 指纹与卡片管理 项目源代码分析 1. 主程序流程 (main…

CSS 实体

如果希望在 HTML 中使用 CSS 显示以下任何字符&#xff0c;您可以使用下表中的 CSS 实体。 实例 <style> h1:after {content: \00A7; } </style> 所有 <h1> 元素都将在结尾显示该字符&#xff1a; <!DOCTYPE html> <html> <style> h1…