PyTorch中在反向传播前为什么要手动将梯度清零?

在PyTorch中,手动清零梯度是为了实现梯度累加,这能有效节省内存并允许在小批量训练中模拟全批量的效果。梯度累加通过在反向传播时不立即更新权重,而是累积多个批次的梯度,然后一次性更新,可以解决显存限制问题。此外,对于多任务学习,梯度累加使得共享部分的梯度可以自动累加。但需要注意,使用梯度累加时,学习率应适当调整,并可能需要关注BN层的momentum参数。

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

PyTorch中在反向传播前为什么要手动将梯度清零?
 

这种模式可以让梯度玩出更多花样,比如说梯度累加(gradient accumulation)

传统的训练函数,一个batch是这么训练的:

for i,(images,target) in enumerate(train_loader):
    # 1. input output
    images = images.cuda(non_blocking=True)
    target = torch.from_numpy(np.array(target)).float().cuda(non_blocking=True)
    outputs = model(images)
    loss = criterion(outputs,target)

    # 2. backward
    optimizer.zero_grad()   # reset gradient
    loss.backward()
    optimizer.step()
  1. 获取loss:输入图像和标签,通过infer计算得到预测值,计算损失函数;

  2. optimizer.zero_grad() 清空过往梯度;

  3. loss.backward() 反向传播,计算当前梯度;

  4. optimizer.step() 根据梯度更新网络参数

简单的说就是进来一个batch的数据,计算一次梯度,更新一次网络

使用梯度累加是这么写的:

for i,(images,target) in enumerate(train_loader):
    # 1. input output
    images =
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值