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]。
求导过程其实就是求一个雅可比矩阵:
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]。
求导过程其实就是求一个雅可比向量积: