動手學深度學習 NDArray自動求導(01)

2021-09-25 07:10:29 字數 3098 閱讀 9735

ndarray可以很方便的求解導數,比如下面的例子:(**主要參考自

用**實現如下:

複製**

1 import mxnet.ndarray as nd

2 import mxnet.autograd as ag

3 x = nd.array([[1,2],[3,4]])

4 print(x)

5 x.attach_grad() #附加導數存放的空間

6 with ag.record():

7 y = 2*x**2

8 y.backward() #求導

9 z = x.grad #將導數結果(也是乙個矩陣)賦值給z

10 print(z) #列印結果

複製**

[[ 1. 2.]

[ 3. 4.]]

[[ 4. 8.]

[ 12. 16.]]

對控制流求導

ndarray還能對諸如if的控制分支進行求導,比如下面這段**:

複製**

1 def f(a):

2 if nd.sum(a).asscalar()<15: #如果矩陣a的元數和<15

3 b = a2 #則所有元素2

4 else:

5 b = a

6 return b

複製**

數學公式等價於:

複製**

import mxnet.ndarray as nd

import mxnet.autograd as ag

def f(a):

if nd.sum(a).asscalar()<15: #如果矩陣a的元數和<15

b = a*2 #則所有元素平方

else:

b = a

return b

#注:1+2+3+4<15,所以進入b=a*2的分支

x = nd.array([[1,2],[3,4]])

print(「x1=」)

print(x)

x.attach_grad()

with ag.record():

y = f(x)

print(「y1=」)

print(y)

y.backward() #dy/dx = y/x 即:2

print(「x1.grad=」)

print(x.grad)

x = x*2

print(「x2=」)

print(x)

x.attach_grad()

with ag.record():

y = f(x)

print(「y2=」)

print(y)

y.backward()

print(「x2.grad=」)

print(x.grad)

複製**

x1=[[ 1. 2.]

[ 3. 4.]]

y1=[[ 2. 4.]

[ 6. 8.]]

x1.grad=

[[ 2. 2.]

[ 2. 2.]]

x2=[[ 2. 4.]

[ 6. 8.]]

y2=[[ 2. 4.]

[ 6. 8.]]

x2.grad=

[[ 1. 1.]

[ 1. 1.]]

頭梯度原文上講得很含糊,其實所謂頭梯度,就是乙個求導結果前的乘法係數,見下面**:

複製**

1 import mxnet.ndarray as nd

2 import mxnet.autograd as ag

34 x = nd.array([[1,2],[3,4]])

5 print(「x=」)

6 print(x)

78 x.attach_grad()

9 with ag.record():

10 y = 2xx

1112 head = nd.array([[10, 1.], [.1, .01]]) #所謂的"頭梯度"

13 print(「head=」)

14 print(head)

15 y.backward(head_gradient) #用頭梯度求導

1617 print(「x.grad=」)

18 print(x.grad) #列印結果

複製**

x=[[ 1. 2.]

[ 3. 4.]]

head=

[[ 10. 1. ]

[ 0.1 0.01]]

x.grad=

[[ 40. 8. ]

[ 1.20000005 0.16 ]]

對比本文最開頭的求導結果,上面的**僅僅多了乙個head矩陣,最終的結果,其實就是在常規求導結果的基礎上,再乘上head矩陣(指:數乘而非叉乘)

鏈式法則

先複習下數學

注:最後一行中所有變數x,y,z都是向量(即:矩形),為了不讓公式看上去很凌亂,就統一省掉了變數上的箭頭。ndarray對復合函式求導時,已經自動應用了鏈式法則,見下面的示例**:

複製**

1 import mxnet.ndarray as nd

2 import mxnet.autograd as ag

34 x = nd.array([[1,2],[3,4]])

5 print(「x=」)

6 print(x)

78 x.attach_grad()

9 with ag.record():

10 y = x2

11 z = y2 + y

1213 z.backward()

1415 print(「x.grad=」)

16 print(x.grad) #列印結果

1718 print(「w=」)

19 w = 4x**3 + 2x

20 print(w) # 驗證結果

複製**

x=[[ 1. 2.]

[ 3. 4.]]

x.grad=

[[ 6. 36.]

[ 114. 264.]]

w=[[ 6. 36.]

[ 114. 264.]]

動手學深度學習

線性回歸的基本要素 模型 為了簡單起見,這裡我們假設 只取決於房屋狀況的兩個因素,即面積 平方公尺 和房齡 年 接下來我們希望探索 與這兩個因素的具體關係。線性回歸假設輸出與各個輸入之間是線性關係 price warea area wage age b price warea area wage a...

動手學深度學習(一)

其中 w1 和 w2 是權重 weight b 是偏差 bias 且均為標量。訓練資料 損失函式 通常,我們用訓練資料集中所有樣本誤差的平均來衡量模型 的質量 w 1,w 2,b 為使訓練樣本平均損失最小的解 優化演算法 b 代表每個小批量中的樣本個數 批量大小,batch size 稱作學習率 l...

筆記 動手學深度學習

在求數值解的優化演算法中,小批量隨機梯度下降 mini batch stochastic gradient descent 在深度學習中被廣泛使用。它的演算法很簡單 先選取一組模型引數的初始值,如隨機選取 接下來對引數進行多次迭代,使每次迭代都可能降低損失函式的值。在每次迭代中,先隨機均勻取樣乙個由...