我不明白 NEAT 算法如何根据连接基因获取输入然后输出数字,我熟悉使用固定拓扑神经网络中的矩阵来前馈输入,但是由于 NEAT 中的每个节点都有自己的连接数并且不是'不一定连接到每个其他节点,我不明白,经过大量搜索后,我找不到 NEAT 如何根据输入产生输出的答案。
有人可以解释它是如何工作的吗?
我不明白 NEAT 算法如何根据连接基因获取输入然后输出数字,我熟悉使用固定拓扑神经网络中的矩阵来前馈输入,但是由于 NEAT 中的每个节点都有自己的连接数并且不是'不一定连接到每个其他节点,我不明白,经过大量搜索后,我找不到 NEAT 如何根据输入产生输出的答案。
有人可以解释它是如何工作的吗?
这也是我在实现自己的算法版本时遇到的一个问题。
您可以在 NEAT 用户页面中找到答案:https ://www.cs.ucf.edu/~kstanley/neat.html作者说:
如何激活具有任意拓扑的网络?
激活函数 bool Network::activate() 给出了细节。当然,实现与简单的分层前馈网络有很大不同。每个节点将来自上一个时间步的所有传入节点的激活相加。(该函数还处理一个特殊的“延时”连接,但在我们发布的任何实验中,当前版本的 NEAT 都没有使用它。)理解它的另一种方法是意识到激活不会一直从在单个时间步中将输入层传输到输出层。在单个时间步长中,激活仅从一个神经元传播到下一个神经元。因此,激活从输入到输出需要几个时间步。如果你想一想,这就是它在真实大脑中的工作方式,
因此,如果其中一个进化网络不是前馈的,网络的输出将在不同的时间步长上发生变化,这在环境不是静态的连续控制问题中特别有用,而且在分类问题中也存在问题。作者还回答:
在将输出用于分类问题之前,如何确保网络稳定?
这样做的廉价而肮脏的方法是在 n>1 的情况下连续激活 n 次,并希望没有太多的循环或隐藏节点的长路径。
正确(并且非常好)的方法是检查从一个时间步长到下一个时间步长的每个隐藏节点和输出节点,看看是否没有任何变化,或者至少在某个增量内没有变化。一旦满足这个标准,输出必须是稳定的。
请注意,在某些情况下,输出可能并不总是稳定。此外,对于连续控制问题,不要检查稳定性,因为网络永远不会“稳定”,而是不断对不断变化的环境做出反应。通常,稳定性用于分类问题或棋盘游戏。
当我处理这个问题时,我研究了使用矩阵方法等进行循环检测。 https://en.wikipedia.org/wiki/Adjacency_matrix#Matrix_powers
但我发现前馈输入和获取输出的最佳方法是在每个节点上使用超时传播延迟进行循环检测:
前馈实现很简单,我从那里开始:
等到一个节点的所有传入连接都有信号,然后 sum-squash 激活并发送到该节点的所有输出连接。从已经有来自输入向量的信号的输入节点开始。一旦没有更多节点要处理以获得输出向量,则使用 sum-squash 操作手动“分流”输出节点。
对于循环性(传统的 NEAT 实现),我做了与前馈相同的操作,但多了一个功能:
计算网络的“最大可能循环大小”。一个简单的计算方法是~2*(节点总数)。在没有循环的情况下,从输入到网络中任何节点的步行都不会比这更大,因此节点必须在这么多时间步内传播,除非它是循环的一部分。然后我等到所有输入连接信号到达节点或发生超时(信号在最大循环大小步长内未到达连接)。如果发生超时,则将没有信号的输入连接标记为循环。一旦连接被标记为循环,重新启动所有节点上的所有计时器(以防止在检测到的循环中稍后的节点由于传播延迟而被标记为循环)
现在前向传播与前馈网络相同,除了:不要等待循环连接,只要所有非循环连接都到达就进行 sum-squash(0 表示还没有信号的循环连接)。这确保了循环中到达的第一个节点设置为循环,使其对于任何给定的拓扑具有确定性,并且循环连接将数据传递到下一个传播时间步长。
这有一些第一次开销,但很简洁,并且每次运行时都会使用给定的拓扑产生相同的结果。请注意,这仅在所有节点都有输出路径时才有效,因此您不必禁用拆分连接(由节点添加操作建立的连接)并在进化过程中随机修剪而不考虑。
(PS 这也创建了一个传统的残差循环网络,理论上可以实现为矩阵运算微不足道。如果我有大型网络,我将首先通过运行前向传播来“表达”一次以获得循环连接,然后使用循环、权重和信号连接属性为矩阵乘法运算创建一个“每层张量”表示,循环连接属性为稀疏二进制掩码。我实际上开始编写一个 Tensorflow 实现,它使用 tf.sparse_matrix 操作执行所有突变/增强操作,并且没有使用任何树对象,但我必须使用密集操作,并且消耗的 n^2 空间对于我需要的东西来说太多了,但是这个允许使用上述邻接矩阵幂技巧,因为在矩阵形式!Github 上至少还有一个人已经完成了 tf NEAT,但我不确定他们的实施。我也觉得这很有趣https://neat-python.readthedocs.io/en/latest/neat_overview.html)
快乐黑客!