NEAT算法的结果精度

时间:2018-12-04 11:21:47

标签: python neat es-hyperneat

我是一名博士生,正在尝试将NEAT算法用作机器人的控制器,但我遇到了一些精度问题。我正在使用python 2.7,并且正在使用两个NEAT python实现:

  1. 该GitHub存储库中的NEAThttps://github.com/CodeReclaimers/neat-python 在Google中进行搜索时,似乎已成功将其用于某些项目中。
  2. 由Peter Chervenski和Shane Ryan开发的multiNEAT库:http://www.multineat.com/index.html。 出现在NEAT软件目录的“官方”软件网页上。

在测试第一个时,我发现我的程序可以快速收敛到一个解决方案,但是这种解决方案不够精确。由于缺乏精确度,我想说的是,在演化结束时,与“完美”解相关的中位数和平均值的最小偏差为3-5%(取决于问题的复杂性,误差约为10%对于我的解决方案来说是正常的。此外,我可以说,我从未见过NEAT给出的解决方案与正确的解决方案之间1%以下的错误值)。我必须说,我已经尝试了许多不同的参数组合和配置(这对我来说是个老问题)。

因此,我测试了第二个库。 MultiNEAT库比上一个库更快,更容易收敛。 (我认为这是由于C ++的实现,而不是纯Python造成的),我得到了相似的结果,但是我仍然遇到相同的问题;缺乏准确性。第二个库也具有不同的配置参数,我还没有找到它们的适当组合来提高问题的性能。

我的问题是:
NEAT结果中缺乏准确性是否正常?它实现了很好的解决方案,但不足以控制机器人手臂,这正是我要使用的。

我会写我正在做的事情,以防有人在解决问题时看到一些概念性或技术性错误:

为简化问题,我将举一个非常简单的示例:我有一个非常简单的问题要解决,我想要一个可以计算以下函数的NN:y = x^2(与{{ 1}}或y=x^3或类似功能)

我开发程序所遵循的步骤是:

  1. “ Y”是网络的输入,“ X”是网络的输入。的 神经网络的激活函数是S型函数。
  2. 我创建了一个数据集,其中“ n”个样本的值介于 y = x^2 + x^3xmin = 0.0
  3. 当我使用S型函数时,我对“ Y”进行了归一化 和“ X”值:

    • “ Y”在(Ymin,Ymax)和(-2.0,2.0)(S型输入范围)之间线性归一化。
    • “ X”在(Xmin,Xmax)和(0.0,1.0)(S型输出范围)之间线性标准化。
  4. 创建数据集后,我细分为一个火车样本(70% 总量的百分比),验证样品和测试样品 (每个15%)。

  5. 在这一点上,我创建了一个个人群体 演化。在所有 训练样本。每个职位的评估为:

    eval_pos = xmax-abs(xtarget-xobtained)

    个人的适应度是所有火车位置的平均值(我也选择了最小值,但它使我的表现更差)。

  6. 在整体评估之后,我测试了获得最佳成绩的个人 对测试样品。这是我获得那些东西的地方 “不精确的值”。此外,在评估过程中, “ abs(xtarget-xobtained)= 0”的最大值为从不 获得。

此外,我认为我处理数据的方式是正确的,因为我使用相同的数据集在xmax = 10.0中训练神经网络,并且得到的结果比NEAT更好(误差小于1在具有5个神经元的层中经过1000个周期后,可以达到%。

在这一点上,我想知道发生的事情是否正常,因为我不应该使用数据集来开发控制器,因此必须“在线”学习,Keras看起来像是解决我的问题的合适方法。

谢谢。

编辑后的帖子:

首先,感谢您的评论尼克。 我将在下面回答您的问题:

  1. 我正在使用NEAT算法。

  2. 是的,我已经进行了一些实验,以增加人口总数和世代数。我得到的典型图形是这样的:

Evolution after 50 generations with a population of 150 individuals

尽管本例中的人口规模不是很大,但我在增加个体数量或世代数量的实验中获得了相似的结果。例如,个人和500代中有500个人口。在该实验中,he算法可以快速收敛到一个解决方案,但是一旦找到最佳解决方案,它就会陷入困境,并且不再有任何改进。

正如我在上一篇文章中提到的那样,我已经尝试了许多具有许多不同参数配置的实验...图形与上一幅显示的大致相似。

此外,我尝试的其他两个实验是:一旦进化达到最大值和中值收敛的点,我将根据具有新配置参数的基因组生成其他种群,其中:

  • 突变参数具有很高的突变概率(体重和神经元概率),以便找到新的解决方案,以期从当前的基因组“跳跃”到其他更好的基因。

    • 神经元突变减少为0,而权重“ NEAT”在较低的范围内增加“ mutation probability”,以进行轻微修改,目的是更好地调整重量。 (试图获得与反向传播类似的功能。在重量上稍作更改)

这两个实验没有达到我的预期,该种群的最佳基因组也与先前的种群相同。

  1. 很抱歉,但是我对“在健身功能中应用自己的加权罚款和奖励”要说的话不太了解。在健身功能中包括体重减轻是什么意思?

致谢!

2 个答案:

答案 0 :(得分:0)

免责声明:我为这些库做出了贡献。

您是否尝试过增加人口规模以加快搜索速度并增加世代数?我将其用于交易任务,通过增加人口规模,我的拥护者很快就找到了。

要考虑的另一件事是在健身功能中应用您自己的加权罚分和奖赏,以便很快消除掉那些不是很接近的事物,从而更快地找到正确的基因组。应该注意的是,整洁的人使用健身函数来学习而不是梯度下降,因此它不会以相同的方式收敛,并且可能需要训练更长的时间。

最后一个问题,您使用的是整洁的还是hyperneat algo中的multineat

答案 1 :(得分:0)

嘿,我想我想说的不好,如果您尝试了所有这些,我可能会考虑重写实验以使用超净或es-超净运行,因为它们实际上与原始的净算法有很大不同,遗传是相同,但产生的网络不同。关于惩罚,我说的是您正在运行的实验的适应度函数和用于评估网络的适应度函数,不幸的是,除非您在此处发布更多内容,否则我认为我不会提供太多帮助上下文(对此我感到很抱歉,因为您确实提供了很多,但是一段代码确实可以帮助我为您提供帮助)。