【问题标题】:How to set gradients to Zero without optimizer?如何在没有优化器的情况下将梯度设置为零?
【发布时间】:2019-02-12 10:33:48
【问题描述】:

在多个.backward() 传递之间,我想将渐变设置为零。现在我必须分别为每个组件执行此操作(这里是xt),有没有办法为所有受影响的变量“全局”执行此操作? (我想像z.set_all_gradients_to_zero()。)

如果您使用优化器,我知道有optimizer.zero_grad(),但是否也有不使用优化器的直接方法?

import torch

x = torch.randn(3, requires_grad = True)
t = torch.randn(3, requires_grad = True)
y = x + t
z = y + y.flip(0)

z.backward(torch.tensor([1., 0., 0.]), retain_graph = True)
print(x.grad)
print(t.grad)
x.grad.data.zero_()  # both gradients need to be set to zero 
t.grad.data.zero_()
z.backward(torch.tensor([0., 1., 0.]), retain_graph = True)
print(x.grad)
print(t.grad)

【问题讨论】:

    标签: gradient pytorch


    【解决方案1】:

    您也可以使用nn.Module.zero_grad()。事实上,optim.zero_grad() 只是在传递给它的所有参数上调用 nn.Module.zero_grad()

    没有合理的方法可以在全球范围内进行。您可以在列表中收集变量

    grad_vars = [x, t]
    for var in grad_vars:
        var.grad.data = None
    

    或基于vars() 创建一些hacky 函数。也许也可以检查计算图并将所有叶节点的梯度归零,但我不熟悉图 API。长话短说,您应该使用torch.nn 的面向对象接口,而不是手动创建张量变量。

    【讨论】:

      猜你喜欢
      • 2018-08-18
      • 1970-01-01
      • 2014-01-07
      • 1970-01-01
      • 2021-10-27
      • 2014-10-20
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      相关资源
      最近更新 更多