【问题标题】:NEAT algorithm result precisionNEAT 算法结果精度
【发布时间】:2018-12-04 11:21:47
【问题描述】:

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

  1. 此 GitHub 存储库中的 NEAThttps://github.com/CodeReclaimers/neat-python 在谷歌上搜索,好像已经在一些项目中成功使用过。
  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”个样本的数据集,给定值到“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 好得多(小于 1% 的误差是可以在 5 个神经元的层中经过 1000 个 epoch 后实现)。

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

提前致谢。

编辑后的帖子:

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

  1. 我正在使用NEAT 算法。

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

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

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

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

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

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

这两个实验没有像我预期的那样奏效,种群中最好的基因组也与之前的种群相同。

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

问候!

【问题讨论】:

    标签: python neat es-hyperneat


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      相关资源
      最近更新 更多