Pytorch中标量对向量求导和向量对向量求导的详解

1.标量对向量求导

标量可以直接对向量求导

import torch
p = torch.tensor([2.0, 3.0, 5.0], requires_grad=True)
q = p*2+1
z = torch.mean(q)
z.backward()
print(p.grad)
print(p.grad*p)

结果:

tensor([0.6667, 0.6667, 0.6667])
tensor([1.3333, 2.0000, 3.3333], grad_fn=<MulBackward0>)

解释如下:
z = 1 / 3 ( 2 p + 1 ) z=1/3(2p+1) z=1/3(2p+1) z z z p p p求导为2/3,因为 p p p是向量,故为[0.6667, 0.6667, 0.6667],导数乘以 p p p的值为[1.3333, 2.0000, 3.3333]。
求导过程其实就是求一个雅可比矩阵:
Pytorch中标量对向量求导和向量对向量求导的详解_第1张图片

2.向量对向量求导

向量不能直接对向量求导,要想实现向量对向量求导就要先设置一个权重系数v,然后执行如下操作。这样对可以对向量y中的元素逐一求导,求导后分别乘以系数就是最终的值了。

import torch
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
print(x)
y = x*2
v = torch.tensor([0.1, 1, 0.01], dtype=torch.float)
y.backward(v)
print(x.grad)

结果:

tensor([1., 2., 3.], requires_grad=True)
tensor([0.2000, 2.0000, 0.0200])

解释如下:
y = 2 x y=2x y=2x y y y x x x求导为2,因为x是向量,故为[2, 2, 2],乘上系数为[0.2000, 2.0000, 0.0200]。
求导过程其实就是求一个雅可比向量积:
Pytorch中标量对向量求导和向量对向量求导的详解_第2张图片

参考1
参考2

你可能感兴趣的:(Pytorch)