SLSQP 产量完全不同 - 与 COBYLA
SLSQP yields complete different - vs COBYLA
为什么 SLSQP 卡在初始值附近,而 COBYLA 向
正确的方向?
优化问题是使用 OpenMDAO 2 实现的。2.X;
3 个设计变量 --> 输入到外部代码 comp --> 输出 y 是
objective(y, 定标器=-1)。没有限制。
下图显示了两个优化器针对同一问题的行为。我试图更改 SLSQP 的有限差分设置,但没有帮助。输出是优化成功终止。 (退出模式 0)。
示例驱动程序和包装器代码已上传:
https://gist.github.com/Whosebug38/0219eda12d4c56ce84c68d201d1f1926
我没有发现您的问题设置有任何明显的错误,但如果没有 gf_run.py
,则无法 运行 您提供的模型进行测试。因此,取而代之的是,我能给你的最佳猜测是以下选项之一:
1) COBYLA 是一种无梯度优化器,具有更强的设计搜索能力 space。也许它找到了一个不同的最优值,而 SLSQP 在起点附近陷入了一个较小的最优值。要对此进行测试,您可以使用 COBYLA 的结果作为 SLSQP 的初始猜测。如果 SLSQP 收敛到与 COBYLA 相同(或接近相同)的点,则它可能是局部最优问题。
2) SLSQP 使用梯度,您使用中心差分对其进行近似。即使使用二阶中心差分,这些导数近似值也可能很差。目前尚不清楚底层代码中是否包含某种隐式求解器(如牛顿求解器或 while 循环收敛)。如果它确实有某种内部求解器,那么您需要确保公差设置得非常严格——至少比您的 FD 步长低两个数量级是可取的。即便如此,也可能无法围绕其中包含求解器的代码获得高质量的 FD 近似值。您也可以尝试稍微更改 FD 步长。
我认为原因是FD步长太小导致梯度不准确。到目前为止,我已经使用了 1e-3 到 1e-6 的步骤。现在我使用 1,优化器不会卡在所有设计变量的步骤 1 上。我猜测外部代码的输出差异非常小,FD 步长较小 (1e-3),因此优化器无法准确计算梯度。
为什么 SLSQP 卡在初始值附近,而 COBYLA 向 正确的方向?
优化问题是使用 OpenMDAO 2 实现的。2.X;
3 个设计变量 --> 输入到外部代码 comp --> 输出 y 是
objective(y, 定标器=-1)。没有限制。
下图显示了两个优化器针对同一问题的行为。我试图更改 SLSQP 的有限差分设置,但没有帮助。输出是优化成功终止。 (退出模式 0)。
示例驱动程序和包装器代码已上传: https://gist.github.com/Whosebug38/0219eda12d4c56ce84c68d201d1f1926
我没有发现您的问题设置有任何明显的错误,但如果没有 gf_run.py
,则无法 运行 您提供的模型进行测试。因此,取而代之的是,我能给你的最佳猜测是以下选项之一:
1) COBYLA 是一种无梯度优化器,具有更强的设计搜索能力 space。也许它找到了一个不同的最优值,而 SLSQP 在起点附近陷入了一个较小的最优值。要对此进行测试,您可以使用 COBYLA 的结果作为 SLSQP 的初始猜测。如果 SLSQP 收敛到与 COBYLA 相同(或接近相同)的点,则它可能是局部最优问题。
2) SLSQP 使用梯度,您使用中心差分对其进行近似。即使使用二阶中心差分,这些导数近似值也可能很差。目前尚不清楚底层代码中是否包含某种隐式求解器(如牛顿求解器或 while 循环收敛)。如果它确实有某种内部求解器,那么您需要确保公差设置得非常严格——至少比您的 FD 步长低两个数量级是可取的。即便如此,也可能无法围绕其中包含求解器的代码获得高质量的 FD 近似值。您也可以尝试稍微更改 FD 步长。
我认为原因是FD步长太小导致梯度不准确。到目前为止,我已经使用了 1e-3 到 1e-6 的步骤。现在我使用 1,优化器不会卡在所有设计变量的步骤 1 上。我猜测外部代码的输出差异非常小,FD 步长较小 (1e-3),因此优化器无法准确计算梯度。