pytorch:如何直接求梯度w.r.t。失利
pytorch: how to directly find gradient w.r.t. loss
在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
属性 附加到变量,而不是获取梯度的调用,这看起来很奇怪)。
我的问题是有没有什么方法可以按需反向传播(即只沿着计算[=15=所需的路径反向传播) ], 就像你在 theano 中一样)?
原来这真的很简单。只需使用 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。
在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
属性 附加到变量,而不是获取梯度的调用,这看起来很奇怪)。
我的问题是有没有什么方法可以按需反向传播(即只沿着计算[=15=所需的路径反向传播) ], 就像你在 theano 中一样)?
原来这真的很简单。只需使用 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。