天天看點

pytorch中的out.backward()詳解定義m=(m1,m2)=(2,3),,記為k=(k1,k2)ki對mi求導的jacobian矩陣是:而backward函數的參數FloatTensor([1/0,1/0]),其實是:的值。而具體計算各個梯度的方式為:是以對backward的參數不同取值相當于決定每個偏導數的系數是多少,也就是k對ki的導數的值。

如果out是個标量的話backward()裡面就不用寫了,也就是預設是1,大部分的loss都是這樣的,這個比較簡單了就不詳解了。

以下部落格内容部分參考自部落格https://sherlockliao.github.io/2017/07/10/backward/

定義m=(m1,m2)=(2,3),
pytorch中的out.backward()詳解定義m=(m1,m2)=(2,3),,記為k=(k1,k2)ki對mi求導的jacobian矩陣是:而backward函數的參數FloatTensor([1/0,1/0]),其實是:的值。而具體計算各個梯度的方式為:是以對backward的參數不同取值相當于決定每個偏導數的系數是多少,也就是k對ki的導數的值。
,記為k=(k1,k2)

計算k對于m1和m2的梯度:(m1,m2對應下圖的x1,x2)

pytorch中的out.backward()詳解定義m=(m1,m2)=(2,3),,記為k=(k1,k2)ki對mi求導的jacobian矩陣是:而backward函數的參數FloatTensor([1/0,1/0]),其實是:的值。而具體計算各個梯度的方式為:是以對backward的參數不同取值相當于決定每個偏導數的系數是多少,也就是k對ki的導數的值。

接下來使用代碼來實作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)
           

輸出:

pytorch中的out.backward()詳解定義m=(m1,m2)=(2,3),,記為k=(k1,k2)ki對mi求導的jacobian矩陣是:而backward函數的參數FloatTensor([1/0,1/0]),其實是:的值。而具體計算各個梯度的方式為:是以對backward的參數不同取值相當于決定每個偏導數的系數是多少,也就是k對ki的導數的值。

分析一下:

ki對mi求導的jacobian矩陣是:

pytorch中的out.backward()詳解定義m=(m1,m2)=(2,3),,記為k=(k1,k2)ki對mi求導的jacobian矩陣是:而backward函數的參數FloatTensor([1/0,1/0]),其實是:的值。而具體計算各個梯度的方式為:是以對backward的參數不同取值相當于決定每個偏導數的系數是多少,也就是k對ki的導數的值。

而backward函數的參數FloatTensor([1/0,1/0]),其實是:

pytorch中的out.backward()詳解定義m=(m1,m2)=(2,3),,記為k=(k1,k2)ki對mi求導的jacobian矩陣是:而backward函數的參數FloatTensor([1/0,1/0]),其實是:的值。而具體計算各個梯度的方式為:是以對backward的參數不同取值相當于決定每個偏導數的系數是多少,也就是k對ki的導數的值。
的值。

而具體計算各個梯度的方式為:

pytorch中的out.backward()詳解定義m=(m1,m2)=(2,3),,記為k=(k1,k2)ki對mi求導的jacobian矩陣是:而backward函數的參數FloatTensor([1/0,1/0]),其實是:的值。而具體計算各個梯度的方式為:是以對backward的參數不同取值相當于決定每個偏導數的系數是多少,也就是k對ki的導數的值。

是以對backward的參數不同取值相當于決定每個偏導數的系數是多少,也就是k對ki的導數的值。

繼續閱讀