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