溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Pytorch中的.backward()方法怎么用

發(fā)布時(shí)間:2021-07-12 15:36:11 來(lái)源:億速云 閱讀:338 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要講解了“Pytorch中的.backward()方法怎么用”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Pytorch中的.backward()方法怎么用”吧!

PyTorch的主要功能和特點(diǎn)之一就是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

讓我們?cè)赑yTorch中實(shí)現(xiàn):

Pytorch中的.backward()方法怎么用

如果a和b是向量,那么下面的代碼似乎給出了一個(gè)錯(cuò)誤:

Pytorch中的.backward()方法怎么用

RuntimeError: grad can be implicitly created only for scalar outputs

在文檔中寫道:當(dāng)我們調(diào)用張量的反向函數(shù)時(shí),如果張量是非標(biāo)量(即它的數(shù)據(jù)有不止一個(gè)元素)并且要求梯度,那么這個(gè)函數(shù)還需要指定特定梯度。

這里F是非標(biāo)量張量所以我們需要把梯度參數(shù)傳遞給和張量F維數(shù)相同的反向傳播函數(shù)

Pytorch中的.backward()方法怎么用

在上面的代碼示例中,將梯度參數(shù)傳遞給backword函數(shù)并給出了所需的梯度值a和b。但是,為什么我們必須將梯度參數(shù)傳遞給backword函數(shù)?

要理解這一點(diǎn),我們需要了解.backward()函數(shù)是如何工作的。再次提到這些文檔:

torch.autograd是一個(gè)計(jì)算向量-雅可比積的引擎。即給定任意向量v,計(jì)算其乘積J@v.T注:@表示矩陣乘法

一般來(lái)說(shuō),雅可比矩陣是一個(gè)全偏導(dǎo)數(shù)的矩陣。如果我們考慮函數(shù)y它有n維的輸入向量x它有m維的輸出。然后計(jì)算包含以J表示的所有偏導(dǎo)數(shù)的雅可比矩陣:

Pytorch中的.backward()方法怎么用

v為backword函數(shù)提供的外梯度。另外,需要注意的另一件重要的事情是,默認(rèn)情況下F.backward()與F.backward(gradient=torch.tensor([1.])相同,所以默認(rèn)情況下,當(dāng)輸出張量是標(biāo)量時(shí),我們不需要傳遞梯度參數(shù),就像我們?cè)诘谝粋€(gè)例子中所做的那樣。

當(dāng)輸出張量為標(biāo)量時(shí),則v_vector的大小為1,即torch.tensor([1.]),可以用值1代替。這樣就得到了完整的雅可比矩陣,也就是J@v。T = J

但是,當(dāng)輸出張量是非標(biāo)量時(shí),我們需要傳遞外部梯度向量v,得到的梯度計(jì)算雅可比向量積,即J@v.T

在這里,對(duì)于F = a*b在a = [10.0, 10.0] b =[20.0, 20.0]和v =[1]。1。我們得到?F/?a :

Pytorch中的.backward()方法怎么用

到目前為止,我們有:

Pytorch中的.backward()方法怎么用

我們引入一個(gè)新的變量G,它依賴于F

Pytorch中的.backward()方法怎么用

到目前為止都很好,但是讓我們檢查一下F的grad值也就是F.grad

Pytorch中的.backward()方法怎么用

我們得到None,并顯示了一個(gè)警告

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......

在前向傳播過(guò)程中,自動(dòng)動(dòng)態(tài)生成計(jì)算圖。對(duì)于上面的代碼示例,動(dòng)態(tài)圖如下:

Pytorch中的.backward()方法怎么用

從上面的計(jì)算圖中,我們發(fā)現(xiàn)張量A和B是葉節(jié)點(diǎn)。我們可以用is_leaf來(lái)驗(yàn)證:

Pytorch中的.backward()方法怎么用

Torch backward()僅在默認(rèn)情況下累積葉子節(jié)點(diǎn)張量的梯度。因此,F(xiàn) grad沒(méi)有值,因?yàn)镕張量不是葉子節(jié)點(diǎn)張量。為了積累非葉子節(jié)點(diǎn)的梯度,我們可以使用retain_grad方法如下:

Pytorch中的.backward()方法怎么用

在一般的情況下,我們的損失值張量是一個(gè)標(biāo)量值,我們的權(quán)值參數(shù)是計(jì)算圖的葉子節(jié)點(diǎn),所以我們不會(huì)得出上面討論的誤差條件。但是了解這些特殊的情況,這有助于了解更多關(guān)于pytorch的功能,萬(wàn)一那天用上了呢,對(duì)吧。

感謝各位的閱讀,以上就是“Pytorch中的.backward()方法怎么用”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Pytorch中的.backward()方法怎么用這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI