当一个人使用 NEAT 进化出最适合一项任务的网络时,训练是否也在每个 epoch 中进行?
如果我理解正确的话,训练就是通过反向传播和梯度下降来调整神经网络的权重。例如,在 NEAT 期间,一代运行 1000 次迭代。在那段时间里,是否有任何训练,或者每个基因组随机四处寻找,获胜者将其带到下一个阶段?
我用过 NEAT,但神经网络未经训练的事实对我来说没有意义。同时,我在我的框架 ( Neataptic.js ) 中找不到任何可以在该时期训练生成的代码。
当一个人使用 NEAT 进化出最适合一项任务的网络时,训练是否也在每个 epoch 中进行?
如果我理解正确的话,训练就是通过反向传播和梯度下降来调整神经网络的权重。例如,在 NEAT 期间,一代运行 1000 次迭代。在那段时间里,是否有任何训练,或者每个基因组随机四处寻找,获胜者将其带到下一个阶段?
我用过 NEAT,但神经网络未经训练的事实对我来说没有意义。同时,我在我的框架 ( Neataptic.js ) 中找不到任何可以在该时期训练生成的代码。
NEAT 使用遗传算法来搜索改进的连接权重和改进的架构。
虽然可以使用误差梯度的反向传播来训练 NEAT 生成的神经网络,但实现“原始”NEAT 的库不会实现这一点。
有几个原因:
在监督学习的意义上,通常没有训练数据。NEAT 系统的适应度函数可以通过某些任务的性能来任意测量,在一般情况下,这包括一些与 NN 控制的代理交互的环境模拟,而不是训练数据本身。
演进的网络拓扑不符合旨在运行典型深度学习架构的 ML 框架首选的堆叠层模型。
这两个问题都可以通过一点努力来解决(例如,对于第二个问题,有一些框架可以处理任意前馈连接图,它们只是比 Keras 更小众)。然而,NEAT 经常被使用,因为它可以解决问题,而无需将它们定义为监督学习或强化学习。
除了将它们组合在一起的艰苦工作之外,没有什么能阻止您创建一个数据训练阶段,该阶段可以在两种方法之间交替,可能具有从进化到基于梯度的训练的可控权重。要添加基于梯度的训练,则可以:
a)您的原始问题是适合分类器或回归问题之一。在这种情况下,您的适应度函数和训练损失函数可能相同。
b)您最初的问题是控制环境中的代理之一,您可能会使用基于最近评估的 REINFORCE 算法之类的东西,以便提供梯度来训练 NN。其他策略梯度方法也很适合,因为 NEAT 网络通常输出策略而不是值预测。
我从来没有尝试过这些(除了演示和一些理论之外,NEAT 也没有尝试过)。对于 (a) 我希望这种组合会成功,但想知道您为什么首先要为 NEAT 烦恼。对于(b)我不太确定你是否会得到有用的结果,因为 REINFORCE 依赖于同一个网络的多次运行,而 NEAT 依赖于跨多个网络的随机搜索。在整个人群中应用 REINFORCE 训练可能会占用大量 CPU。