简单游戏 AI 的问题

人工智能 强化学习 张量流 游戏-ai
2021-10-28 04:36:04

几个月前我做了一个简单的游戏,类似于谷歌浏览器中的恐龙游戏——你跳过障碍物,或者不跳过悬浮障碍物,然后跳跃收集比特币,比特币可以放置在 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 激活函数。不管我做了什么,都没有改善。

希望有人知道我哪里出错了。

1个回答

问题可能在于您如何估计健康状况、如何构建误差函数以及根据什么数据,因为您已经使用了两个已知的好软件,并且可能为您的激活函数使用了已知的好导数。第二个最有可能的是现在聚合了健康的组成部分。平方和有时并不代表可靠的聚合策略。

由于三个原因,我对游戏感到有些困惑。

  • 星星进入描述时没有告诉我们它们是不是障碍物、是障碍物还是唯一的障碍物
  • 一方面,收集比特币是目标,障碍是挑战,另一方面,比特币本身就是障碍
  • 您的输入有距离但没有方向(这是二维游戏吗?)

根据文字提示,我将假设五个简单的事情,您可以纠正我列出的任何误解。

  • 收集所有比特币是目标的一部分
  • 在跳跃中遇到比特币被认为是崩溃
  • 以不精确的方式登陆比特币位置存在一定的径向公差
  • 还有其他事情要崩溃
  • 你的输出是跳跃幅度和方向

我看到当比特币不在其他事物附近时,网络可以有效地训练以跳到它们,但是当在其他事物附近时,训练会收敛于在完成之前反复失败的行为。我假设故障位置不是 100% 可重复的,因为遗传算法的伪随机种子会发生变化。如果我在拼凑场景时误解了,请再次纠正我。

应该考虑到非比特币障碍物的距离是误差函数的一部分的可能性,并且跳跃目的地与比特币之间的差异也是误差函数的一部分。(第二个就是为什么我更喜欢将误差等值线称为健康指标。)

如果比特币激励似乎不是崩溃的原因,如果另一个障碍物被移动,比特币就会被收集,那么两个健康标准中的第一个需要从到另一个障碍物的距离的更高阶贡献.

想到了两种简单的函数形式,可以尝试在碰撞概率提高时增加反向传播中表示的警报,以更有效地训练对抗碰撞。两者都涉及确定到最近的比特币的直接跳线以及从该线到最近的其他障碍物的距离;称它为 x。

  • xy,其中y>1.0
  • ekx