PyTorch使用Tricks:梯度裁剪-防止梯度爆炸或梯度消失 !!
2025-07-01 07:51:33
文章目录
前言
1、对参数的梯度进行裁剪,使其不超过一个指定的值
2、一个使用的torch.nn.utils.clip_grad_norm_ 例子
3、怎么获得梯度的norm
4、什么情况下需要梯度裁剪
5、注意事项
前言
梯度裁剪(Gradient Clipping)是一种防止梯度爆炸或梯度消失的优化技术,它可以在反向传播过程中对梯度进行缩放或截断,使其保持在一个合理的范围内。梯度裁剪有两种常见的方法:
按照梯度的绝对值进行裁剪,即如果梯度的绝对值超过了一个阈值,就将其设置为该阈值的符号乘以该阈值。
按照梯度的范数进行裁剪,即如果梯度的范数超过了一个阈值,就将其按比例缩小,使其范数等于该阈值。例如,如果阈值为1,那么梯度的范数就是1。
在PyTorch中,可以使用 torch.nn.utils.clip_grad_value_ 和 torch.nn.utils.clip_grad_norm_ 这两个函数来实现梯度裁剪,它们都是在梯度计算完成后,更新权重之前调用的。
1、对参数的梯度进行裁剪,使其不超过一个指定的值
torch.nn.utils.clip_grad_value_ 是一个函数,它可以对一个参数的梯度进行裁剪,使其不超过一个指定的值。这样可以防止梯度爆炸或梯度消失的问题,提高模型的训练效果。
import torch
import torch.nn as nn
# 定义一个简单的线性模型
model = nn.Linear(2, 1)
# 定义一个优化器
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
# 定义一个损失函数
criterion = nn.MSELoss()
# 生成一些随机的输入和目标
x = torch.randn(4, 2)
y = torch.randn(4, 1)
# 前向传播
output = model(x)
# 计算损失
loss = criterion(output, y)
# 反向传播
loss.backward()
# 在更新权重之前&