我一直在学习神经网络和遗传算法,为了测试我的学习成果,我尝试制作了一个学习玩Flappy Bird的人工智能:
我让它运行了至少10个小时(过夜甚至更久),但最适应的个体仍然没有显示出从我开始模拟时起在智能上有什么显著的进步,除了避免碰到地面和天花板。输入是作为视线的射线(如上图所示),网络接收它们的长度和鸟的垂直速度。看起来最优秀的鸟基本上忽略了所有视线,除了水平的那条,当它非常短时,鸟就会跳。输出是一个0到1之间的数字,如果输出大于0.5,鸟就会跳。网络有4个隐藏层,每层有15个神经元,输入层向前馈送到第一个隐藏层,然后第一个隐藏层向前馈送到第二个隐藏层…最后一个隐藏层向前馈送到输出层,鸟的DNA是一个表示神经网络权重的实数数组,我用相同风格的神经网络和遗传算法做过另一个项目,让蚂蚁去寻找食物,结果非常完美。
这是代码: https://github.com/Karan0110/flappy-bird-ai
请在评论中说明如果您需要任何额外的信息
请告诉我我的方法是否有问题,因为我几乎可以肯定代码是正确工作的(我从之前的成功项目中获取的)。
回答:
我喜欢你的想法,但我建议你做一些改变。
-
不要使用固定结构的网络。查找神经拓扑的进化增强,并自己实现它,或者使用像neataptic这样的库。
- 我认为你的网络不需要那么多输入。我认为3-5个传感器(20-50°的间隔)就足够了,因为许多输入值看起来非常相似。
如果你不确定你的项目为什么不工作,可以尝试以下方法:
-
尝试查看你当前最佳网络的图像。如果网络没有考虑重要的传感器(如速度),你会立即发现。
-
确保所有传感器都正常工作(从上图来看没问题),并确保以有意义的方式对值进行归一化处理。
-
检查最大和平均得分是否随时间增加。如果没有增加,你的遗传算法可能没有正常工作,或者你的网络接收到的输入不足以解决问题。
一个对我帮助很大的技巧是,将遗传算法的精英保存在一个单独的数组中。只有当其他网络的表现优于精英时,才替换精英网络。让精英贯穿所有世代,这样一旦你的算法找到一个特别好的解决方案,如果没有其他更好的表现,它就不会在未来的任何世代中丢失。