优化封闭(黑盒)系统的参数

数据挖掘 优化
2021-09-20 04:27:16

我正在研究一个涉及为黑盒系统寻找最佳参数值的问题。该系统由 6 个输入组成并产生一个输出。我可以将返回的值与观察值进行比较,以确定系统是否根据我指定的参数值进行了良好的校准。

我遇到的主要问题是我不知道如何在黑盒系统中使用这些参数来产生输出。这些参数可能是相关的,因此改变一个参数的值可能会影响其他参数在系统中的行为方式。

由于我不知道功能,我不确定如何有效地优化这个问题。

问:函数未知时有哪些优化方法?


编辑:

变量类型都是实数向量,但如果有帮助,我们可以做出一些假设。

运行黑盒系统的成本只是时间。假设运行系统需要 10 秒,但我碰巧有五个黑匣子——所以如果我可以并行运行我的算法,那么我可以减少运行时间。如果算法按顺序运行,那么我不会通过额外的框获得任何东西(期望可能选择不同的起始位置)。

对于这个问题,我有兴趣了解如何解决这类问题——而不是试图用蛮力解决问题。也就是说,我对获得答案不太感兴趣,而对如何获得答案感兴趣。我认为很容易说,只要有足够的资源(时间、处理能力),简单地生成许多随机数并选择给出最佳结果的组合是最简单(可能也是最差)的方法。

3个回答

根据目前的描述,有很多功能优化例程可以应用。随机搜索、网格搜索、爬山、梯度下降、遗传算法、模拟退火、粒子群优化都是我听说过的可能的竞争者,我可能错过了一些。

问题是,从对黑匣子的了解几乎为零开始,几乎不可能从这些搜索选项中猜出一个好的候选者。他们都有长处和短处。首先,您似乎没有任何规模迹象- 您是否应该尝试任何特定范围内的输入参数?因此,您可能想通过一系列幅度(正值和负值)尝试非常粗略的搜索,以找到值得搜索的区域。这样的网格搜索很昂贵——如果你有ķ 尺寸和想要搜索 n 不同的幅度,那么你需要调用你的黑匣子 nķ 次。

不过,这可以并行完成,并且假设您确信该函数大致是单峰的,您可以从相对较少的 n 开始(可能检查 -10、-1、0、+1、+10 以获取 15625 次调用您的功能使用 5 个盒子大约需要 8 小时 40 分钟)。一旦您知道是否找到该模式的边界框或需要尝试更多值,您可能需要重复其他参数,因此此过程可能需要更长的时间 - 如果参数 6 的最佳值更像是,可能需要几天20,000。您还可以更仔细地细化,一旦您有一个潜在的模式,您可能想要定义另一个值网格来搜索。这个基本的网格搜索可能是我对黑盒系统的第一个攻击点,我对参数含义一无所知,但我确信黑盒输出具有粗略的单峰形式。

考虑到响应速度,您应该将所有输入和输出值存储在数据库中,以便以后更快地查找和更好地构建模型。当缓存可以在 1 毫秒内查找它时,重复调用需要 10 秒是没有意义的。

一旦你有了一些你认为某个模式可能处于的值范围,那么就该选择一个合适的优化器了。

鉴于目前的信息,我很想运行更多的网格搜索(每个参数的值之间有单独的线性缩放)和/或随机搜索,大致限制在由一组定义的框 26在初始数量级搜索中找到的最佳结果周围的角点。

那时,您还可以考虑绘制数据图表,看看是否有任何其他算法可以表现良好的直觉。

有了并行调用的可能性,梯度下降可能是一个合理的猜测,因为您可以通过向每个参数添加一个小的偏移量并将导致输出的差异除以它来获得近似梯度。此外,与依赖多次迭代(模拟退火)或大量并行工作(粒子群或遗传算法)的方法相比,梯度下降(或简单的爬山)有一些优化函数的机会,只需更少的调用来评估函数。神经网络中使用的梯度下降优化器,加上 Nesterov 动量或 RMSProp 等附加功能,可以应对函数输出“特征尺度”的变化,例如峰、脊、鞍点的不同大小和高度。

然而,梯度下降和爬山算法并不是对所有函数形状都具有鲁棒性。您的探索所看到的图表或几个图表可能会帮助您决定采用不同的方法。因此,请保留所有数据并将其绘制成图表,以防万一。

最后,不排除随机蛮力搜索,并且能够在时间限制下接受“迄今为止最好的”。由于对黑匣子内部的了解很少,这是一种合理的策略。

由于还没有人提到贝叶斯优化:“贝叶斯优化是一种用于黑盒函数全局优化的顺序设计策略。”

在该维基百科页面的底部是几个贝叶斯优化库的链接,例如:

除了使用贝叶斯优化的库之外,还有使用 TPE(parzen 估计器树)的库,例如hyperopt

这是 fmfn 的贝叶斯优化器优化非线性二维函数的图像。如您所见,在相对较少的迭代后找到了接近全局最优的点,并且系统在更有希望的(红色)区域中测试的点比在不太有希望的(蓝色)区域中测试的点更多——这使得它比随机搜索更有效:

二维函数的贝叶斯优化 (完整动画)

这是一个解决方案

本文描述了一种数学方法