什么时候遗传算法是优化的好选择?

机器算法验证 机器学习 优化 梯度下降 遗传算法
2022-01-19 10:10:47

遗传算法是优化方法的一种形式。通常随机梯度下降及其导数是函数优化的最佳选择,但有时仍会使用遗传算法。例如,美国宇航局 ST5 航天器的天线是使用遗传算法创建的:

ST5天线

什么时候遗传优化方法比更常见的梯度下降方法更好?

4个回答

遗传算法 (GA) 是一系列启发式算法,在许多情况下,它们在经验上擅长提供体面的答案,尽管它们很少是给定领域的最佳选择。

您提到了基于导数的算法,但即使没有导数,也有很多无导数优化算法的性能比 GA 好。有关一些想法,请参见这个这个答案。

许多标准优化算法的共同点(甚至是无导数的方法)是假设基础空间是一个光滑的流形(可能具有一些离散维度),并且要优化的函数在某种程度上表现良好。

然而,并不是所有的函数都定义在一个光滑的流形上。有时您想对图或其他离散结构进行优化(组合优化)——这里有专门的算法,但 GA 也可以工作。

你越是在复杂的离散结构上定义函数,GA 就越有用,特别是如果你能找到遗传算子在其中发挥最佳作用的表示(这需要大量的手动调整和领域知识)。

当然,未来可能会导致完全忘记 GA,并开发将离散空间映射到连续空间的方法,并使用我们对连续表示的优化机制。

当梯度下降专门用于单准则优化时,遗传方法非常适合多准则优化。当存在导数并且只有一个最优解(如果我们排除局部最小值)时,梯度下降允许找到函数的最小值。遗传算法可用于多准则问题并导致连续解决方案,每个解决方案都是群体中的个体,从初始群体进化而来。要优化的值是个体的表型,可以有几种表型。一般来说,没有一个个体同时具有每种表型的更好价值,因此不只有一个解决方案。最终种群中的个体,都是优化的解,属于“帕累托前沿”,标记为“帕累托秩一” 个人。这意味着,与在每种表型上具有相同表现的其他人相比,他们至少在一种表型上比其他表型更好。

最好在哪种意义上?

根据我的经验,GA 是最实用的优化器之一。虽然许多更精确的算法需要时间和精力来形式化数学世界中的实际问题,但 GA 可以处理具有复杂规则和约束的任何成本函数(GA 最终与执行方法相关,而不是通过特定计算)。这个过程很简单,您可以尝试多种方法进行探索性工作。

我也很欣赏将过去的解决方案重新注入到未来运行的算法中的可能性,这对重复任务很有好处。

从概念上讲,遗传算法可以用函数的哈希图表示,并且非常适合像 Clojure 这样的函数式语言,Clojure 也是一种可以非常快速地获得大结果的语言。

遗传算法也可以嵌套:一个遗传算法的成本函数可以是遗传算法!这些算法利用现代硬件和基础设施,使它们能够计算非常大的种群,因此 - 即使使用简单的变异/选择操作 - 您仍然可以获得良好的结果。

即使对于像找到波函数的最小值这样的简单问题,GA 也没有那么糟糕,并且可以在可接受的时间内达到相当高的精度。

所以,是的,分析解决方案可能具有更快的执行时间和精度,但产生它们所需的时间往往超过预期的好处!那么什么时候呢?几乎每次对我来说,至少对于元优化。

当可以并行使用许多处理器时,遗传算法是最好的。当目标函数具有高模态(许多局部最优)时。此外,对于多目标优化,还有多目标遗传算法 MOGA。

但是,我认为遗传算法被高估了。很多流行可能来自于它们受到生物学启发的事实。与其他直接搜索方法相比,它们确实倾向于更频繁地找到全​​局最优值,但成本很高,这意味着可以多次运行另一种直接搜索方法(例如 Nelder-Mead、Complex 或 SQP)来找到全局最优值,并且总体上产生更好的性能(即,在收敛性和找到全局最优值的概率方面)。不仅在使用单个处理器时如此,即使在多处理器可用时也是如此。

我认为它们仍然很受欢迎,因为使用非常简单的模型存在很多问题,因此性能不是问题。