【问题标题】:Adam Optimizer not Updating ValuesAdam Optimizer 不更新值
【发布时间】:2021-10-04 07:02:30
【问题描述】:

我正在尝试使用 Adam 优化器来获取神经网络之外的某些值。我的技术不起作用,所以我创建了一个简单的例子来看看它是否有效:

a = np.array([[0.0,1.0,2.0,3.0,4.0], [0.0,1.0,2.0,3.0,4.0]])
b = np.array([[0.1,0.2,0.0,0.0,0.0], [0.0,0.5,0.0,0.0,0.0]])
a = torch.from_numpy(a)
b = torch.from_numpy(b)
a.requires_grad = True
b.requires_grad = True
optimizer = torch.optim.Adam(
        [b],
        lr=0.01,
        weight_decay=0.001
    )

iterations = 200
for i in range(iterations ):
    loss = torch.sqrt(((a.detach() - b.detach()) ** 2).sum(1)).mean()
    loss.requires_grad = True 
    
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if i % 10 == 0:
        print(b)
        print("loss:", loss)

我的直觉是 b 应该尽可能接近 a 以减少损失。但是我发现 b 的任何值都没有变化,并且 loss 保持完全相同。我在这里想念什么?谢谢。

【问题讨论】:

    标签: machine-learning deep-learning pytorch adam


    【解决方案1】:

    你正在分离b,这意味着在反向传播时渐变不会一直流向bb不会改变!此外,您无需在 loss 上声明 requires_grad = True,因为这是自动完成的,因为其中一个操作数已打开 requires_grad 标志。

    loss = torch.sqrt(((a.detach() - b) ** 2).sum(1)).mean()
    

    【讨论】:

    • 这解决了问题,谢谢。我相信我在最初没有 requires_grad on loss 后感到困惑,然后将每个参数上的 requires_grad 设置为 True,这造成了这个问题。
    • 在这个最小的示例中,您可以将a 视为您的基本事实,因此它不需要计算梯度。所以你只需要b.requires_grad = True。不要标志只对设置后出现的操作生效。所以loss.requires_grad = True 实际上没有任何效果,因为你在之前的行中计算了它的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 2019-10-18
    • 2017-07-02
    • 2018-05-06
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多