找到某个函数的局部/全局最小值的代表性样本时,存在哪些算法?

时间:2018-07-18 06:28:42

标签: python algorithm optimization scipy mathematical-optimization

我正在从事一个多目标优化项目,我偶然发现了对算法的需求,该算法给定一个函数作为输入,该函数可以在任意有限的次数(受计算能力限制)中返回该功能的本地或全局最小值的位置的均匀分布的采样

如果您没有喜欢的语言,我更喜欢Python,并将任何建议移植到Python供我自己使用。否则,任何带有或不带有代码的答案都是可以接受的。

这类似于许多更容易回答的问题,因此我还有一些澄清的细节:

1。用法示例/ API

我们将定义一个具有已知局部最小值的函数,以生成一个简单的测试用例。

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.        ]])

2。无答案

有两类与此问题密切相关的算法:

2.1本地求解器

示例包括梯度下降,各种各样的拟牛顿法,“基于斑点”的不可微搜索算子,等等。整洁的是,它们实际上可以相对轻松地用来回答这个问题。只需在随机起点处运行本地解算器,直到解决方案的边界大约不会增大,然后继续运行,直到在该边界中有足够的点均匀分布为止。将精力集中在空白处以提高效率。

从技术上讲,这些可以用来建立答案,但是IMO这是一个效率很低的策略。您至少需要与请求点数一样多的局部最小化步骤(如果功能不当,则需要更多),并且所有信息在局部最小化之间都被丢弃,因此您不能使用一个最小值的位置来指导寻找另一个。也许这实际上是最佳选择,但我怀疑还有更好的选择。

2.2全局求解器

示例包括盆地跳跃,模拟退火等。从表面上看,它们似乎是正确的方法,因为它们检查了大量局部最小值,并最终确定了其中的最小最小值。可以简单地返回获得的局部最小值的合适子集。但是,通过设计,他们选择本地极小值的方式可能会朝着全局极小值迈进。根据定义,这会尝试使搜索产生偏差并对局部最小值进行不均匀采样。

3。附加信息

出于个人好奇心,我对您认为可能适用的任何算法都感兴趣。实际上,优化例程的效率与针对特定问题的量身定制密切相关。我想到的特定功能有很多约束和特殊属性,可能会有所作为:

  1. 忽略数值错误,我要优化的函数具有所有局部最小值实际上都是全局最小值的特性。
  2. 除了某些病理输入之外,我要优化的功能还具有全局最小值为0的附加属性。
  3. 可以假定该函数是n个变量的无穷标量函数(如果需要特定的编程语言,则表示为平面numpy数组)。
  4. 评估函数,其Jacobian以及其Hessian与任何矢量的乘积都可以在O(n ^ 2)时间内完成。
  5. 评估Jacobian所需的时间大约是单个函数评估的3倍。
  6. 评估Hessian向量积大约需要两倍于一次Jacobian评估的时间
  7. 求高阶微分形式的费用实在太高了(目前...我认为,如果我再加一点/一点一点的努力,自动微分会解决这个特定问题)
  8. 除病理情况外,最小值位于低维流形的并集上。我希望这很重要,因为在给定旧最小值的位置的情况下,它提供了大量有关在哪里搜索新最小值的信息。
  9. 该函数在选择的任何有界域上都有界,但是不一定必须提前知道该界。
  10. 对于具有10,000多个输入的较大问题,一些中间计算往往会增加数值不稳定性。在这些情况下,我提到的所有量(函数,雅可比,黑森州)都不知道小数点后5或6位,因此理想情况下,任何解决方案都不需要更高的精度。
  11. 预期的应用程序具有成千上万的输入,并且需要采样50-2000点才能覆盖局部最小值。
  12. 计算的一个副作用是,对于每个函数求值,我们都会在降维空间中获得有用的表示。这可能无关紧要,但是使用低维(2-10D)表示形式进行类似邻近度的计算可能会有用,而不是10,000+维输入。
  13. 在重要的情况下,我们希望其最小值最小的函数是我们正在优化的相同n维输入的特定m维函数的雅可比行列的潜在非零奇异值中的最小值。上述减少的空间是该m维函数的输出。

4。当前的尝试和想法

  • 我目前已实现了 2.1 中提到的随机重启方法。从技术上讲,它可以运行,但是比我想要的要慢。从算法的角度来看,它也不是优雅或令人满意的。

  • 随机重启方法并不是均匀采样,而是通过修改起始位置以尝试突破现有解决方案的边界并填充这些解决方案中的空白(使用减少的空间进行邻近度计算),可以获得合理的覆盖率。算上Jacobian和Hessian,对于简单问题,每个样本点使用〜5个函数求值,对于复杂问题,使用〜80个函数求值。目标是利用我们当前正在丢弃的一些额外信息,将约80个信息减少到更可管理的水平。我希望最大加速速度约为16倍(或者说硬币的另一端具有处理较大问题的能力)。

  • 我曾经想过要找到一个局部最小值,然后通过沿方向导数为0的方向“跟随”它所处的流形(因为局部最小值和全局最小值是全部为0)。对于一维流形来说,这已经足够容易实现了,但是我还没有想出一种令人满意的方法来处理更复杂的搜索空间而不加倍返回。

  • 令我惊讶的是,针对人口的进化算法可能具有针对个人的基于牛顿的本地搜索组件。进化算法通常具有的与随机搜索的关系以及对参数的极端敏感性使我感到警觉。

5。最后

是否存在解决此类问题的标准方法?如果没有,我是否可以权衡其优点和缺点的适用算法的简短列表?我的Google-foo出现了问题,而我最初的预感并没有取得很好的结果。解决这个问题时,我还有什么要考虑的吗?甚至书/参考书/博客/播客推荐总比没有好。

预先感谢您的努力。

0 个答案:

没有答案