fbpx
维基百科

自動微分

數學計算機代數中,自動微分有時稱作演算式微分,是一種可以藉由電腦程式計算一個函數導數的方法。兩種傳統做微分的方法為:

  • 對一個函數的表示式做符號上的微分,並且計算其在某一點上的值。
  • 使用差分

使用符號微分最主要的缺點是速度慢及將電腦程式轉換成表示式的困難。此外,很多函數在要計算更高階微分時會變得複雜。 使用差分的兩個重要的缺點是捨棄誤差及數值化過程和相消誤差。此兩者傳統方法在計算更高階微分時,都有複雜度及誤差增加的問題。自動微分則解決上述的問題。

自動微分使用這個事實:任何實作一個向量函數 y=F(x)的電腦程式,一般而言,可以被分解成由基本指定運算所成的序列,而其中每一個都可以藉由查表而輕易地微分。這些計算某一特定項的 "基本偏微分" 是依照微積分中的复合函数求导法则來合併成某個 F 的微分資訊(如梯度切線雅可比矩陣等)。這個過程會產生確實(數值上準確)的導數。因為只在最基礎的層面做符號轉換,自動微分避免了複雜的符號運算的問題。

复合函数求导法则,前向和反向積累 编辑

自動微分的基礎是,根據复合函数求导法则來合併微分值。以 為例,根據复合函数求导法则,我們有:

 

通常有兩個不同的模式:“前向積累”(或“前向模式”)和“反向積累”(或反向模式)。 前向積累由右到左地使用复合函数求导法则,即先計算   ,然後才 。 反向積累則是由左到右。

前向積累 编辑

前向積累式的自動微分是最容易理解和實作的。  這個函數是可被電腦(或程式設計師) 解釋成一連串對變數 的運算。 前向積累式自動微分的工具則會增加相對應的作用於第二項上的運算。

原本程式碼敘述 為導數而新增的敘述
    (種子)
    (種子)
   
   
   

計算 的導數需要初始化, 以區別是要對  來求導數。 上述表格則以  來初始化, 並且我們可以看到其結果 正是對 的導數。 注意,雖然表格列出了符號微分, 但以電腦的角度而言,電腦總是儲存數值。圖2則以圖形表明上述的敘述。

為了計算這個例子的導數,其分別為  , 需要計算兩次,一次是以  做初始值, 另一次則以  做為初始值。

前向積累的計算複雜度則正比於原來程式的計算複雜度。

對於函數  來說, 前向積累只要計算一次,優於需要計算 m 次的反向積累。

反向積累 编辑

前向式積累自動微分的由來與二元數 编辑

前向式積累自動微分可藉由擴充實數中的代數並得到一個新的算術系統來達成。 每一個數都會新增另一數,用來表示一函數在這數上導數的數。 而每一個算術運算都被擴充於此新的代數。 這個擴充後的代數就是二元數的代數。


將每一個數 替換成數 ,其中 是一個實數,但 則只是一個據有 這個特性的符號。 使用這特性,我們可以有運算

 
 

減法和除法則類似。

現在,我們可以計算多項式。 如果 ,則

     
   
 
   

其中   表示   對第一個參數的導數。 而   則稱作“種子”,可以任意選擇。

新的算術是由有序對、寫成  及對第一項的運算和對第二項的第一階微分運算所組成。 將上述結果應用於多項式的解析函數上, 我們可以得到一系列關於基本算術和一些標準函數的新算術:

 
 
 
 
 
 
 
 
 
 

並且,一般而言,對於一個函數  ,我們會有

 

其中  分別是 對其第一項和第二項的導數。

對一個二元算術運算作用於混合的參數時(數對 和實數 ), 實數會先被轉成 。 函數  上的導數 則為以上述算術計算 ,其結果為 

向量參數和函數 编辑

藉由採取方向導數的運算, 多變數函數也可以同單變數函數的效率和機制來處理。 亦即,函數  這點, 和 這個方向上的方向導數 , 可以使用上述相同的算術來計算   而求得。

更高階微分 编辑

以上的算術可以被一般化,以用於二階及三階導數。 然而,此算術的規則將會迅速變得複雜。 其複雜度將與最高階導數階數成平化。 取而代之的是使用限縮泰勒級數。 這是可行的,因為函數的泰勒級數中的通項為己知係數和函數導數的乘積。 使用自動微分來計算黑塞矩陣在某些最佳化已被證明是可行的。

