梯度裁剪(Gradient Clipping)

打印 上一主题 下一主题

主题 1949|帖子 1949|积分 5847

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
梯度裁剪(Gradient Clipping)是一种用于防止梯度爆炸(Gradient Explosion)的技能,具体来说:
1. 梯度裁剪的作用



  • 标题背景:在训练深度神经网络(尤其是RNN/LSTM)时,反向传播过程中梯度大概会变得非常大(称为"梯度爆炸"),导致参数更新幅度过大,模型无法收敛。
  • 解决方案:梯度裁剪通过限定梯度向量的最大范数(magnitude)来稳定训练。
2. 代码表明

  1. torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
复制代码


  • model.parameters():获取模型中全部需要梯度更新的参数
  • max_norm=1.0:答应的梯度最大范数(常用值0.5~5.0)
  • clip_grad_norm_:原地修改全部参数的梯度(带下划线表现原地操作)
3. 数学原理

假设全部参数的梯度组成一个向量 g,裁剪操作如下:

  • 盘算梯度范数:‖g‖ = sqrt(∑gᵢ²)
  • 如果 ‖g‖ > max_norm:

    • 缩放梯度:g = g × (max_norm / ‖g‖)

4. 使用场景

通常在loss.backward()之后、optimizer.step()之前调用:
  1. for batch in dataloader:
  2.     loss = model(batch)          # 前向传播
  3.     loss.backward()              # 反向传播
  4.    
  5.     # 梯度裁剪(关键位置!)
  6.     torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
  7.    
  8.     optimizer.step()             # 参数更新
  9.     optimizer.zero_grad()        # 梯度清零
复制代码
5. 直观理解

想象你在下山(优化丧失函数):


  • 正常情况:沿着平缓的坡度逐步下降(梯度适中)
  • 梯度爆炸:忽然遇到悬崖,直接跳下去(梯度极大)
  • 梯度裁剪:给悬崖装上安全绳,限定最大步幅
6. 参数选择发起

典范值适用场景0.5非常敏感的模型(如深层Transformer)1.0通用保举值(LSTM/CNN等)5.0较简单的模型 7. 对比其他方法

方法长处缺点梯度裁剪简单直接,通用性强需要手动选择max_norm权重初始化预防性步伐不能完全防止爆炸改用LSTM/GRU布局上更稳定盘算本钱略高 发起在训练RNN、Transformer等模型时默认添加梯度裁剪,这是实践中稳定训练的常用技巧。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表