具有不同输入的神经网络(用于游戏 ai)

人工智能 神经网络 游戏-ai 神经元 爪哇
2021-10-25 10:23:37

我想创建一个简单的游戏,它基本上由 2d 圆圈组成,它们相互射击较小的圆圈(以便一开始就更容易检测命中框)。我的目标是创建一个能够让自己的行为适应玩家行为的人工智能。为此,我想使用神经网络作为大脑。每一帧,NN 都接受与玩家相同的输入,并将其输出与玩家输出进行比较。(在这种情况下,输出是向上箭头等按下的键)作为输入,我想使用几个不同的重要因素:例如,敌方玩家的方向作为从 0 到 1 的数字

我还想输入敌人和自己射弹的方向、大小和速度,这就是我的问题所在。如果每个玩家只有一颗子弹,那会很容易,但我希望子弹的数量是可变的,因此输入神经元的数量必须是可变的。

我的方法:1)使用大量神经元并将未使用的神经元设置为 0(一点也不优雅) 2)而不是特定值,只需使用所有像素的 rgb 值作为输入(会限制游戏,因为颜色会提供所有信息)(+速度和方向等因素可能不会产生任何影响)

有没有更有希望的方法来解决这个问题?我希望你能给我一些启发。

此外,在 0/1 或 -1/1 之间的范围输入值是否存在差异?

提前谢谢你,莫

编辑:如果你没有足够的问题,有没有办法让神经网络记住事情?例如,如果我在游戏中添加了一个涉及按住键的机制,我会添加一个输入神经元,如果某个键被按下则输入 1,如果没有按下则输入 0,但我怀疑这会起作用。

2个回答

我建议预处理图像并提供几个组合图像的像素值。一些想法:

  1. 如果可能,将所有图像预处理为灰度。它将减少输入神经元的数量。(只要这一步不会引入大的开销)

  2. 选择一些γ值使得 0 <γ< 1. 生成(即从您的游戏中选择)n连续图像。为了k序列中的第一个图像,将每个像素值乘以γnk1. 这假设我们索引k从零开始。

  3. 将所有已处理图像的像素值与 clip ~ [0, 255] 相加(对于有效的值范围)

这将产生一个单一的图像,其中静止像素将被求和以创建更亮/更饱和的点,其中移动对象将具有随着每个时间步长而褪色的“阴影”或“尾巴”(γ可以说是“衰落因素”)。

图像输入:只要所有值都处于可比较的范围内,输入是在 [-1, 1] 还是 [0, 1] 范围内并不重要,但是由于您将使用像素值,因此它们将都是积极的。因此标准化像素值将产生范围 [0, 1]。

注意:这种处理可能可以通过求和,然后在每个时间步乘以 gamma 以更高的效率迭代完成。然后你可以在线实现它。

现在考虑您希望网络的输出是什么。如果您希望代理在处理输入后采取行动,那么您稍后的输出应该由每个离散动作的一个神经元组成(即,每个可以按下的“按钮”)。我将把我的答案限制在离散动作上,因为这可能是这个问题最有用的答案。

最后,您询问网络是否可以“记住事物”,例如“按住键”。这个问题有点模糊,但让我试着回答一下。听起来您正在考虑将其用作网络的输入。理论上,您可以使用类似的实现(即,如果按下按钮,则在每个时间步测量。如果按下 0,则可能使用 1。在每个时间步衰减并求和。使用 n 个时间步,总和将具有最大值的价值n(γn1))。记得衰减nk1, 和k从零开始。您不必实际衰减这个值,但衰减一个 gamma 因子有助于网络知道例如按钮是在第一帧还是最后一帧附近被按下。

话虽如此,我不知道您是否想将其用作输入。如果人工智能意味着比对手拥有更多的信息,那么我想你可以。但是,代理将不会从与对手相同的信息中学习。此外,如果按住按钮会产生清晰可见的效果,则该信息将已在图像中捕获,因此可能是多余的输入。

这些想法不是唯一的实现,但可以让你继续前进。听起来您需要一定程度的奖励,并且可能需要将其构建为 RL 问题。这些细节超出了这篇文章的范围,我不想对你原来的问题太过分。请注意,与玩家输出进行比较可能不会给您想要的结果,即使确实如此,您的网络也将仅限于学习模仿其他玩家。使用奖励度量将允许您的代理通过采取最大化奖励的行动在理论上超越其对手的技能,即使对手不会考虑采取该行动。

我希望这有帮助。

最通用的方法是按照您的建议输入所有像素。CNN 将是最好的架构。要提供速度或速度等信息,您可以向 CNN 提供多于一帧(例如最后 5 帧或提供足够信息的任何内容)。CNN 可以通过比较这些图像来学习运动信息。

如果您想存储附加信息(如库存项目),则可以选择每个值的输入神经元。您还可以查找 LSTM(长期短期记忆)模型,但对于您的具体情况,硬编码神经元将是更简单的解决方案。