<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
我們在《數值分析》課程中已經學過許多經典的數值微分方法。許多經典的數值微分演演算法非常快,因為它們只需要計算差商。然而,他們的主要缺點在於他們是數值的,這意味著有限的算術精度和不精確的函數求值,而這些都從根本上限制了求解結果的質量。因此。充滿噪聲的、複雜多變的函數很難得到精準的數值微分。
自動微分技術(稱為“automatic differentiation, autodiff”)是介於符號微分和數值微分的一種技術,它是在計算效率和計算精度之間的一種折衷。自動微分不受任何離散化演演算法誤差的約束,它充分利用了微分的鏈式法則和其他關於導數的性質來準確地計算它們。
我們先來計算簡單的前向自動微分。假設我們有兩個變數u和v,使用浮點數儲存。我們將變數u′=du/dt和v′=dv/dt和這些變數一起儲存,這裡tt是獨立的變數。在一些程式設計語言(如Python)中,我們可以選擇定義一種新的資料型別來儲存[u,u′]和[v,v′]這類數對。我們可以在這些數對上定義一種代數運算,這些代數運算編碼了一些經典的操作:
在進行前向自動微分之前,我們需要先將計算f(t)所產生的操作序列表示為計算圖。接著,採用自底向上的遞推演演算法的思想,從做為遞推起點的數對t≡[t0,1](因為dt/dt=1)開始,我們能夠按照我們上述編碼規則同時對函數f(t)和它的導數f′(t)進行求值。我們在程式語言中可以選擇令數對過載運運算元,這樣額外的求導數運算就可以對使用者透明地執行了。
例1 比如,對於函數f(x)=exp(x2−x)/x,想要依次計算dyi/dx(這裡yi為所有計算中間項)。則我們先從x開始將表示式分解為計算圖:
然後前向遞推地按照我們之前所述的編碼規則來進行求導
注意鏈式法則(chain rule)告訴我們:
(f(g(x)))′=f′(g(x))⋅g′(x)
所以我們對
yk=g(yi)
有
y′k=g′(yi)⋅yi′
事實上,我們也能夠處理有多個輸入的函數g:
k=g(yi,⋯,yj)
多元微分鏈式法則如下:
比如,對於
我們有
下面展示了一個對二元函數模擬前向自動微分的過程。
例2 設(x1,x2)=x1⋅exp(x2)−x1,模擬前向微分過程。
接下來我們看如何用Python程式碼來實現單變數函數的前向自動微分過程。為了簡便起見,我們下面只編碼了幾個常用的求導規則。
import math class Var: def __init__(self, val, deriv=1.0): self.val = val self.deriv = deriv def __add__(self, other): if isinstance(other, Var): val = self.val + other.val deriv = self.deriv + other.deriv else: val = self.val + other deriv = self.deriv return Var(val, deriv) def __radd__(self, other): return self + other def __sub__(self, other): if isinstance(other, Var): val = self.val - other.val deriv = self.deriv - other.deriv else: val = self.val - other deriv = self.deriv return Var(val, deriv) def __rsub__(self, other): val = other - self.val deriv = - self.deriv return Var(val, deriv) def __mul__(self, other): if isinstance(other, Var): val = self.val * other.val deriv = self.val * other.deriv + self.deriv * other.val else: val = self.val * other deriv = self.deriv * other return Var(val, deriv) def __rmul__(self, other): return self * other def __truediv__(self, other): if isinstance(other, Var): val = self.val / other.val deriv = (self.deriv * other.val - self.val * other.deriv)/other.val**2 else: val = self.val / other deriv = self.deriv / other return Var(val, deriv) def __rtruediv__(self, other): val = other / self.val deriv = other * 1/self.val**2 return Var(val, deriv) def __repr__(self): return "value: {}t gradient: {}".format(self.val, self.deriv) def exp(f: Var): return Var(math.exp(f.val), math.exp(f.val) * f.deriv)
例如,我們若嘗試計算函數f(x)=exp(x2−x)/x在x=2.0處的導數f′(2.0)如下:
fx = lambda x: exp(x*x - x)/x df = fx(Var(2.0)) print(df)
列印輸出:
value: 3.694528049465325 deriv: 9.236320123663312
可見,前向過程完成計算得到f(2.0)≈3.69, f′(2.0)≈9.24。
我們前面介紹的前向自動微分方法在計算y=f(t)的時候並行地計算f′(t)。接下來我們介紹一種“反向”自動微分方法,相比上一種的方法它僅需要更少的函數求值,不過需要以更多的記憶體消耗和更復雜的實現做為代價。
同樣,這個技術需要先將計算f(t)所產生的操作序列表示為計算圖。不過,與之前的從dt/dt=1開始,然後往dy/dt方向計算不同,反向自動求導演演算法從dy/dy=1開始並且按與之前同樣的規則往反方向計算,一步步地將分母替換為dt。反向自動微分可以避免不必要的計算,特別是當y是一個多元函數的時候。例如,對f(t1,t2)=f1(t1)+f2(t2),反向自動微分並不需要計算f1關於t2的微分或f2關於t1的微分。
例3 設f(x1,x2)=x1⋅exp(x2)−x1,模擬反向自動微分過程。
可見若採用反向自動微分,我們需要儲存計算過程中的所有東西,故記憶體的使用量會和時間成正比。不過,在現有的深度學習框架中,對反向自動微分的實現進行了進一步優化,我們會在深度學習專題文章中再進行詳述。
自動微分被廣泛認為是一種未被充分重視的數值技術, 它可以以儘量小的執行代價來產生函數的精確導數。它在軟體需要計算導數或Hessian來執行優化演演算法時顯得格外有價值,從而避免每次目標函數改變時都去重新手動計算導數。當然,做為其便捷性的代價,自動微分也會帶來計算的效率問題,因為在實際工作中自動微分方法並不會去化簡表示式,而是直接應用最顯式的編碼規則。
到此這篇關於Python實現前向和反向自動微分的範例程式碼的文章就介紹到這了,更多相關Python自動微分內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45