正如保罗所言,没有更多信息,没有假设就很难给出建议。
具有10-20个变量和昂贵的函数评估,趋势是推荐无导数的优化算法。我会强烈不同意Paul的建议:除非您使用某种特殊方法(例如,机器学习中的随机梯度下降将利用目标的形式来提出合理的假设),否则通常需要机器精度的梯度。梯度估算值)。
每个准牛顿步骤将采用以下形式:
H~(xk)dk=−∇f(xk),
其中是Hessian矩阵的一些近似,d ķ是搜索方向,X ķ在当前迭代的决策变量的值,˚F是您的目标函数,∇ ˚F是您的目标的梯度,并且决策变量被更新等X ķ + 1 = X ķ + α ķ d ķ,其中α ķH~dkxkf∇fxk+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确实需要花费一些时间来学习,并且有大量的文档可供筛选。