【问题标题】:How to choose the right optimizer?如何选择合适的优化器?
【发布时间】:2018-07-16 09:28:12
【问题描述】:

我在最小化 Rosenbrock 函数时遇到了一个错误的最优值:100(y-x**2)**2 + (1-x)**2。正确的结果是 x=y=1.0, f = 0。但是当使用带有 COBYLA 优化器的 OpenMDAO 时,结果是 x=0.5660643, y=0.3179899, f=0.18889496。我切换到 Powell 优化器,过程收敛到正确的结果。那么,如何为优化问题选择一致的优化器呢?

【问题讨论】:

    标签: openmdao


    【解决方案1】:

    很遗憾,这个问题没有好的答案。事实上,Wolpert and Macready 证明了你不能用他们没有免费的午餐定理明确回答这个问题,即没有优化器可以在所有问题上表现最好。

    我会给你一些广泛的建议:你需要了解你正在解决的问题的性质。

    1. 是凹凸不平还是凸出(ish)?
    2. 是连续的还是离散的
    3. 你有限制吗
    4. 您有多少设计变量?有多少约束?
    5. 你能得到解析导数还是需要近似它们?
    6. 如果需要近似它们,可以使用有限差分或复步(复步更好!)

    鉴于所有这些,您可以开始缩小选择范围。大多数时候工程问题都是凸面的(超级技术术语!)。我的意思是,虽然你不能证明存在不止一个最优值,但实际上你发现的最优值往往对你的起点不敏感。如果是这种情况,最好使用基于梯度的优化器而不是无梯度的优化器。 COBYLA 是一种无梯度方法。 SLSQP 和 CONMIN 都是基于梯度的。

    简单地切换到基于梯度的方法不一定能解决您的准确性问题。这些方法需要精确的导数。如果您不定义解析导数,而是使用 FD,则近似值可能不足以收敛到正确答案。不过,如果您稍微调整一下步长,它们可能还可以。一般来说,FD 最多会导致收敛速度变慢,最坏的情况是阻止你得到答案。

    如果您想要最可靠的优化,那么您应该使用基于梯度的优化和解析导数或复步近似导数(比 FD 更准确)。对于大量的设计变量,或者对于具有昂贵的非线性求解器循环的问题,解析导数会快得多。

    如果您知道您的问题有多个局部最小值,那么您需要使用基于多起点梯度的方法或无梯度方法。

    【讨论】:

      【解决方案2】:

      抱歉,我不被允许添加评论,所以尽管这是一个后续问题,但这是一个答案;

      也许重要的是询问/提及参数(目标或设计变量)的标准化是否会根据优化器改变收敛。换句话说,对于基于梯度的优化器,变量归一化比无梯度变量更重要吗?对单个目标情况进行缩放和归一化的效果是什么(假设对于多目标情况,很清楚为什么要进行归一化)?

      【讨论】:

        猜你喜欢
        • 2020-06-21
        • 2021-09-12
        • 1970-01-01
        • 2017-07-05
        • 2011-08-27
        • 2011-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多