根据目前的描述,有很多功能优化例程可以应用。随机搜索、网格搜索、爬山、梯度下降、遗传算法、模拟退火、粒子群优化都是我听说过的可能的竞争者,我可能错过了一些。
问题是,从对黑匣子的了解几乎为零开始,几乎不可能从这些搜索选项中猜出一个好的候选者。他们都有长处和短处。首先,您似乎没有任何规模迹象- 您是否应该尝试任何特定范围内的输入参数?因此,您可能想通过一系列幅度(正值和负值)尝试非常粗略的搜索,以找到值得搜索的区域。这样的网格搜索很昂贵——如果你有ķ 尺寸和想要搜索 n 不同的幅度,那么你需要调用你的黑匣子 nķ 次。
不过,这可以并行完成,并且假设您确信该函数大致是单峰的,您可以从相对较少的 n 开始(可能检查 -10、-1、0、+1、+10 以获取 15625 次调用您的功能使用 5 个盒子大约需要 8 小时 40 分钟)。一旦您知道是否找到该模式的边界框或需要尝试更多值,您可能需要重复其他参数,因此此过程可能需要更长的时间 - 如果参数 6 的最佳值更像是,可能需要几天20,000。您还可以更仔细地细化,一旦您有一个潜在的模式,您可能想要定义另一个值网格来搜索。这个基本的网格搜索可能是我对黑盒系统的第一个攻击点,我对参数含义一无所知,但我确信黑盒输出具有粗略的单峰形式。
考虑到响应速度,您应该将所有输入和输出值存储在数据库中,以便以后更快地查找和更好地构建模型。当缓存可以在 1 毫秒内查找它时,重复调用需要 10 秒是没有意义的。
一旦你有了一些你认为某个模式可能处于的值范围,那么就该选择一个合适的优化器了。
鉴于目前的信息,我很想运行更多的网格搜索(每个参数的值之间有单独的线性缩放)和/或随机搜索,大致限制在由一组定义的框 26在初始数量级搜索中找到的最佳结果周围的角点。
那时,您还可以考虑绘制数据图表,看看是否有任何其他算法可以表现良好的直觉。
有了并行调用的可能性,梯度下降可能是一个合理的猜测,因为您可以通过向每个参数添加一个小的偏移量并将导致输出的差异除以它来获得近似梯度。此外,与依赖多次迭代(模拟退火)或大量并行工作(粒子群或遗传算法)的方法相比,梯度下降(或简单的爬山)有一些优化函数的机会,只需更少的调用来评估函数。神经网络中使用的梯度下降优化器,加上 Nesterov 动量或 RMSProp 等附加功能,可以应对函数输出“特征尺度”的变化,例如峰、脊、鞍点的不同大小和高度。
然而,梯度下降和爬山算法并不是对所有函数形状都具有鲁棒性。您的探索所看到的图表或几个图表可能会帮助您决定采用不同的方法。因此,请保留所有数据并将其绘制成图表,以防万一。
最后,不排除随机蛮力搜索,并且能够在时间限制下接受“迄今为止最好的”。由于对黑匣子内部的了解很少,这是一种合理的策略。