如何在Neuroevolution中进化神经网络的权重?

rem*_*e32 15 machine-learning neural-network genetic-algorithm evolutionary-algorithm deep-learning

我是人工神经网络和NeuroEvolution算法的新手.我正在尝试实现名为NEAT(NeuroEvolution of Augmented Topologies)的算法,但原始公共报纸中的描述错过了如何演化网络权重的方法,它说"连接权重在任何NE系统中变异,与每一个连接在每一代都是否受到干扰".

我已经做了一些关于如何在NE系统中改变权重的搜索,但遗憾的是找不到任何详细的描述.

我知道在训练NE时,通常使用反向传播算法来校正权重,但只有在您拥有固定的拓扑(结构)代数并且您知道问题的答案时,它才有效.在NeuroEvolution中你不知道答案,你只有健身功能,所以在这里不可能使用反向传播.

ane*_*eal 15

我有一些使用遗传算法训练固定拓扑NN的经验(本文所称的"传统NE方法").我们使用了几种不同的突变和繁殖算子,我们随机选择了它们.

鉴于两位家长,我们的复制运营商(也可称为这些交叉运营商)包括:

  • 交换网络中给定神经元的单个权重或所有权重.因此,例如,如果选择两个父母进行复制,或者选择网络中的特定权重并交换价值(对于我们的交换,我们生成两个后代,然后选择具有最佳适应性的一个在下一代人群中存活),或选择网络中的特定神经元并交换该神经元的所有权重以产生两个后代.

  • 交换整个图层的权重.因此,给定父母A和B,选择一个特定的图层(两者中的同一图层)并交换它们之间的所有权重以产生两个offsping.这是一个很大的举动,所以我们进行设置,以便选择此操作的频率低于其他操作.此外,如果您的网络只有几层,这可能没有意义.

我们的变异算子在一个网络上运行,并选择一个随机权重,并且:

  • 完全用新的随机值替换它
  • 将重量改变一定百分比.(将权重乘以0到2之间的一些随机数 - 实际上我们倾向于约束一点并将其乘以0.5到1.5之间的随机数.这具有缩放权重的效果,因此它不会改变你也可以通过缩放特定神经元的所有权重来做这种操作.
  • 在权重中加上或减去0到1之间的随机数.
  • 改变重量的标志.
  • 在单个神经元上交换权重.

您当然可以通过变异算子获得创造力,您可能会发现一些更适合您特定问题的东西.

IIRC,我们会根据随机比例选择从人群中选择两个父母,然后对每个父母进行变异操作,然后通过复制操作运行这些变异父母,并通过适应性函数运行两个后代以选择最适合的进入下一代人口.

当然,在你的情况下,由于你也在不断改进拓扑结构,上面的一些复制操作也没有多大意义,因为两个选定的父节点可能具有完全不同的拓扑结构.在NEAT中(据我所知),您可以在网络的非连续层之间建立连接,例如,您可以在第4层中将第1层神经元馈送到另一层,而不是直接馈送到第2层.这使得交换操作涉及神经元的所有权重都比较困难 - 您可以尝试选择网络中具有相同权重数量的两个神经元,或者只是坚持在网络中交换单个权重.

我知道在训练NE时,通常使用反向传播算法来校正权重

实际上,在NE中没有使用backprop.这是GA执行的突变,它们正在训练网络作为backprop的替代方案.在我们的例子中,由于网络的一些"非正统"添加,我不会进入后面的问题.但是,如果有可能提供支持,我会坚持下去.训练神经网络的遗传方法肯定比反向支持可能会有的慢得多.此外,当使用进化方法调整网络权重时,您需要调整GA的各种参数,如交叉和突变率.


zeg*_*jan 5

在 NEAT 中,一切都是通过遗传算子完成的。正如您已经知道的,拓扑是通过交叉和突变事件演变而来的。

权重是通过突变事件演变而来的。就像在任何进化算法中一样,权重有一定的概率随机改变(您可以生成一个全新的数字,或者您可以例如向原始权重添加一个正态分布的随机数)。

实现 NEAT 似乎是一项简单的任务,但有很多小细节最终使它变得相当复杂。您可能想查看现有的实现并使用其中之一,或者至少受到它们的启发。所有重要的信息都可以在NEAT 用户页面找到