目标函数非常昂贵的问题的并行优化算法


15

我正在优化10-20个变量的函数。坏消息是每个功能评估都很昂贵,大约需要30分钟的串行计算时间。好消息是我有一个群集,其中包含几十个计算节点。

因此,问题是:是否存在可用的优化算法,这些算法可以使我有效地利用所有这些计算能力?

频谱的一侧将是穷举搜索:将整个搜索空间细分为一个精细的网格,并在每个网格点上独立计算函数。这当然是非常并行的计算,但是该算法效率非常低。

频谱的另一端是准牛顿算法:根据先前的历史智能更新参数的下一个估计。这是一种有效的算法,但我不知道如何使其并行:“基于先前历史估计参数”的概念听起来像是串行计算。

二次算法似乎处于中间位置:可以通过并行计算一堆值来构建初始的“代理模型”,但是我不知道其余迭代是否可并行化。

关于哪种无梯度优化方法在群集上能很好地表现出什么建议?此外,目前是否有并行的优化算法实现方案?


1
您始终可以并行计算梯度(对于使用有限差分的准牛顿法),并获得与参数数量(即10x-20x)成比例的加速比。
stali 2014年

@stali:您需要使用Hessian进行拟牛顿法优化。通过功能评估的有限差异来计算Hessian确实不是一个好主意。计算梯度的有限差分近似以进行优化通常也不是一个好主意。
Geoff Oxberry 2014年

许多准牛顿法(例如BFGS)不需要明确地使用Hessian。我认为通过结合使用渐变色和L-BFGS,OP可以快速实现他想要的功能。
stali 2014年

@stali:我指出了为什么对梯度使用有限差分近似是一个坏主意。通过将误差引入准牛顿迭代的右侧,它将降低收敛性。另外,由于没有机会重用旧的评估(与替代方法不同),因此浪费了功能评估。使用BFGS仅能解决建议方法的一半问题。
Geoff Oxberry 2014年

这更合适地是评论而不是答案。但是我别无选择,因为我没有足够的代表发表评论。迈克尔,我有非常类似的问题:昂贵的函数评估,涉及在集群上运行的复杂模拟。当功能评估涉及集群仿真时,您是否找到适合运行优化的代码?
MoonMan '16

Answers:


16

正如保罗所言,没有更多信息,没有假设就很难给出建议。

具有10-20个变量和昂贵的函数评估,趋势是推荐无导数的优化算法。我会强烈不同意Paul的建议:除非您使用某种特殊方法(例如,机器学习中的随机梯度下降将利用目标的形式来提出合理的假设),否则通常需要机器精度的梯度。梯度估算值)。

每个准牛顿步骤将采用以下形式:

H~(xk)dk=f(xk),

其中是Hessian矩阵的一些近似,d ķ是搜索方向,X ķ在当前迭代的决策变量的值,˚F是您的目标函数,˚F是您的目标的梯度,并且决策变量被更新等X ķ + 1 = X ķ + α ķ d ķ,其中α ķH~dkxkffxk+1=xk+αkdkαk是以某种方式(例如线搜索)确定的步长。您可以通过某些方式避免近似于Hessian,并且您的迭代将收敛,尽管如果您通过精确的梯度使用像Hessian的有限差分近似之类的方法,则可能会由于条件不佳而遇到问题。通常,使用梯度对Hessian进行近似(例如,对Hessian进行等级1更新的BFGS类型方法)。

出于多种原因,通过有限差分逼近Hessian和梯度是个坏主意:

  • 您将在梯度中出现误差,因此您要应用的拟牛顿法类似于寻找噪声函数的根
  • 如果函数评估很昂贵,并且您正在尝试评估相对于变量的梯度,那将使您花费N次函数评估NN每次迭代
  • 如果您在梯度中有误差,那么您的Hessian误差将更大,这对于线性系统的条件而言是一个大问题
  • ...这将使您花费每次迭代函数评估N2

因此,要获得准牛顿的一次糟糕的迭代,您需要在每次评估30分钟的时间内执行多达420个函数评估,这意味着您要么要等待一段时间才能进行每次迭代,要么要仅需要一个大型集群即可进行功能评估。实际的线性求解将是20 x 20矩阵(最多!),因此没有理由将它们并行化。例如,如果您可以通过解决一个伴随问题来获得梯度信息,那么它可能更有价值,在这种情况下,可能值得一看Nocedal&Wright这样的书。

