您好,登錄后才能下訂單哦!
這篇文章主要講解了“Pytorch中的.backward()方法怎么用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Pytorch中的.backward()方法怎么用”吧!
PyTorch的主要功能和特點之一就是backword函數,我知道一些基本的導數:
Let, F = a*b
Where,
a = 10
b = 10?F/?a = b => ?F/?a = 20
?F/?b = a => ?F/?b = 10
讓我們在PyTorch中實現:
如果a和b是向量,那么下面的代碼似乎給出了一個錯誤:
RuntimeError: grad can be implicitly created only for scalar outputs
在文檔中寫道:當我們調用張量的反向函數時,如果張量是非標量(即它的數據有不止一個元素)并且要求梯度,那么這個函數還需要指定特定梯度。
這里F是非標量張量所以我們需要把梯度參數傳遞給和張量F維數相同的反向傳播函數
在上面的代碼示例中,將梯度參數傳遞給backword函數并給出了所需的梯度值a和b。但是,為什么我們必須將梯度參數傳遞給backword函數?
要理解這一點,我們需要了解.backward()函數是如何工作的。再次提到這些文檔:
torch.autograd是一個計算向量-雅可比積的引擎。即給定任意向量v,計算其乘積J@v.T注:@表示矩陣乘法
一般來說,雅可比矩陣是一個全偏導數的矩陣。如果我們考慮函數y它有n維的輸入向量x它有m維的輸出。然后計算包含以J表示的所有偏導數的雅可比矩陣:
v為backword函數提供的外梯度。另外,需要注意的另一件重要的事情是,默認情況下F.backward()與F.backward(gradient=torch.tensor([1.])相同,所以默認情況下,當輸出張量是標量時,我們不需要傳遞梯度參數,就像我們在第一個例子中所做的那樣。
當輸出張量為標量時,則v_vector的大小為1,即torch.tensor([1.]),可以用值1代替。這樣就得到了完整的雅可比矩陣,也就是J@v。T = J
但是,當輸出張量是非標量時,我們需要傳遞外部梯度向量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......
在前向傳播過程中,自動動態生成計算圖。對于上面的代碼示例,動態圖如下:
從上面的計算圖中,我們發現張量A和B是葉節點。我們可以用is_leaf來驗證:
Torch backward()僅在默認情況下累積葉子節點張量的梯度。因此,F grad沒有值,因為F張量不是葉子節點張量。為了積累非葉子節點的梯度,我們可以使用retain_grad方法如下:
在一般的情況下,我們的損失值張量是一個標量值,我們的權值參數是計算圖的葉子節點,所以我們不會得出上面討論的誤差條件。但是了解這些特殊的情況,這有助于了解更多關于pytorch的功能,萬一那天用上了呢,對吧。
感謝各位的閱讀,以上就是“Pytorch中的.backward()方法怎么用”的內容了,經過本文的學習后,相信大家對Pytorch中的.backward()方法怎么用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。