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

时间:2017-07-26 09:44:40

标签: theano pytorch autograd

在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中一样) ?

1 个答案:

答案 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