pytorch中的梯度裁剪

神经网络是通过梯度下降来学习的,在进行反向传播时,进行每一层的梯度计算,假设梯度都是比较大的值,计算到第一层的梯度时,会呈指数级增长,那么更新完的参数值会越来越大,产生梯度爆炸现象。一个比较常见的表现就是损失变成non。

梯度裁剪(Gradient Clipping)是一种防止梯度爆炸或梯度消失的技术,它可以在反向传播过程中对梯度进行缩放或截断,使其保持在一个合理的范围内。梯度裁剪有两种常见的方法:按梯度的绝对值截断或者按梯度的范数进行截断。pytorch给定了相应方法实现,这一步应该在更新参数前进行。

按值截断

c 复制代码
torch.nn.utils.clip_grad_value_(model.parameters(), value)

对一个参数的梯度进行裁剪,使其不超过一个指定的值,它接受两个参数:一个是模型的参数,一个是裁剪的值。它会对每个参数的梯度进行裁剪,使其在 [-value,value]的范围内。这样可以避免梯度过大或过小,影响模型的收敛。例子:

c 复制代码
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()
 
# 在更新权重之前,对梯度进行裁剪,使其不超过0.5
torch.nn.utils.clip_grad_value_(model.parameters(), clip_value=0.5)
 
# 更新权重
optimizer.step()

按范数截断

c 复制代码
torch.nn.utils.clip_grad_norm_(model.parameters(), threshold)

对一个参数的梯度进行裁剪,首先计算出梯度的范数,然后将其限制在一个最大值之内。这样可以防止在反向传播过程中梯度过大导致的数值不稳定问题。例子:

c 复制代码
import torch
import torch.nn as nn
import torch.optim as optim
 
# 假设我们有一个简单的全连接网络
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc = nn.Linear(10, 1)
 
    def forward(self, x):
        return self.fc(x)
 
# 创建网络、优化器和损失函数
model = Net()
optimizer = optim.SGD(model.parameters(), lr=0.01)
loss_fn = nn.MSELoss()
 
# 假设我们有一些随机输入数据和目标
data = torch.randn(5, 10)
target = torch.randn(5, 1)
 
# 训练步骤
outputs = model(data)  # 前向传播
loss = loss_fn(outputs, target)  # 计算损失
optimizer.zero_grad()  # 清零梯度
loss.backward()  # 反向传播,计算梯度
 
# 在优化器步骤之前,我们使用梯度裁剪
nn.utils.clip_grad_norm_(model.parameters(), max_norm=20, norm_type=2)
 
optimizer.step()  # 更新模型参数
相关推荐
EkihzniY5 小时前
AI+OCR:解锁数字化新视界
人工智能·ocr
东哥说-MES|从入门到精通5 小时前
GenAI-生成式人工智能在工业制造中的应用
大数据·人工智能·智能制造·数字化·数字化转型·mes
程序员小远5 小时前
软件测试之单元测试详解
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
心无旁骛~5 小时前
python多进程和多线程问题
开发语言·python
铅笔侠_小龙虾5 小时前
深度学习理论推导--梯度下降法
人工智能·深度学习
星云数灵5 小时前
使用Anaconda管理Python环境:安装与验证Pandas、NumPy、Matplotlib
开发语言·python·数据分析·pandas·教程·环境配置·anaconda
kaikaile19956 小时前
基于遗传算法的车辆路径问题(VRP)解决方案MATLAB实现
开发语言·人工智能·matlab
lpfasd1236 小时前
第1章_LangGraph的背景与设计哲学
人工智能
计算机毕设匠心工作室6 小时前
【python大数据毕设实战】青少年抑郁症风险数据分析可视化系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习
后端·python
计算机毕设小月哥6 小时前
【Hadoop+Spark+python毕设】智能制造生产效能分析与可视化系统、计算机毕业设计、包括数据爬取、Spark、数据分析、数据可视化、Hadoop
后端·python·mysql