如果out是個标量的話backward()裡面就不用寫了,也就是預設是1,大部分的loss都是這樣的,這個比較簡單了就不詳解了。
以下部落格内容部分參考自部落格https://sherlockliao.github.io/2017/07/10/backward/
定義m=(m1,m2)=(2,3), ,記為k=(k1,k2)
計算k對于m1和m2的梯度:(m1,m2對應下圖的x1,x2)
接下來使用代碼來實作k對m1和m2的梯度
from torch.autograd import Variable as v
import torch
j = torch.zeros(2 ,3)
k = v(torch.zeros(1, 2))
m.grad.data.zero_()
k[0, 0] = m[0, 0] ** 2 + 3 * m[0 ,1]
k[0, 1] = m[0, 1] ** 2 + 2 * m[0, 0]
k.backward(torch.FloatTensor([[1, 1]]), retain_graph =True) # 需要san次反向求導
j[:,0]=m.grad.data
m.grad.data.zero_()
# [1, 0] dk0/dm0, dk1/dm0
k.backward(torch.FloatTensor([[1, 0]]), retain_graph =True) # 需要兩次反向求導
j[:, 1] = m.grad.data
m.grad.data.zero_()
# [0, 1] dk0/dm1, dk1/dm1
k.backward(torch.FloatTensor([[0, 1]]))
j[:, 2] = m.grad.data
print('jacobian matrix is')
print(j)
輸出:
分析一下:
ki對mi求導的jacobian矩陣是:
而backward函數的參數FloatTensor([1/0,1/0]),其實是:
的值。
而具體計算各個梯度的方式為:
是以對backward的參數不同取值相當于決定每個偏導數的系數是多少,也就是k對ki的導數的值。