几个月前我做了一个简单的游戏,类似于谷歌浏览器中的恐龙游戏——你跳过障碍物,或者不跳过悬浮障碍物,然后跳跃收集比特币,比特币可以放置在 5 个不同的高度。我使用了 NYU 教授 Dan Shiffman 编写的一个非常轻量级的神经网络,几天之内游戏和 AI 就完成了,从 200 名跳投者开始,以及一个遗传算法(适应度函数(为避开障碍物和聚集而给出分数)比特币)和突变),它应该可以正常工作。
然而,这只是当比特币和障碍物不靠近时,我一直在努力解决这个问题。
所以,我做了一个“训练场”,我首先放了一个悬浮障碍物,然后是一个接地的障碍物,然后是比特币,然后是第四个接地障碍物上方的比特币,无论我多少次和多长时间。 d让它训练,我总是会以相同的行为结束:
前 3 个障碍物被适当避开,第一个比特币被收集,然后跳跃者跳得太早,在第四个“比特币”障碍物之前降落,然后再次跳跃,总是在几乎同一个地方坠毁(跨越所有世代,所以即使我会重新开始训练,它们在障碍物的同一个地方坠毁,上下有几个像素的偏差)。我为 NN 添加了多层支持,没有任何改进。
今天我用 tensorflow.js 替换了 NN,我得到了相同的行为。
我的输入是:
- 到下一个障碍物的距离
- 下一个障碍物的高度
- 到下一颗星星的距离
(为简单起见,我从输入中删除了星星的高度,并将它们保持在恒定的高度)
我有 2 个隐藏层(5 个和 6 个神经元),输出中有 1 个神经元,它决定了跳线是否应该跳。
我唯一的想法是,一个因障碍物决定何时跳跃的神经元与因比特币决定何时跳跃的神经元一起激活,它们的权重被求和,并做出过早跳跃的决定。
我将给出一个(也许是不好的)类比:
如果您需要 1 个月的时间准备考试,那么,如果您在同一天有 2 场考试,您将提前 2 个月开始准备。这种逻辑在这种情况下有效,但不适用于我的 AI。
在最初的“玩具神经网络”中,我什至添加了 8 层,每层 12 个神经元,我认为这对于这种情况来说太过分了。在 tf.js 中,我同时使用了 sigmoid 和 relu 激活函数。不管我做了什么,都没有改善。
希望有人知道我哪里出错了。