- 深度學習自然語言處理實戰
- 開課吧組編 張楠 蘇南 王貴陽等編著
- 863字
- 2021-04-22 17:09:12
2.3 PyTorch自動求梯度
深度學習的過程中,在對代價函數(loss)進行優化時需要計算梯度(gradient),Py-Torch提供的autograd(自動求梯度)包能夠根據輸入的數據和前向傳播過程自動構建計算圖,并執行反向傳播。
2.3.1 基本概念
在PyTorch中,torch.Tensor是autograd包的核心類,如果將其屬性.requires_ grad設置為True,它將開始追蹤對Tensor的所有操作,即可以利用鏈式法則(Chain Rule)進行梯度傳播(Gradient Propagation)。完成計算后,可以調用.backward()來自動完成所有梯度的計算。這個Tensor的梯度將累積到.grad屬性中。例如,如果x是一個Tensor,x.requires_grad=True,然后x.grad是另一個Tensor,x.grad將累計x的所有的梯度。
如果在后期需要停止對Tensor歷史記錄的追蹤,可以調用.detach()函數,它會將Tensor與其計算的歷史記錄做分離,并防止將來的計算被繼續追蹤,此時,梯度就不會進行傳播了。如果需要設置一些操作代碼使其不被跟蹤,可以用with torch.no_grad()將具體的代碼塊包裝起來。這種方法在評估(Evaluate)模型時用處很大,這是因為在評估模型的階段不需要用到可訓練參數(require_grad = True)部分的梯度。
Function也是autograd包中很重要的一個類。通過將Tensor和Function進行連接可以構建一個保存整個計算過程歷史信息的有向無環圖(Directed Acyclic Graph,DAG)。每個Tensor都會有一個.grad_fn屬性,這個屬性會保存創建該Tensor的Function,即說明這個Tensor是否由某些運算得到。如果是用戶自己創建的Tensor,那么.grad_fn屬性將是None。
2.3.2 Tensor樣例
創建一個Tensor,通過設置requires_grad = True來跟蹤與它相關的計算。

輸出的結果為

對Tensor x做加法運算

輸出的結果為


在這里可以看到,Tensor x是直接創建的(又可以稱為葉子節點),因此x沒有grad fn;Tensor y是通過加法創建出來的,因此y有一個名為<AddBackward0>的grad_fn。
對Tensor y做更復雜的運算,如下所示:

輸出的結果為

.requires_grad_(...)會改變張量的requires_grad標記。如果沒有提供相應的參數,輸入的標記默認為False。

輸出的結果為

2.3.3 梯度計算
我們根據上述內容建立一個稍微復雜的網絡來進行梯度計算。

然后進行反向傳播

輸出的結果為

下面,我們來計算一個簡單的雅可比的梯度。

輸入的結果為

現在在這種情況下,y不再是一個標量。torch.autograd不能直接計算整個雅可比,但是如果我們只想要雅可比向量積,只需要簡單地把向量傳遞給backward作為參數。


輸出的結果為

可以通過將代碼包裹在with torch.no_grad()中,來停止對從跟蹤歷史中的.requires_grad=True的張量自動求導。

輸出的結果為

- Painter 現代服裝效果圖表現技法
- 中文版AutoCAD 2015實用教程
- GIMP 2.6 cookbook
- TArch 8.5天正建筑軟件標準教程
- Scratch 1.4: Beginner’s Guide
- Google Web Toolkit 2 Application Development Cookbook
- After Effects中文版入門、精通與實戰
- OpenCV項目開發實戰(原書第2版)
- Photoshop移動UI設計從入門到精通
- 中文版Illustrator 2020基礎教程
- Learning the Yahoo! User Interface library
- AutoCAD 2022中文版從入門到精通(標準版)
- Excel 2010 Financials Cookbook
- 中文版InDesign CC平面排版設計從入門到精通
- 玩轉電子設計:基于Altium Designer的PCB設計實例(移動視頻版)