![](/img/trans.png)
[英]Using autograd.grad() as a parameter for a loss function (pytorch)
[英]Inner workings of pytorch autograd.grad for inner derivatives
考慮以下代碼:
x = torch.tensor(2.0, requires_grad=True)
y = torch.square(x)
grad = autograd.grad(y, x)
x = x + grad[0]
y = torch.square(x)
grad2 = autograd.grad(y, x)
首先,我們有∇(x^2)=2x
。 據我了解, grad2=∇((x + ∇(x^2))^2)=∇((x+2x)^2)=∇((3x)^2)=9∇x^2=18x
。 正如預期的那樣, grad=4.0=2x
,但是grad2=12.0=6x
,我不明白它來自哪里。 感覺好像3
來自我的表達式,但它不是平方的,而2
來自傳統的導數。 有人可以幫我理解為什么會這樣嗎? 此外,存儲梯度 go 的計算圖有多遠?
具體來說,我來自元學習的角度,人們有興趣計算以下形式的數量∇ L(theta - alpha * ∇ L(theta))=(1 + ∇^2 L(theta)) ∇L(theta - alpha * ∇ L(theta)
(這里的導數是關於theta
)。因此,我們稱之為A
的計算包括二階導數。計算與以下∇_{theta - alpha ∇ L(theta)}L(\theta - alpha * ∇ L(theta))=∇_beta L(beta)
,我稱之為B
。
希望很清楚我所擁有的片段與我在第二段中描述的內容之間的關系。 我的總體問題是: pytorch 在什么情況下使用autograd.grad
實現計算A
與計算B
? 我將不勝感激有關autograd
如何處理此特殊情況的技術細節的任何解釋。
PD。 我遵循的原始代碼讓我想知道這是在這里; 特別是第 69 行到第 106 行,以及隨后的第 193 行,這是他們使用autograd.grad
的時候。 對於代碼更不清楚,因為他們做了很多model.clone()
等等。
如果問題以任何方式不清楚,請告訴我。
我做了一些改變:
torch.rand(2.0)
應該做什么。 根據文本,我只是將其設置為 2。z
以便我們可以計算梯度 w.r.t。 到原來的變量。 你的被覆蓋了。create_graph=True
來計算高階梯度。 見https://pytorch.org/docs/stable/generated/torch.autograd.grad.htmlimport torch
from torch import autograd
x = torch.ones(1, requires_grad=True)*2
y = torch.square(x)
grad = autograd.grad(y, x, create_graph=True)
z = x + grad[0]
y = torch.square(z)
grad2 = autograd.grad(y, x)
# yours is more like autograd.grad(y, z)
print(x)
print(grad)
print(grad2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.