在深度學習中,我們經常需要對函式求梯度(gradient)。本節將介紹如何使用mxnet提供的autograd模組來自動求梯度。
通過下面的**匯入autograd模組
from mxnet import autograd
我們先來看乙個簡單的例子,如何使用mxnet來求解y=2
xt
xy=2x^t x
y=2xtx
這個函式關於x
xx的梯度的方法。
print
('簡單例子'
)x=nd.arange(4)
.reshape((4
,1))
#建立乙個4*1的向量,元素值為從0到3
print
(x)# 1. 為了求有關變數x的梯度,我們需要先呼叫attach_grad函式來申請儲存梯度所需要的記憶體。
x.attach_grad(
)# 2. 我們需要呼叫record函式來要求mxnet記錄與求梯度有關的計算。
with autograd.record():
y=2*nd.dot(x.t,x)
#定義有關變數x的函式。
# 3. 通過呼叫backward函式自動求梯度。當y不是乙個標量,mxnet將預設先對y中元素求和得到新變數,再求該變數有關x的梯度。
y.backward(
)assert
(x.grad-
4*x)
.norm(
).asscalar()==
0#判斷函式y關於x的梯度是否正確
# 4. 輸出梯度
print
(x.grad)
輸出:
簡單例子
[[0.]
[1.]
[2.]
[3.]]
[[ 0.]
[ 4.]
[ 8.]
[12.]]
在上面的例子中,僅定義y=2*nd.dot(x.t,x)這個表示式不會記錄用於求梯度的計算,這是為了減少計算和記憶體開銷。通過呼叫record函式來要求mxnet記錄與求梯度有關的計算。
從上面可以看出,在呼叫record函式後,mxnet會記錄並計算梯度。此外,預設情況下autograd還會將執行模式從**模式轉為訓練模式。這可以通過呼叫is_training函式來檢視。
print
('訓練模式和**模式'
)print
(autograd.is_training())
with autograd.record():
print
(autograd.is_training(
))
在有些情況下,同乙個模型在訓練模式和**模式下的行為並不相同。
使用mxnet的乙個便利之處是,即使函式的計算圖包含了python的控制流(如條件和迴圈控制),我們也有可能對變數求梯度。
本節將提供乙個包含python條件和迴圈控制的函式,輸入值為a,輸出為c。我們將對a求解梯度。
print
('對python控制流求梯度'
)# 定義乙個函式,待會將對這個函式求關於a的梯度
deff
(a):
b=a*
2while b.norm(
).asscalar(
)<
1000
: b=b*
2if b.
sum(
).asscalar(
)>0:
c=belse
: c=
100*b
return c
a=nd.random.normal(shape=1)
# 1. 為了求有關變數a的梯度,我們需要先呼叫attach_grad函式來申請儲存梯度所需要的記憶體。
a.attach_grad(
)# 2. 我們需要呼叫record函式來要求mxnet記錄與求梯度有關的計算。
with autograd.record():
c=f(a)
# 3. 通過呼叫backward函式自動求梯度。
c.backward(
)# 4. 驗證梯度求解的是否正確
print
(a.grad==c/a)
輸出:
對python控制流求梯度
[1.]
如何判斷梯度正確性:事實上,給定任意輸入a,其輸出必然是 f(a) = x * a的形式,其中標量係數x的值取決於輸入a。由於c = f(a)有關a的梯度為x,且值為c / a,我們可以像下面這樣驗證對本例中控制流求梯度的結果的正確性。 PyTorch學習筆記 自動求梯度
在深度學習中,我們經常需要對函式求梯度 gradient pytorch提供的autograd包能夠根據輸 和前向傳播過程自動構建計算圖,並執 反向傳播。本節將介紹如何使用autograd包來進 自動求梯度的有關操作。建立 個tensor並設定requires grad屬性為true x torch...
動手學深度學習 7 2 梯度下降和隨機梯度下降
在本節中,我們將介紹梯度下降 gradient descent 的工作原理。雖然梯度下降在深度學習中很少被直接使用,但理解梯度的意義以及沿著梯度反方向更新自變數可能降低目標函式值的原因是學習後續優化演算法的基礎。隨後,我們將引出隨機梯度下降 stochastic gradient descent 我...
動手學深度學習Task3
過擬合 欠擬合及其解決方案 梯度消失 梯度 迴圈神經網路高階 1 過擬合和欠擬合 過擬合 模型的訓練誤差遠小於它在測試資料集上的誤差,我們稱該現象為過擬合 欠擬合 模型訓練誤差無法降低.如何應對欠擬合和過擬合?在這裡我們重點討論兩個因素 模型複雜度和訓練資料集大小。1.1.1 模型複雜度 為了解釋模...