【问题标题】:SLSQP yields complete different - vs COBYLASLSQP 产生完全不同的 - 与 COBYLA
【发布时间】:2018-09-24 20:02:13
【问题描述】:

为什么 SLSQP 卡在初始值附近,而 COBYLA 向 方向正确吗?

优化问题是使用 OpenMDAO 2.2.X 实现的;

3 个设计变量 --> 输入到外部代码 comp --> 输出 y
目标(y,缩放器=-1)。没有限制。

下图显示了两个优化器针对同一问题的行为。我试图改变 SLSQP 的有限差分设置,但没有帮助。输出是优化成功终止。 (退出模式 0)。

上载示例驱动程序和包装器代码: https://gist.github.com/stackoverflow38/0219eda12d4c56ce84c68d201d1f1926

【问题讨论】:

  • 这些求解器的状态输出是什么?永远不要在没有阅读它们的情况下相信任何东西(除非你确定你的库会在任何状态下引发异常,但成功除外)。
  • 你的意思是这样的状态输出吧?这是 SLSQP 优化成功终止。 (退出模式 0)当前函数值:-27272708.4836453 迭代:5 函数评估:49 梯度评估:5 优化完成 -------------- ---------

标签: python optimization openmdao


【解决方案1】:

我认为原因是 FD 步长太小导致梯度不准确。到目前为止,我已经使用了 1e-3 到 1e-6 的步骤。现在我使用 1,对于所有设计变量,优化器不会卡在 1 的步长上。我猜测外部代码的输出差异很小,FD 步长 (1e-3) 很小,因此优化器无法准确计算梯度。

【讨论】:

    【解决方案2】:

    我看不出您的问题设置有任何明显错误,但如果没有gf_run.py,则无法运行您提供的模型来测试它。所以取而代之的是,我能给你的最好的猜测是以下选项之一:

    1) COBYLA 是一种无梯度优化器,具有更多的设计空间搜索能力。也许它找到了一个不同的最优值,而 SLSQP 在起点附近陷入了一个较小的最优值。要对此进行测试,您可以使用 COBYLA 的结果作为 SLSQP 的初始猜测。如果 SLSQP 收敛到与 COBYLA 相同(或接近相同)的点,那么它很可能是局部最优问题。

    2) SLSQP 使用梯度,您正在使用中心差进行近似。即使使用二阶中心差分,这些导数近似也可能很差。目前尚不清楚底层代码中是否有某种隐式求解器(如牛顿求解器或 while-loop 收敛)。如果它确实有某种内部求解器,那么你需要确保公差设置得非常严格——至少比你的 FD 步长低两个数量级会更好。即便如此,也可能无法在其中包含求解器的代码周围获得高质量的 FD 近似值。您也可以尝试稍微更改 FD 步长。

    【讨论】:

    • 我无法上传外部代码,因为它需要许可证才能运行。我正在使用 Python 调用终端并运行该代码。我一开始就想到了你的第 1 条建议,并玩弄了最初的猜测,但没有帮助。但我现在将更彻底地检查这是否是问题所在。因为第二个在我看来不太可能,但我也会调整 FD 步长。当然,这整个事情可能会产生一个问题,基于梯度的优化器最终是否比无梯度优化器慢。因为设计变量的数量很小。可能是这种情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 2019-06-13
    • 2018-06-20
    • 2017-07-11
    相关资源
    最近更新 更多