什么是自动求导
自动求导 (AUTOMATIC DIFFERENTIATION
简称 AD) 或许是目前你从未听过且最有用的计算技术之一。如果你的工作涉及到实数计算,那么理解 AD 或许将会对你的工作有所帮助。
其定义如下:
自动求导,也被称为
算法求导(algorithmic differentiation)
或计算求导(computational differentiation)
,是一组使用数值方法对某个函数,通过编程的方式进行求导的技术。可以求任意阶的导数,求导过程是自动的,并且能够保证足够的精度,以及较小的时间复杂度。
自动求导不是……
所有人听到这个概念时,总是会下意识地认为 AD 指的是 数值求导(numerical differentiation)
或 符号求导(symbolic differentiation)
,然而 AD 比这些算法更为优秀。
不是数值求导
从微分公式中,我们可以得到数值求导的基本思路:
d f ( x ) d x = lim h → 0 f ( x + h ) − f ( x ) h \frac{df(x)}{dx} = \lim_{h \to 0} \frac{f(x + h) - f(x)}{h} dxdf(x)=h→0limhf(x+h)−f(x)
通过计算右边的公式,令其值逼近左边(实际导数值),并且保证 h h h 非零
这个思路很容易转换为实际的代码,然而对于 n n n 维函数进行求导时,其时间复杂度逼近 O ( n ) O(n) O(n)。并且我们不得不考虑过程中的截断误差与舍入误差,虽然已经有弥补这些缺点的技术,不过引入这些技术会令编码难度大幅提高。
不是符号求导
符号求导的基本思路是应用求导公式与链式法则,通过解析函数公式的方法来进行求导,例如:
A: d ( u ( x ) + v ( x ) ) d x = d u ( x ) d x + d v ( x ) d x B: d ( u ( x ) v ( x ) ) d x = u ( x ) d v ( x ) d x + d u ( x ) d x v ( x ) ⋯ \textrm{A:}\ \frac{d(u(x) + v(x))}{dx} = \frac{du(x)}{dx} + \frac{dv(x)}{dx} \\ \textrm{B:}\ \frac{d(u(x) v(x))}{dx} = u(x) \frac{dv(x)}{dx} + \frac{du(x)}{dx} v(x) \\ \cdots A: dxd(u(x)+v(x))=dxdu(x)+dxdv(x)B: dxd(u(x)v(x))=u(x)dxdv(x)+