解決torch.autograd.backward中的參數(shù)問題
torch.autograd.backward(variables, grad_variables=None, retain_graph=None, create_graph=False)
給定圖的葉子節(jié)點variables, 計算圖中變量的梯度和。 計算圖可以通過鏈式法則求導。如果variables中的任何一個variable是 非標量(non-scalar)的,且requires_grad=True。那么此函數(shù)需要指定grad_variables,它的長度應該和variables的長度匹配,里面保存了相關variable的梯度(對于不需要gradient tensor的variable,None是可取的)。
此函數(shù)累積leaf variables計算的梯度。你可能需要在調用此函數(shù)之前將leaf variable的梯度置零。
參數(shù):
variables(變量的序列) - 被求微分的葉子節(jié)點,即 ys 。
grad_variables((張量,變量)的序列或無) - 對應variable的梯度。僅當variable不是標量且需要求梯度的時候使用。
retain_graph(bool,可選) - 如果為False,則用于釋放計算grad的圖。請注意,在幾乎所有情況下,沒有必要將此選項設置為True,通常可以以更有效的方式解決。默認值為create_graph的值。
create_graph(bool,可選) - 如果為True,則將構造派生圖,允許計算更高階的派生產品。默認為False。
我這里舉一個官方的例子
import torch from torch.autograd import Variable x = Variable(torch.ones(2, 2), requires_grad=True) y = x + 2 z = y * y * 3 out = z.mean() out.backward()#這里是默認情況,相當于out.backward(torch.Tensor([1.0])) print(x.grad)
輸出結果是
Variable containing: 4.5000 4.5000 4.5000 4.5000 [torch.FloatTensor of size 2x2]
接著我們繼續(xù)
x = torch.randn(3) x = Variable(x, requires_grad=True) y = x * 2 while y.data.norm() < 1000: y = y * 2 gradients = torch.FloatTensor([0.1, 1.0, 0.0001]) y.backward(gradients) print(x.grad)
輸出結果是
Variable containing: 204.8000 2048.0000 0.2048 [torch.FloatTensor of size 3]
這里這個gradients為什么要是[0.1, 1.0, 0.0001]?
如果輸出的多個loss權重不同的話,例如有三個loss,一個是x loss,一個是y loss,一個是class loss。那么很明顯的不可能所有l(wèi)oss對結果影響程度都一樣,他們之間應該有一個比例。那么比例這里指的就是[0.1, 1.0, 0.0001],這個問題中的loss對應的就是上面說的y,那么這里的輸出就很好理解了dy/dx=0.1*dy1/dx+1.0*dy2/dx+0.0001*dy3/dx。
如有問題,希望大家指正,謝謝_!
以上這篇解決torch.autograd.backward中的參數(shù)問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Python使用socket實現(xiàn)組播與發(fā)送二進制數(shù)據(jù)
在工作中經常會用到socket傳輸數(shù)據(jù),例如客戶端給服務器發(fā)送數(shù)據(jù)(雙方約定了數(shù)據(jù)格式),本文主要介紹了Python使用socket實現(xiàn)組播與發(fā)送二進制數(shù)據(jù),感興趣的可以了解一下2021-06-06python 循環(huán)數(shù)據(jù)賦值實例
今天小編就為大家分享一篇python 循環(huán)數(shù)據(jù)賦值實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12