【问题标题】:How to specify gradient in Pyomo with IPOPT如何使用 IPOPT 在 Pyomo 中指定渐变
【发布时间】:2019-09-09 05:34:03
【问题描述】:

主要问题

在 Pyomo 中求解 NLP 时,使用 IPOPT 作为求解器,我如何告诉 IPOPT 目标函数和/或约束的梯度是多少?我必须传递一个返回目标值的可调用函数——我也可以传递一个评估梯度的可调用函数吗?

次要问题

Pyomo+IPOPT 默认如何处理这个问题?当我用 Pyomo+IPOPT 解决一个简单的 NLP 时,IPOPT 输出的一部分包括“客观梯度评估的数量”......但是它是如何评估梯度的?数值上的有限差分,还是什么?

我将 Pyomo 5.6 与 Python 3.6 和 IPOPT 3.7 一起使用。

【问题讨论】:

  • 这个问题对我来说的相关性来自于在 Pyomo/IPOPT 之外训练的模型(例如,tensorflow),其中函数是可微的,但没有封闭形式的表达式。在这种情况下,如果能够轻松地将梯度信息插入 IPOPT 并且不依赖于 autodiff,那就太好了。您可以在 scipy 中执行此操作,但我不知道那里的求解器与 IPOPT 相比如何。

标签: python-3.x pyomo ipopt


【解决方案1】:

Pyomo 使用 Ampl Solver Library (ASL) 中的自动微分功能提供一阶和二阶导数信息。调用 IPOPT 时,Pyomo 使用 ASL 读取并链接到 IPOPT 的“.nl”文件格式输出您的模型。所以你不需要做任何事情来提供梯度信息,这是自动完成的。

【讨论】:

  • 谢谢!用户(原则上)是否可以提供可调用的渐变,或者该功能甚至不存在?我读了一些关于 AD 的东西,听起来它本身就相当快
  • 这是一种支持。 ASL(和 Pyomo)支持外部函数的想法,它要求您提供自己的函数来评估一阶和二阶导数,但这些函数必须用 C++ 之类的语言编写并编译,然后才能链接到 Pyomo 模型和在 ASL 中评估。
  • 啊,好吧,我明白了。感谢您的详尽回答,感谢您帮助构建 Pyomo——它是一个非常有用的工具!
【解决方案2】:

背后的算法称为Autodiff。基本上,它通过使用表示为原子函数(加法、减法、乘法、除法,可能还有 exp 和 log)的图来计算任何函数的梯度。然后它使用微积分中的链式法则来计算关于任何输入的整个梯度。

【讨论】:

    猜你喜欢
    • 2018-03-01
    • 2019-06-23
    • 2020-04-09
    • 2022-01-08
    • 2018-01-30
    • 2018-02-24
    • 1970-01-01
    • 2019-10-13
    • 2017-02-17
    相关资源
    最近更新 更多