扩展拓扑(NEAT)和全球创新数量的神经演化

时间:2016-03-25 15:46:14

标签: machine-learning neat es-hyperneat

我无法找到为什么我们应该为NEAT中的每个新连接基因创建一个全球创新号。

根据我对NEAT的一点知识,每个创新号都直接与node_in,node_out对对应,那么,为什么不只使用这对id而不是创新号呢?这个创新号码中有哪些新信息?年表?

更新

是算法优化吗?

3 个答案:

答案 0 :(得分:1)

注意:这更多是扩展评论而不是答案。

您在为javascript开发NEAT版本时遇到了一个问题。 2002年发表的原始论文非常不清楚。

original paper包含以下内容:

  

每当一个新的   基因出现(通过结构突变),全球创新数量增加   并分配到该基因。因此,创新数字代表了年表   系统中每个基因的出现。 [..];创新数字永远不会改变。因此,每一个人的历史渊源   系统中的基因在整个进化过程中都是已知的。

但该文件对以下案例非常不清楚,说我们有两个; '相同'(相同结构)网络:

enter image description here

上述网络是初始网络;网络具有相同的创新ID,即[0, 1]。所以现在网络随机改变一个额外的连接。

enter image description here

轰!偶然的机会,他们突变到了同样的新结构。但是,连接ID完全不同,即parent1为[0, 2, 3],parent2为[0, 4, 5],因为ID是全局计数。

但是NEAT算法无法确定这些结构是否相同。当其中一个父母得分高于另一个时,这不是问题。但是当父母具有相同的适应性时,我们就会遇到问题。

因为论文指出:

  

在组成后代时,基因是从匹配基因的父母中随机选择的,而所有过量或不相交的基因总是包含在更合适的父母中,或者如果它们同样适合父母双方。

因此,如果父母同样适合,后代将有[0, 2, 3, 4, 5]的联系。这意味着一些节点具有双重连接...删除全局创新计数器,只需通过查看node_in和node_out来分配id,就可以避免这个问题。

所以当你有同样适合父母的时候,是的,你已经优化了算法。但这几乎不是这样的。

非常有趣:在论文的newer version中,他们实际上删除了那条粗线!旧版here

顺便说一句,您可以通过使用pairing functions来分配创新ID,基于node_in和node_out分配ID来解决此问题。当健康相等时,这会产生非常有趣的神经网络:

enter image description here

答案 1 :(得分:0)

在交叉过程中,我们必须考虑两个基因组,它们共享其个人神经网络中两个相同节点之间的连接。在交叉的每个步骤中,我们如何检测到这种碰撞而又不重复重复两个基因组的连接基因?容易:如果在交叉过程中检查的两个连接都共享一个创新编号,那么它们将连接相同的两个节点,因为它们是从同一共同祖先那里获得的。

简单示例: 如果我是一个具有特定连接基因且创新编号为“ i”的基因组,那么从我这里获得基因“ i”的孩子最终可能会相互杂交100代。我们必须检测我的基因“ i”的这两个进化版本(等位基因)何时发生碰撞,以防止两者同时发生。接受两个相同的基因可能会导致表型循环和崩溃,从而杀死该基因型。

答案 2 :(得分:0)

当我创建NEAT的第一个实现时,我也以为...为什么要保留创新数字跟踪器...?为什么只用一代呢?完全不保留它,并使用与连接的节点同等的键值会更好吗?

现在,我正在实施我的第三次修订,我可以看到肯尼斯·斯坦利(Kenneth Stanley)试图对它们进行的处理,以及为什么他只想保留它们一代人的原因。

创建连接后,它将在那一刻开始其优化。它标志着它的起源。如果同一连接在另一代中弹出,则将开始其优化。世代号试图将来自同一个祖先的世代号分开,因此针对许多世代进行了优化的世代号不会与刚刚产生的世代相提并论。如果在两个基因组中发现相同的连接,则意味着该基因来自相同的起源,因此可以进行比对。

想象一下,您拥有自己的一代冠军。由于对齐的基因受到同等对待,其某些基因有50%的机会会丢失。

有什么更好的...?我还没有任何实验可以比较这两种方法。

肯尼斯·斯坦利(Kenneth Stanley)还在NEAT用户页面中解决了此问题:https://www.cs.ucf.edu/~kstanley/neat.html

  

创新记录应永久保存,还是仅适用于当前   代?

     

在我执行NEAT的过程中,记录只保留了一代,但是在那里   让它们永远存在没有错。实际上,它可能会更好。   这是详细的解释:

     

我没有在整个比赛中保持记录的原因   NEAT的实现是因为我觉得调用相同的东西   在完全不同的情况下发生的突变不是   直观。也就是说,很可能是几代人,   同一连接相对于所有其他连接的“含义”或贡献   网络中的连接与它出现时的连接有所不同   几代人以前。我用一代人作为这种标准   情况,尽管那是临时的。

     

也就是说,从功能上来说,我认为这没有任何问题   永远保持创新。主要作用是产生更少的物种。   相反,不让它们周围会导致更多物种。   代表同一件事,但仍然分开。目前尚不清楚   在哪种情况下哪种方法会产生更好的结果。

     

请注意,随着物种的分化,将出现在一个物种中的联系称为   与早先出现在另一个名称中不同的名称只会增加   该物种的不相容性。因为它们是   开始不兼容。另一方面,如果同一物种添加   它在上一代产品中添加的连接,这必须意味着   该物种还没有采用这种联系...所以现在很可能   该连接的第一个“版本”开始会有所帮助,并且   另一个将消失。第三种情况是已经建立连接   通常被一个物种采用。在这种情况下,不会产生突变   因为已经被使用,所以在该物种中具有相同的联系。要点是   您不会真的期望太多带有不同标记的真正相似的结构   甚至只保留了1代的记录。

     

哪种方法效果最好是一个好问题。如果您有任何有趣的实验   关于这个问题的结果,请让我知道。

我的第三个修订版将同时允许这两种选择。取得相关结果后,我会在此答案中添加更多信息。