【问题标题】:NeuroEvolution of Augmenting Topologies (NEAT) and global innovation number增强拓扑的神经进化 (NEAT) 和全球创新数量
【发布时间】:2016-07-13 09:35:49
【问题描述】:

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

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

更新

是算法优化吗?

【问题讨论】:

    标签: machine-learning neat es-hyperneat


    【解决方案1】:

    我无法提供详细的答案,但创新编号可以使 NEAT 模型中的某些功能达到最佳状态(例如计算基因的种类),并允许可变长度基因组之间的交叉。 NEAT 中不需要交叉,但由于创新数量,它可以完成。

    我从这里得到了所有答案:

    http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf

    很好读

    【讨论】:

    • 是的,我使用这个文档来实现我的 rust 版本github.com/TLmaK0/rustneat。我没有使用创新号,我能够获得物种,并与可变长度基因组进行交叉
    • 我很想知道您是如何在不使用创新编号的情况下对种群进行分类的!我看看你的代码
    【解决方案2】:

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

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

    original paper 包含以下内容:

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

    但是论文对以下情况非常不清楚,比如说我们有两个; “相同”(相同结构)网络:

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

    轰隆隆!偶然地,它们突变为相同的新结构。但是,连接 ID 完全不同,即 [0, 2, 3] 用于 parent1,[0, 4, 5] 用于 parent2,因为 ID 是全局计数的。

    但 NEAT 算法无法确定这些结构是否相同。当父母中的一方得分高于另一方时,这不是问题。但是当父母身体素质一样的时候,我们就有问题了。

    因为论文指出:

    在组成后代时,基因是从匹配基因的父母中随机选择的,而所有多余或不相交的基因总是来自更适合的父母,或者如果它们同样适合,则来自父母双方。强>

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

    所以当你有同样合适的父母时,是的,你已经优化了算法。但几乎从来没有这种情况。


    很有趣:在论文的newer version 中,他们实际上删除了粗体线!旧版本here.


    顺便说一句,您可以通过使用pairing functions 根据node_in 和node_out 分配ID 而不是分配创新ID 来解决此问题。当适应度相等时,这会创建非常有趣的神经网络:

    【讨论】:

    • 感谢@Thomas,阅读您的 cmets 让我觉得我应该再次阅读论文!
    【解决方案3】:

    在交叉过程中,我们必须考虑两个基因组,它们在个人神经网络中的两个相同节点之间共享连接。我们如何检测这种碰撞,而无需在每一步交叉中一遍又一遍地迭代两个基因组的连接基因?简单:如果在交叉期间检查的两个连接共享一个创新编号,那么它们连接的是相同的两个节点,因为它们从同一个共同祖先那里接收到该连接。

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

    【讨论】:

      【解决方案4】:

      当我创建我的第一个 NEAT 实现时,我也是这么想的……为什么要保留创新编号跟踪器……?为什么你只用一代人?完全不保留它并使用与连接的节点相匹配的键值不是更好吗?

      现在我正在实施我的第三次修订,我可以看到 Kenneth Stanley 试图对它们做什么,以及为什么他只想将它们保留一代。

      当一个连接被创建时,它会在那一刻开始它的优化。它标志着它的起源。如果在另一代中弹出相同的连接,则将开始其优化。世代数试图将来自共同祖先的那些分开,因此已经优化了许多代的那些不会与刚刚生成的那一个并排放置。如果在两个基因组中发现相同的连接,则意味着该基因来自同一来源,因此可以对齐。

      然后想象一下,你有你的一代冠军。由于对齐的基因被平等对待,他们的一些基因将有 50% 的机会丢失。

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

      Kenneth Stanley 还在 NEAT 用户页面中解决了这个问题:https://www.cs.ucf.edu/~kstanley/neat.html

      应该永久保留创新记录,还是只保留当前 一代?

      在我的 NEAT 实现中,记录只保存了一代,但有 永远保持它们并没有错。事实上,它可能会更好。 这是详细的解释:

      我没有在整个跑步过程中保持记录的原因 NEAT 的实现是因为我觉得调用相同的东西 在完全不同的情况下发生的突变不是 直觉的。也就是说,很可能在几代人之后, 同一联系相对于所有其他联系的“意义”或贡献 网络中的连接与出现时的连接不同 几代以前。我用一代人作为衡量这种 情况,尽管这是不可否认的。

      也就是说,从功能上讲,我不认为有什么问题 永远保持创新。主要效果是产生更少的物种。 相反,不把它们留在身边会导致更多的物种……其中一些 代表相同的东西,但仍然分开。目前尚不清楚 哪种方法在什么情况下产生更好的结果。

      请注意,随着物种的分化,将出现在一个物种中的联系称为 与之前出现在另一个名称中的名称不同的名称只会增加 物种不相容。这并没有改变太多,因为它们是 一开始就不兼容。另一方面,如果同一物种添加 它在前几代中添加的连接,这一定意味着某些成员 该物种尚未采用这种联系......所以现在很可能 开始有用的连接的第一个“版本”将胜出,并且 另一个会死去。第三种情况是已经建立了连接 一般被一个物种所采用。在这种情况下,不可能有突变产生 在那个物种中也有同样的联系,因为它已经被采用了。重点是, 你并不期望有太多真正相似的结构具有不同的标记 出现,即使只保留了 1 代的记录。

      哪种方式效果最好是个好问题。如果你有什么有趣的实验 这个问题的结果,请告诉我。

      我的第三次修订将允许这两种选择。当我有结果时,我会在这个答案中添加更多信息。

      【讨论】:

        猜你喜欢
        • 2018-01-05
        • 1970-01-01
        • 1970-01-01
        • 2019-08-29
        • 2019-02-16
        • 2019-11-14
        • 2013-06-30
        • 2017-10-10
        • 2018-03-16
        相关资源
        最近更新 更多