我在做一个多目标优化项目,我偶然发现了一种算法的必要性,这种算法把一个函数作为一个输入,它可以存储任意有限的次数(受计算能力的限制),可以返回一个均匀分布的采样值,这个采样值是函数的局部或全局极小值。你知道吗
如果您没有最喜欢的语言,我更喜欢Python,并将任何建议移植到Python中供我自己使用。否则,任何带或不带代码的答案都是可以接受的。你知道吗
这类似于许多更容易回答的问题,因此我有一些更明确的细节:
我们将定义一个具有已知局部极小值的函数来生成一个简单的测试用例。你知道吗
import numpy as np
def f(x: np.ndarray):
"""If x has shape (2,) returns distance from line y=x"""
return np.abs(np.diff(x))
def minima_sample(f, bounds, sample_size):
"""TODO"""
当我们试图在单位方格中找到3个均匀分布、覆盖良好的点时,这些点位于f
(可以被视为一个oracle)的局部(或全局…对我的应用程序来说并不重要)最小值,最好的方法是返回线段的两个端点,这两个端点代表所有的极小值,以及直接位于两者之间的点。同样得4分。你知道吗
>>> print(minima_sample(f, [(0,1), (0,1)], 3))
array([[0. , 0. ],
[0.5, 0.5],
[1. , 1. ]])
>>> print(minima_sample(f, [(0,1), (0,1)], 4))
array([[0. , 0. ],
[0.33333333, 0.33333333],
[0.66666667, 0.66666667],
[1. , 1. ]])
有两类算法与此问题密切相关:
例子包括梯度下降法,各种各样的拟牛顿法,基于blob的不可微搜索算子等等。有趣的是,它们实际上可以相对容易地用来回答这个问题。只需在随机起始点运行局部解算器,直到解的边界大小大致不增加,然后继续运行,直到有足够的点均匀分布在该边界中。把精力集中在空旷的地方,以提高效率。你知道吗
从技术上讲,这些方法可以用来建立一个答案,但这是一个相当低效的策略。您至少需要与所请求的点一样多的局部最小化步骤(如果函数表现不好,则需要更多),并且在局部最小化之间丢弃所有信息,这样您就不能使用一个最小值的位置来指导另一个最小值的查找。也许这实际上是最佳的,但我怀疑有更好的东西存在。你知道吗
例如碱化法、模拟退火法等。从表面上看,他们似乎是正确的方法,因为他们检查了大量的局部极小值,并最终解决了其中最小的。我们可以简单地返回得到的局部极小值的一个合适的子集。然而,通过设计,他们选择局部极小值的方式很可能是走向全局极小值。根据定义,这试图偏向搜索和样本的局部极小不均匀。你知道吗
出于个人好奇心,我对你认为可能适用的任何算法都感兴趣。作为一个实际问题,一个优化例程的效率很大程度上取决于它对特定问题的定制程度。我想到的特定函数有很多约束和特殊属性,它们可能会产生不同:
我目前已经实现了2.1中提到的随机重启方法。从技术上讲,它是可行的,但它比我想要的慢。从算法的角度来看,它也不优雅,也不令人满意。
随机重启动方法采样不均匀,但通过修改起始位置,尝试推导出现有解的边界,并填充这些解中的空洞(使用缩减空间进行邻近计算),可以得到合理的覆盖。计算雅可比数和黑森数,对于简单问题,每个样本点使用~5个函数求值;对于复杂问题,每个样本点使用~80个函数求值。我们的目标是利用我们目前丢弃的一些额外信息,将80%的信息减少到更易于管理的程度。我希望最大的加速比是16倍(或者在硬币的另一面是处理更大问题的能力)。
我的一个想法是找到一个单一的局部极小值,然后“跟随”流形,它恰好是通过方向导数为0的方向移动(因为局部极小值和全局极小值都是0)。这对于1D流形来说是很容易实现的,但是我还没有找到一个令人满意的方法来处理更复杂的搜索空间而不需要加倍。
我突然想到,进化算法的人口与牛顿为基础的局部搜索组件的个人可能是有效的。进化算法与随机搜索的关系以及对参数的极端敏感性让我很警惕。
有没有一个标准的方法来解决这样的问题?如果没有,是否有一个短/长的适用算法列表,我可以权衡其优缺点?我的Google foo出现了问题,我最初的预感并没有产生好的结果。在处理这个问题时,我还有什么需要考虑的吗?即使是书籍/参考资料/博客/播客推荐也总比什么都没有好。你知道吗
事先谢谢你的努力。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