我最近阅读了介绍 NEAT的论文Evolving Neural Networks through Augmenting Topologies 。我现在正在尝试用 JavaScript 自己制作原型。但是,我偶然发现了一些我无法回答的问题。
关于 NEAT 算法的几个问题
人工智能
神经网络
遗传算法
进化算法
整洁的
神经进化
2021-11-05 07:06:38
1个回答
- “结构创新”的定义是什么,我如何存储这些,以便检查之前是否已经发生过创新?
结构创新是添加任何改变网络拓扑的东西。因此,结构创新是任何添加的连接或添加的节点。我不想过多地了解实现,但是类似于字典全局变量的东西会起作用。在两个节点之间添加连接(或节点)时,我们检查之前是否曾在这两个节点之间放置过连接(或节点)。如果有,那么我们已经存储了这个连接(或节点)相同的创新编号,我们将其创新编号设置为那个。我们通过其编号识别每个节点。
- 是否有理由存储节点的类型(输入、隐藏、输出)?
是的,有很多我们不希望发生的结构性创新。两个输入节点之间的创新或两个输出节点之间的创新是我们不想要的结构创新的两个例子。
- 在原始论文中,只有连接具有创新编号,但在其他来源中,节点也是如此。这对交叉有必要吗?(这已经在这里问过了。)
虽然我不确定它是否明确说明,但暗示节点具有标识号。您可以在论文的图 2 和图 3 中看到这一点,其中每个节点都标有一个数字。
- 我怎么能限制变异函数不添加反向传播连接?
通过反向传播连接,我假设您的意思是循环连接(如果我错了,请纠正我)。您可以通过多种方式防止重复连接,但一种方法是维护部分有序集。在两个节点之间添加连接时,您会检查这两个节点在部分有序集中的顺序。第一个将是连接开始的节点,而第二个将是连接结束的节点。
作为说明,我们可以防止重复连接,但通常允许它们提供找到更好解决方案的机会(如@PaulG 评论)