簡介
pytorch梯度機(jī)制,計算梯度注意事項
關(guān)鍵字
pytorch,autograd,tensor,自動微分,張量,梯度
正文
??在一些優(yōu)化算法中,常常需要計算函數(shù)的梯度,在pytorch可以借助autograd機(jī)制來自動計算梯度值。
1. 梯度對象及對應(yīng)方法
??假設(shè),關(guān)于
的梯度記為
,
是關(guān)于變量
的函數(shù),其梯度
是隨著
的值變化而變化的,決定梯度的除了
自身的值以外還有施加在
上的運(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ùn)算的結(jié)果,因此需要求
的梯度值時就對
使用backward()方法來計算
的梯度。
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)量求梯度,也是在中,
是標(biāo)量的情況,如果
向量或矩陣,也可以求梯度,此時本質(zhì)上也是按分量一個一個來,因此要給backward()加個參數(shù),一般情況下該參數(shù)的形狀和
一樣,每一個位置的值指示每個分量的梯度權(quán)重,多數(shù)情況就是全部設(shè)置為1。
??(3)一般過程
??仍然假設(shè)求的關(guān)于
的梯度,首先設(shè)置聲明tensor類型變量
,聲明的時候需要設(shè)置參數(shù)requires_grad=True;接下來計算出
,這里的
是用來表示函數(shù)運(yùn)算過程,最后使用
,如果
非標(biāo)量,就加個參數(shù),假設(shè)為
,
的形狀與
相同,此時使用的是
,要的梯度值可以通過
獲得。
3. 注意事項
??單獨(dú)寫個注意事項,計算變量的梯度時,
的屬性有可能會變化,比如需要對
進(jìn)行迭代,假設(shè)為
,那么
的requires_grad和is_leaf屬性會變化,變得不可求梯度,那怎么辦呢,其實程序迭代時只需要改變值就好了,使用
就可以了。
參考資料
[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