You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

这段PyTorch代码能否准确演示Accumulated Gradients(梯度累积)?

梯度累积代码的问题与修正

你的代码没有准确体现PyTorch中梯度累积的原生实现逻辑,存在冗余操作和不必要的手动累加,具体问题如下:

  • 冗余的初始化操作:
    • 手动设置param.requires_grad = True完全多余,PyTorch的nn.Module参数默认就开启梯度追踪;param.grad = None也没必要,optimizer.zero_grad()会自动将梯度置零或初始化。
  • 错误使用retain_graph=True:
    • 每个批次的输入和计算图都是独立的,不需要保留计算图,这个参数会额外占用显存,完全可以去掉。
  • 手动维护accumulated_gradients是重复劳动:
    • PyTorch的梯度本身就支持自动累加——只要在多个批次的backward()之间不调用zero_grad(),每次反向传播的梯度就会自动加到param.grad中,不需要手动收集和累加梯度,你的代码相当于绕开了原生机制,做了重复且容易出错的工作。
  • 最后手动赋值param.grad = accumulated_gradient完全多余:
    • 实际上经过5次backward()后,param.grad已经是累加后的梯度值,不需要再手动替换。

正确的梯度累积实现示例

import torch
import torch.nn as nn

class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.fc = nn.Linear(10, 1)

    def forward(self, x):
        return self.fc(x)

model = SimpleModel()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
accumulation_steps = 5  # 累积5个批次的梯度

optimizer.zero_grad()  # 初始清零梯度
for i in range(accumulation_steps):
    input_data = torch.randn(1, 10)
    output = model(input_data)
    loss = output.sum()
    loss.backward()  # 梯度自动累加,无需手动维护
    print(f"Gradients after batch {i + 1} accumulated.")

# 用累加后的梯度更新参数
optimizer.step()
print(f"Weights after 5 batches update: {model.fc.weight.data}")

这个版本才是PyTorch中梯度累积的标准实现:通过多次反向传播不清零梯度实现自动累加,最后统一执行一次optimizer.step()更新参数,完全利用框架原生机制,简洁且不易出错。

内容的提问来源于stack exchange,提问作者Arup Sankar Roy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:12:49