【问题标题】:Checking if the optimizer support gradient检查优化器是否支持梯度
【发布时间】:2019-10-13 10:32:19
【问题描述】:

我想区分优化器(基于梯度的和免费的)。如果我在使用 SLSQP 的OpenMDAO 的主网页中使用示例优化并检查优化器是否支持渐变,我会得到“False”;

prob.driver.supports['gradients']

这是 OpenMDAO 或 Scipy 相关的问题吗?

在问题运行之前,是否有另一种方法可以查看优化器是否会使用梯度计算。


根据下面的答案,我在脚本的开头添加了这个;谢谢!

    prob = om.api.Problem()
    prob.driver = user_driver_object
    prob.setup()
    prob.final_setup()
    grads.append(prob.driver.supports['gradients'])

【问题讨论】:

    标签: openmdao scipy-optimize


    【解决方案1】:

    ScipyOptimizeDriver 中,并非所有优化器都支持梯度优化,因此在设置驱动程序之前您无法确定正确的值。这是在您的问题的final_setup() 中完成的(在您的驱动程序中调用_setup_driver())。此方法在run_model()run_driver() 中调用,但您也可以单独调用它来获取优化器的正确属性。

    在下面的示例中,我询问了驱动程序 3 次是否支持渐变。第一次,在 problem 设置之后它给出了一个错误的答案(默认),因为驱动程序还没有被触及。如果我调用final_setup(),这将设置驱动程序,并且驱动程序的所有属性都是正确的。如果调用run_model()run_driver(),当然这也会设置驱动程序。

    所以我的建议是在从驱动程序中查询任何内容之前使用final_setup(),这可能会在设置过程中发生变化(主要是优化器特定的属性)。

    import openmdao.api as om
    
    # build the model
    prob = om.Problem()
    indeps = prob.model.add_subsystem('indeps', om.IndepVarComp())
    indeps.add_output('x', 3.0)
    indeps.add_output('y', -4.0)
    
    prob.model.add_subsystem('paraboloid', om.ExecComp('f = (x-3)**2 + x*y + (y+4)**2 - 3'))
    
    prob.model.connect('indeps.x', 'paraboloid.x')
    prob.model.connect('indeps.y', 'paraboloid.y')
    
    # setup the optimization
    driver = prob.driver = om.ScipyOptimizeDriver()
    prob.driver.options['optimizer'] = 'SLSQP'
    
    prob.model.add_design_var('indeps.x', lower=-50, upper=50)
    prob.model.add_design_var('indeps.y', lower=-50, upper=50)
    prob.model.add_objective('paraboloid.f')
    
    prob.setup()
    print("\nSupports gradients (after setup)?")
    print(prob.driver.supports['gradients'])
    
    prob.final_setup()
    print("\nSupports gradients (after final setup)?")
    print(prob.driver.supports['gradients'])
    
    prob.run_driver()
    print("\nSupports gradients (after run)?")
    print(prob.driver.supports['gradients'])
    

    这会产生以下输出:

    Supports gradients (after setup)?
    False
    Supports gradients (after final setup)?
    True
    Optimization terminated successfully.    (Exit mode 0)
                Current function value: -27.33333333333333
                Iterations: 5
                Function evaluations: 6
                Gradient evaluations: 5
    Optimization Complete
    -----------------------------------
    Supports gradients (after run)?
    True
    

    【讨论】:

    • 好的,谢谢。我希望以自动方式解决问题,但似乎无法解决。有时我的问题太大而无法设置完整的雅可比行列式(某些组件我必须使用填充完整雅可比行列式的“fd”近似值)。所以我在每个组件的 setup() 中有一个标志,如果选择了无梯度优化器,则不会声明部分。 (否则它不适合内存)。但是这个标志是根据所选的优化器梯度支持设置的。 (在设置问题之前我不知道)
    • 我将通过使用用户给定的优化器设置一个虚拟问题然后检查虚拟问题“支持梯度”然后设置我自己的组件来解决这个问题
    • 如果你想走这条路,做一个虚拟问题确实是一个解决方案。制作一个虚拟驱动程序,调用_setup_driver() 或从scipy_optimizer 导入_gradient_optimizers 并检查您的优化器是否在列表中也可以完成这项工作。由于两者都是私有的,因此这些解决方案有点脏。
    猜你喜欢
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多