具有大量局部最小值的多参数优化

时间:2010-10-10 13:58:39

标签: algorithm language-agnostic optimization

我正在寻找能够找到“最佳”参数值集的算法。有问题的函数有很多局部最小值并且变化很快。更糟糕的是,测试一组参数非常慢 - 大约1分钟 - 我无法直接计算梯度。

这种优化是否有任何众所周知的算法?

我只是尝试随机值,取得了一定的成功。我想知道我是否可以通过使随机参数选择器选择接近过去产生不良结果的参数的机会来提高性能。这种方法有名称,以便我可以搜索具体的建议吗?

更多信息:

  • 参数是连续的
  • 大约有5-10个参数。当然不超过10个。

5 个答案:

答案 0 :(得分:9)

有多少参数 - 例如,搜索空间中有多少维度?它们是连续的还是离散的 - 例如,实数,整数,还是只有几个可能的值?

我见过用于这类问题的方法具有类似的整体结构 - 采用大量的采样点,并将它们全部调整到以某种方式具有“好”答案的区域。由于你有很多分数,它们的相对差异可以作为临时梯度。

  • Simulated Annealing:经典方法。拿一堆点,可能会将一些点移动到随机选择的相邻点,具体取决于它有多好。
  • Particle Swarm Optimization:在搜索空间中采取一团“粒子”速度,可能会随机移动一个粒子;如果这是一个改进,让整个群体知道。
  • Genetic Algorithms:这有点不同。不是像上面那样使用邻居信息,而是每次都取得最好的结果并“杂交”它们,希望能够获得每种信息的最佳特征。

维基百科链接有前两个伪代码; GA方法种类繁多,很难列出一种算法,但您可以从那里跟踪链接。请注意,您可以使用或将其作为起点的所有上述实现。

请注意,所有这些 - 以及这种大维搜索算法的任何方法 - 都是启发式算法,这意味着它们具有必须针对您的特定问题进行调整的参数。哪个可能很乏味。

顺便说一句,功能评估如此昂贵的事实可以让你有点工作;由于上述所有方法都涉及大量独立的函数评估,因此可以使用OpenMP或类似的方法将该部分算法简单地并行化,以利用您机器上的多个内核。

答案 1 :(得分:6)

您的情况似乎与Software to Tune/Calibrate Properties for Heuristic Algorithms的海报类似,我会给您相同的建议I gave there:考虑采用Metropolis-Hastings类似方法与多个步行者和模拟退步步长。

在您的案例中使用蒙特卡罗方法的困难在于对每个候选人进行昂贵的评估。与您手边的时间相比,如何昂贵?如果你在几分钟内需要一个好的答案,那就不够快了。如果你可以让它运行一夜,它会运行得相当好。

鉴于搜索空间复杂,我建议随机初始分发。您的最终答案可能只是整个运行过程中记录的最佳个人结果,或者是具有最佳结果的助行器的平均位置。

不要因为我正在讨论最大化而你想要最小化:理性因素可以被否定或颠倒。

答案 2 :(得分:6)

我尝试过模拟退火粒子群优化。 (作为提醒,我无法使用渐变下降,因为无法计算渐变)。

我还尝试了一种执行以下操作的算法:

  • 选择随机点和随机方向
  • 评估功能
  • 只要结果不断改进,就一直沿着随机方向移动,加快每次成功的迭代。
  • 当结果停止改善时,退后一步,然后尝试以相同的距离移动到正交方向。

这个“正交方向”是通过创建具有必要维数的随机正交矩阵(改编this code)生成的。

如果在正交方向上移动改善了结果,则算法仅继续该方向。如果没有方向改善结果,则跳跃距离减半并且将尝试一组新的正交方向。最终算法得出结论,它必须处于局部最小值,记住它并在新的随机点重新启动整个批次。

这种方法比模拟退火和粒子群更好地执行:它需要较少的(非常慢)函数的评估来实现相同质量的结果。

当然是我对S.A.和P.S.O的实施。很可能是有缺陷的 - 这些是棘手的算法,有很多调整参数的空间。但我只是觉得我会提到最适合我的东西。

答案 3 :(得分:2)

我无法帮助您找到适合您特定问题的算法。

然而,关于参数的随机选择,我认为您正在寻找的是genetic algorithms。遗传算法通常基于选择一些随机输入,选择那些最适合(到目前为止)问题的输入,并随机改变/组合它们以生成下一代,再次选择最佳。

如果函数或多或少是连续的(良好输入的小突变通常不会产生错误的输入(小的有点通用)),这对你的问题来说相当不错。

答案 4 :(得分:1)

没有通用的方法来回答你的问题。有很多关于这个主题的书籍/论文,但你必须根据你的需要选择你的路径,这里没有明确说明。

有些事情需要知道 - 1分钟/测试对任何算法来说都太过分了。我想在你的情况下,你必须真正做到以下其中一件事:

  • 让100台计算机将参数测试时间缩短到合理的时间
  • 真正尝试用手和心灵计算出你的参数。必须有一些冗余和至少一些健全性检查,以便您可以在< 1min
  • 中测试您的案例
  • 对于可能的结果集,尝试找出一些稍微修改它的“操作”而不是随机化它。例如,在TSP中,一些基本运算符是lambda,它交换两个节点,从而创建新路由。你可以将一些数字向上/向下移动一些值。
  • 然后,找到一些不错的算法,你的起点可以在某个地方here。对于任何开始解决问题的人来说,这本书都是非常宝贵的资源。