【问题标题】:pytorch: how to directly find gradient w.r.t. losspytorch:如何直接找到梯度 w.r.t.失利
【发布时间】:2018-01-01 13:22:12
【问题描述】:

在theano中,很容易得到一些变量w.r.t的梯度。给定的损失:

loss = f(x, w)
dl_dw = tt.grad(loss, wrt=w)

我知道 pytorch 采用了不同的范例,您可以在其中执行以下操作:

loss = f(x, w)
loss.backwards()
dl_dw = w.grad

问题是我可能不想在图形中进行完整的反向传播 - 只是沿着到达 w 所需的路径。

如果您不想通过它们进行反向传播,我知道您可以使用 requires_grad=False 定义变量。但是你必须在创建变量时决定(并且 requires_grad=False 属性附加到变量,而不是获取渐变的调用,这看起来很奇怪)。

我的问题是是否有某种方法可以按需反向传播(即只在计算dl_dw 所需的路径上反向传播,就像在theano 中那样)?

【问题讨论】:

  • 我认为这会很复杂。请注意,您只能为叶变量设置 requires_grad。因此,即使您对图表中的所有变量都有句柄,您也不能只切换 requires_grad = False 或 True 来仅计算您想要的梯度。另请注意,仅保留叶变量的梯度(如果您想要中间变量的梯度,则需要一个钩子)。如果您对叶变量的梯度感兴趣,您可以标准地设置它们的所有 requires_grad = False,然后在反向传播之前将您感兴趣的设置为 true。
  • 我认为您正在寻找register_backward_hook 功能。你可以直接用它修改渐变。

标签: theano pytorch autograd


【解决方案1】:

事实证明,这真的很容易。只需使用torch.autograd.grad

例子:

import torch
import numpy as np
from torch.autograd import grad

x = torch.autograd.Variable(torch.from_numpy(np.random.randn(5, 4)))
w = torch.autograd.Variable(torch.from_numpy(np.random.randn(4, 3)), requires_grad=True)
y = torch.autograd.Variable(torch.from_numpy(np.random.randn(5, 3)))
loss = ((x.mm(w) - y)**2).sum()
(d_loss_d_w, ) = grad(loss, w)

assert np.allclose(d_loss_d_w.data.numpy(), (x.transpose(0, 1).mm(x.mm(w)-y)*2).data.numpy())

感谢 JerryLin 回答问题here

【讨论】:

    猜你喜欢
    • 2018-10-14
    • 2021-11-25
    • 2018-06-16
    • 2022-01-13
    • 2019-09-24
    • 2022-01-14
    • 2019-04-14
    • 2019-01-10
    • 1970-01-01
    相关资源
    最近更新 更多