實作 编辑

前向式積累是由對程式的非標準化轉譯程序來實作。 即將實數替換成二元數,常數則換成有第二項為零係數的二元數。 而數值上基本運算則被換成二元數的運算。 非標準化轉譯程序一般使用兩者策略之一:程式碼轉換運算符重載

程式碼轉換 编辑

 
Figure 4: Example of how source code transformation could work

一個函數的程式碼會被自動產生的程式碼所替換, 新生成用來計算導數的程式碼則會插入原程式碼中。

程式碼轉換可實作在所有的程式語言上,且它對編譯器而言,是容易最佳化的。 然而,實作自動微分的工具則是比較困難的。

例子:

  • ADIC[1] (C/C++, 前向積累)
  • ADIFOR[2] (Fortran77)
  • OpenAD[3] (Fortran77, Fortran95, C/C++)
  • TAPENADE[4] (Fortran77, Fortran95)

運算符重載 编辑

 
Figure 5: Example of how operator overloading could work

如果所使用的程式語言支持,運算符重載是個可行的方法。 實數的物件跟基本數學運算必須重載以滿足上述 augmented 算術。 這不須要改變要被微分的函數的程式碼。

運算符重載對前向積累是容易實作的,並且可能對反向積累亦如此。 然而,與前向積累相比,現有的編譯器在最佳化程式碼方面則是較為落後。

例子:

  • ADC Version 4.0[5] (C/C++)
  • ADF Version 4.0[6] (Fortran 77, Fortran 95)
  • ADOL-C[7] (C/C++)
  • FADBAD++[8] (C/C++)
  • CppAD[9] (C/C++)
  • MAD[10] (Matlab)
  • Sacado (Trilinos[11]的一部分) (C++, forward/reverse)

