正如保罗所说,没有更多信息,很难在没有假设的情况下给出建议。
对于 10-20 个变量和昂贵的函数评估,趋势是推荐无导数优化算法。我将强烈反对 Paul 的建议:您通常需要机器精度梯度,除非您使用某种特殊方法(例如,机器学习中的随机梯度下降将利用目标的形式提出合理的梯度估计)。
每个准牛顿步将采用以下形式:
H~(xk)dk=−∇f(xk),
在哪里H~是 Hessian 矩阵的某种近似,dk是搜索方向,xk是当前迭代中决策变量的值,f是你的目标函数,并且∇f是您的目标的梯度,决策变量的更新如下xk+1=xk+αkdk, 在哪里αk是以某种方式确定的步长(如线搜索)。您可以通过某些方式来近似 Hessian,并且您的迭代将收敛,尽管如果您通过精确梯度使用 Hessian 的有限差分近似,您可能会因病态条件而遇到问题。通常,Hessian 使用梯度来近似(例如,BFGS 类型的方法对 Hessian 进行 rank-1 更新)。
通过有限差分来近似 Hessian 和梯度是一个坏主意,原因有很多:
- 您将在梯度中遇到错误,因此您应用的准牛顿方法类似于找到噪声函数的根
- 如果函数评估很昂贵并且您正在尝试评估梯度N变量,它会让你付出代价N每次迭代的函数评估
- 如果梯度有误差,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和 Powell 的一些代理建模方法也将实现。你也可以看看MCS;它是用 MATLAB 编写的,但也许您可以将 MATLAB 实现移植到您选择的语言。DAKOTA 本质上是一组脚本,可用于运行昂贵的模拟并收集优化算法的数据,而 NLOPT 具有多种语言的接口,因此在使用任何一种软件包时,编程语言的选择都不应该是一个大问题;不过,DAKOTA 确实需要一段时间来学习,并且有大量的文档需要筛选。