這篇文章主要講解了“Pytorch中的.backward()方法怎么用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Pytorch中的.backward()方法怎么用”吧!
成都創(chuàng)新互聯(lián)專注于潘集網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供潘集營銷型網(wǎng)站建設(shè),潘集網(wǎng)站制作、潘集網(wǎng)頁設(shè)計、潘集網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造潘集網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供潘集網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
PyTorch的主要功能和特點之一就是backword函數(shù),我知道一些基本的導(dǎo)數(shù):
Let, F = a*b
Where,
a = 10
b = 10?F/?a = b => ?F/?a = 20
?F/?b = a => ?F/?b = 10
讓我們在PyTorch中實現(xiàn):
如果a和b是向量,那么下面的代碼似乎給出了一個錯誤:
RuntimeError: grad can be implicitly created only for scalar outputs
在文檔中寫道:當(dāng)我們調(diào)用張量的反向函數(shù)時,如果張量是非標(biāo)量(即它的數(shù)據(jù)有不止一個元素)并且要求梯度,那么這個函數(shù)還需要指定特定梯度。
這里F是非標(biāo)量張量所以我們需要把梯度參數(shù)傳遞給和張量F維數(shù)相同的反向傳播函數(shù)
在上面的代碼示例中,將梯度參數(shù)傳遞給backword函數(shù)并給出了所需的梯度值a和b。但是,為什么我們必須將梯度參數(shù)傳遞給backword函數(shù)?
要理解這一點,我們需要了解.backward()函數(shù)是如何工作的。再次提到這些文檔:
torch.autograd是一個計算向量-雅可比積的引擎。即給定任意向量v,計算其乘積J@v.T注:@表示矩陣乘法
一般來說,雅可比矩陣是一個全偏導(dǎo)數(shù)的矩陣。如果我們考慮函數(shù)y它有n維的輸入向量x它有m維的輸出。然后計算包含以J表示的所有偏導(dǎo)數(shù)的雅可比矩陣:
v為backword函數(shù)提供的外梯度。另外,需要注意的另一件重要的事情是,默認(rèn)情況下F.backward()與F.backward(gradient=torch.tensor([1.])相同,所以默認(rèn)情況下,當(dāng)輸出張量是標(biāo)量時,我們不需要傳遞梯度參數(shù),就像我們在第一個例子中所做的那樣。
當(dāng)輸出張量為標(biāo)量時,則v_vector的大小為1,即torch.tensor([1.]),可以用值1代替。這樣就得到了完整的雅可比矩陣,也就是J@v。T = J
但是,當(dāng)輸出張量是非標(biāo)量時,我們需要傳遞外部梯度向量v,得到的梯度計算雅可比向量積,即J@v.T
在這里,對于F = a*b在a = [10.0, 10.0] b =[20.0, 20.0]和v =[1]。1。我們得到?F/?a :
到目前為止,我們有:
我們引入一個新的變量G,它依賴于F
到目前為止都很好,但是讓我們檢查一下F的grad值也就是F.grad
我們得到None,并顯示了一個警告
The .grad attribute of a Tensor that is not a leaf Tensor is being accessed. Its .grad attribute won't be populated during autograd.backward(). If you indeed want the gradient for a non-leaf Tensor, use .retain_grad() on the non-leaf Tensor......
在前向傳播過程中,自動動態(tài)生成計算圖。對于上面的代碼示例,動態(tài)圖如下:
從上面的計算圖中,我們發(fā)現(xiàn)張量A和B是葉節(jié)點。我們可以用is_leaf來驗證:
Torch backward()僅在默認(rèn)情況下累積葉子節(jié)點張量的梯度。因此,F(xiàn) grad沒有值,因為F張量不是葉子節(jié)點張量。為了積累非葉子節(jié)點的梯度,我們可以使用retain_grad方法如下:
在一般的情況下,我們的損失值張量是一個標(biāo)量值,我們的權(quán)值參數(shù)是計算圖的葉子節(jié)點,所以我們不會得出上面討論的誤差條件。但是了解這些特殊的情況,這有助于了解更多關(guān)于pytorch的功能,萬一那天用上了呢,對吧。
感謝各位的閱讀,以上就是“Pytorch中的.backward()方法怎么用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Pytorch中的.backward()方法怎么用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!