我是一名博士生,正在尝试将NEAT算法用作机器人的 Controller ,但我遇到了一些准确性问题。我正在使用python 2.7并为此使用两个NEAT python实现:

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

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

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

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

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

    为了简化这个问题,我将展示一个非常简单的示例:我有一个非常简单的问题要解决,我想要一个可以计算以下函数的NN:y = x^2(使用y=x^3y = x^2 + x^3或类似的函数可以找到类似的结果)

    我开发该程序所遵循的步骤是:
  • “Y”是网络的输入,“X”是网络的输入。这
    神经网络的激活函数是S型函数。
  • 我创建了一个“n”个样本的数据集,给定了“X”之间的值。xmin = 0.0xmax = 10.0
  • 当我使用S型函数时,我对“Y”进行了归一化
    和“X”值:
  • “Y”在(Ymin,Ymax)和(-2.0,2.0)(S型输入范围)之间线性标准化。
  • “X”在(Xmin,Xmax)和(0.0,1.0)(S型输出范围)之间线性标准化。
  • 创建数据集后,我将其分割为一个火车样本(70%
    总量的百分比),验证 sample 和测试 sample
    (每个15%)。
  • 至此,我创建了一个个人群体
    进化。人口中的每个人都在所有
    训练样本。每个职位的评估为:

    eval_pos = xmax-abs(xtarget-xobtained)

    个人的适应度是所有列车位置的平均值(我也选择了最小值,但它却使我的表现更差)。
  • 经过全面评估,我测试了获得最佳成绩的个人
    对测试 sample 。这是我获得那些东西的地方
    “不精确的值”。此外,在评估过程中,
    “abs(xtarget-xobtained)= 0”的最大值为从不
    获得。

  • 此外,我认为我处理数据的方式是正确的,因为我使用相同的数据集来训练Keras中的神经网络,并且得到的结果比NEAT更好(在1000个历元之后,误差小于1%)具有5个神经元的层)。

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

    提前致谢。

    编辑后:

    首先,感谢您的评论尼克。
    我将在下面回答您的问题::
  • 我正在使用NEAT算法。
  • 是的,我进行了实验,增加了人口总数和世代数。我得到的典型图形如下:

  • python - NEAT算法结果精度-LMLPHP

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

    正如我在上一篇文章中提到的那样,我已经尝试了使用许多不同参数配置的多个实验……并且图形与上一个显示的大致相同。

    此外,我尝试的其他两个实验是:一旦进化达到最大值和中值收敛的点,我将根据具有新配置参数的基因组生成其他种群,其中:
  • 突变参数以很高的突变概率(体重和神经元概率)变化,以便找到新的解决方案,目的是“从”当前基因组“跳跃”到其他更好的基因组。
  • 神经元突变减少为0,而“mutation probability”的权重“mutate weight”在较低的范围内增加,以便进行稍微修改,以更好地调整权重。 (试图获得与反向传播类似的功能。在权重上进行一些细微的更改)

  • 这两个实验没有达到我的预期,并且该种群的最佳基因组也与先前的种群相同。
  • 对不起,“要在健身功能中应用您自己的加权罚分和奖励”,您想说什么我不太明白。在健身功能中包括体重减轻是什么意思?

  • 问候!

    最佳答案

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

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

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

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

    关于python - NEAT算法结果精度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53611858/

    10-13 07:52