我不明白NEAT算法如何根据连接基因接收输入并输出数字。我熟悉在固定拓扑的神经网络中使用矩阵进行前馈输入的方法,但是由于NEAT中的每个节点都有自己数量的连接,并且不一定与其他所有节点连接,我不明白其工作原理,并且在大量搜索后,我找不到NEAT如何根据输入产生输出的答案。
有人能解释一下这是如何工作的吗?
回答:
这也是我在实现自己的算法版本时遇到的问题。
您可以在NEAT用户页面找到答案:https://www.cs.ucf.edu/~kstanley/neat.html,作者在其中提到:
如何激活具有任意拓扑的网络?
激活函数,bool Network::activate(),提供了具体细节。当然,与简单的分层前馈网络的实现大不相同。每个节点都会将来自上一时间步的所有传入节点的激活值相加。(该函数还处理一种特殊的“时间延迟”连接,但我们在已发表的任何实验中都没有使用当前版本的NEAT。)另一种理解方式是意识到激活不会在一个时间步内从输入层传输到输出层。在一个时间步内,激活只会从一个神经元传输到下一个。因此,激活从输入传输到输出的过程需要多个时间步。如果你想想看,这与真实大脑的运作方式相同,一个信号击中你的眼睛后需要一段时间才能传输到大脑皮层,因为它要经过多个神经连接。
因此,如果一个进化出的网络不是前馈网络,那么网络的输出会在不同的时间步发生变化,这在环境不静态的连续控制问题中特别有用,但在分类问题中可能存在问题。作者还回答了:
如何确保在获取分类问题的输出之前网络稳定?
简单粗暴的方法是连续激活n次,其中n>1,并希望没有太多循环或隐藏节点的长路径。
正确(且相当不错)的方法是检查每个隐藏节点和输出节点在连续时间步之间的变化,如果没有任何变化,或者至少在某个delta范围内没有变化。一旦满足这一标准,输出就必须是稳定的。
请注意,在某些情况下,输出可能不会总是稳定。对于连续控制问题,不要检查稳定性,因为网络永远不会“稳定”,而是持续对变化的环境做出反应。通常,稳定性用于分类问题或棋盘游戏中。