實踐·pytorch梯度計算

簡介

pytorch梯度機(jī)制,計算梯度注意事項

關(guān)鍵字

pytorch,autograd,tensor,自動微分,張量,梯度

正文

??在一些優(yōu)化算法中,常常需要計算函數(shù)的梯度,在pytorch可以借助autograd機(jī)制來自動計算梯度值。

1. 梯度對象及對應(yīng)方法

??假設(shè)y=f(x),關(guān)于x的梯度記為\nabla f(x)\nabla f(x)是關(guān)于變量x的函數(shù),其梯度\nabla是隨著x的值變化而變化的,決定梯度的除了x自身的值以外還有施加在x上的運(yùn)算。因此,關(guān)注梯度就是關(guān)注兩個東西,求哪個變量的梯度,該變量上被施加了哪種運(yùn)算

??首先看變量:在pytorch中把梯度作為一個固有屬性結(jié)合進(jìn)張量(tensor),任何一個tensor類型的變量都有梯度(grad)屬性,再結(jié)合一般場景下的需要,pytorch把tensor類型定義為一個對象,包括5個屬性,分別對應(yīng)data(變量本身的值),grad(梯度值),requires_grad(是否需要梯度,很多場景都不需要求變量的微分),grad_fn(生成該變量結(jié)果的運(yùn)算,即這個值通過什么運(yùn)算來的),is_leaf(是否葉子節(jié)點,葉子才幫你算梯度)。

??接著看運(yùn)算:在pytorch中沒有顯式的給出梯度函數(shù)表達(dá),而是算出梯度值,存放在tensor類型變量的grad屬性中,那么運(yùn)算也一樣用結(jié)果來表達(dá),假設(shè)y=f(x),這里的y就承載了運(yùn)算的結(jié)果,因此需要求x的梯度值時就對y使用backward()方法來計算x的梯度。

2. 如何使用

??上面提到計算梯度的兩個要素:變量運(yùn)算,對應(yīng)的pytorch機(jī)制是tensor對象和backward方法。因此計算梯度就是學(xué)會怎么用這倆貨。具體的例子這邊不寫,各位大神寫的很多了,不當(dāng)搬運(yùn)工了,推薦參考資料3,參考資料2。這里說明兩點,然后總結(jié)個過程。

??(1)可求梯度的條件

??從上面的敘述知道,一個變量有5個屬性,要求這個變量可以求梯度,需要滿足2個屬性為真,requires_grad=True,is_leaf=True。在聲明變量的時候聲明requires_grad=True就可以了。在實踐過程中如果發(fā)現(xiàn)梯度沒法計算,要查一下這兩個屬性。

??(2)回傳結(jié)果類型

??大部分情況是對標(biāo)量求梯度,也是在y=f(x)中,y是標(biāo)量的情況,如果y向量或矩陣,也可以求梯度,此時本質(zhì)上也是按分量一個一個來,因此要給backward()加個參數(shù),一般情況下該參數(shù)的形狀和y一樣,每一個位置的值指示每個分量的梯度權(quán)重,多數(shù)情況就是全部設(shè)置為1。

??(3)一般過程

??仍然假設(shè)求x的關(guān)于y=f(x)的梯度,首先設(shè)置聲明tensor類型變量x,聲明的時候需要設(shè)置參數(shù)requires_grad=True;接下來計算出y=function(x),這里的function是用來表示函數(shù)運(yùn)算過程,最后使用y.backward(),如果y非標(biāo)量,就加個參數(shù),假設(shè)為v,v的形狀與y相同,此時使用的是y.backward(v),要的梯度值可以通過x.grad獲得。

3. 注意事項

??單獨(dú)寫個注意事項,計算變量x的梯度時,x的屬性有可能會變化,比如需要對x進(jìn)行迭代,假設(shè)為x=x’,那么x的requires_grad和is_leaf屬性會變化,變得不可求梯度,那怎么辦呢,其實程序迭代時只需要改變值就好了,使用x.data=x'.data就可以了。

參考資料

[1] https://pytorch.org/docs/1.3.1/index.html
[2] https://blog.csdn.net/qq_27825451/article/details/89393332
[3] https://www.cnblogs.com/marsggbo/p/11549631.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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