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 在深度學習中被廣泛使用。它的演算法很簡單 先選取一組模型引數的初始值,如隨機選取 接下來對引數進行多次迭代,使每次迭代都可能降低損失函式的值。在每次迭代中,先隨機均勻取樣乙個由...