自动判别背景
什么是自动差异化?
自动微分(也称为autodiff,广告,或算法的区别)是优化中广泛使用的工具。的解决
函数在一般非线性目标函数和约束条件的基于问题的优化中默认使用自动微分;看到优化工具箱中的自动区分.
自动微分是一套数值计算导数(梯度)的技术。该方法使用符号规则求导,比有限差分逼近更精确。与纯符号方法不同,自动微分在计算的早期计算表达式的数值,而不是进行大量的符号计算。换句话说,自动微分计算在特定数值上的导数;它不构造导数的符号表达式。
转发模式自动微分通过同时执行初等导数运算和计算函数本身的运算来计算数值导数。下一节将详细介绍,该软件在计算图上执行这些计算。
反模式自动微分使用正向模式计算图的扩展,通过对图的反向遍历来实现梯度的计算。当软件运行代码来计算函数及其导数时,它将操作记录在名为a的数据结构中跟踪.
正如许多研究人员所指出的(例如,Baydin, Pearlmutter, Radul和Siskind)[1]),对于多变量的标量函数,反向模式比正向模式更有效地计算梯度。因为目标函数是标量,解决
自动微分使用反向模式进行标量优化。然而,对于向量值函数,如非线性最小二乘和方程求解,解决
使用正向模式进行某些计算。看到优化工具箱中的自动区分.
转发模式
考虑计算这个函数及其梯度的问题:
自动微分作用于特定点。在这种情况下,拿x1= 2,x2= 1/2。
下面的计算图编码了函数的计算f(x).
计算的梯度f(x)使用正向模式,您可以在相同的方向上计算相同的图形,但根据基本的微分规则修改计算。为了进一步简化计算,您填写每个子表达式的导数值u我就在你走的时候。为了计算整个梯度,你必须遍历图两次,一次是关于每个自变量的偏导数。链式法则中的每个子表达式都有一个数值,因此整个表达式具有与函数本身相同的计算图。
计算是链式法则的重复应用。在这个例子中,求导f关于x1展开为以下表达式:
让 表示表达式的导数u我关于x1.的评估值u我从函数求值,你可以计算偏导数f关于x1如下图所示。的所有值 在从上到下遍历图形时变得可用。
求关于的偏导数x2,您将遍历一个类似的计算图。因此,当你计算函数的梯度时,图遍历的次数与变量的数量相同。当目标函数或非线性约束依赖于许多变量时,这个过程对于许多应用程序来说可能是缓慢的。
反模式
反向模式使用计算图的一次正向遍历来设置跟踪。然后,它在反方向遍历图的一次过程中计算函数的整个梯度。对于有很多变量的问题,这种模式要有效得多。
逆向模式背后的理论也是基于链式法则,以及用超棒表示的相关伴随变量。伴随变量为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”
,或自动翻转的
.
AD何时生效 | 支持所有约束函数金宝app | 不支持一个或多个约束金宝app |
---|---|---|
目标功能支持金宝app | AD用于目标和约束 | AD仅用于客观 |
不支持的目标函数金宝app | AD仅用于约束 | 未使用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”,真正的);问题。Options = Options;
目前,AD仅适用于一阶导数;它不适用于二阶或更高阶导数。因此,例如,如果您想使用分析黑森来加速优化,则不能使用解决
中所描述的方法基于问题的工作流程中的供给导数.
参考文献
Baydin, Atilim Gunes, Barak A. Pearlmutter, Alexey Andreyevich Radul和Jeffrey Mark Siskind。《机器学习中的自动区分:综述》机器学习研究杂志,18(153), 2018,第1-43页。可以在https://arxiv.org/abs/1502.05767.
[2]自动分化。维基百科。可以在https://en.wikipedia.org/wiki/Automatic_differentiation.