代码之家  ›  专栏  ›  技术社区  ›  Stepan Yakovenko

为什么PyTorch不为我最小化x*x?

  •  2
  • Stepan Yakovenko  · 技术社区  · 6 年前

    我期望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)
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   enumaris    6 年前

    你的问题是,当你计算每个循环的时候,你不会把梯度调零。相反,通过设置 retain_graph=True 不打电话 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 .