from torch.autograd import Variable
import torch
x = Variable(torch.FloatTensor([[1, 2, 3, 4]]), requires_grad=True)
z = 2*x
loss = z.sum(dim=1)
# do backward for first element of z
z.backward(torch.FloatTensor([[1, 0, 0, 0]]), retain_graph=True)
print(x.grad.data)
x.grad.data.zero_() #remove gradient in x.grad, or it will be accumulated
# do backward for second element of z
z.backward(torch.FloatTensor([[0, 1, 0, 0]]), retain_graph=True)
print(x.grad.data)
x.grad.data.zero_()
# do backward for all elements of z, with weight equal to the derivative of
# loss w.r.t z_1, z_2, z_3 and z_4
z.backward(torch.FloatTensor([[1, 1, 1, 1]]), retain_graph=True)
print(x.grad.data)
x.grad.data.zero_()
# or we can directly backprop using loss
loss.backward() # equivalent to loss.backward(torch.FloatTensor([1.0]))
print(x.grad.data)
在上面的示例中,第一个 print的结果是
两千
[手电筒。浮动张量的大小1x4]
正好是 z _ 1 wr.t 对 x 的导数。
第二次 print的结果是:
0200
[手电筒。浮动张量的大小1x4]
是 z _ 2 wr.t 对 x 的导数。
现在,如果使用[1,1,1,1]的权重来计算 z. r.t 对 x 的导数,结果是 1*dz_1/dx + 1*dz_2/dx + 1*dz_3/dx + 1*dz_4/dx。所以毫不奇怪,第三个 print的输出是:
2222
[手电筒。浮动张量的大小1x4]
值得注意的是,权向量[1,1,1,1]是 loss. r.t 对 z _ 1,z _ 2,z _ 3和 z _ 4的精确导数。loss. r.t 对 x的导数计算如下: