为什么 pytorch 没有为我最小化 x*x?
Why pytorch isn't minimizing x*x for me?
我希望 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)
你遇到的问题是你在计算每个循环时没有将梯度归零。相反,通过在循环的每一步设置 retain_graph=True
而不是调用 opt.zero_grad()
,您实际上是将计算的梯度添加到 ALL 之前计算的梯度。因此,您不是在梯度下降中迈出一步,而是在 所有 累积梯度上迈出一步,这当然不是您想要的。
您应该确保在循环开始时调用 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)
而我的最终 x
是 1e-25
。
我希望 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)
你遇到的问题是你在计算每个循环时没有将梯度归零。相反,通过在循环的每一步设置 retain_graph=True
而不是调用 opt.zero_grad()
,您实际上是将计算的梯度添加到 ALL 之前计算的梯度。因此,您不是在梯度下降中迈出一步,而是在 所有 累积梯度上迈出一步,这当然不是您想要的。
您应该确保在循环开始时调用 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)
而我的最终 x
是 1e-25
。