假設我們定義了乙個方程:f(
x,y)
=x2y
+y+2
f (x
,y)=
x2y+
y+2,我們需要對
x x
和 y' role="presentation" style="position: relative;">y
y求偏導,此時通常由以下幾種做法:
拿起紙筆應用鏈式法則逐層求導即可。缺點是易於出錯。
下圖是符號微分方法在函式g(
x,y)
g (x
,y)上的運算示例。
鏈式法則的運算過程與右邊這棵樹的生成過程對應。計算時首先從葉節點開始,逐層向上。
當函式比較複雜時,由該方法生成的樹規模十分龐大,且難以進行簡化。另外,符號微分無法無法對一些迭代計算的表示式進行計算:
def
my_func
(a, b): z=0
for i in range(100):
z = a * np.cos(z + i) + z * np.sin(b - i)
return z
最簡單的方法就是對偏導數進行數值近似。函式h(
x)h (x
)在x0
x
0點處的導數為: h′
(x)=
limx→x
0h(x
)−h(
x0)x
−x0=
limϵ→0
h(x0
+ϵ)−
h(x0
)ϵh ′(
x)=limx→
x0h(
x)−h
(x0)
x−x0
=limϵ→
0h(x
0+ϵ)
−h(x
0)ϵ在計算微分的時候,取乙個很小的ϵ ϵ
代入計算即可。但由此得到的結果不夠準確,當函式比較複雜時尤為如此。
前向自動微分結合了符號微分與數值微分的思想,主要依賴dual numbers
ϵ ϵ
實現,ϵ ϵ
是乙個無窮小的數,ϵ≠
0 ϵ≠0
但是ϵ2
=0ϵ 2=
0。注意,因為有: h(
a+bϵ
)=h(
a)+b
×h′(
a)ϵ h(a
+bϵ)
=h(a
)+b×
h′(a
)ϵ因此,我們可以通過計算h(
a+ϵ)
h (a
+ϵ)來求解h′
(a) h′(
a)。下圖為對f(
x,y)
f (x
,y)在點x=
3,y=
4 x=3
,y=4
處求偏導的計算過程。要求f(
3+ϵ,
4)f (3
+ϵ,4
),所得 dual number 的第一部分對應於 f(
3,4)
f (3
,4),第二部分對應於∂f
需要說明的是,如果要求解∂f
∂y(3
,4) ∂f∂
y(3,
4),我們必須按照流程從頭到尾再計算一遍。
總的來說,前向自動微分要比數值微分精確得多。但真如上一段所說,每對乙個變數求解微分,我們就需要從葉子節點開始計算到根節點,當變數數很大時,前向自動微分方法就不夠實用了。
反向自動微分正是tensorflow採用的自動微分方法。該方法共分為兩個階段完成:
下圖為 reverse direction 的計算過程示意。
總的來說,反向自動微分法是乙個非常清大且精確的技術,當輸入輸出維度較大時,優勢尤為明顯。具體來說
Autograd 自動微分
1 深度學習的演算法本質上是通過反向傳播求導數,pytorch的autograd模組實現了此功能 在tensor上的所有操作,autograd都能為他們自動提供微分,避免手動計算導數的複雜過程。2 autograd.variable是autograd中的核心類,它簡單的封裝了tensor,並支援幾乎...
MindSpore多元自動微分
當前主流的深度學習框架,除了能夠便捷高效的搭建機器學習的模型之外,其自動並行和自動微分等功能還為其他領域的科學計算帶來了模式的變革。本文我們將探索如何用mindspore去實現乙個多維的自動微分,並且得到該多元函式的雅可比矩陣。首先我們給定乙個比較簡單的z關於自變數x的函式形式 其中y和i是一些引數...
線性微分方程簡介
delta y 表示的是變數 y 的變化量。微分 differential 即微變化量,數學上表示為 dy dy 被成為different of y 導數 derivative 即變化率,數學上表示為 frac 也就是極短時間內 y 的變化量。線性微分方程 linear differential e...