假设有一个函数将实数映射到实数,如下所示:当 x 从低到高时,f(x) 最初处于平坦区域(围绕常数但不一定是常数,可能是凹凸不平的) ,然后出现“悬崖”,价值迅速增加很多。当它达到最大值后,它会稍微下降并再次变得平坦。假设我知道目标函数具有此功能,但不知道“悬崖”在域上的起点和终点。我应该如何找到最大值?将初始值放在平坦区域会很快陷入困境,但找到更好的初始点(例如,悬崖附近)具有挑战性(例如,随机样本初始点),尤其是当输入的维度变大时。
我尝试了随机样本初始点,但这对于较大尺寸的输入可能效率不高。寻找算法/想法的推荐。如果有 python/R/Matlab 的包那就太好了!
正如 @A10 指出的那样,退火似乎是此类问题的一种很好的优化方法。这是因为它基于随机游走方法并且没有梯度。所以它并不完全关心是否存在平坦区域。退火方法的缺点是我们无法像基于梯度的方法那样将它们初始化为特定值。
我还使用他们的 Leap 和 Ocean SDK 使用 D-Wave 的量子退火器进行量子退火,并且值得通过他们的免费开发者试用计划来使用它。他们的 Ocean SDK 还内置了模拟退火函数,如果您可以在 QUBO 或 Ising 模型优化问题中设置优化问题,那么这些函数很容易使用。如果没有,您可以随时尝试常规的模拟退火实现,例如this one。
我还建议使用 Gurobi 求解器,因为它们是最好的闭源(对学生/学者免费)优化器之一。