我是人工神经网络和NeuroEvolution算法的新手。我正在尝试实现名为NEAT(NeuroEvolution of Augmented Topologies)的算法,但original public paper中的描述错过了如何演化网络权重的方法,它说“连接权重变异,就像在任何NE系统中一样,每一个连接在每一代都是不安的“。
我已经做了一些关于如何在NE系统中改变权重的搜索,但遗憾的是找不到任何详细描述。
我知道在训练NE时,通常使用反向传播算法来校正权重,但只有在您拥有固定的拓扑(结构)代数并且您知道问题的答案时,它才有效。在NeuroEvolution中你不知道答案,你只有健身功能,因此不可能在这里使用反向传播。
答案 0 :(得分:14)
我有一些使用遗传算法训练固定拓扑神经网络的经验(本文所指的是传统的NE方法")。我们使用了几种不同的突变和繁殖算子,我们随机选择了它们。
鉴于两位家长,我们的复制运营商(也可称为这些交叉运营商)包括:
交换网络中给定神经元的单个权重或所有权重。因此,例如,如果选择两个父母进行复制,或者选择网络中的特定权重并交换价值(对于我们的交换,我们生成两个后代,然后选择具有最佳适应性的一个在下一代人群中存活),或选择网络中的特定神经元并交换该神经元的所有权重以产生两个后代。
交换整个图层的权重。因此,给定父母A和B,选择一个特定的图层(两者中的同一图层)并交换它们之间的所有权重以产生两个offsping。这是一个很大的举动,所以我们进行设置,以便选择此操作的频率低于其他操作。此外,如果您的网络只有几层,这可能没有意义。
我们的变异算子在一个网络上运行,并且会选择一个随机权重:
你可以通过变异算子获得创造力,你可能会发现一些更适合你特定问题的东西。
IIRC,我们会根据随机比例选择从群体中选择两个父母,然后对每个父母进行变异操作,然后通过繁殖操作运行这些变异父母,并通过适应度函数运行两个后代以选择最适合的一个进入下一代人群。当然,在您的情况下,由于您还在拓展拓扑结构,因此上述某些复制操作不会有多大意义,因为两个选定的父级可能具有完全不同的拓扑结构。在NEAT中(据我所知),您可以在网络的非连续层之间建立连接,例如,您可以在第4层中将第1层神经元馈送到另一层,而不是直接馈送到第2层。这使得交换操作涉及神经元的所有权重都比较困难 - 您可以尝试在网络中选择具有相同权重数的两个神经元,或者只是坚持在网络中交换单个权重。
我知道在训练NE时,通常使用反向传播算法来校正权重
实际上,NE中没有使用backprop。它是由GA执行的突变,它们正在训练网络作为backprop的替代方案。在我们的案例中,由于一些非正统的"我不会进入网络的新成员。但是,如果有可能提供支持,我会坚持下去。训练神经网络的遗传方法肯定比反向支持可能会有的慢得多。此外,当使用进化方法调整网络权重时,您需要调整GA的各种参数,如交叉和变异率。
答案 1 :(得分:4)
在NEAT中,一切都是通过遗传算子完成的。如您所知,拓扑结构是通过交叉和变异事件发展而来的。
权重是通过突变事件进化而来的。与任何进化算法一样,重量有可能随机变化(您可以生成一个全新的数字,或者您可以例如将正态分布的随机数添加到原始权重中)。
实施NEAT似乎是一件容易的事,但是有很多细节使得它最终变得相当复杂。您可能希望查看现有实现并使用其中一个或至少受其启发。重要的一切都可以在NEAT Users Page找到。