自动分化(也称为autodiff,广告,或算法的区别)是一种应用广泛的优化工具。的解决
函数在一般非线性目标函数和约束的基于问题的优化中默认使用自动微分;看到优化工具箱中的自动微分.
自动微分是一套用数字计算导数(梯度)的技术。该方法采用符号规则进行微分,比有限差分逼近法更精确。与纯粹的符号方法不同,自动微分在计算的早期以数值计算表达式,而不是执行大型符号计算。换句话说,自动微分计算特定数值上的导数;它不构造导数的符号表达式。
转发模式自动微分是通过在计算函数本身的运算中同时执行初等导数运算来计算数值导数的。在下一节中详细介绍,软件在计算图上执行这些计算。
反模式自动微分使用了前向模式计算图的扩展,从而可以通过对图的反向遍历来计算梯度。当软件运行代码来计算函数及其导数时,它会在一个叫做跟踪.
正如许多研究人员所指出的(例如Baydin、Pearlmutter、Radul和Siskind)[1]),对于多变量标量函数,反模式比正模式更有效地计算梯度。因为目标函数是标量,解决
自动区分采用反向模式进行标量优化。然而,对于非线性最小二乘和方程求解等向量值函数,解决
使用正向模式进行一些计算。看到优化工具箱中的自动微分.
考虑这个函数及其梯度的求值问题:
自动区分在特定的点起作用。在这种情况下,采取x1= 2,x2= 1/2。
下面的计算图编码了函数的计算f(x).
计算…的梯度f(x)使用正向模式,可以在相同方向上计算相同的图,但根据基本的微分规则修改计算。为了进一步简化计算,您需要填充每个子表达式的导数值u我当你走。为了计算整个梯度,你必须遍历图两次,一次是对每个自变量的偏导数。链式规则中的每个子表达式都有一个数值,因此整个表达式的求值图与函数本身的类型相同。
计算是链式法则的重复应用。在这个例子中f关于x1扩展到这个表达式:
让 表示表达式的导数u我关于x1.的计算值u我通过对函数的求值,可以计算出的偏导数f关于x1如图所示。的所有值 从上到下遍历图表时可用。
来计算对的偏导数x2,您将遍历一个类似的计算图。因此,在计算函数的梯度时,图遍历的次数与变量的数量相同。当目标函数或非线性约束依赖于许多变量时,这个过程在许多应用中可能会很慢。
反向模式使用对计算图的一次前向遍历来设置跟踪。然后计算函数在图的相反方向的一次遍历的整个梯度。对于有许多变量的问题,这种模式要有效得多。
反向模式背后的理论也是基于链式法则,以及用overbar表示的相关伴随变量。的伴随变量u我是
在计算图中,变量的每一个输出箭头都通过链式法则中的项贡献给相应的伴随变量。例如,变量u1向外的箭头指向两个变量,u1和u6.图中有相关的方程
在这个计算中,回想一下 和u6=u5u1,你获得
在图的前向遍历过程中,软件计算中间变量u我.在反向遍历期间,从种子值开始 时,反模式计算得到所有变量的伴随值。因此,反向模式只需要一次计算就可以计算出梯度,与正向模式相比节省了大量的时间。
下图显示了该函数在反向模式下梯度的计算
同样,计算需要x1= 2,x2= 1/2。反模式计算依赖于u我在原始计算图中对函数进行计算时获得的值。在图的右侧部分,伴随变量的计算值出现在伴随变量名称的旁边,使用图的左侧部分的公式。
最终的梯度值显示为 和 .
欲了解更多详情,请参阅Baydin、Pearlmutter、Radul和Siskind[1]或者维基百科上关于自动分化的文章[2].
自动分化(AD)适用于解决
和prob2struct
以下条件下的功能:
支持目标函数和约束函数,如金宝app金宝app支持优化变量和表达式的操作.它们不需要使用fcn2optimexpr
函数。
对于优化问题,“ObjectiveDerivative”
和“ConstraintDerivative”
的名称-值对参数解决
或prob2struct
将“汽车”
(默认),“auto-forward”
,或自动翻转的
.
对于方程问题,“EquationDerivative”
选项设置为“汽车”
(默认),“auto-forward”
,或自动翻转的
.
当广告应用 | 支持的所有约束函数金宝app | 不支持一个或多个约束金宝app |
---|---|---|
目标函数的支持金宝app | AD用于表示目标和约束条件 | AD仅用于客观目的 |
不支持目标函数金宝app | AD仅用于约束 | 广告不习惯 |
当这些条件不满足时,解决
通过有限差分估计梯度prob2struct
不会在其生成的函数文件中创建梯度。
求解器默认选择以下类型的AD:
对于一般的非线性目标函数,fmincon
默认为目标函数反向AD。fmincon
当非线性约束的数量小于变量的数量时,默认对非线性约束函数反向AD。否则,fmincon
默认为非线性约束函数转发AD。
对于一般的非线性目标函数,fminunc
默认为反向AD。
对于最小二乘目标函数,fmincon
和fminunc
默认为目标函数转发AD。关于基于问题的最小二乘目标函数的定义,见编写基于问题的最小二乘的目标函数.
lsqnonlin
当目标向量中的元素数量大于或等于变量数量时,默认转发AD。否则,lsqnonlin
默认为反向AD。
fsolve
当方程的数量大于或等于变量的数量时,默认转发AD。否则,fsolve
默认为反向AD。
请注意
在由。转换的问题中使用自动导数prob2struct
,传递指定这些衍生品的选项。
选择= optimoptions (“fmincon”,“SpecifyObjectiveGradient”,真的,...“SpecifyConstraintGradient”,真正的);问题。选择=选项;
目前,AD仅适用于一阶衍生物;它不适用于二阶或更高阶导数。例如,如果你想使用分析Hessian来加速你的优化,你不能使用解决
直接使用,而必须使用基于问题的工作流中的供应衍生品.
[1] Baydin, Atilim Gunes, Barak A. Pearlmutter, Alexey Andreyevich Radul, Jeffrey Mark Siskind。《机器学习中的自动区分:调查》机器学习研究杂志,18(153), 2018, pp. 1-43。可以在https://arxiv.org/abs/1502.05767.
[2]自动分化。维基百科。可以在https://en.wikipedia.org/wiki/Automatic_differentiation.