天天看點

标量 向量 标量求導鍊式法則_PyTorch自動求導:Autograd包案例詳解

标量 向量 标量求導鍊式法則_PyTorch自動求導:Autograd包案例詳解

PyTorch中,所有神經網絡的核心是 autograd 包。autograd 包為張量上的所有操作提供了自動求導機制。 它是一個在運作時定義(define-by-run)的架構,這意味着反向傳播是根據代碼如何運作來決定的,并且每次疊代可以是不同的。 張量

标量 向量 标量求導鍊式法則_PyTorch自動求導:Autograd包案例詳解

張量:n維向量 torch.Tensor 是這個包的核心類。如果設定它的屬性 .requires_grad 為 True,那麼它将會追蹤對于該張量的所有操作。當完成計算後可以通過調用 .backward(),來自動計算所有的梯度。這個張量的所有梯度将會自動累加到.grad屬性。

标量 向量 标量求導鍊式法則_PyTorch自動求導:Autograd包案例詳解

要阻止一個張量被跟蹤曆史,可以調用 .detach() 方法将其與計算曆史分離,并阻止它未來的計算記錄被跟蹤。

标量 向量 标量求導鍊式法則_PyTorch自動求導:Autograd包案例詳解

為了防止跟蹤曆史記錄(和使用記憶體),可以将代碼塊包裝在 with torch.no_grad(): 中。在評估模型時特别有用,因為模型可能具有 requires_grad = True 的可訓練的參數,但是我們不需要在此過程中對他們進行梯度計算。 還有一個類對于autograd的實作非常重要:Function。 Tensor 和 Function 互相連接配接生成了一個無圈圖(acyclic graph),它編碼了完整的計算曆史。每個張量都有一個 .grad_fn 屬性,該屬性引用了建立 Tensor 自身的Function(除非這個張量是使用者手動建立的,即這個張量的 grad_fn 是 None )。

标量 向量 标量求導鍊式法則_PyTorch自動求導:Autograd包案例詳解

如果需要計算導數,可以在 Tensor 上調用 .backward()。如果 Tensor 是一個标量(即它包含一個元素的資料),則不需要為 backward() 指定任何參數,但是如果它有更多的元素,則需要指定一個 gradient 參數,該參數是形狀比對的張量。

标量 向量 标量求導鍊式法則_PyTorch自動求導:Autograd包案例詳解

y是計算的結果,是以它有grad_fn屬性。

标量 向量 标量求導鍊式法則_PyTorch自動求導:Autograd包案例詳解
标量 向量 标量求導鍊式法則_PyTorch自動求導:Autograd包案例詳解

.requires_grad_(...)

原地改變了現有張量的 requires_grad 标志。如果沒有指定的話,預設輸入的這個标志是 False。

标量 向量 标量求導鍊式法則_PyTorch自動求導:Autograd包案例詳解

梯度

标量 向量 标量求導鍊式法則_PyTorch自動求導:Autograd包案例詳解

梯度:方向導數,函數在該點處沿着該方向(此梯度的方向)變化最快,變化率最大(為該梯度的模)。 現在開始進行反向傳播,因為 out 是一個标量,是以 out.backward() 和out.backward(torch.tensor(1.)) 等價。 輸出導數 d(out)/dx

标量 向量 标量求導鍊式法則_PyTorch自動求導:Autograd包案例詳解

我們的得到的是一個數取值全部為4.5的矩陣。 計算步驟:

标量 向量 标量求導鍊式法則_PyTorch自動求導:Autograd包案例詳解

數學上,若有向量值函數 y =f(x ),那麼 y 相對于 x 的梯度是一個雅可比矩陣:

标量 向量 标量求導鍊式法則_PyTorch自動求導:Autograd包案例詳解

通常來說,torch.autograd 是計算雅可比向量積的一個“引擎”。根據鍊式法則,雅可比向量積:

标量 向量 标量求導鍊式法則_PyTorch自動求導:Autograd包案例詳解

雅可比向量積的這一特性使得将外部梯度輸入到具有非标量輸出的模型中變得非常友善。 現在我們來看一個雅可比向量積的例子:

标量 向量 标量求導鍊式法則_PyTorch自動求導:Autograd包案例詳解

在這種情況下,y 不再是标量。torch.autograd 不能直接計算完整的雅可比矩陣,但是如果我們隻想要雅可比向量積,隻需将這個向量作為參數傳給 backward:

标量 向量 标量求導鍊式法則_PyTorch自動求導:Autograd包案例詳解

也可以通過将代碼塊包裝在 with torch.no_grad(): 中,來阻止autograd跟蹤設定了 .requires_grad=True 的張量的曆史記錄。

标量 向量 标量求導鍊式法則_PyTorch自動求導:Autograd包案例詳解

- END - 文源網絡,僅供學習之用,如有侵權,聯系删除。往期精彩

标量 向量 标量求導鍊式法則_PyTorch自動求導:Autograd包案例詳解

◆  50款開源工具你都用過嗎?

◆  python+C、C++混合程式設計的應用

◆  python網絡爬蟲的基本原理詳解

◆  Python自動操控excel,一小時解決你一天的工作

◆  如何用Python增強Excel,減少處理複雜資料的痛苦?

标量 向量 标量求導鍊式法則_PyTorch自動求導:Autograd包案例詳解