我找不到为什么我们应该为NEAT中的每个新连接基因拥有一个全球创新编号。
据我对NEAT的一点了解,每个创新号都直接对应于一个node_in,node_out对,因此,为什么不仅使用这对id来代替创新号?此创新编号中有哪些新信息?年表?
更新资料
它是算法优化吗?
最佳答案
注意:这更多的是扩展评论,而不是答案。
您在开发适用于javascript的NEAT版本时遇到了一个我刚刚遇到的问题。 〜2002年发表的原始论文还不清楚。
original paper包含以下内容:
每当新的
基因出现(通过结构突变),全球创新数量增加
并分配给该基因。因此,创新数字代表了按时间顺序排列的
系统中每个基因的外观。 [..];创新数字从未改变。因此,每一个
该系统中的基因在整个进化过程中都是已知的。
但是,对于以下情况,本文还不清楚,比如说我们有两个。 “相同”(结构相同)的网络:
上面的网络是初始网络;这些网络具有相同的创新ID,即[0, 1]
。因此,现在网络随机地突变了一个额外的连接。
繁荣!偶然地,他们突变为相同的新结构。但是,连接ID是完全不同的,对于父1,[0, 2, 3]
和对父2 [0, 4, 5]
,因为该ID是全局计数的。
但是NEAT算法无法确定这些结构是否相同。当一个父母的得分高于另一个父母时,这不是问题。但是,当父母的健康程度相同时,我们就会遇到问题。
因为该论文指出:
在组成后代时,基因是从匹配基因的亲本中随机选择的,而所有多余或不相交的基因总是包含在更合适的亲本中,或者如果它们同样合适,则包含在两个亲本中。
因此,如果父母双方同样健康,则后代将具有连接[0, 2, 3, 4, 5]
。这意味着某些节点具有双重连接...删除全局创新计数器,仅通过查看node_in和node_out分配ID,就可以避免此问题。
因此,当您拥有同样适合的父母时,是的,您已经优化了算法。但是,几乎从来没有这样。
非常有趣:在论文的newer version中,他们实际上删除了粗体行!较旧的版本here。
顺便说一句,您可以解决此问题,而不是分配创新ID,而是使用pairing functions根据node_in和node_out分配ID。当适合度相等时,这会创建非常有趣的神经网络: