Rom*_*kov 11 language-agnostic algorithm optimization
我正在寻找算法来找到"最佳"参数值集.有问题的函数有很多局部最小值并且变化很快.更糟糕的是,测试一组参数非常慢 - 大约1分钟 - 我无法直接计算梯度.
有这种优化的众所周知的算法吗?
只是尝试随机值,我取得了一定的成功.我想知道我是否可以通过使随机参数选择器选择接近过去产生不良结果的参数的机会来提高性能.这种方法有名称,以便我可以搜索具体的建议吗?
更多信息:
有多少参数 - 例如,搜索空间中有多少维度?它们是连续的还是离散的 - 例如,实数,整数,还是仅仅是几个可能的值?
我已经看到用于这类问题的方法具有类似的整体结构 - 采用大量的样本点,并将它们全部调整到以某种方式具有"好"答案的区域.由于你有很多分数,它们的相对差异可以作为临时梯度.
维基百科链接有前两个伪代码; GA方法的种类繁多,很难列出一种算法,但您可以从那里跟踪链接.请注意,您可以使用或将其作为起点的所有上述实现.
请注意,所有这些 - 实际上是这种大维搜索算法的任何方法 - 都是启发式算法,这意味着它们具有必须根据您的特定问题进行调整的参数.哪个可能很乏味.
顺便说一句,功能评估如此昂贵的事实可以让你有点工作; 由于上述所有方法都涉及大量独立的函数评估,因此可以使用OpenMP或类似的方法将该部分算法简单地并行化,以便使用与计算机上一样多的内核.
你的情况似乎是相似的海报的软件调优/校准属性的启发式算法,我也给你同样的忠告我给有:考虑一个大都市,黑斯廷斯的,多步行者和的模拟退火算法步长.
在您的案例中使用蒙特卡罗方法的困难在于对每个候选人进行昂贵的评估.与您手边的时间相比,价格有多贵?如果你在几分钟内需要一个好的答案,那就不够快了.如果你可以让它运行一夜,那么它的效果会相当好.
鉴于一个复杂的搜索空间,我建议随机初始分布.您的最终答案可能只是整个运行期间记录的最佳个人结果,或者具有最佳结果的助行器的平均位置.
不要被推迟,因为我正在讨论最大化那里并且你想要最小化:优点可以被否定或反转.
我尝试过模拟退火和粒子群优化.(作为提醒,我无法使用渐变下降,因为无法计算渐变).
我还尝试了一种执行以下操作的算法:
通过创建具有必要数量的维度的随机正交矩阵(适用于该代码)来生成该"正交方向" .
如果在正交方向上移动改善了结果,则算法仅继续该方向.如果没有一个方向改善了结果,则跳跃距离减半并且将尝试一组新的正交方向.最终算法得出结论,它必须处于局部最小值,记住它并在新的随机点重新启动整个批次.
这种方法比模拟退火和粒子群更好地执行:它需要较少的(非常慢)函数的评估来实现相同质量的结果.
当然,我的SA和PSO的实现很可能是有缺陷的 - 这些是棘手的算法,有很多调整参数的空间.但我只是觉得我会提到最适合我的东西.