【问题标题】:Shall I use grad.zero_() in PyTorch with or without gradient tracking?我应该在 PyTorch 中使用 grad.zero_() 还是不使用梯度跟踪?
【发布时间】:2022-02-02 22:44:26
【问题描述】:

我对 PyTorch 很陌生,我有一个关于在一个时期后将梯度归零的问题。假设我有以下训练循环:

for epoch in range(n_iters):
  y_hat = forward(X)
  l = loss(y, y_hat)
  with torch.no_grad():
    l.backward()
    w -= lr * w.grad

很明显,为了不累积梯度,我需要将w.grad 属性归零。但是,我不确定在哪里打电话给w.grad.zero_()。我都在互联网教程中找到了在no_grad() 部分中调用它的位置以及从中调用它的位置。所以我对它们进行了测试,它们都适用于简单的线性回归。
两者有什么区别吗?如果有,哪个更好用?

【问题讨论】:

  • 我还在一些代码中看到他们在 no_grad() 之外调用了 backward(),尤其是在使用内置优化器时。这样做是否有更多的计算成本?我读到在不需要梯度跟踪时使用no_grad() 可以使代码更快。

标签: python pytorch autograd


【解决方案1】:

在您的 sn-p 中,这并不重要。 zero_() 名称中的下划线表示它是一个就地函数,并且由于 w.grad.requires_grad == False 我们知道不会有任何梯度计算相对于 w.grad 无论如何都会发生。唯一重要的是它发生在loss.backward() 调用之前。

我建议您为您的损失函数和它计算的实际损失张量使用不同的名称,否则您将用另一个名称覆盖。

【讨论】:

  • 很抱歉,我应该添加w 的定义。我使用requires_grad=True 是因为我想优化它。
  • w本身确实需要梯度计算,但是它的梯度w.gradw是不同的张量,而w.grad不需要梯度计算!
猜你喜欢
  • 2019-08-27
  • 2018-11-19
  • 2019-04-29
  • 2011-07-21
  • 2011-08-12
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
相关资源
最近更新 更多