梯度爆炸解决方案——梯度截断(gradient clip norm)

本文介绍PyTorch中梯度裁剪的方法,包括clip_grad_norm_和clip_grad_value_函数的使用,以及如何在训练循环中正确实施梯度裁剪,以避免梯度爆炸或消失。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果梯度超过阈值,那么就截断,将梯度变为阈值

from torch.nn.utils import clip_grad_norm

pytorch源码

默认为l2(norm type)范数,对网络所有参数求l2范数,和最大梯度阈值相比,如果clip_coef<1,范数大于阈值,则所有梯度值乘以系数。

使用:

optimizer.zero_grad()        
loss, hidden = model(data, hidden, targets)
loss.backward()

torch.nn.utils.clip_grad_norm_(model.parameters(), args.clip)
optimizer.step()

python - How to properly do gradient clipping in pytorch? - Stack Overflow  https://stackoverflow.com/questions/54716377/how-to-properly-do-gradient-clipping-in-pytorch

但是,clip_grad_norm还不够狠,有时候失效,这个时候更狠的就出来了:

torch.nn.utils.clip_grad_value_(model.parameters(), number)

### 梯度爆炸梯度裁剪 #### 梯度爆炸定义 在深度学习中,当模型采用反向传播算法进行参数更新时,可能会遇到梯度爆炸现象。具体表现为,在计算损失函数相对于各层权重的导数过程中,这些导数值变得非常大,以至于超出计算机浮点数表示范围或导致数值不稳定的情况发生[^3]。 #### 解决方案梯度裁剪 为了应对上述挑战之一——即梯度过大引发的问题,一种常用的技术称为梯度裁剪被广泛应用。这种方法的核心理念是在每次迭代期间设定一个最大允许值作为阈值;一旦检测到当前批次内的任何单个样本所产生的梯度过此界限,则对该超限部分实施截断处理,使其不超过预设的安全区间[^1][^2]。 #### 实现方式 下面给出一段Python代码片段用于展示如何在一个简单的循环体内执行基本形式的梯度裁剪操作: ```python import torch.nn.utils as utils def apply_gradient_clipping(optimizer, clip_value=0.5): # 对所有可优化变量应用梯度裁剪 params = list(filter(lambda p: p.grad is not None, optimizer.param_groups[0]['params'])) if len(params) > 0: total_norm = utils.clip_grad_norm_(params, max_norm=clip_value) print(f'Clipped gradients with norm {total_norm}') ``` 这段程序展示了怎样利用PyTorch框架内置工具`torch.nn.utils.clip_grad_norm_()`来进行全局性的梯度裁切工作。这里的关键参数`max_norm`即是前述提到的那个用来界定安全区间的上限值。 除了直接控制梯度本身之外,还可以考虑其他间接手段来抑制极端情况的发生,比如使用权重正则化方法调整权值矩阵规模,或是设计更合理的初始化策略减少初始阶段可能出现的大尺度波动等问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值