可微分编程
来自维基百科,自由的百科全书
可微分编程是一种编程范型,在其中数值计算程序始终可通过自动微分来求导数[1][2][3][4]。这允许了对程序中的参数的基于梯度优化,通常通过梯度下降。可微分编程广泛用于各种领域,特别是科学计算和人工智能[4]。
方式
多数可微分编程框架是通过构造包含程序中的控制流和数据结构的图来进行工作的[5]。各种尝试一般可归入两组之中:
- 基于静态、编译图的方式,比如TensorFlow 1、Theano和MXNet。它们意图允许良好的编译器优化并易于伸缩成大系统,但是它们的静态本质,限制了交互性和能够轻易建立的程序类型,例如难于构建涉及循环或递归的那些程序,还有使得用户难以针对他们的程序进行有效的推理[5][6][7]。
- 基于运算符重载、动态图的方式,比如PyTorch和针对NumPy的Autograd[8],TensorFlow 2也缺省使用了动态图方式。它们的动态和交互本质,使得多数程序可以更容易的书写和推理。但是它们导致了解释器开销,特别是在包含很多小运算的时候,和较弱的可伸缩性,并且缩减了来自编译器优化的利益[6][7]。用Julia写的Flux用到了自动微分程序包Zygote[9],它直接工作在Julia的中间表示之上,但仍可以由Julia的JIT编译器进行优化[5][10][4]。
早期方式的局限在于,它们都是以适合于这些框架的风格书写求微分的代码,这限制了同其他程序的互操作性。新近的方式,通过从语言的语法或中间表示构造图来解决了这种问题,允许任意代码都是可求微分的[5][6]。
应用
可微分编程已经应用于多个领域,比如在机器人学中结合深度学习和物理引擎,用可微分密度泛函理论解决电子结构问题,可微分光线追踪,图像处理和概率编程[11][12][13][14][15][4]。
参见
引用
Wikiwand - on
Seamless Wikipedia browsing. On steroids.