在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中一样) ?
答案 0 :(得分: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。