參考文獻 编辑

  1. ^ ADIC (页面存档备份,存于互联网档案馆
  2. ^ ADIFOR (页面存档备份,存于互联网档案馆
  3. ^ OpenAD (页面存档备份,存于互联网档案馆
  4. ^ TAPENADE (页面存档备份,存于互联网档案馆
  5. ^ ADC Version 4.0 (页面存档备份,存于互联网档案馆
  6. ^ ADF Version 4.0 (页面存档备份,存于互联网档案馆
  7. ^
  8. ^ FADBAD++ (页面存档备份,存于互联网档案馆
  9. ^ CppAD (页面存档备份,存于互联网档案馆
  10. ^ MAD (页面存档备份,存于互联网档案馆
  11. ^
  • Rall, Louis B. Automatic Differentiation: Techniques and Applications. Lecture Notes in Computer Science 120. Springer. 1981. ISBN 978-3-540-10861-0. 
  • Griewank, Andreas. Evaluating Derivatives: Principles and Techniques of Algorithmic Differentiation. Frontiers in Applied Mathematics 19. SIAM. 2000. ISBN 0-89871-451-6. 

外部連結 编辑

  • www.autodiff.org (页面存档备份,存于互联网档案馆), An "entry site to everything you want to know about automatic differentiation"
  • Automatic Differentiation, Operator Overloading Approach (页面存档备份,存于互联网档案馆
  • Automatic differentiation of nonlinear models
  • Compute analytic derivatives of any Fortran77 or Fortran95 through a web-based interface (页面存档备份,存于互联网档案馆) Automatic Differentiation of Fortran programs

自動微分, 在數學和計算機代數中, 有時稱作演算式微分, 是一種可以藉由電腦程式計算一個函數導數的方法, 兩種傳統做微分的方法為, 對一個函數的表示式做符號上的微分, 並且計算其在某一點上的值, 使用差分, 使用符號微分最主要的缺點是速度慢及將電腦程式轉換成表示式的困難, 此外, 很多函數在要計算更高階微分時會變得複雜, 使用差分的兩個重要的缺點是捨棄誤差及數值化過程和相消誤差, 此兩者傳統方法在計算更高階微分時, 都有複雜度及誤差增加的問題, 則解決上述的問題, 使用這個事實, 任何實作一個向量函數, 的電腦程式. 在數學和計算機代數中 自動微分有時稱作演算式微分 是一種可以藉由電腦程式計算一個函數導數的方法 兩種傳統做微分的方法為 對一個函數的表示式做符號上的微分 並且計算其在某一點上的值 使用差分 使用符號微分最主要的缺點是速度慢及將電腦程式轉換成表示式的困難 此外 很多函數在要計算更高階微分時會變得複雜 使用差分的兩個重要的缺點是捨棄誤差及數值化過程和相消誤差 此兩者傳統方法在計算更高階微分時 都有複雜度及誤差增加的問題 自動微分則解決上述的問題 自動微分使用這個事實 任何實作一個向量函數 y F x 的電腦程式 一般而言 可以被分解成由基本指定運算所成的序列 而其中每一個都可以藉由查表而輕易地微分 這些計算某一特定項的 基本偏微分 是依照微積分中的复合函数求导法则來合併成某個 F 的微分資訊 如梯度 切線 雅可比矩陣等 這個過程會產生確實 數值上準確 的導數 因為只在最基礎的層面做符號轉換 自動微分避免了複雜的符號運算的問題 目录 1 复合函数求导法则 前向和反向積累 1 1 前向積累 1 2 反向積累 2 前向式積累自動微分的由來與二元數 2 1 向量參數和函數 2 2 更高階微分 3 實作 3 1 程式碼轉換 3 2 運算符重載 4 參考文獻 5 外部連結复合函数求导法则 前向和反向積累 编辑自動微分的基礎是 根據复合函数求导法则來合併微分值 以f x g h x displaystyle f x g h x nbsp 為例 根據复合函数求导法则 我們有 d f d x d f d h d h d x displaystyle frac df dx frac df dh frac dh dx nbsp 通常有兩個不同的模式 前向積累 或 前向模式 和 反向積累 或反向模式 前向積累由右到左地使用复合函数求导法则 即先計算 d h d x displaystyle dh dx nbsp 然後才d g d h displaystyle dg dh nbsp 反向積累則是由左到右 前向積累 编辑 前向積累式的自動微分是最容易理解和實作的 f x 1 x 2 x 1 x 2 sin x 1 displaystyle f x 1 x 2 x 1 x 2 sin x 1 nbsp 這個函數是可被電腦 或程式設計師 解釋成一連串對變數w i displaystyle w i nbsp 的運算 前向積累式自動微分的工具則會增加相對應的作用於第二項上的運算 原本程式碼敘述 為導數而新增的敘述w 1 x 1 displaystyle w 1 x 1 nbsp w 1 1 displaystyle w 1 1 nbsp 種子 w 2 x 2 displaystyle w 2 x 2 nbsp w 2 0 displaystyle w 2 0 nbsp 種子 w 3 w 1 w 2 displaystyle w 3 w 1 w 2 nbsp w 3 w 1 w 2 w 1 w 2 1 x 2 x 1 0 x 2 displaystyle w 3 w 1 w 2 w 1 w 2 1x 2 x 1 0 x 2 nbsp w 4 sin w 1 displaystyle w 4 sin w 1 nbsp w 4 cos w 1 w 1 cos x 1 1 displaystyle w 4 cos w 1 w 1 cos x 1 1 nbsp w 5 w 3 w 4 displaystyle w 5 w 3 w 4 nbsp w 5 w 3 w 4 x 2 cos x 1 displaystyle w 5 w 3 w 4 x 2 cos x 1 nbsp 計算f x 1 x 2 x 1 x 2 sin x 1 displaystyle f x 1 x 2 x 1 x 2 sin x 1 nbsp 的導數需要初始化 以區別是要對x 1 displaystyle x 1 nbsp 或x 2 displaystyle x 2 nbsp 來求導數 上述表格則以w 1 1 displaystyle w 1 1 nbsp 和w 2 0 displaystyle w 2 0 nbsp 來初始化 並且我們可以看到其結果x 2 cos x 1 displaystyle x 2 cos x 1 nbsp 正是對x 1 displaystyle x 1 nbsp 的導數 注意 雖然表格列出了符號微分 但以電腦的角度而言 電腦總是儲存數值 圖2則以圖形表明上述的敘述 為了計算這個例子的導數 其分別為 f x 1 displaystyle partial f partial x 1 nbsp 和 f x 2 displaystyle partial f partial x 2 nbsp 需要計算兩次 一次是以w 1 1 displaystyle w 1 1 nbsp 和w 2 0 displaystyle w 2 0 nbsp 做初始值 另一次則以w 1 0 displaystyle w 1 0 nbsp 和w 2 1 displaystyle w 2 1 nbsp 做為初始值 前向積累的計算複雜度則正比於原來程式的計算複雜度 對於函數f R R m displaystyle f mathbb R rightarrow mathbb R m nbsp 且 m 1 displaystyle m gg 1 nbsp 來說 前向積累只要計算一次 優於需要計算 m 次的反向積累 反向積累 编辑前向式積累自動微分的由來與二元數 编辑前向式積累自動微分可藉由擴充實數中的代數並得到一個新的算術系統來達成 每一個數都會新增另一數 用來表示一函數在這數上導數的數 而每一個算術運算都被擴充於此新的代數 這個擴充後的代數就是二元數的代數 將每一個數x displaystyle x nbsp 替換成數x x e displaystyle x x varepsilon nbsp 其中x displaystyle x nbsp 是一個實數 但e displaystyle varepsilon nbsp 則只是一個據有e 2 0 displaystyle varepsilon 2 0 nbsp 這個特性的符號 使用這特性 我們可以有運算 x x e y y e x y x y e displaystyle x x varepsilon y y varepsilon x y x y varepsilon nbsp x x e y y e x y x y e y x e x y e 2 x y x y y x e displaystyle x x varepsilon cdot y y varepsilon xy xy varepsilon yx varepsilon x y varepsilon 2 xy xy yx varepsilon nbsp 減法和除法則類似 現在 我們可以計算多項式 如果P x p 0 p 1 x p 2 x 2 p n x n displaystyle P x p 0 p 1 x p 2 x 2 cdots p n x n nbsp 則 P x x e displaystyle P x x varepsilon nbsp displaystyle nbsp p 0 p 1 x x e p n x x e n displaystyle p 0 p 1 x x varepsilon cdots p n x x varepsilon n nbsp displaystyle nbsp p 0 p 1 x p n x n displaystyle p 0 p 1 x cdots p n x n nbsp p 1 x e 2 p 2 x x e n p n x n 1 x e displaystyle p 1 x varepsilon 2p 2 xx varepsilon cdots np n x n 1 x varepsilon nbsp displaystyle nbsp P x P 1 x x e displaystyle P x P 1 x x varepsilon nbsp 其中 P 1 displaystyle P 1 nbsp 表示 P displaystyle P nbsp 對第一個參數的導數 而 x displaystyle x nbsp 則稱作 種子 可以任意選擇 新的算術是由有序對 寫成 x x displaystyle langle x x rangle nbsp 及對第一項的運算和對第二項的第一階微分運算所組成 將上述結果應用於多項式的解析函數上 我們可以得到一系列關於基本算術和一些標準函數的新算術 u u v v u v u v displaystyle langle u u rangle langle v v rangle langle u v u v rangle nbsp u u v v u v u v displaystyle langle u u rangle langle v v rangle langle u v u v rangle nbsp u u v v u v u v u v displaystyle langle u u rangle langle v v rangle langle uv u v uv rangle nbsp u u v v u v u v u v v 2 v 0 displaystyle langle u u rangle langle v v rangle left langle frac u v frac u v uv v 2 right rangle quad v neq 0 nbsp sin u u sin u u cos u displaystyle sin langle u u rangle langle sin u u cos u rangle nbsp cos u u cos u u sin u displaystyle cos langle u u rangle langle cos u u sin u rangle nbsp exp u u exp u u exp u displaystyle exp langle u u rangle langle exp u u exp u rangle nbsp log u u log u u u u gt 0 displaystyle log langle u u rangle langle log u u u rangle quad u gt 0 nbsp u u k u k k u k 1 u u 0 displaystyle langle u u rangle k langle u k ku k 1 u rangle quad u neq 0 nbsp u u u u sign u u 0 displaystyle left langle u u rangle right langle left u right u mbox sign u rangle quad u neq 0 nbsp 並且 一般而言 對於一個函數 g displaystyle g nbsp 我們會有 g u u v v g u v g 1 u v u g 2 u v v displaystyle g langle u u rangle langle v v rangle langle g u v g 1 u v u g 2 u v v rangle nbsp 其中g 1 displaystyle g 1 nbsp 和g 2 displaystyle g 2 nbsp 分別是g displaystyle g nbsp 對其第一項和第二項的導數 對一個二元算術運算作用於混合的參數時 數對 u u displaystyle langle u u rangle nbsp 和實數c displaystyle c nbsp 實數會先被轉成 c 0 displaystyle langle c 0 rangle nbsp 函數f R R displaystyle f mathbb R rightarrow mathbb R nbsp 在x 0 displaystyle x 0 nbsp 上的導數 則為以上述算術計算f x 0 1 displaystyle f langle x 0 1 rangle nbsp 其結果為 f x 0 f x 0 displaystyle langle f x 0 f x 0 rangle nbsp 向量參數和函數 编辑 藉由採取方向導數的運算 多變數函數也可以同單變數函數的效率和機制來處理 亦即 函數f R n R m displaystyle f mathbb R n rightarrow mathbb R m nbsp 在x R n displaystyle x in mathbb R n nbsp 這點 和x R n displaystyle x in mathbb R n nbsp 這個方向上的方向導數y R m displaystyle y in mathbb R m nbsp 可以使用上述相同的算術來計算 y 1 y 1 y m y m f x 1 x 1 x n x n displaystyle langle y 1 y 1 rangle ldots langle y m y m rangle f langle x 1 x 1 rangle ldots langle x n x n rangle nbsp 而求得 更高階微分 编辑 以上的算術可以被一般化 以用於二階及三階導數 然而 此算術的規則將會迅速變得複雜 其複雜度將與最高階導數階數成平化 取而代之的是使用限縮泰勒級數 這是可行的 因為函數的泰勒級數中的通項為己知係數和函數導數的乘積 使用自動微分來計算黑塞矩陣在某些最佳化已被證明是可行的 實作 编辑前向式積累是由對程式的非標準化轉譯程序來實作 即將實數替換成二元數 常數則換成有第二項為零係數的二元數 而數值上基本運算則被換成二元數的運算 非標準化轉譯程序一般使用兩者策略之一 程式碼轉換和運算符重載 程式碼轉換 编辑 nbsp Figure 4 Example of how source code transformation could work一個函數的程式碼會被自動產生的程式碼所替換 新生成用來計算導數的程式碼則會插入原程式碼中 程式碼轉換可實作在所有的程式語言上 且它對編譯器而言 是容易最佳化的 然而 實作自動微分的工具則是比較困難的 例子 ADIC 1 C C 前向積累 ADIFOR 2 Fortran77 OpenAD 3 Fortran77 Fortran95 C C TAPENADE 4 Fortran77 Fortran95 運算符重載 编辑 nbsp Figure 5 Example of how operator overloading could work如果所使用的程式語言支持 運算符重載是個可行的方法 實數的物件跟基本數學運算必須重載以滿足上述 augmented 算術 這不須要改變要被微分的函數的程式碼 運算符重載對前向積累是容易實作的 並且可能對反向積累亦如此 然而 與前向積累相比 現有的編譯器在最佳化程式碼方面則是較為落後 例子 ADC Version 4 0 5 C C ADF Version 4 0 6 Fortran 77 Fortran 95 ADOL C 7 C C FADBAD 8 C C CppAD 9 C C MAD 10 Matlab Sacado Trilinos 11 的一部分 C forward reverse 參考文獻 编辑 ADIC 页面存档备份 存于互联网档案馆 ADIFOR 页面存档备份 存于互联网档案馆 OpenAD 页面存档备份 存于互联网档案馆 TAPENADE 页面存档备份 存于互联网档案馆 ADC Version 4 0 页面存档备份 存于互联网档案馆 ADF Version 4 0 页面存档备份 存于互联网档案馆 ADOL C FADBAD 页面存档备份 存于互联网档案馆 CppAD 页面存档备份 存于互联网档案馆 MAD 页面存档备份 存于互联网档案馆 Trilinos Rall Louis B Automatic Differentiation Techniques and Applications Lecture Notes in Computer Science 120 Springer 1981 ISBN 978 3 540 10861 0 Griewank Andreas Evaluating Derivatives Principles and Techniques of Algorithmic Differentiation Frontiers in Applied Mathematics 19 SIAM 2000 ISBN 0 89871 451 6 外部連結 编辑www autodiff org 页面存档备份 存于互联网档案馆 An entry site to everything you want to know about automatic differentiation Automatic Differentiation of Parallel OpenMP Programs Automatic Differentiation C Templates and Photogrammetry Automatic Differentiation Operator Overloading Approach 页面存档备份 存于互联网档案馆 Compute analytic derivatives through a web based interface Automatic differentiation of nonlinear models Compute analytic derivatives of any Fortran77 or Fortran95 through a web based interface 页面存档备份 存于互联网档案馆 Automatic Differentiation of Fortran programs 取自 https zh wikipedia org w index php title 自動微分 amp oldid 79035187, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。