具有大量局部最小值的多参数优化
Posted
技术标签:
【中文标题】具有大量局部最小值的多参数优化【英文标题】:Multiple parameter optimization with lots of local minima 【发布时间】:2010-10-10 13:58:39 【问题描述】:我正在寻找算法来找到一组“最佳”参数值。有问题的函数有很多局部最小值并且变化非常快。更糟糕的是,测试一组参数非常慢 - 大约 1 分钟 - 而且我无法直接计算梯度。
这种优化有什么著名的算法吗?
我在尝试随机值方面取得了一定的成功。我想知道是否可以通过降低随机参数选择器选择接近过去产生不良结果的参数的机会来提高性能。是否有这种方法的名称,以便我可以搜索具体建议?
更多信息:
参数是连续的 大约有 5-10 个参数。当然不超过 10 个。【问题讨论】:
您能发布您的功能模型吗?如果可能,请提示您要建模什么... @belisarius 这些参数是用于玩特定游戏的 AI 中的调整因素。例如,调整评估给定位置的“威胁级别”的功能。我优化中的“评估”步骤产生了正在开发的 AI 在一组固定的地图上战胜一组固定的其他 AI 的次数。 (我知道这确实在这些特定地图上针对这些特定对手进行了优化,但希望调整因素太少以至于它有任何过度拟合的空间) 【参考方案1】:有多少个参数——例如,搜索空间中有多少个维度?它们是连续的还是离散的 - 例如实数或整数,或者只是几个可能的值?
我见过的用于此类问题的方法具有相似的整体结构 - 获取大量样本点,然后将它们全部调整到以某种方式具有“好”答案的区域。由于您有很多点,它们的相对差异用作临时渐变。
Simulated Annealing:经典方法。取一堆点,根据概率将一些点移动到随机选择的相邻点,具体取决于它的好坏程度。 Particle Swarm Optimization:在搜索空间中取一个具有速度的粒子“群”,概率性地随机移动一个粒子;如果这是一种改进,请让整个群体都知道。 Genetic Algorithms:这有点不同。您无需像上面那样使用邻居信息,而是每次都取最好的结果,然后“杂交”他们,希望得到每个人的最佳特征。***链接有前两个的伪代码; GA 方法种类繁多,很难仅列出一种算法,但您可以从那里访问链接。请注意,您可以使用以上所有内容的实现或将其作为起点。
请注意,所有这些 - 以及这种大维搜索算法的任何方法 - 都是启发式的,这意味着它们具有必须针对您的特定问题进行调整的参数。这可能很乏味。
顺便说一句,函数评估如此昂贵的事实可以为你工作一点;由于上述所有方法都涉及大量独立的函数评估,因此该算法的一部分可以与 OpenMP 或类似的东西进行简单的并行化,以利用您机器上尽可能多的内核。
【讨论】:
参数最少4-5个,最多10个,并且是连续的。感谢您的链接,会好好看看! GA 可能不合适,因为参数太少了,我真的怀疑在我的情况下,将两个好的集合组合起来会产生更好的集合。评估已经是并行的,每个参数集使用我所有的 4 个内核 30-60 秒。【参考方案2】:您的情况似乎与Software to Tune/Calibrate Properties for Heuristic Algorithms 的海报相似,我会给您同样的建议I gave there:考虑采用类似Metropolis-Hastings 的方法,使用多个步行器并模拟步长退火。
在您的案例中使用蒙特卡洛方法的困难在于对每个候选人的昂贵评估。与您手头的时间相比,有多贵?如果您在几分钟内需要一个好的答案,这还不够快。如果你可以让它整夜运行,它会很好地工作。
考虑到复杂的搜索空间,我建议使用随机初始分布。您最终的答案可能只是整个跑步过程中记录的最佳个人成绩,或者是获得最佳成绩的步行者的平均位置。
不要因为我在那里讨论最大化而你想最小化而感到迟疑:品质因数可以被否定或倒置。
【讨论】:
【参考方案3】:我尝试过模拟退火和粒子群优化。 (提醒一下,我不能使用梯度下降,因为无法计算梯度)。
我还尝试了一种算法,它执行以下操作:
选择一个随机点和一个随机方向 评估函数 只要结果不断改进,就一直沿着随机方向前进,每次成功迭代都会加快速度。 当结果停止改善时,退后一步,尝试向正交方向移动相同的距离。这个“正交方向”是通过创建具有必要维数的随机正交矩阵(改编为this code)生成的。
如果沿正交方向移动可以改善结果,则算法将继续沿该方向移动。如果没有一个方向可以改善结果,则跳跃距离减半,并尝试一组新的正交方向。最终算法得出结论,它必须处于局部最小值,记住它并在一个新的随机点重新开始整个批次。
这种方法的性能明显优于模拟退火和粒子群:它需要更少的(非常慢的)函数评估来获得相同质量的结果。
当然是我的 S.A. 和 P.S.O.很可能是有缺陷的——这些是棘手的算法,有很大的调整参数的空间。但我只是想我会提到最终对我最有效的方法。
【讨论】:
【参考方案4】:我真的无法帮助您找到针对您的特定问题的算法。
但是,关于随机选择参数,我认为您正在寻找的是genetic algorithms。遗传算法通常基于选择一些随机输入,选择那些(到目前为止)最适合该问题的输入,然后随机变异/组合它们以生成下一代,并再次选择最佳。
如果函数或多或少是连续的(即好的输入的小突变通常不会产生坏的输入(小的有点通用)),这对于您的问题将相当有效。
【讨论】:
【参考方案5】:没有通用的方法来回答您的问题。有很多关于这个主题的书籍/论文,但你必须根据自己的需要选择你的路径,这里没有明确说明。
但是,有些事情要知道 - 1 分钟/测试对于任何算法来说都太长了。我想在您的情况下,您必须真正执行以下操作之一:
让 100 台计算机将您的参数测试时间缩短到合理的时间 真正尝试用手和头脑计算出您的参数。必须有一些冗余和至少一些完整性检查,以便您可以在 对于可能的结果集,尝试找出一些稍微修改它的“操作”,而不是仅仅随机化它。例如,在TSP 中,一些基本运算符是 lambda,它交换两个节点,从而创建新路由。您可以将一些数字向上/向下移动以获得一些价值。 然后,给自己找一些不错的算法,你的起点可以在某个地方here。对于任何从解决问题入手的人来说,这本书都是宝贵的资源。【讨论】:
我想我必须在某一天或两天内购买 100 台计算机,但在我这样做之前我必须相当肯定我正在充分利用它们。 .. :)以上是关于具有大量局部最小值的多参数优化的主要内容,如果未能解决你的问题,请参考以下文章