梯度裁剪是为了防止梯度爆炸。在训练FCOS算法时,因为训练过程出现了损失为NaN的情况,在github issue有很多都是这种训练过程出现loss为NaN,使用torch.nn.utils.clip_grad_norm_梯度裁剪函数,可以有效预防梯度爆炸的情况发生。
1 clip_grad_norm_介绍
1.1 函数原型

def clip_grad_norm_(
parameters: _tensor_or_tensors, max_norm: float, norm_type: float = 2.0,
error_if_nonfinite: bool = False, foreach: Optional[bool] = None) -> torch.Tensor:
- parameters:需要进行梯度裁剪的参数列表。通常是模型的参数列表,即model.parameters()
- max_norm:可以理解为梯度(默认是L2 范数)范数的最大阈值
- norm_type:可以理解为指定范数的类型,比如norm_type=1 表示使用L1 范数,norm_type=2 表示使用L2 范数。
这个梯度裁剪函数一般来说只需要调整max_norm 和norm_type这两个参数。clip_grad_norm_最后就是对所有的梯度乘以一个clip_coef,而且乘的前提是clip_coef一定是小于1的,所以,按照这个情况:clip_grad_norm只解决梯度爆炸问题,不解决梯度消失问题
torch.nn.

文章介绍了在训练FCOS算法时遇到的loss为NaN问题,通过使用torch.nn.utils.clip_grad_norm_函数进行梯度裁剪来预防梯度爆炸。该方法通过调整max_norm和norm_type参数,限制梯度的范数,确保训练过程稳定。
最低0.47元/天 解锁文章
5万+

被折叠的 条评论
为什么被折叠?



