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

为何PyTorch无法最小化x*x?代码错误排查求助

你的代码存在这3个关键错误,导致x无法收敛到0

让我帮你逐一拆解问题,以及对应的修复方式:

错误1:没有在每次迭代中重新计算损失值z

你当前只在循环外部定义了一次z = x*x,这意味着不管后续x怎么被优化器更新,z始终是初始x=3时的固定值9。后续每次反向传播都是基于这个固定的z计算梯度,优化器自然没法朝着让z最小化(即x=0)的方向更新参数。

错误2:没有清空累积的梯度

PyTorch的梯度是累积式的——每次调用backward()时,梯度值会加到之前的梯度缓存里,而不是直接覆盖。如果不清空梯度,每次迭代的梯度都会叠加,导致优化器收到混乱的梯度信号,完全无法正确更新x。

错误3:不必要的retain_graph=True

这里你每次迭代都是独立计算z的梯度,根本不需要保留计算图。retain_graph=True会让计算图一直驻留在内存中,既浪费资源,还可能引发潜在的梯度累积问题,完全可以去掉这个参数。


修复后的完整代码

import torch
from torch.autograd import Variable

tns = torch.FloatTensor([3])
x = Variable(tns, requires_grad=True)
opt = torch.optim.Adam([x], lr=.01, betas=(0.5, 0.999))

for i in range(3000):
    opt.zero_grad()  # 每次迭代前清空梯度缓存
    z = x * x  # 根据当前x重新计算损失
    z.backward()  # 计算当前梯度
    opt.step()  # 更新参数
    if i % 300 == 0:  # 每隔300次打印一次,避免输出刷屏
        print(f"Iteration {i}: x = {x.item():.6f}")

运行这段代码后,你会看到x会逐步收敛到0,最终会非常接近目标值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:58:45