【问题标题】:Why pytorch isn't minimizing x*x for me?为什么 pytorch 没有为我最小化 x*x ?
【发布时间】:2018-05-29 16:27:24
【问题描述】:

我希望 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)

【问题讨论】:

  • 你能显示输出吗? x 到底发生了什么?

标签: python optimization pytorch tensor


【解决方案1】:

您遇到的问题是在计算每个循环时没有将梯度归零。相反,通过设置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)

我最后的x1e-25

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    相关资源
    最近更新 更多