我无法找到为什么我们应该为 NEAT 中的每个新连接基因设置一个全球创新编号。
根据我对 NEAT 的一点了解,每个创新号都直接对应一个 node_in、node_out 对,那么,为什么不只使用这对 id 而不是创新号呢?这个创新号有哪些新信息?年表?
更新
是算法优化吗?
我无法找到为什么我们应该为 NEAT 中的每个新连接基因设置一个全球创新编号。
根据我对 NEAT 的一点了解,每个创新号都直接对应一个 node_in、node_out 对,那么,为什么不只使用这对 id 而不是创新号呢?这个创新号有哪些新信息?年表?
更新
是算法优化吗?
注意:这更多的是扩展评论而不是答案。
您遇到了一个问题,我在为 javascript 开发 NEAT 版本时也遇到了问题。2002 年左右发表的原始论文非常不清楚。
原始论文包含以下内容:
每当新基因出现(通过结构突变)时,就会增加一个全局创新编号并分配给该基因。因此,创新数字代表了系统中每个基因出现的年表。[..] ; 创新数字永远不会改变。因此,系统中每个基因的历史起源在整个进化过程中都是已知的。
但是论文对以下情况非常不清楚,比如说我们有两个;“相同”(相同结构)网络:
上面的网络是初始网络;这些网络具有相同的创新 ID,即[0, 1]
。所以现在网络随机改变了一个额外的连接。
繁荣!偶然地,它们突变为相同的新结构。但是,连接 ID 完全不同,即[0, 2, 3]
parent1 和[0, 4, 5]
parent2 因为 ID 是全局计数的。
但是 NEAT 算法无法确定这些结构是否相同。当父母中的一方得分高于另一方时,这不是问题。但是当父母身体素质一样的时候,我们就有问题了。
因为论文说:
在组成后代时,基因是从匹配基因的父母中随机选择的,而所有多余或不相交的基因总是来自更适合的父母,或者如果它们同样适合,则来自父母双方。
因此,如果父母同样合适,后代就会有联系[0, 2, 3, 4, 5]
。这意味着某些节点具有双重连接......删除全局创新计数器,只需通过查看 node_in 和 node_out 来分配 id,就可以避免这个问题。
所以当你有同样合适的父母时,是的,你已经优化了算法。但这几乎从来没有发生过。
很有趣:在较新版本的论文中,他们实际上删除了粗体线!旧版本在这里。
顺便说一句,您可以通过使用配对函数根据 node_in 和 node_out 分配 ID 而不是分配创新 ID 来解决此问题。当适应度相等时,这会创建非常有趣的神经网络:
我无法提供详细的答案,但创新数字可以使 NEAT 模型中的某些功能达到最佳状态(例如计算基因的种类),并允许可变长度基因组之间的交叉。NEAT 中不需要交叉,但由于创新数量,它可以完成。
我从这里得到了所有的答案:
http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf
这是一个很好的阅读
在交叉过程中,我们必须考虑在个人神经网络中的两个相同节点之间共享连接的两个基因组。我们如何检测这种碰撞,而无需在每一步交叉中一遍又一遍地迭代两个基因组的连接基因?简单:如果在交叉期间检查的两个连接共享一个创新编号,那么它们连接的是相同的两个节点,因为它们从同一个共同祖先那里接收到该连接。
简单的例子:如果我是一个具有特定连接基因且创新编号为“i”的基因组,那么从我身上获取基因“i”的我的孩子最终可能会在 100 代后相互交叉。我们必须检测我的基因“i”的这两个进化版本(等位基因)何时发生碰撞,以防止两者兼而有之。取两个相同的基因可能会导致表型循环和崩溃,从而杀死基因型。
当我创建我的第一个 NEAT 实现时,我也是这么想的……你为什么要保留一个创新数字跟踪器……?为什么你只用一代人?根本不保留它并使用与连接的节点相同的键值不是更好吗?
现在我正在实施我的第三次修订,我可以看到 Kenneth Stanley 试图对它们做什么,以及为什么他只想将它们保留一代。
创建连接后,它将在那个时刻开始优化。它标志着它的起源。如果在另一代中弹出相同的连接,则将开始其优化。代号试图将来自共同祖先的代号分开,因此经过多代优化的代号不会与刚刚生成的代号并排放置。如果在两个基因组中发现相同的连接,则意味着该基因来自同一来源,因此可以对齐。
想象一下,你有你的一代冠军。由于对齐的基因被平等对待,他们的一些基因将有 50% 的机会丢失。
什么是更好的...?我还没有看到任何比较这两种方法的实验。
Kenneth Stanley 还在 NEAT 用户页面中解决了这个问题:https ://www.cs.ucf.edu/~kstanley/neat.html
创新记录应该永远保留,还是只保留给当代人?
在我的 NEAT 实现中,记录只保留一代,但永远保留它们并没有错。事实上,它可能会更好。这是长篇的解释:
在我的 NEAT 实现中,我没有在整个运行过程中保留记录的原因是因为我觉得将在完全不同的情况下发生的相同突变称为不直观。也就是说,很可能在几代之后,同一连接相对于网络中所有其他连接的“意义”或贡献与它在几代前出现时的情况不同。我用一代人作为衡量这种情况的标准,尽管这无疑是临时性的。
也就是说,从功能上讲,我认为永远保持创新没有任何问题。主要效果是产生更少的物种。相反,不保留它们会导致更多的物种……其中一些代表相同的事物,但仍然分开。目前尚不清楚哪种方法在什么情况下会产生更好的结果。
请注意,随着物种的分化,将出现在一个物种中的连接称为与更早出现在另一个物种中的连接不同的名称只会增加物种的不相容性。这并没有改变太多,因为它们一开始就不兼容。另一方面,如果同一个物种增加了它在前一代中添加的联系,那一定意味着该物种的一些成员还没有接受这种联系……所以现在很可能是那个的第一个“版本”开始有帮助的联系会胜出,而另一个会消失。第三种情况是连接已经被一个物种普遍采用。在这种情况下,不可能有突变在该物种中产生相同的连接,因为它已经被采用了。重点是,你不
哪种方式效果最好是一个好问题。如果您对这个问题有任何有趣的实验结果,请告诉我。
我的第三次修订将允许这两种选择。当我有结果时,我会在这个答案中添加更多信息。