如何选择合适的优化算法?

机器算法验证 优化
2022-02-01 11:58:36

我需要找到一个函数的最小值。阅读http://docs.scipy.org/doc/scipy/reference/optimize.html上的文档,我发现有几种算法可以做同样的事情,即找到最小值。我怎么知道我应该选择哪一个?

列出的一些算法

  • 使用下坡单纯形算法最小化函数。
  • 使用 BFGS 算法最小化函数。
  • 使用非线性共轭梯度算法最小化函数。
  • 使用 Newton-CG 方法最小化函数 f。
  • 使用改进的 Powell 方法最小化函数。

我的函数是线性的。维度大约是 232750(这是我每次必须计算多少个不同的梯度),计算一次梯度和成本大约需要 2 分钟,所以并不便宜。我不认为我有限制。它是确定性和连续性的。

2个回答

根据您所说:我假设您必须针对 50 个变量进行优化;我还假设您遇到的情况是找到解析导数非常昂贵(更不用说得到数值了),并且您的优化是不受约束的。

让我强调一下,在 25-30 和 100 个变量之间,您有点不幸,因为在选择大型或小型优化例程时,它有点模糊。话虽如此,但没有任何损失。

考虑到即使是一阶导数也很昂贵,这会扼杀牛顿方法的想法。如果你的 Hessian 有点像开始的对角线,你可能会对准牛顿 (BFGS) 有一些运气。CG 通常比 BFGS 慢一点,所以可能不会有太大的改进;如果内存也是一个问题,请使用它(或者在这种情况下只使用 L-BFGS)。此外,考虑到评估函数的速度有多慢,一个简单的最速下降/直线搜索算法会非常缓慢;模拟退火和其他随机搜索变体也是如此(我假设您无权访问 HMC 和所有爵士乐)。

因此,当您在进行单一功能评估时需要物超所值时:使用 Powell 的方法并测试 COBYLA;尽管它是一种受约束的优化算法,因为它会在内部线性近似函数的梯度以加快速度,但它将能够利用函数的线性。绝对尝试NLopt for Python他们有很多无梯度优化器;试试大华;这也是鲍威尔的创意(通过二次近似进行无约束优化)。

非常简单:N-CG 算法依赖于计算 Hessian,而你的 Hessian 似乎计算起来非常昂贵。NLCG 和 BFGS 不需要它,尽管它们可能会在第一步中尝试计算一次。

我故意省略了单纯形算法,因为它是完全不同的野兽。与渐变无关。试试看,但我真的不能评论它;这实际上取决于您的问题的性质。

对于数值优化的第一个很好的参考,CTKelly 的《优化的迭代方法》一书会让你走得很远,很好。

也许你应该给自己买一本关于数值优化的入门书。您需要考虑您的功能才能决定算法。

在您提到的算法中,重要的区别是是需要 Jacobian 还是 Hessian 还是只需要函数本身。

考虑到这是一个统计问答网站,因此处理随机变量:确保您的函数是确定性的,可以通过在搜索空间上产生连续结果的方式进行评估。