可微分編程是一種程式設計範式,在其中數值計算程式始終可通過自動微分來求導數[1][2][3][4]。這允許了對程式中的參數的基於梯度最佳化英語Gradient method,通常通過梯度下降。可微分編程廣泛用於各種領域,特別是科學計算人工智能[4]

方式

多數可微分編程框架是通過構造包含程式中的控制流和數據結構的圖來進行工作的[5]。各種嘗試一般可歸入兩組之中:

  • 基於靜態、編譯的方式,比如TensorFlow 1TheanoMXNet。它們意圖允許良好的編譯器最佳化英語优化编译器並易於伸縮成大系統,但是它們的靜態本質,限制了互動性和能夠輕易建立的程式類型,例如難於構建涉及迴圈遞歸的那些程式,還有使得用戶難以針對他們的程式進行有效的推理[5][6][7]
  • 基於運算子多載、動態圖的方式,比如PyTorch和針對NumPy的Autograd[8],TensorFlow 2也預設使用了動態圖方式。它們的動態和互動本質,使得多數程式可以更容易的書寫和推理。但是它們導致了直譯器開銷,特別是在包含很多小運算的時候,和較弱的可伸縮性,並且縮減了來自編譯器最佳化的利益[6][7]。用Julia寫的Flux英語Flux (machine-learning framework)用到了自動微分程式包Zygote[9],它直接工作在Julia的中間表示之上,但仍可以由Julia的JIT編譯器進行最佳化[5][10][4]

早期方式的局限在於,它們都是以適合於這些框架的風格書寫求微分的代碼,這限制了同其他程式的互操作性。新近的方式,通過從語言的語法或中間表示構造圖來解決了這種問題,允許任意代碼都是可求微分的[5][6]

應用

可微分編程已經應用於多個領域,比如在機械人學中結合深度學習物理引擎,用可微分密度泛函理論解決電子結構英語Electronic structure問題,可微分光線追蹤圖像處理概率編程[11][12][13][14][15][4]

參見

參照

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.