主要内容

自动区分背景

什么是自动差异化?

自动微分(也称为autodiff,公元算法微分)是一种应用广泛的优化工具。的解决函数在一般非线性目标函数和约束的基于问题的优化中默认使用自动微分;看到优化工具箱中的自动微分

自动微分是一套数值计算导数(梯度)的技术。该方法使用符号规则进行微分,比有限差分近似更精确。与纯符号方法不同,自动微分在计算的早期以数字方式计算表达式,而不是执行大型符号计算。换句话说,自动微分以特定数值计算导数;它不为导数构造符号表达式。

  • 转发模式自动微分通过在计算函数本身的操作的同时执行初等导数操作来计算数值导数。如下一节所述,软件在计算图上执行这些计算。

  • 反模式自动微分使用了前向模式计算图的扩展,从而可以通过对图的反向遍历来计算梯度。当软件运行代码来计算函数及其导数时,它会在一个叫做跟踪

正如许多研究人员所指出的(例如Baydin、Pearlmutter、Radul和Siskind)[1]),对于多变量的标量函数,反向模式比正向模式更有效地计算梯度。因为目标函数是标量函数,解决自动微分使用反向模式进行标量优化。但是,对于向量值函数,如非线性最小二乘和方程求解,解决在某些计算中使用正向模式。看见优化工具箱中的自动微分

转发模式

考虑这个函数及其梯度的求值问题:

F ( x ) = x 1. 经验 ( 1. 2. ( x 1. 2. + x 2. 2. ) )

自动区分在特定的点起作用。在这种情况下,采取x1.= 2,x2.= 1/2。

下面的计算图对函数的计算进行了编码F(x).

计算…的梯度F(x)使用正向模式,可以在相同方向上计算相同的图,但根据基本的微分规则修改计算。为了进一步简化计算,您需要填充每个子表达式的导数值U当你走。为了计算整个梯度,你必须遍历图两次,一次是对每个自变量的偏导数。链式规则中的每个子表达式都有一个数值,因此整个表达式的求值图与函数本身的类型相同。

计算是链式规则的重复应用。在本例中F关于x1.扩展到此表达式:

D F D x 1. = D U 6. D x 1. = U 6. U 1. + U 6. U 5. U 5. x 1. = U 6. U 1. + U 6. U 5. U 5. U 4. U 4. x 1. = U 6. U 1. + U 6. U 5. U 5. U 4. U 4. U 3. U 3. x 1. = U 6. U 1. + U 6. U 5. U 5. U 4. U 4. U 3. U 3. U 1. U 1. x 1.

U ˙ 表示表达式的导数U关于x1..的计算值U通过对函数的求值,可以计算出的偏导数F关于x1.如下图所示。请注意 U ˙ 从上到下遍历图形时变为可用。

计算关于的偏导数x2.,您将遍历一个类似的计算图。因此,在计算函数的梯度时,图遍历的次数与变量的数量相同。当目标函数或非线性约束依赖于许多变量时,这个过程在许多应用中可能会很慢。

反模式

反向模式使用对计算图的一次前向遍历来设置跟踪。然后计算函数在图的相反方向的一次遍历的整个梯度。对于有许多变量的问题,这种模式要有效得多。

反向模式背后的理论也是基于链式法则,以及用overbar表示的相关伴随变量。的伴随变量U

U ¯ = F U

在计算图方面,变量中的每个向外箭头通过其在链式规则中的项贡献给相应的伴随变量。例如,变量U–1向外的箭头指向两个变量,U1.U6.. 该图具有关联的方程式

F U 1. = F U 1. U 1. U 1. + F U 6. U 6. U 1. = U ¯ 1. U 1. U 1. + U ¯ 6. U 6. U 1.

在这个计算中,回想一下 U 1. = U 1. 2. U6.=U5.U–1,你获得

U ¯ 1. = U ¯ 1. 2. U 1. + U ¯ 6. U 5.

在向前遍历图形的过程中,软件计算中间变量U. 在反向遍历期间,从种子值开始 U ¯ 6. = F F = 1. 时,反模式计算得到所有变量的伴随值。因此,反向模式只需要一次计算就可以计算出梯度,与正向模式相比节省了大量的时间。

下图显示了该函数在反向模式下梯度的计算

F ( x ) = x 1. 经验 ( 1. 2. ( x 1. 2. + x 2. 2. ) )

同样,计算需要花费大量时间x1.= 2,x2.= 1/2。反模式计算依赖于U在原始计算图中对函数进行计算时获得的值。在图的右侧部分,伴随变量的计算值出现在伴随变量名称的旁边,使用图的左侧部分的公式。

最终的渐变值显示为 U ¯ 0 = F U 0 = F x 2. U ¯ 1. = F U 1. = F x 1.

有关更多详细信息,请参见Baydin、Pearlmutter、Radul和Siskind[1]或者维基百科上关于自动分化的文章[2]

计算机自动微分优化工具箱

自动微分(AD)适用于解决prob2struct以下条件下的功能:

当广告适用时 支持的所有约束函数金宝app 不支持一个或多个约束金宝app
目标函数的支持金宝app 用于目标和约束的AD AD仅用于客观目的
不支持目标函数金宝app AD仅用于约束 未使用的广告

当这些条件不满足时,解决通过有限差分估计梯度prob2struct不会在其生成的函数文件中创建梯度。

求解器默认选择以下类型的AD:

  • 对于一般的非线性目标函数,铁铬镍铁合金默认为目标函数反向AD。铁铬镍铁合金当非线性约束数小于变量数时,非线性约束函数默认为反向AD。否则铁铬镍铁合金非线性约束函数的默认值为正向AD。

  • 对于一般的非线性目标函数,fminunc默认为反向AD。

  • 对于最小二乘目标函数,铁铬镍铁合金fminunc默认为目标函数转发AD。关于基于问题的最小二乘目标函数的定义,见编写基于问题的最小二乘的目标函数

  • 解非线性最小二乘问题当目标向量中的元素数大于或等于变量数时,默认为向前AD。否则解非线性最小二乘问题默认为反向AD。

  • fsolve当方程数量大于或等于变量数量时,默认为向前AD。否则,fsolve默认为反向AD。

笔记

在通过转换的问题中使用自动导数prob2struct,传递指定这些衍生品的选项。

选择= optimoptions (“fmincon”,“SpecifyObjectiveGradient”符合事实的...“SpecifyConstraintGradient”,真正的);问题。选择=选项;

目前,AD仅适用于一阶导数;它不适用于二阶或更高阶导数。因此,例如,如果您想使用分析Hessian来加速优化,您不能使用解决直接使用,而必须使用基于问题的工作流中的供应衍生品

参考文献

[1] 贝丁、阿提林·冈斯、巴拉克·A·珀尔穆特、阿列克谢·安德烈耶维奇·拉杜尔和杰弗里·马克·西斯金德。“机器学习中的自动区分:一项调查。”机器学习研究杂志,18(153), 2018, pp. 1-43。可以在https://arxiv.org/abs/1502.05767

[2]自动分化。维基百科。可以在https://en.wikipedia.org/wiki/Automatic_differentiation

另见

|

相关的话题

外部网站