關于pytorch求導總結(torch.autograd)
1、Autograd 求導機制
我們在用神經(jīng)網(wǎng)絡求解PDE時, 經(jīng)常要用到輸出值對輸入變量(不是Weights和Biases)求導;
例如在訓練WGAN-GP 時, 也會用到網(wǎng)絡對輸入變量的求導,pytorch中通過 Autograd 方法進行求導
其求導規(guī)則如下:
1.1當x為向量,y為一標量時
![]()
![]()
通過autograd 計算的梯度為:

1.2先假設x,y為一維向量
![]()
![]()
其對應的jacobi(雅可比)矩陣為

grad_outputs 是一個與因變量 y 的shape 一致的向量
![]()
在給定grad_outputs 后,通過Autograd 方法 計算的梯度如下:

1.3當 x 為1維向量,Y為2維向量
![]()
給出grad_outputs與Y的shape一致
![]()
Y 與x的jacobi矩陣
![]()
![]()
則 Y 對 x 的梯度:

1.4當 X ,Y均為2維向量時

![]()
???????
1.5當XY為更高維度時
可以按照上述辦法轉化為低維度的求導
值得注意的是:
求導后的梯度shape總與自變量X保持一致對自變量求導的順序并不會影響結果,某自變量的梯度值會放到該自變量原來相同位置梯度是由每個自變量的導數(shù)值組成的向量,既有大小又有方向grad_outputs 與 因變量Y的shape一致,每一個參數(shù)相當于對因變量中相同位置的y進行一個加權。
2、pytorch求導方法
2.1在求導前需要對需要求導的自變量進行聲明


2.2torch.autograd.gard()
grad =? autograd.grad( outputs, inputs, grad_outputs=None, retain_graph=None, ???create_graph=False, only_inputs=True, allow_unused=False )
參數(shù)解釋:
- outputs:求導的因變量 Y
- inputs : 求導自變量 X
- grad_outputs:
當outputs為標量時,grad_outputs=None , 不需要寫,當outputs 為向量,需要為其聲明一個與outputs相同shape的參數(shù)矩陣,該矩陣中的每個參數(shù)的作用是,對outputs中相同位置的y進行一個加權。
不然會報錯



autograd.grad()返回的是元組數(shù)據(jù)類型,元組的長度與inputs長度相同,元組中每個單位的shape與相同位置的inputs相同


retain_graph:
1、當求完一次梯度后默認會把圖信息釋放掉,都會free掉計算圖中所有緩存的buffers,當要連續(xù)進行幾次求導時,可能會因為前面buffers不存在而報錯。

![]()
因為第二個梯度計算z對x的導數(shù),需要y對x的計算導數(shù)的緩存信息,但是在計算grad1后,保存信息被釋放,找不到了,因此報錯。
修改如下:


2、一般計算的最后一個梯度可以不需要保存計算圖信息,這樣在計算后可以及時釋放掉占用的內(nèi)存。
3、在pytorch中連續(xù)多次調(diào)用backward()也會出現(xiàn)這樣的問題,對中間的backwad(),需要保持計算圖信息

create_graph: 若要計算高階導數(shù),則必須選為True
求二階導方法如下:


allow_unused: 允許輸入變量不進入計算
2.3torch.backward()
def backward( ??????????? ????????????gradient: Optional[Tensor] = None, ??????????? ????????????retain_graph: Any = None, ??????????? ????????????create_graph: Any = False, ??????????? ????????????inputs: Any = None) -> Any ??????????????????????????????????????????????? )
如果需要計算導數(shù),可以在tensor上直接調(diào)用.backward(),會返回該tensor所有自變量的導數(shù)。
通過name(自變量名).grad 可以獲得該自變量的梯度如果tensor是標量,則backward()不需要指定任何參數(shù)如果tensor是向量,則backward()需要指定gradient一個與tensorshape相同的參數(shù)矩陣,即這里的gradient 同 grad_outputs 作用和形式完全一樣。


總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Python利用xmltodict實現(xiàn)字典和xml互相轉換的示例代碼
xmltodict是一個Python第三方庫,用于處理XML數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-12-12
keras tensorflow 實現(xiàn)在python下多進程運行
今天小編就為大家分享一篇keras tensorflow 實現(xiàn)在python下多進程運行,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
python實現(xiàn)mp3文件播放的具體實現(xiàn)代碼
前段時間在搞一個基于python的語音助手,其中需要用到python播放音頻的功能,下面這篇文章主要給大家介紹了關于python實現(xiàn)mp3文件播放的具體實現(xiàn)代碼,需要的朋友可以參考下2023-05-05
Python聊天室?guī)Ы缑鎸崿F(xiàn)的示例代碼(tkinter,Mysql,Treading,socket)
這篇文章主要介紹了Python聊天室?guī)Ы缑鎸崿F(xiàn)的示例代碼(tkinter,Mysql,Treading,socket),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04
Python騷操作完美實現(xiàn)短視頻偽原創(chuàng)
剪輯的視頻上傳到某平臺碰到降權怎么辦?視頻平臺都有一套自己的鑒別算法,專門用于處理視頻的二次剪輯,本篇我們來用python做一些特殊處理2022-02-02
python中threading.Semaphore和threading.Lock的具體使用
python中的多線程是一個非常重要的知識點,本文主要介紹了python中threading.Semaphore和threading.Lock的具體使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2023-08-08

