洛伦谈MATLAB的艺术

将想法转化为MATLAB

自动区分优化工具箱™

本专栏由优化工具箱文档的作者Alan Weiss撰写。把它拿走,艾伦。

嗨,各位。你可能知道,解决一个优化问题,也就是找到一个函数最小的点,当你有这个函数的梯度时,会更容易。这很容易理解:梯度指向上坡,所以如果你朝相反的方向移动,你通常会到达一个最小值。优化工具箱算法是基于比这更复杂的算法,但这些更复杂的算法也受益于梯度。

如何给求解器一个梯度和函数?直到最近,您还必须将梯度作为一个单独的输出来计算,这将带来所有的痛苦和可能的错误。然而,在R2020b中,基于问题的方法使用自动微分来计算一般非线性优化问题的问题梯度。我将解释所有这些词的意思。简而言之,只要您的函数是由初等函数(如多项式、三角函数和指数函数)组成的,那么最优化工具箱就会自动计算并使用函数的梯度,而无需您的努力。

“一般非线性”短语意味着自动微分适用于以下问题:fminconfminunc求解,这是一般的约束或无约束的最小化,而不是线性规划或最小二乘或其他类型的问题,调用其他专门的求解器。

自动微分,也称为AD,是一种符号导数,它将函数转换为代码,计算特定点的函数值和导数值。此过程是透明的;您不必编写任何特殊代码来使用AD。实际上,正如您稍后将看到的,您必须指定一些名值对in为了不让解算器使用AD。

目录

基于问题的优化

基于问题的优化方法是根据优化变量和表达式编写问题。例如,要最小化单元磁盘$x^2+y^2\le 1$中的测试函数${\rm fun}(x,y)=100(y-x^2)^2+(1-x)^2$,首先创建优化变量。

x=optimvar(“x”); y=最优值(“是的”);

然后使用这些变量创建优化表达式。

fun=100*(y-x^2)^2+(1-x)^2;unitdisk=x^2+y^2<=1;

在适当的问题字段中使用这些表达式创建优化问题。

概率= optimproblem (“客观”有趣的,“约束”, unitdisk);

通过打电话来解决问题解决,从x = 0 y = 0开始。

x0。x = 0;x0。y = 0;索尔=解决(x0概率)
使用fmincon解决问题。找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。x: 0.7864 y: 0.6177

这个解决函数调用fmincon来解决这个问题。事实上,解决使用AD加速解决过程。让我们更详细地检查解决方案流程,以了解其实际运行情况。但首先,在单位圆盘上画出1加目标函数的对数,并在解处画出一个红色的圆。

