我是否必须在 NEAT 中交叉我的节点基因,以及如何交叉?

人工智能 整洁的 神经进化 交叉运营商 变异算子
2021-10-29 11:04:39

我目前正在尝试自己编写 NEAT 算法,但我遇到了两个问题。他们来了:

如果在交叉期间删除(或禁用)节点并且之前连接到该特定节点的连接会发生什么?因为,在这种情况下,某些连接不再有用。我是保留无用的连接还是防止这种情况发生?或者,也许我错过了什么?

AI SE上有人说:

你可以:

1.) 只使用交叉中的连接基因,并从连接基因中导出你的节点基因

2.)测试是否每个节点都在使用,并删除那些没有

但问题是我的基因组会失去一些复杂性。也许我可以在交叉期间使用节点,然后禁用使用该节点的连接。这样,我保持基因型复杂,但表型仍然有效。

有没有其他方法可以解决这个问题,或者这是最好的方法?

1个回答

好的,我首先要回顾一下 NEAT 的工作原理。我希望这可以帮助您成功地对 NEAT 进行整体建模,而不仅限于您的问题。

我们使用神经进化来创建解决给定任务的特定行为。行为可以简单也可以复杂。

现在让我们关注行为......不同的神经网络可以创建相同的行为(AKA 竞争约定问题)。

我们还希望最终得到一个非常有效的神经网络。

因此,我们想用一个算法 (NEAT) 解决两个问题:找到解决任务的行为,并找到创建该行为的最有效的神经网络。

有一种简单的方法可以搜索最有效的神经网络:从最简单的神经网络开始,然后慢慢构建神经网络。

困难的部分是定义行为(我们如何定义神经网络中的行为?)。NEAT 介绍了他们对行为非常有趣的定义:神经网络行为的一个原子单元是神经网络的连接:哪个节点连接到哪个节点以及以什么权重。

现在我正在接近你的问题(关注):你想确保你的基因组可以变得复杂,这意味着你想保留你的基因组表达复杂行为的能力。正如论文所述,行为与节点无关,更不用说节点基因了。行为是一组神经网络连接。

所以这是我对你问题的回答:关心交叉连接,而不是节点基因。找到一种计算节点基因的有效方法。例如,如果您只是连接来自两个父母的节点基因而不重叠,您将消耗大量内存。有可能某些节点基因可能未使用(即禁用连接,由于概率而未继承某些连接基因)。

希望这可以帮助 :)