是否有可能在没有适应度函数的情况下进行神经进化?

人工智能 神经网络 遗传算法 神经进化 适应功能 人工生命
2021-10-25 04:24:18

我的问题是关于神经进化(遗传算法+神经网络):我想通过进化代理来创造人工生命。但是,我不想依赖适应度函数,而是想让智能体通过对其后代基因的一些突变进行繁殖,并让一些智能体通过自然选择而死亡。以这种方式实现进化是我的目标。

这可行吗?在这方面是否有一些先前的工作?另外,是否有可能将NEAT纳入该方案?

到目前为止,我已经在 amethyst(用 Rust 编写的并行游戏引擎)中实现了大部分基础知识,但我担心学习会非常缓慢。我应该以不同的方式处理这个问题吗?

2个回答

您并不总是需要一个明确编码的适应度函数来执行遗传算法搜索。更普遍的需要是选择一个有利于在环境中的核心任务中表现更好的个人(即“更适合”)的选择过程。评估绩效的一种方法是授予数字分数,但其他方法也是可能的,包括:

  • 比赛选择,其中两个或更多个人在游戏中竞争,并选择获胜者。

  • 基于机会的选择,其中共享环境中的代理(通常具有有限的资源和竞争机会)可以作为可用操作之一进行复制,前提是它们满足某些标准,例如收集了足够多的资源。我无法为这种选择形式找到一个规范的名称,但它通常在人工生命项目中实施。

A -life项目和 GA 优化项目之间的一个关键区别是,在 A-life 项目中没有目标行为或目标性能。通常,A-life 项目是具有开放式结果的模拟,开发人员运行遗传算法来“看看会发生什么”,而不是“做最好的游戏玩家”。如果您的项目是这样的,那么您很可能会在这里寻找第二个选项。

要了解有关这种方法的更多详细信息,您可以尝试搜索“人工生命遗传算法”,因为在线发布的此类项目相当多,其中一些使用 NEAT。

从技术上讲,您可以将上面列出的任何一种方法视为个体之间针对未知适应度函数进行抽样比较的方法。那么,真正的适应度函数是否可以应用在一定程度上是一个哲学问题。作为开发人员,更重要的是您不必编写一个。相反,您可以使用各种个人选择方法来近似测量适应度。

到目前为止,我已经在 amethyst(一个用 rust 编写的并行游戏引擎)中实现了大部分基础知识,但我担心学习会非常缓慢。我应该以不同的方式处理这个问题吗?

很难说你是否应该以不同的方式处理这个问题。然而,成功的遗传算法方法的最大瓶颈是:

  • 评估代理所需的时间/CPU 资源。

  • 基因组搜索空间的大小。

这两者都可能成为雄心勃勃的 a-life 项目的真正障碍。在尝试解决这些问题时,通常会大量简化代理和环境。

在没有质量度量的情况下,如何评估任何解决方案的质量,在遗传算法的背景下,质量度量称为适应度函数?适应度函数一词源于著名的短语“适者生存”,该短语通常用于描述达尔文的自然选择理论(遗传算法基于该理论)。但是,请注意,适应度函数可以采用任何形式,例如

  • 这个解决方案在游戏中的表现如何?(在这种情况下,解决方案可以是玩游戏的策略),或者
  • 该解决方案与某个函数的最小值/最大值的接近程度f(更准确地说,如果你想找到函数的最大值f(x)=x2, 那么个人是标量x^R,并且适应度可以由下式确定f(x^)或有多大f(x^)对于其他个人);检查我是怎么在这里做的)?

适应度函数的定义取决于您要解决什么问题以及您要找到哪些解决方案。

因此,您需要遗传算法中的某种适应度函数以合理的方式进行选择,从而保持种群中的“最佳解决方案”。更准确地说,在为新一代(即迭代)选择新个体时,如果您不使用适应度(如果您愿意,也可以称为性能)函数来了解哪些个体应该生或死,怎么办您知道新的解决方案比以前的解决方案更好吗?如果没有适应度/性能函数,您无法知道这一点,因此您也无法从逻辑上决定在下一代之前杀死哪些个体。单独的突变只是改变了解决方案,即它们被用来探索解决方案的空间。

遗传算法总是由

  • 一群溶液/个体/染色体(即通常至少2解决方案)
  • 随机(或随机)更改现有解决方案以创建新解决方案的操作(通常是突变和交叉)
  • 一个选择过程,为下一代选择新的解决方案/个体(或组合和变异)
  • 一个适应度函数,可帮助您决定需要选择哪些解决方案(甚至组合和变异)

有关遗传算法或更一般地进化算法的更多信息,请查看Andries P. Engelbrecht的《计算智能:简介》一书的第 8 章和第 9 章。