MXNet (2) Automatic Differentiation
深度神經網路的訓練是基於誤差的梯度對誤差進行修正,比較詳細的內容可以參照[1]。
本篇主要是介紹 MXNet 計算梯度的模組 autograd。
1. 梯度計算範例:
梯度計算流程如下:
- 將變數加入梯度計算
- 在計算時紀錄梯度
- backward() 會傳遞梯度給計算過程中需要計算梯度的變數
下面我們計算示範如何計算 dy/dx,下式中 y=x**2 所以 dy/dx=2x:
from mxnet import autograd from mxnet import nd x = nd.array([[1,2,3],[4,5,6]]) x.attach_grad() # 1 將 x 加入梯度計算 with autograd.record(): # 2 在這個 scope 會記錄梯度 y = x**2 y.backward() # 3 傳遞梯度給計算過程中需要計算梯度的變數 print(x.grad)
x.grad 的值為:
[[ 2. 4. 6.] [ 8. 10. 12.]] <NDArray 2x3 @cpu(0)>
2. 關於梯度計算的狀態:
梯度計算的狀態有四種狀態:
- record()/pause(): 決定是否紀錄梯度 (e.g. record 會記錄梯度)
- tran_mode()/predict_mode(): 決定是否 dropout...等 (e.g. train_mode 會 dropout)
在 train_mode 梯度是不會被記錄:
with autograd.train_mode(): print("is_training: ", autograd.is_training()) # True print("is_recording: ", autograd.is_recording()) # False
在 record 會計算梯度且 train_mode 會被啟動:
with autograd.record(): print("is_training: ", autograd.is_training()) # True print("is_recording: ", autograd.is_recording()) # True
Reference:
留言
張貼留言