Pytorch|官方入門教程-學(xué)習(xí)筆記(一)-tensor與自動(dòng)微分

背景介紹

Pytorch是torch的一個(gè)衍生品,在Python語言中可以替代numpy的一個(gè)強(qiáng)大的科學(xué)計(jì)算庫。

Pytorch與TensorFlow的主要區(qū)別:

  • TensorFlow是基于靜態(tài)計(jì)算圖,需要先定義再運(yùn)行,一次定義多次運(yùn)行;
  • Pytorch基于動(dòng)態(tài)計(jì)算圖,在運(yùn)行過程中進(jìn)行定義,可以實(shí)現(xiàn)多次構(gòu)建多次運(yùn)行。

Pytorch官方文檔傳送門

基礎(chǔ)知識(shí)

Tensor

tensor與numpy的ndarray類似,可以使用GPU加速。
1.初始化操作



2.加法操作
函數(shù)名后帶下劃線_的函數(shù)會(huì)修改tensor本身
3.支持numpy的所有標(biāo)準(zhǔn)操作
Tensor與numpy對(duì)象共享內(nèi)存,因此二者之間可以快捷轉(zhuǎn)換

Autograd自動(dòng)微分

Autograd包可以為tensor上的所有操作提供自動(dòng)微分,并記錄這些操作生成一個(gè)動(dòng)態(tài)計(jì)算圖。目前pytorch的版本將tensor的運(yùn)算與variable的自動(dòng)微分進(jìn)行了合并,可以更為便捷的使用。

  • 跟蹤tensor上的所有操作:設(shè)置屬性requires_grad = True
  • 自動(dòng)計(jì)算所有梯度:調(diào)用.backward()
  • 停止跟蹤tensor:調(diào)用.detach() || 使用代碼塊with torch.no grad
  • 若tensor不僅僅是標(biāo)量,需要靠gradient參數(shù)來說明張量的形式

function類對(duì)于autograd的實(shí)現(xiàn)也很重要。tensor與function類互相連接并構(gòu)建一個(gè)計(jì)算圖,即有向無環(huán)圖(DAG),用于保存整個(gè)完整計(jì)算過程的歷史信息。原先的pytorch版本是將tensor封裝為一個(gè)variable,經(jīng)由variable來實(shí)現(xiàn)對(duì)tensor的backward,現(xiàn)在的版本可以直接由tensor進(jìn)行微分。
每當(dāng)對(duì)tensor施加一個(gè)運(yùn)算的時(shí)候,就會(huì)產(chǎn)生一個(gè)function對(duì)象,由tensor的.grad_fn屬性指向這個(gè)function對(duì)象,來產(chǎn)生運(yùn)算結(jié)果,記錄運(yùn)算的發(fā)生,并記錄運(yùn)算的輸入。tensor使用.grad.fn屬性記錄這個(gè)計(jì)算圖的入口,反向傳播中,autograd引擎會(huì)按照逆序,通過function的backward依次計(jì)算梯度。
(若某個(gè)變量是由用戶創(chuàng)建的,則它為葉子節(jié)點(diǎn),對(duì)應(yīng)的.grad_fn為none)


backward函數(shù)實(shí)現(xiàn)對(duì)tensor的反向傳播。對(duì)計(jì)算圖中的根節(jié)點(diǎn)調(diào)用backward()方法,autograd會(huì)自動(dòng)沿著計(jì)算圖反向傳播,計(jì)算每一個(gè)葉子節(jié)點(diǎn)的梯度。
torch.autograd.backward(tensors, grad_tensors=None, retain_graph=None, create_graph=False, grad_variables=None)參數(shù)介紹如下:

  • tensors(tensor序列) — 需要被求導(dǎo)的張量
  • grad_tensors(tensor序列或None) — Jacobian矢量積中的矢量,也可理解為鏈?zhǔn)椒▌t的中間變量的梯度
  • create_graph(bool) — 默認(rèn)為false,否則會(huì)對(duì)反向傳播過程再次構(gòu)建計(jì)算圖,可通過backward of backward實(shí)現(xiàn)求高階函數(shù)
    backward()函數(shù)中的grad_tesnors參數(shù)size需要與根節(jié)點(diǎn)的size相同。當(dāng)根節(jié)點(diǎn)為標(biāo)量時(shí),則無需說明該參數(shù),例如對(duì)out進(jìn)行反向求導(dǎo):
    若進(jìn)行反向傳播的根節(jié)點(diǎn)為一個(gè)向量,則需要傳入與該節(jié)點(diǎn)同等size的向量,以下為示例:

可見這里傳入的參數(shù)是對(duì)原本正常求出的Jacobian matrix進(jìn)行了線性操作。torch.autograd不能直接計(jì)算整個(gè)雅克比,因此需要我們給backward()傳遞向量作為參數(shù)從而得到雅可比向量積。
雅可比向量積是說,對(duì)于函數(shù)\vec y=f(\vec x)定義雅可比矩陣為J,則對(duì)于給定的向量v = (v_1,v_2,...,v_m)^T,計(jì)算J·v即為所求的雅可比向量積。

對(duì)于傳入的參數(shù)與雅可比矩陣之間的對(duì)應(yīng)關(guān)系,本伸手黨在這里貼兩個(gè)鏈接
backward()參數(shù)解釋傳送門1
backward()參數(shù)解釋傳送門2

總結(jié)來說,對(duì)于backward() 函數(shù)傳入?yún)?shù)的解釋有以下幾點(diǎn)可以參考:

  • 輸入的參數(shù)即為參與雅可比向量積計(jì)算的v;
  • 根節(jié)點(diǎn)為標(biāo)量時(shí),默認(rèn)傳入的參數(shù)為([[1.]]);
  • 手動(dòng)設(shè)置該參數(shù)的意義在于,需要由開發(fā)者決定根節(jié)點(diǎn)向量的每個(gè)分量對(duì)葉子節(jié)點(diǎn)求導(dǎo)時(shí)的權(quán)重。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容