核心要点

  • 清零参数上累加的 .grad

  • 每个训练 step 开始前调用

  • 可用 optimizer.zero_grad 或 model.zero_grad

  • 理解梯度累积场景例外

简要回答

zero_grad() 将模型参数的 .grad 清零,防止梯度累加;每个 batch 的 backward 之前应调用,除非故意做梯度累积。

标准回答

一、先给出结论和背景

  • 核心回答PyTorchoptimizer.zero_grad()model.zero_grad() 用于清零梯度
  • 原因loss.backward() 将梯度累加param.grad(便于梯度累积)。若不清零,上一 batch 的梯度残留,等价错误的大 batch 或发散训练。

二、拆开关键步骤和判断点

  • 标准时机:——每个训练 step 开始前
    示例代码可以这样理解:
    for x, y in loader:
    optimizer.zero_grad() # ① 清零
    loss = criterion(model(x), y)
    loss.backward() # ② 累加梯度
    optimizer.step() # ③ 更新
  • set_to_none=True:(推荐):optimizer.zero_grad(set_to_none=True) 释放 .grad 引用,略省内存,下轮 backward 重新分配。

三、补上落地边界和取舍

  • 例外——梯度累积:每 N 步才 step(),中间步 zero_grad,手动累积 N 个小 batch 梯度后一次更新,模拟大 batch。详见 深度学习训练技巧

面试里不要只停在公式或名词,可以补 PyTorch 中 zero_grad 的作用是什么 对训练稳定性、泛化、收敛速度或显存/算力的影响。再说明一个常见调参或排错场景,面试官会更容易判断你真的用过这些方法。

回答思路

  • 【定义】用一句话说清「PyTorch 中 zero_grad() 的作用是什么?何时调用」

  • 【原理】讲清关键机制或步骤(2~3 点)

  • 【例子】举一个真实项目、论文或产品中的例子

  • 【对比】与易混淆概念或替代方案比较(如有)

  • 【收尾】总结适用场景 + 一个局限或风险

延伸学习

工具:PyTorch。术语:梯度反向传播。知识库:深度学习训练技巧反向传播原理

常见误区

⚠️ 常见踩坑

误区一:容易答偏的地方:每 epoch 而非每 step 清零;梯度累积时误每步清零;backward 后忘记 step 只清零。

追问

追问 1zero_grad 和 grad.zero_() 区别?

optimizer.zero_grad 遍历所有 param;单个 tensor 可用 param.grad.zero_() 只清该参数。功能等价于置零。

追问 2忘记 zero_grad 有什么现象?

loss 震荡、不收敛或收敛极慢;grad norm 异常大。是新手最常见 bug 之一,排查时应同时打印梯度范数。

追问 3推理需要 zero_grad 吗?

不需要。推理用 torch.no_grad(),不建梯度,无 .grad 累加问题,还能减少显存占用并提升推理速度。

🔗 相似问题

同一考点的不同问法,换着练更稳

延伸学习

按主题分类的相关资源,便于系统复习