自动微分

title: 复合函数求导法则,前向和反向积累.
content: 自动微分的基础是,根据复合函数求导法则来合并微分值。以formula_1为例,根据复合函数求导法则,我们有:  通常有两个不同的模式:“前向积累”(或“前向模式”)和“反向积累”(或反向模式)。 前向积累由右到左地使用复合函数求导法则,即先计算 formula_3,然后才formula_4。 反向积累则是由左到右。
title: 前向积累.
content: 前向积累式的自动微分是最容易理解和实作的。 formula_5这个函数是可被电脑(或程序员) 解释成一连串对变量formula_6的运算。 前向积累式自动微分的工具则会增加相对应的作用于第二项上的运算。 计算formula_5的导数需要初始化, 以区别是要对formula_8或formula_9来求导数。 上述表格则以formula_10和formula_11来初始化, 并且我们可以看到其结果formula_12正是对formula_8的导数。 注意,虽然表格列出了符号微分, 但以电脑的角度而言,电脑总是储存数值。图2则以图形表明上述的叙述。  为了计算这个例子的导数,其分别为formula_14和formula_15, 需要计算两次,一次是以formula_16和formula_17做初始值, 另一次则以formula_18和formula_19做为初始值。  前向积累的计算复杂度则正比于原来程序的计算复杂度。  对于函数formula_20且 formula_21来说, 前向积累只要计算一次,优于需要计算 m 次的反向积累。
title: 前向式积累自动微分的由来与二元数.
content: 前向式积累自动微分可借由扩充实数中的代数并得到一个新的算术系统来达成。 每一个数都会新增另一数,用来表示一函数在这数上导数的数。 而每一个算术运算都被扩充于此新的代数。 这个扩充后的代数就是二元数的代数。 将每一个数formula_22替换成数formula_23,其中formula_24是一个实数,但formula_25则只是一个据有formula_26这个特性的符号。 使用这特性,我们可以有运算 减法和除法则类似。  现在,我们可以计算多项式。 如果formula_29,则  其中 formula_30 表示 formula_31 对第一个参数的导数。 而 formula_24 则称作“种子”,可以任意选择。  新的算术是由有序对、写成formula_33 及对第一项的运算和对第二项的第一阶微分运算所组成。 将上述结果应用于多项式的解析函数上, 我们可以得到一系列关于基本算术和一些标准函数的新算术: 并且,一般而言,对于一个函数 formula_44,我们会有 其中formula_46和formula_47分别是formula_44对其第一项和第二项的导数。  对一个二元算术运算作用于混合的参数时(数对formula_49和实数formula_50), 实数会先被转成formula_51。 函数formula_52在formula_53上的导数 则为以上述算术计算formula_54,其结果为formula_55。
title: 向量参数和函数.
content: 借由采取方向导数的运算, 多变量函数也可以同单变量函数的效率和机制来处理。 亦即,函数formula_56在formula_57这点, 和formula_58这个方向上的方向导数formula_59, 可以使用上述相同的算术来计算 formula_60 而求得。
title: 更高阶微分.
content: 以上的算术可以被一般化,以用于二阶及三阶导数。 然而,此算术的规则将会迅速变得复杂。 其复杂度将与最高阶导数阶数成平化。 取而代之的是使用限缩泰勒级数。 这是可行的,因为函数的泰勒级数中的通项为己知系数和函数导数的乘积。 使用自动微分来计算黑塞矩阵在某些最佳化已被证明是可行的。
title: 实作.
content: 前向式积累是由对程序的非标准化转译程序来实作。 即将实数替换成二元数,常数则换成有第二项为零系数的二元数。 而数值上基本运算则被换成二元数的运算。 非标准化转译程序一般使用两者策略之一:"程序码转换"和"运算符重载"。
title: 程序码转换.
content: 一个函数的程序码会被自动产生的程序码所替换, 新生成用来计算导数的程序码则会插入原程序码中。  程序码转换可实作在所有的程序语言上,且它对编译器而言,是容易最佳化的。 然而,实作自动微分的工具则是比较困难的。  例子:
title: 运算符重载.
content: 如果所使用的程序语言支持,运算符重载是个可行的方法。 实数的物件跟基本数学运算必须重载以满足上述 augmented 算术。 这不须要改变要被微分的函数的程序码。  运算符重载对前向积累是容易实作的,并且可能对反向积累亦如此。 然而,与前向积累相比,现有的编译器在最佳化程序码方面则是较为落后。  例子:

Summary: 在数学和计算机代数中,自动微分有时称作演算式微分,是一种可以借由计算机程序计算一个函数导数的方法。两种传统做微分的方法为:

Automatic differentiation: In mathematics and computer algebra, automatic differentiation (AD), also called algorithmic differentiation or computational differentiation, is a set of techniques to numerically evaluate the derivative of a function specified by a computer program. AD exploits the fact that every computer program, no matter how complicated, executes a sequence of elementary arithmetic operations (addition, subtraction, multiplication, division, etc.) and elementary functions (exp, log, sin, cos, etc.). By applying the chain rule repeatedly to these operations, derivatives of arbitrary order can be computed automatically, accurately to working precision, and using at most a small constant factor more arithmetic operations than the original program. Automatic differentiation is distinct from symbolic differentiation and numerical differentiation (the method of finite differences). Symbolic differentiation can lead to inefficient code and faces the difficulty of converting a computer program into a single expression, while numerical differentiation can introduce round-off errors in the discretization process and cancellation. Both classical methods have problems with calculating higher derivatives, where complexity and errors increase. Finally, both classical methods are slow at computing partial derivatives of a function with respect to "many" inputs, as is needed for gradient-based optimization algorithms. Automatic differentiation solves all of these problems.