我对人工神经网络和神经进化算法是新手。我正在尝试实现一种名为NEAT(增强拓扑的神经进化)的算法,但在原始公开论文中,关于如何进化网络权重的方法被遗漏了,论文中提到
连接权重在任何神经进化系统中都像这样变异,每个连接在每一代中要么被扰动要么不被扰动
我已经搜索了一些关于在神经进化系统中如何变异权重的信息,但遗憾的是找不到任何详细的描述。
我知道在训练神经网络时,通常使用反向传播算法来调整权重,但这仅在你有固定拓扑(结构)穿越各代并且知道问题的答案时才有效。在神经进化中,你不知道答案,你只有适应度函数,因此在这里无法使用反向传播。
回答:
我有一些使用遗传算法训练固定拓扑神经网络的经验(论文中称为“传统神经进化方法”)。我们使用了几种不同的变异和繁殖操作符,并且随机选择这些操作符。
给定两个父代,我们的繁殖操作符(也可以称为交叉操作符)包括:
-
交换网络中单个权重或特定神经元的所有权重。例如,给定两个选定用于繁殖的父代,可以选择网络中的特定权重并交换其值(对于我们的交换,我们产生两个后代,然后选择适应度最佳的一个在下一代种群中生存),或者选择网络中的特定神经元并交换该神经元的所有权重以产生两个后代。
-
交换整个层的权重。给定父代A和B,选择特定层(在两者中是相同的层)并交换它们之间的所有权重以产生两个后代。这是一个大的移动,所以我们设置了这个操作被选择的频率低于其他操作。此外,如果你的网络只有几层,这可能没有意义。
我们的变异操作符作用于单个网络,并会选择一个随机权重并执行以下操作之一:
- 完全用一个新的随机值替换它
- 通过某个百分比改变权重。(将权重乘以某个介于0和2之间的随机数——实际上我们会稍微限制一下,乘以介于0.5和1.5之间的随机数。这会使权重缩放,从而不会发生太大的变化。你也可以通过缩放特定神经元的所有权重来执行这种操作。
- 在权重上加或减一个介于0和1之间的随机数。
- 改变权重的符号。
- 交换单个神经元上的权重。
你当然可以对变异操作符进行创新,你可能会发现一些对你特定问题更有效的方法。
据我所知,我们会根据随机比例选择从种群中选择两个父代,然后对它们进行变异操作,然后将这些变异的父代通过繁殖操作,并将两个后代通过适应度函数来选择最适合的一个进入下一代种群。
当然,在你的情况下,由于你也在进化拓扑,上述一些繁殖操作可能没有多大意义,因为两个选定的父代可能有完全不同的拓扑。在NEAT中(据我所知),你可以在网络的非连续层之间建立连接,例如,你可以让第一层的某个神经元直接连接到第四层的另一个神经元,而不是直接连接到第二层。这使得涉及神经元所有权重的交换操作变得更加困难——你可以尝试选择网络中具有相同数量权重的两个神经元,或者只坚持交换网络中的单个权重。
我知道在训练神经进化时,通常使用反向传播算法来调整权重
实际上,在神经进化中不使用反向传播。训练网络的替代方法是遗传算法执行的变异。在我们的案例中,由于网络中一些“非正统”的添加,反向传播存在问题,我就不详细说明了。然而,如果反向传播是可能的,我会选择那样的方法。使用遗传方法训练神经网络显然比反向传播可能要慢得多。此外,当使用进化方法调整网络的权重时,你开始需要调整遗传算法的各种参数,如交叉和变异率。