pytorch: autograd中backward
输出值是标量:
import torch
x = torch.ones(2, 2, requires_grad=True)
y = x + 2
z = y * y * 3
out = z.mean()
out.backward()#这里是默认情况,相当于out.backward(torch.Tensor([1.0]))
print(x.grad)
tensor([[4.5000, 4.5000],
[4.5000, 4.5000]])
输出值是tensor:
x = torch.randn(3, requires_grad=True)
y = x * 2
while y.data.norm() < 1000:
y = y * 2
print(y)
gradients = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(gradients)
print(x.grad)
tensor([ 51.2000, 512.0000, 0.0512])
解释:
这里这个gradients为什么要是[0.1, 1.0, 0.0001]?
如果输出的多个loss权重不同的话,例如有三个loss,一个是y1 loss,一个是y2 loss,一个是y3 loss。那么很明显的不可能所有loss对结果影响程度都一样,他们之间应该有一个比例。那么比例这里指的就是[0.1, 1.0, 0.0001],这个问题中的loss对应的就是上面说的y,那么这里的输出就很好理解了dy/dx=0.1*dy1/dx+1.0*dy2/dx+0.0001*dy3/dx
。