7

我是一名博士生,正在尝试将该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.htmlNEAT出现在软件目录的“官方”软件网页中。

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

因此,我测试了第二个库。该MultiNEAT库比前一个库收敛得更快、更容易。(我假设这是由于 C++ 实现而不是纯 Python)我得到了类似的结果,但我仍然有同样的问题;缺乏准确性。第二个库也有不同的配置参数,我还没有找到合适的组合来提高问题的性能。

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

如果有人在我提出问题的方式中发现一些概念或技术错误,我会写下我正在做的事情:

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

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

  1. “Y”是网络的输入,“X”是输出。神经网络的激活函数是 sigmoid 函数。
  2. 我创建了一个“n”个样本的数据集,给定“X”的 xmin = 0.0xmax = 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 个 epoch 之后可以实现小于 1% 的误差)层有 5 个神经元)。

此时,我想知道发生的情况是否正常,因为我不应该使用数据集来开发控制器,它必须“在线”学习,并且NEAT看起来适合我的问题。

提前致谢。

编辑后的帖子:

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

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

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

50 代后进化,人口 150 人

虽然这个例子中的人口规模不是很大,但我在增加个体数量或世代数的实验中获得了类似的结果。例如,500 个人和 500 代的人口。在这个实验中,he 算法快速收敛到一个解,但是一旦到了那里,最好的解就被卡住了,它不再改进了。

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

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

  • 突变参数随着突变的高概率(权重和神经元概率)而变化,以便找到新的解决方案,旨在从当前基因组“跳跃”到其他更好的基因组。

    • 神经元突变减少到0,而权重“ mutation probability”增加“ mutate weight”在较低的范围内,以便获得轻微的修改,目的是获得更好的权重调整。(试图获得与反向传播“相似”的功能。对权重进行轻微更改)

这两个实验没有像我预期的那样奏效,而且人群中最好的基因组也和之前的人群一样。

  1. 很抱歉,但我不太明白你想说什么“在你的健身功能中应用你自己的加权惩罚和奖励”。在健身功能中加入体重惩罚是什么意思?

问候!

4

1 回答 1

1

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

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

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

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

于 2018-12-11T22:54:05.797 回答