MXNet (2) Automatic Differentiation

深度神經網路的訓練是基於誤差的梯度對誤差進行修正,比較詳細的內容可以參照[1]。

本篇主要是介紹 MXNet 計算梯度的模組 autograd。


1. 梯度計算範例:

梯度計算流程如下:

  1. 將變數加入梯度計算
  2. 在計算時紀錄梯度
  3. 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. 關於梯度計算的狀態:

梯度計算的狀態有四種狀態:

  1. record()/pause(): 決定是否紀錄梯度 (e.g. record 會記錄梯度)
  2. 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:

1. Deep Learning 深度學習基礎|設計下一代人工智慧演算法

留言

熱門文章