NEAT算法结果精度

Mar*_*tin 5 python neat es-hyperneat

我是一名博士生,他试图将该NEAT算法用作机器人的控制器,我对它有一些准确性问题.我正在使用Python 2.7和它,并使用两个NEATpython实现:

  1. 这个NEAT在GitHub存储库中:https://github.com/CodeReclaimers/neat-python 在Google中搜索,看起来它已经在一些项目中被使用了.
  2. multiNEAT由Peter Chervenski和Shane Ryan开发的图书馆:http://www.multineat.com/index.html.它出现在NEAT软件目录的"官方"软件网页中.

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

因此,我测试了第二个库.该MultiNEAT库比前一个库快速,简单地汇聚.(我假设这是由于C++实现而不是纯Python)我得到了类似的结果,但我仍然有同样的问题; 缺乏准确性.第二个库也有不同的配置参数,我没有找到它们的正确组合来改善问题的性能.

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

我将写下我正在做的事情,以防有人在我提出问题的方式中看到一些概念或技术错误:

为了简化问题,我将展示一个很简单的例子:我有一个非常简单的问题要解决,我想是可以计算如下功能NN: y = x^2(类似的结果发现y=x^3y = x^2 + x^3或类似功能)

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

  1. "Y"是网络的输入,"X"是输出.神经网络的激活函数是sigmoid函数.
  2. 我创建了一个"n"个样本的数据集,给出了" xmin = 0.0和"之间的"X"值 xmax = 10.0
  3. 当我使用sigmoid函数时,我对"Y"和"X"值进行了规范化:

    • "Y"在(Ymin,Ymax)和(-2.0,2.0)(sigmoid的输入范围)之间线性归一化.
    • "X"在(Xmin,Xmax)和(0.0,1.0)(sigmoid的输出范围)之间线性归一化.
  4. 创建数据集后,我将列车样本(总量的70%),验证样本和测试样本(每个15%)细分.

  5. 在这一点上,我创造了一群进化的人.在所有列车样本中评估每个人群.每个职位评估为:

    eval_pos = xmax - abs(xtarget - xobtained)

    个人的适应性是所有列车位置的平均值(我也选择了最小值,但它给我的性能更差).

  6. 在整个评估之后,我针对测试样品测试获得的最佳个体.这是我获得那些"不准确的价值观"的地方.此外,在评估过程中,从未 获得"abs(xtarget-xobtained)= 0"的最大值.

此外,我假设我如何操纵数据是正确的,因为我使用相同的数据集来训练神经网络,Keras并且我得到比NEAT更好的结果(在1000个时期之后可以实现小于1%的误差)有5个神经元的层).

在这一点上,我想知道发生的事情是否正常,因为我不应该使用数据数据集来开发控制器,它必须"在线"学习并且NEAT看起来像我的问题的合适解决方案.

提前致谢.

编辑后:

首先,感谢评论尼克.我会在下面回答你的问题::

  1. 我正在使用该NEAT算法.

  2. 是的,我已经进行了实验,增加了人口中的个体数量和代数.我得到的典型图表是这样的:

经过50代的进化,人口为150人

虽然这个例子中的人口规模并不大,但我在增加个体数量或代数的实验中获得了类似的结果.例如,500人的个体和500代的人口.在这个实验中,他的算法快速收敛到一个解决方案,但是一旦到那里,最好的解决方案就会陷入困境,而且它不再有所改进.

正如我在上一篇文章中提到的,我已经尝试了几个不同参数配置的实验......并且图形或多或少类似于之前的显示.

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

  • 突变参数随着突变的高概率(体重和神经元概率)而变化,以便找到新的解决方案,目的是从当前基因组"跳跃"到更好的其他基因组.

    • 神经元突变减少到0,而重量" mutation probability" mutate weight在较低范围内增加" ",以便稍微修改,目的是更好地调整重量.(试图获得与backprop相似的"类似"功能.在权重上做出轻微的改变)

这两个实验没有按照我的预期发挥作用,人口的最佳基因组也与之前的人口相同.

  1. 对不起,但是我不太清楚你想用"在你的健身功能中应用你自己的加权惩罚和奖励"想说什么.你在健身功能中包括体重惩罚是什么意思?

问候!

nic*_*ckw 1

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

您是否尝试过增加种群规模以加快搜索速度并增加代数?我用它来完成交易任务,通过增加人口规模,我的冠军被发现得更快。

另一件需要考虑的事情是在你的适应度函数中应用你自己的加权惩罚和奖励,这样任何不能立即非常接近的东西都会被更快地“消灭”,并且更快地找到正确的基因组。应该注意的是,neat 使用适应度函数来学习,而不是梯度下降,因此它不会以相同的方式收敛,并且您可能需要训练更长的时间。

最后一个问题,你使用的是nee还是hyperneat algofrom multineat