可微分编程

可微分编程是一种编程范型,在其中数值计算程序始终可通过自动微分来求导数[1][2][3][4]。这允许了对程序中的参数的基于梯度优化,通常通过梯度下降。可微分编程广泛用于各种领域,特别是科学计算和人工智能[4]

方式

多数可微分编程框架是通过构造包含程序中的控制流和数据结构的图来进行工作的[5]。早期的尝试一般可归入两组之中:

  • 基于静态、编译的方式,比如TensorFlow[note 1]TheanoMXNet。它们意图允许良好的编译器优化并易于伸缩成大系统,但是它们的静态本质,限制了交互性,和可以容易建立的程序类型(就是涉及循环递归的那些程序),还有使得用户难于针对他们的程序进行有效的推理[5][6][7]
  • 基于运算符重载、动态图的方式,比如PyTorchNumPy的AutoGrad。它们的动态和交互本质,使得多数程序可以更容易的书写和推理。但是它们导致了解释器开销(特别是在包含很多小运算的时候),较弱的可伸缩性,费力于从编译器优化中获益[6][7][4]

这些早期方式都只能微分以适合于这些框架的风格书写的代码,限制了同其他程序的互操作性。

更新近的包如Julia编程语言的ZygoteSwift编程语言的Swift for TensorFlow,和新的编程语言Myia,通过将编程语言的语法当作图来处理,解决了早期尝试面对的问题。任意代码的中间表示可以直接的微分、优化和编译[5][8][6]

应用

可微分编程已经应用于多个领域,比如在机器人学中结合深度学习物理引擎,可微分光线追踪图像处理概率编程[9][10][11][12][4]

参见

注释

  1. TensorFlow 1使用静态图方式,而TensorFlow 2缺省使用动态图方式。

引用

  1. Baydin, Atilim Gunes; Pearlmutter, Barak; Radul, Alexey Andreyevich; Siskind, Jeffrey. . Journal of Machine Learning Research. 2018, 18: 1–43.
  2. Wang, Fei; Decker, James; Wu, Xilun; Essertel, Gregory; Rompf, Tiark, Bengio, S.; Wallach, H.; Larochelle, H.; Grauman, K. , 编, (PDF), Advances in Neural Information Processing Systems 31 (Curran Associates, Inc.), 2018: 10201–10212 [2019-02-13]
  3. Innes, Mike. (PDF). SysML Conference 2018. 2018.
  4. Innes, Mike; Edelman, Alan; Fischer, Keno; Rackauckas, Chris; Saba, Elliot; Viral B Shah; Tebbutt, Will, , 2019, arXiv:1907.07587
  5. Innes, Michael; Saba, Elliot; Fischer, Keno; Gandhi, Dhairya; Rudilosso, Marco Concetto; Joy, Neethu Mariya; Karmali, Tejan; Pal, Avik; Shah, Viral. . 2018-10-31. arXiv:1811.01457 [cs.PL].
  6. . [2019-06-24].
  7. . [2019-03-04].
  8. Innes, Michael. . 2018-10-18. arXiv:1810.07951 [cs.PL].
  9. Degrave, Jonas; Hermans, Michiel; Dambre, Joni; wyffels, Francis. . 2016-11-05. arXiv:1611.01652 [cs.NE].
  10. . people.csail.mit.edu. [2019-02-13].
  11. . sciml.ai. [2020-07-19].
  12. . people.csail.mit.edu. [2019-02-13].
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.