自动微分(也称为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我是
在计算图方面,变量中的每个向外箭头通过其在链式规则中的项贡献给相应的伴随变量。例如,变量U–1向外的箭头指向两个变量,U1.和U6.. 该图具有关联的方程式
在这个计算中,回想一下 和U6.=U5.U–1,你获得
在向前遍历图形的过程中,软件计算中间变量U我. 在反向遍历期间,从种子值开始 时,反模式计算得到所有变量的伴随值。因此,反向模式只需要一次计算就可以计算出梯度,与正向模式相比节省了大量的时间。
下图显示了该函数在反向模式下梯度的计算
同样,计算需要花费大量时间x1.= 2,x2.= 1/2。反模式计算依赖于U我在原始计算图中对函数进行计算时获得的值。在图的右侧部分,伴随变量的计算值出现在伴随变量名称的旁边,使用图的左侧部分的公式。
最终的渐变值显示为 和 .
有关更多详细信息,请参见Baydin、Pearlmutter、Radul和Siskind[1]或者维基百科上关于自动分化的文章[2].
自动微分(AD)适用于解决
和prob2struct
以下条件下的功能:
支持目标函数和约束函数,如金宝app金宝app支持的优化变量和表达式操作. 它们不需要使用fcn2optimexpr
作用
解算器被调用解决
是铁铬镍铁合金
,fminunc
,fsolve
或解非线性最小二乘问题
.
对于优化问题“ObjectiveDerivative”
和“ConstraintDerivative”
的名称-值对参数解决
或prob2struct
准备好了吗“自动”
(违约),“auto-forward”
或自动翻转的
.
对于方程问题,“EquationDerivative”
选项设置为“自动”
(违约),“auto-forward”
或自动翻转的
.
当广告适用时 | 支持的所有约束函数金宝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.