- 中文名
- 自动微分
- 外文名
- Automatic differentiation
- 又 称
- 演算式微分
- 本 质
- 一个函数导数的方法
简介
播报编辑
自动微分使用这个事实:垫格剃任何实作一个向量函数y她体捉=F(x)的计算机程序,一般而言,可以被分解成由基本指定运算所成的序列,而其中每一个都可以借由查表而轻多臭多乐企地验易地微分。这些计算某一特定项的 "基本偏微分" 是依照微积分中的复合函数求导法则嘱夜连来合并成某个 F 的宙归祖微分资讯(如梯度白您、切线、雅可比矩阵等)。这个过程会产生确实(数值上准确洒樱)的导数。因为只在最基础的层面做符号转换,自动微分避免了复杂的符号运算的问题。
复合函数求导法则
播报编辑
前向积累
前向积累式的自动微分是最容易理解和实作的。
这个函数是可被电脑(或程序员) 解释成一连串对变数
的运算。 前向积累式自动微分的工具则会增加相对应的作用于第二项上的运算。
计算
的导数需要初始化, 以区别是要对
或
来求导数。 上述表格则以
和
来初始化, 并且我们可以看到其结果
正是对
的导数。 注意,虽然表格列出了符号微分, 但以电脑的角度而言,电脑总是储存数值。图一则以图形表明上述的叙述。
为了计算这个例子的导数,其分别为
和
, 需要计算两次,一次是以
和
做初始值, 另一次则以
和
做为初始值。
前向积累的计算复杂度则正比于原来程式的计算复杂度。
对于函数
且
来说, 前向积累只要计算一次,优于需要计算m次的反向积累。 [1]
前向式积累自动微分的由来与二元数
播报编辑
前向式积累自动微分可借由扩充实数中的代数并得到一个新的算术系统来达成。 每一个数都会新增另一数,用来表示一函数在这数上导数的数。 而每一个算术运算都被扩充于此新的代数。 这个扩充后的代数就是二元数的代数。
将每一个数
替换成数
,其中
是一个实数,但
则只是一个据有
这个特性的符号。 使用这特性,我们可以有运算
减法和除法则类似。
其中
表示
对第一个参数的导数。 而
则称作“种子”,可以任意选择。
并且,一般而言,对于一个函数{\displaystyle g},我们会有
其中
和
分别是
对其第一项和第二项的导数。
对一个二元算术运算作用于混合的参数时(数对
和实数
), 实数会先被转成
。 函数
在
上的导数 则为以上述算术计算
,其结果为
。
向量参数和函数
更高阶微分
以上的算术可以被一般化,以用于二阶及三阶导数。 然而,此算术的规则将会迅速变得复杂。 其复杂度将与最高阶导数阶数成平化。 取而代之的是使用限缩泰勒级数。 这是可行的,因为函数的泰勒级数中的通项为己知系数和函数导数的乘积。 使用自动微分来计算黑塞矩阵在某些最佳化已被证明是可行的。
前向式积累是由对程式的非标准化转译程序来实作。 即将实数替换成二元数,常数则换成有第二项为零系数的二元数。 而数值上基本运算则被换成二元数的运算。 非标准化转译程序一般使用两者策略之一:源程序代码转换和运算符重载。
源程序代码转换
一个函数的源程序代码会被自动产生的源程序代码所替换, 新生成用来计算导数的源程序代码则会插入原源程序代码中。
源程序代码转换可实作在所有的编程语言上,且它对编译器而言,是容易最佳化的。 然而,实作自动微分的工具则是比较困难的。
运算符重载
运算符重载对前向积累是容易实作的,并且可能对反向积累亦如此。 然而,与前向积累相比,现有的编译器在最佳化源程序代码方面则是较为落后。 [2]