Home Articles

pytorch:如何直接找到渐变w.r.t.失利

Asked
Viewed 1104 times
3

在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 属性附加到变量,而不是获得渐变的调用,这似乎很奇怪) .

My Question is 是否有某种方式可以根据需要进行反向传播(即,只需沿着计算 dl_dw 所需的路径进行反向传播,就像在theano中那样)?

1 Answer

  • 2

    事实证明,这真的很容易 . 只需使用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 .

Related