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

标签 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)

最佳答案

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

关于python - 为什么 pytorch 没有为我最小化 x*x?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50588958/

相关文章:

python - 尝试访问 Django Rest Framework 中的嵌套序列化程序时出现属性错误

python - 如何使用python获取mp3文件的采样率

c++ - const <type>& foo() 与 <type> foo()

python - 如何从模型本身找到 torch 模型名称?

python - 我怎样才能拥有 PyTorch 模块的子模块而不是模块的属性

python - 在 PyTorch 中将张量的一部分分割成另一个张量的最快方法是什么?

python - Python 中的链式比较数字范围

python - 取决于一个参数的不确定循环次数

python - 如何在不使用 cythonizing 的情况下以纯 pythonic 方式优化 python 代码

c++ - 如何在 C++ 中更有效地生成这么多排列?