昂贵目标函数的全局最大化


12

我感兴趣的最大化全球许多(函数)实参数(一个复杂的模拟的结果)。但是,该功能的评估相对昂贵,每个参数集大约需要2天。我正在比较不同的选择,并且想知道是否有人提出建议。30

我知道对于这类过程,有一套方法涉及开发近似函数,然后将其最大化(例如,Jones等人的“昂贵的黑匣子函数的有效全局优化”)。但是,这似乎与编码有关。

我确实有能力并行运行大量仿真(50多个)。这似乎暗示着要使用遗传算法之类的方法来进行优化-因为我可以像创建一个一样快地创建大量候选解决方案。

这是我的问题:1)是否有人有免费获得这种全球性求解器/建议的实施经验?2)是否有理由在这里偏爱或避免使用遗传算法?

这是一个物理问题,我的早期实验表明,随着我更改参数,品质因数变化相当平稳。

更新:

感谢您的帮助!其他一些细节:除了最大位置之外,我不需要任何信息。模拟是确定性的,而不是蒙特卡洛,因此复杂性并不大。参数没有明确的界限或约束。我拥有的另一条信息(以前没有提到过)是对所需最大数量的了解。在寻找全局最大值时,我也会对任何规模或更大的规模感到满意-我不知道这是否会提供任何帮助。希望我能更系统地进行筛查(如Brian Borchers所建议的拉丁超立方体),这种情况将会出现。


在评估目标函数时,它是否会产生任何其他信息,尤其是。关于参数的导数(或近似值)?由于目标函数本身的计算成本很高,因此可能需要挤挤此类计算以获得补充信息。
hardmath

(一年后),您最终做了什么-改变了模型中的30个参数中的几个……?
丹尼斯2014年

丹尼斯:我能够运用一些身体上的直觉(和运气)来猜测最关键的参数,然后改变它们以获得“足够好”的结果。(在这种情况下,找到精确的最优值并不比找到足够大的答案重要。)我最终并不需要这些技术的全部功能,但是方便使用它们是很好的。
2014年

尽管这是在2 1/2年前,但是您在目标函数评估(确定性仿真)中是否可以选择精度级别,并且可以在精度与运行时间之间进行权衡吗?
马克·L·斯通

Answers:


11

当目标函数的评估成本非常高时,遗传算法是一个非常差的选择-这些方法在每一代(并行性可以帮助)和许多世代(本质上是顺序的)中都需要大量的函数评估。每一代,这将是非常缓慢的。

您没有提到此问题的来源。您是在统计分析似然表面(在这种情况下,您不仅需要最佳参数和目标值)还是在优化目标函数?

您没有提到目标函数的计算是精确还是不准确。通常情况下,当通过蒙特卡洛模拟计算目标函数时,这些值会非常嘈杂。这可能会误导许多优化算法。响应面方法通过消除噪声来帮助解决此问题。

您还没有提到对参数的任何限制。他们有界吗?参数之间是否存在线性或非线性约束?

可能是您的30个参数中的大多数对这个问题并不是很重要。我建议使用一种实验设计筛选方法,首先确定30个参数中的哪一个在优化中真正重要,然后在为不重要的参数设置合理的值之后,对重要参数进行优化。诸如拉丁文超立方体采样之类的方法在筛选相对不重要的参数方面可能非常有帮助。在此筛选阶段,您可以轻松使用数百个处理器。

在将参数数量减少到更合理的大小后,我将使用响应面方法对其余参数进行优化。如果响应面确实是多模式的,并且使用了过于简单的响应面模型(通常人们只适合二次模型),那么您很容易误导并错过全局最大值。小心!在这一阶段,您可以通过实验设计再次使用大量处理器,该实验设计可以很好地覆盖参数空间。寻找拟合模型与计算值相差较远的设计点-这表明响应面在该区域工作不正常。您可能必须在参数空间的不同区域中构建响应面。

最后,您可以从响应面优化中的参数开始,然后尝试通过一次调整一个参数(坐标下降)来改善筛选出的参数的值。

我将第二次推荐DAKOTA作为这种优化的框架。如果只打算执行一次此优化,那么手工组织计算可能会更容易,但是如果要重复进行一次,DAKOTA将非常有帮助。


