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

理解PyTorch计算图生成:为何两次调用backward有时报错有时正常?

PyTorch二次反传报错问题解答

这个报错的核心原因是PyTorch动态计算图的默认释放机制:
默认情况下,计算图的中间缓存会在调用.backward()完成梯度计算后被自动销毁,避免不必要的内存占用。

第一段代码报错的原因

你第一次生成的z = torch.matmul(x, w)+b对应唯一的一张计算图,后续两次loss计算均复用了同一个z对应的旧计算图:

  • 第一次调用loss.backward()后,这张旧计算图的缓存已经被释放
  • 第二次对同一个z生成的loss调用backward,本质是尝试在已经销毁的计算图上二次反传,因此触发报错。

第二段代码正常运行的原因

你在第一次backward之后重新执行了z = torch.matmul(x, w)+b:

  • 这一步会基于当前的w、b参数重新生成一个全新的z变量,同时构建一张完全独立的新计算图
  • 后续生成的loss绑定在新计算图上,调用backward自然不会和已经销毁的旧计算图产生冲突。

可选解决方案

如果你需要对同一张计算图执行多次反传,可以在第一次调用backward时指定保留图参数:

loss.backward(retain_graph=True)

该参数会让PyTorch在反传完成后不释放计算图缓存,可满足多次反传需求,但会额外占用内存,非必要场景不推荐开启。


内容的提问来源于stack exchange,提问作者QCD_IS_GOOD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 18:30:04