(R, TH) = ndgrid (linspace (0, 1100), linspace(0, 2 *π,200));(X, Y) = pol2cart (TH, R);冲浪(X, Y,日志(1 + 100 * (Y - X ^ 2)。²+ (1 - x)²,“EdgeColor”,“没有”)颜色栏视图(0,90)轴平等的持有plot3 (sol.x sol.y 1,“罗”,“MarkerSize”, 10)

自动分化效应

为了更详细地检查解决过程,再次解决问题,这一次要求更多解决输出。检查求解器所采用的迭代次数和函数求值。

[溶胶,fval exitflag、输出]=解决(概率,x0);fprintf('fmincon接受%g次迭代和%g次函数求值。\n',...output.iterations,output.funcount)
使用fmincon解决问题。找到满足约束的局部最小值。优化完成,因为目标函数在可行方向上不递减,在最优性公差值范围内,约束满足在约束公差值范围内。fmincon需要24次迭代和34次函数n评价。

输出结构表明,该求解器需要24次迭代和34次函数计数。再次运行该问题,这次强制解决程序不使用AD。

[sol2, fval2 exitflag2 output2] =解决(x0,概率...“ObjectiveDerivative”,“有限差分”,“ConstraintDerivative”,“有限差分”);fprintf('fmincon接受%g次迭代和%g次函数求值。\n',...output2.iterations,output2.funcCount)绘图([12],[output.funcCount output2.funcCount],“r-”,...[1 - 2],[输出。funcCount output2.funcCount),“罗”) ylabel (“函数计数”)xlim([0.82.2])ylim([0.90])图例('函数计数(越低越好)',“位置”,“西北”) ax = gca;斧子。XTick = [1, 2];斧子。XTickLabel = {“广告”,没有广告的};
使用fmincon解决问题。找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。Fmincon需要24次迭代和84次函数计算。

这一次求解器需要84个函数计数,而不是34个。产生这种差异的原因是自动分化。

无论是否金宝搏官方网站使用AD,解决方案几乎相同:

fprintf(“解决方案差异的标准是%g.\n”、规范([sol.x,索尔。y] - [sol2.x sol2.y]))
解决方案差异常模为1.80128e-09。

什么是自动差异化?

AD类似于符号微分:每个函数本质上都是符号微分,结果转化为代码,由MATLAB运行以计算导数。查看结果代码的一种方法是使用prob2struct函数。让我们穿上试试概率

problem=prob2struct(prob);problem.objective
ans=函数\具有以下值的句柄:@generatedObjective

prob2struct创建一个名为generatedObjective.m.这个函数包括一个自动生成的梯度。查看函数文件的内容。

函数[obj, grad] = generatedobject (inputVariables)%生成目标计算目标函数值和梯度%%OBJ=generatedObjective(INPUTVARIABLES)计算目标值%输入变量点处的OBJ。%%[OBJ,GRAD]=生成的对象(INPUTVARIABLES)额外计算%当前点的客观梯度值GRAD。%% Auto-generated by prob2struct on 06-Oct-2020 09:01:35% %变量指标。xidx = 1;yidx = 2;将基于求解器的变量映射到基于问题的变量。x=输入变量(xidx);y=输入变量(yidx);%%计算目标函数。Arg1 = (y - x.^2);最长= 100;长度= __arg1。^ 2;Arg4 = (1 - x);Obj = ((arg2 .* arg3) + arg4.^2);%%计算目标梯度。如果Nargout > 1 arg5 = 1;Arg6 = 0 ([2, 1]);arg6 (xidx:) = (- (arg5。* 2 * (arg4 (:)))) + ((-(( arg5。*最长(:))。* 2 * (__arg1(:))))。* 2 * (x (:)));arg6 (yidx:) = ((arg5。*最长(:))。* 2。* (__arg1 (:)));研究生= arg6 (:);终止终止

虽然这段代码对您来说可能不是很清楚,但您可以将AD梯度计算与符号表达式进行比较,看看它们是相同的:

$\nabla({\rm fun})=[-400(y-x^2)x-2(1-x);\200(y-x^2)]$

这样解决prob2struct将优化表达式转换为代码基本上与微积分学生学习的方式相同,学习表达式的每一部分并应用微分规则。计算梯度的详细过程在自动分化背景,它描述了大多数AD软件使用的“向前”和“向后”过程。目前,优化工具箱只使用“向后”AD。

要使用这些微分规则,软件必须为目标函数或约束函数中的每个函数提供微分规则。支持的运算符列表包括多项式、三角函数和指数函数及其逆,以及乘法和加法及其逆。请参阅金宝app金宝app支持优化变量和表达式的操作

自动差异化有什么好处?

AD降低了求解器需要的函数计算次数。没有AD时,非线性求解器通过有限差分估计梯度,例如$(f(x+\delta e_1) - f(x))/ delta,$其中$e_1$是单位向量(1,0,…,0)。解算器的评估N这种形式的有限差分默认,其中N为问题变量的数量。对于有大量变量的问题,这个过程需要大量的函数求值。

有了AD和支持的函数,求金宝app解器不需要采取有限差分步骤,因此导数估计过程需要更少的函数计算,更准确。

这并不是说AD总是加速求解器。对于复杂的表达式,计算自动导数可能比计算有限差分更耗时。一般来说,当问题有大量的变量并且是稀疏的时候,AD比有限差分更快。当问题变量少且功能复杂时,AD的速度较慢。

不支持的操作怎么办?金宝app

到目前为止,我已经讨论了支持操作的自动区分。金宝app如果您有一个黑箱函数,其底层代码甚至可能不在MATLAB中,该怎么办?或者,如果你只是有一个不支持基于问题的优化的函数,比如贝塞尔函数,该怎么办?金宝app为了在基于问题的方法中包含此类函数,可以使用fcn2optimexpr作用例如,使用贝塞尔作用

fun2=fcn2optimexpr(@(x,y)besselj(1,x^2+y^2),x,y);

fcn2optimexpr允许您在基于问题的方法中使用不受支持的操金宝app作。然而,fcn2optimexpr不支持AD。金宝app所以,当你使用fcn2optimexpr,利用有限差分来估计目标函数或非线性约束函数的梯度。有关更多信息,请参见基于问题的工作流中的供应衍生品

目前,AD不支持高阶导数。金宝app换句话说,您不能自动生成第二或第三阶导数的代码。你只得到一阶导数(梯度)。

最终的想法

AD在解决仅由支持函数组成的优化问题时,有助于提高速度和可靠性。金宝app然而,在某些情况下,它不会增加速度,并且目前AD不能用于非线性最小二乘或方程求解问题。

在我看来,AD最有用的特性是它完全透明地用于基于问题的优化。从R2020b开始,AD自动应用,无需您的努力。如果您觉得它对解决优化问题有用,请发表您的评论,让我们知道在这里




发布与MATLAB®R2020b

|

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。