为什么 pytorch 没有为我最小化 x*x ?

Ste*_*nko 3 python optimization pytorch tensor

我期望 x 收敛到 0,这是 x*x 的最小值。但这并没有发生。我在这个小示例代码中做错了什么:

import torch
from torch.autograd import Variable
tns = torch.FloatTensor([3])
x = Variable(tns, requires_grad=True)
z = x*x
opt = torch.optim.Adam([x], lr=.01, betas=(0.5, 0.999))
for i in range(3000):
    z.backward(retain_graph=True) # Calculate gradients
    opt.step()
    print(x)
Run Code Online (Sandbox Code Playgroud)

enu*_*ris 5

您遇到的问题是,在计算每个循环时没有将梯度归零。相反,通过在循环的每一步进行设置retain_graph=True而不调用,您实际上是将计算出的梯度添加到所有先前计算的梯度中。因此,您不是在梯度下降中采取一步,而是针对所有累积的梯度采取一步,这当然不是您想要的。opt.zero_grad()

相反,您应该确保opt.zero_grad()在循环开始时调用,并将循环移到z=x*x循环内部,这样您就不必这样做retain_graph

我做了这些细微的修改:

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
    z.backward() # Calculate gradients
    opt.step()
    print(x)
Run Code Online (Sandbox Code Playgroud)

我的决赛x1e-25