你如何通过考虑循环来实现 NEAT?

人工智能 整洁的
2021-10-24 11:19:12

我正在根据 2002 年的原始论文“通过不断发展的神经网络拓扑进行高效强化学习”(Kenneth O. Stanley 和 Risto Miikkulainen)来实现我自己的 NEAT 算法。算法的设计方式可能会在隐藏层的连接中产生循环。这显然会导致计算输出的困难。

我搜索并遇到了两种方法。像这个例子这样的集合声称该值应该像在 RNN 中看到的时间序列一样计算,并且循环节点应该使用“旧”值作为它们的“当前”输出。但是,这似乎是错误的,因为训练数据并不总是有序的,并且之前的值与当前的值无关。

像这个例子的第二组声称应该用某种方法修剪结构以避免循环和循环。这种方法除了做起来真的很昂贵之外,也违背了算法的核心思想。像这样删除连接可能会导致以后的结构更改。

到目前为止,我自己尝试将未知的前向值设置为 0,这隐藏了连接(因为它的权重对结果没有影响),但也因两个原因而失败。一是我的网络迅速变大,破坏了“所需的最小网络”的想法,结果也不好。

什么是正确的方法?

2个回答

NEAT 没有采用前馈概念,也没有采取任何特殊措施来避免循环。

网络在非递归模型中进行评估。评估具有的唯一非确定性循环是用于激活所有输出的循环。伪代码是这样的,

Until all the outputs are active
    for all non-sensor nodes
        activate node
        sum the input
    for all non-sensor and active nodes
        calculate the output

注意1:您可以使用防御机制(如计数器)来避免无限循环

注意 2:在对输入求和时,考虑至少被评估/计算一次的节点的输出,否则它们的输出被假定为零。

这是 NEAT 的作者关于识别循环的注释,

请注意,通常不需要检查网络中的循环,因此我停止编写此函数

布尔网络::完整性()

您可以使用前馈式网络,以便每个节点输出到除输出节点之外的更高节点。这将消除连接环路。