官术网_书友最值得收藏!

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的張量自動求導。

輸出的結果為

主站蜘蛛池模板: 通化市| 名山县| 邵阳市| 沙田区| 庆阳市| 石嘴山市| 荥阳市| 樟树市| 宁陵县| 安新县| 彩票| 株洲县| 康平县| 酉阳| 宁明县| 项城市| 玛曲县| 远安县| 闽清县| 仪陇县| 九台市| 汉阴县| 依安县| 灵武市| 临邑县| 张掖市| 吉木萨尔县| 克什克腾旗| 焦作市| 托克逊县| 肥东县| 新泰市| 海丰县| 修文县| 遵义市| 永顺县| 泾源县| 格尔木市| 庆安县| 商都县| 伊金霍洛旗|