4
  1. 我对这类求解器没有任何经验。我的一些同事已经使用过它们。DAKOTA似乎是推荐用于此类任务的软件包。它包含一个界面,该界面使用户可以将作业重复提交到提交队列,并将输出用于参数研究,灵敏度分析等。同时。

  2. 假设您的参数是连续的,如果品质因数随参数的变化而平稳变化,则替代模型应做合理的工作以拟合品质因数,而替代导数信息应有助于改善收敛。对于30个参数,确定性的无导数优化方法也应该有用。再次,平滑应该有所帮助。相比之下,遗传算法根本不会使用派生信息,并且通常需要调整诸如突变率,重组率和选择参数之类的参数才能获得良好的性能。作为一种算法选择,我将使用遗传算法作为后备,因为我希望设计良好的代理优化或确定性无导数优化方法具有更好的收敛性能。


使用确定性无导数优化方法可能不明智的几个原因。首先,这些是局部搜索方法,最终可能会找到局部最大值,而在参数空间中的其他位置缺少更好的点。其次,这些方法通常需要进行大量迭代,且每次迭代的功能评估相对较少,因此并行性不佳。
Brian Borchers 2013年

您对本地搜索方法是正确的。有一些全局搜索方法(DIRECT,分支定界,多级坐标搜索)不能构造替代模型,并且应比局部搜索方法表现更好。我不能说并行化这些方法的功效。
Geoff Oxberry

1

查看用于黑盒优化的TOMLAB,DAKOTA和OpenMDAO。


编辑#3:贝叶斯优化与EGO非常相似:

https://github.com/mwhoffman/pybo

https://github.com/hyperopt/hyperopt

有限许可:

https://github.com/rmcantin/bayesopt

https://github.com/HIPS/Spearmint


编辑#2:

第一种方法是围绕昂贵的函数构建元模型/代理(使用kriging / GP),并使用此附加信息以更快的速度和更少的评估(EGO)找到全局最优点。

MDAS中的第二种方法是直接搜索,并在多个级别进行一些巧妙的调整。

启发式方法本质上是遗传/随机的,没有任何保证。


编辑#1:

根据Sahinidis的论文,TOMLAB是基于MATLAB的工具,具有最佳的速度/优化质量。但这是具有重要公司用途的商业工具。我没有用这个。

除了常规优化之外,DAKOTA更适合不确定性量化。基于c ++和一些旧版Fortran代码。尽管根据LGPL许可和二进制文件可供下载,但至少根据我在Win7上使用GCC或MSVS / ifort的经验很难进行重新编译。依赖于boost,lapack,cmake来构建。基本上,这是无数开源解决方案和商业解决方案的包装。这是SNL产品,与Sandia NL的其他项目紧密集成。我能够成功地集成这一个而不是某些IMSL例程。Sahinidis的论文错过了DAKOTA可能实现的大规模并行处理。

OpenMDAO是NASA在APACHE许可下使用Python开发的基于优化的设计软件。我正在尝试这个。


欢迎来到SciComp!就目前而言,您的帖子并没有真正解释为什么看TOMLAB或OpenMDAO是个好主意(其他答案已经讨论了DAKOTA)。我们正在寻找不仅提供建议的答案,而且还在讨论为什么这些建议有用,潜在的陷阱等。
Geoff Oxberry

我先急着回答,现在又加了解释。
denfromufa

0

如果您负担不起30个运行,每个运行一个参数,则将它们分组更改:
例如,每个运行8个运行时每个变化的4个参数在一起,然后优化2个运行最佳/ 8个参数...
(我不知道如何权衡信息增益与总运行时间; 多臂匪徒?)


-3

这是一个代码,可以使用多核CPU有效地优化昂贵的黑盒功能。

此处提供了代码背后的数学描述。


1
这是您在此帖子中提供的答案。另外,这似乎是您自己的工作。如果是这样,请在您的答案中明确指出。
nicoguaro

您能否提供有关本文中描述的方法以及在软件中实现的方法的详细信息?使用什么方法?为什么好呢?这种方法提供了哪些其他答案未涵盖的内容?
nicoguaro

1
另外,请注意,您是该软件的作者,因此任何阅读此书的人都将意识到,您a)知道自己在说什么,b)可能有些偏partial。
克里斯蒂安·克拉森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.