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>)
解釋如下:
,對求導爲2/3,因爲是向量,故爲[0.6667, 0.6667, 0.6667],導數乘以的值爲[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])
解釋如下:
,對求導爲2,因爲x是向量,故爲[2, 2, 2],乘上係數爲[0.2000, 2.0000, 0.0200]。
求導過程其實就是求一個雅可比向量積: