【发布时间】:2018-12-04 11:21:47
【问题描述】:
我是一名博士生,正在尝试使用 NEAT 算法作为机器人的控制器,但我遇到了一些准确性问题。我正在使用 Python 2.7 并为此使用两个 NEAT python 实现:
- 此 GitHub 存储库中的
NEAT:https://github.com/CodeReclaimers/neat-python 在谷歌上搜索,好像已经在一些项目中成功使用过。 -
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^3 或y = x^2 + x^3或类似功能)
我开发该程序所遵循的步骤是:
- “Y”是网络的输入,“X”是输出。这 神经网络的激活函数是 sigmoid 函数。
- 我创建了一个包含“n”个样本的数据集,给定值到“X”之间
xmin = 0.0和xmax = 10.0 -
当我使用 sigmoid 函数时,我对“Y”进行了归一化 和“X”值:
- “Y”在 (Ymin, Ymax) 和 (-2.0, 2.0) 之间线性归一化(sigmoid 的输入范围)。
- “X”在 (Xmin, Xmax) 和 (0.0, 1.0) 之间线性归一化(sigmoid 的输出范围)。
创建数据集后,我在训练样本中细分(70% 总量的百分比),一个验证样品和一个测试样品 (各占 15%)。
-
此时,我创建了一群人来做 进化。总体中的每个个体都在所有 训练样本。每个位置被评估为:
eval_pos = xmax - abs(xtarget - xobtained)
个人的适应度是所有火车位置的平均值(我也选择了最小值,但它给我的表现更差)。
在整个评估之后,我测试了最好的个人 针对测试样品。这是我获得这些的地方 “不精确的价值观”。此外,在评估过程中, “abs(xtarget - xobtained) = 0”的最大值从不 获得。
此外,我假设我处理数据的方式是正确的,因为我使用相同的数据集在Keras 中训练神经网络,我得到的结果比 NEAT 好得多(小于 1% 的误差是可以在 5 个神经元的层中经过 1000 个 epoch 后实现)。
此时,我想知道发生的情况是否正常,因为我不应该使用数据集来开发控制器,必须“在线”学习,NEAT 看起来是一个合适的解决方案解决我的问题。
提前致谢。
编辑后的帖子:
首先,感谢尼克的评论。 我会在下面回答你的问题::
我正在使用
NEAT算法。是的,我已经进行了增加种群中个体数量和世代数的实验。我得到的典型图表是这样的:
虽然这个例子中的种群规模不是很大,但我在增加个体数量或世代数的实验中获得了类似的结果。例如,500 个人和 500 代的人口。在这个实验中,he算法快速收敛到一个解,但是一旦收敛,最好的解就被卡住了,并且不再改进。
正如我在上一篇文章中提到的,我已经尝试了许多不同参数配置的实验......并且图形或多或少与之前显示的相似。
此外,我尝试过的其他两个实验是:一旦进化达到最大值和中值收敛的点,我会根据该基因组使用新的配置参数生成其他种群,其中:
-
突变参数随着突变的高概率(权重和神经元概率)而变化,以便找到新的解决方案,旨在从当前基因组“跳跃”到其他更好的基因组。
- 神经元突变减少到 0,而权重“
mutation probability”在较低范围内增加“mutate weight”,以便进行轻微修改,以更好地调整权重。 (试图获得与反向传播“相似”的功能。稍微改变权重)
- 神经元突变减少到 0,而权重“
这两个实验没有像我预期的那样奏效,种群中最好的基因组也与之前的种群相同。
- 很抱歉,但我不太明白你想说什么“在你的健身功能中应用你自己的加权惩罚和奖励”。在适应度函数中加入体重惩罚是什么意思?
问候!
【问题讨论】:
标签: python neat es-hyperneat