如果要并行执行许多功能评估,则应在考虑准牛顿方法之前,先考虑替代建模方法或生成集合搜索方法。经典的评论文章是Rios和Sahinidis撰写的一篇关于无导数方法的文章,该文章于2012年发表,提供了一个很好的,广泛的比较;More and Wild在2009年发布的基准测试文章;Conn,Scheinberg和Vicente在2009年编写的“无导数优化简介”教科书;以及有关Kolda,Lewis和Torczon生成集合搜索方法评论文章在2003年。

如上所示,DAKOTA软件包将实现其中的某些方法,而实现DIRECT的NLOPT以及一些鲍威尔的替代建模方法也将实现。您也可以看看MCS;它是用MATLAB编写的,但是也许您可以将MATLAB实现移植到您选择的语言。DAKOTA本质上是一个脚本集合,可用于运行昂贵的仿真并收集用于优化算法的数据,而NLOPT具有多种语言的接口,因此,使用两种软件包都不应该成为编程语言的大问题;不过,DAKOTA确实需要花费一些时间来学习,并且有大量的文档可供筛选。


2
我很高兴能犯错,并在此过程中学到一些新的有用的东西:)。
保罗

谢谢!需要再澄清一点:那些算法中的哪些能够并行执行功能评估?例如,在k路网格上,仅基于从迭代1,...,n?获得的信息执行迭代n + 1,...,n + k。
迈克尔

k

3

也许您正在寻找基于代理的优化算法。这些算法在优化过程中使用替代模型来替换实际的计算昂贵的模型,并尝试使用尽可能少的计算昂贵的模型评估来寻求合适的解决方案。

我认为可以采用“ 模式追求采样”方法来解决您的问题。该算法使用RBF替代模型来近似昂贵的目标函数,并且可以处理非线性约束。更重要的是,它会选择多个候选者进行昂贵的功能评估,以便您可以分发这些候选者进行并行计算,从而进一步加快搜索过程。该代码是开源的,并用MATLAB编写。

参考

Wang,L.,Shan,S.,&Wang,GG(2004)。在昂贵的黑匣子函数上进行全局优化的模式追求采样方法。工程优化,36(4),419-438。


2

我不确定并行算法是否真的是您想要的。这是您的功能评估,费用很高。您要做的是并行化函数本身,不一定是优化算法。

如果您无法做到这一点,那么穷举搜索和牛顿算法之间就有一个中间点,那就是蒙特卡洛方法。您可以在一堆不同的核心/节点上启动相同的算法,该算法容易陷入局部最优(例如准牛顿算法),但所有算法都具有随机初始条件。那么,对于真正的最优值,您最好的猜测是最小值的最小值。这对于并行化是微不足道的,可用于扩展任何方法。虽然效率不是很理想,但是如果您有足够的计算能力可以使用,则可以肯定会赢得编程生产率与算法性能的较量(如果您具有大量的计算能力,则可以在完成更高级的算法之前就完成了)。


0

优化算法(及其并行化)的选择在很大程度上取决于目标函数和约束的属性。如果不了解更多有关该问题的信息,就很难提供任何有意义的建议。

但是从您对牛顿方法的考虑,我推断您的目标函数是可微的。如果可能,通过并行执行功能评估,您的问题将大为受益。如果不可能,那么您还可以考虑使用不精确的牛顿法,该方法用有限差分近似代替精确的梯度/ hessian。然后,您可以使用所有这些处理器来计算jacobian的每个非零元素,如@stali所建议的。

有关更多信息,请阅读Nocedal&Wright的数值优化,第7章。有许多优化软件包可以并行实现此功能。DAKOTA软件包(Sandia National Labs)是使用最广泛的免费软件之一


5
除非您有可用的机器精度梯度(通过辅助计算,通过某种前向灵敏度分析,通过解析),否则这种方法确实不是一个好主意。每次Hessian评估都需要进行大量的模拟,您最好进行这些功能评估,并使用它们来构建替代模型(例如,像BOBYQA; ORBIT可以在其中构建替代模型)。ñ使用径向基函数进行函数评估)。
Geoff Oxberry 2014年

-2

这是您的问题的解决方案

本文提供了一种数学方法的描述。


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

2
另外,这似乎是您自己的工作。如果是这样,请在您的答案中明确指出。
nicoguaro

@nicoguaro:谢谢,但是我知道如何单击链接。
迈克尔

2
@Michael,不适合您。该网站的理念是收集答案。您今天就可以得到答案,但是将来其他人可能需要同样的帮助。这就是为什么事实上有一个好的答案的标准。
nicoguaro
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.