簡體   English   中英

pytorch autograd.grad 內部導數的內部工作

[英]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()等等。

如果問題以任何方式不清楚,請告訴我。

我做了一些改變:

  1. 我不確定torch.rand(2.0)應該做什么。 根據文本,我只是將其設置為 2。
  2. 添加中間變量z以便我們可以計算梯度 w.r.t。 到原來的變量。 你的被覆蓋了。
  3. 設置create_graph=True來計算高階梯度。 https://pytorch.org/docs/stable/generated/torch.autograd.grad.html
import 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM