如何训练神经网络来玩乒乓球游戏?

How to train a Neural Network to play a pong game?

我试图理解这篇解释如何训练神经网络来玩乒乓球游戏的论文。 https://cloud.github.com/downloads/inf0-warri0r/neural_pong/README.pdf

我最近开始研究神经网络,知道反向传播的概念。在本文中,反向传播用于训练神经网络。

这个神经网络中有五个输入神经元。

  1. 球的x坐标(bx)
  2. 球的y坐标(by)
  3. 球在 x 方向的速度 (bvx)
  4. 球在 y 方向的速度 (bvy)
  5. 桨的位置 (py)。

隐藏层有10个神经元,输出层有1个神经元,输出桨的位置(py)。

从这一点开始,我有一些疑惑需要清除。

由于反向传播是一种监督学习方法,它应该有一些期望的输出,我们从中迭代减去当前输出以找出输出中的误差并计算梯度下降。

  1. 现在我不明白的是,在这种情况下所需的输出是什么。能不能是小球撞墙的位置到桨的位置的距离,我们应该保持零?

  2. 我知道控制桨将被硬编码为与球同步移动,但我们如何在训练时随机移动另一个桨?我们应该在输入中给出什么值 "py"?

  3. 在游戏中什么时候应该提供所有五个输入 bx、by、bvx、bvy 和 py?我们是否应该只在球撞到墙上时才给出这些输入并执行神经网络迭代的一个时期?

首先,我想劝阻您不要将本文用作教育工具。代码记录不完整,论文本身的信息量也不大。

  1. 在代码库中,他似乎使用输出作为桨到它应该在的位置的距离。然后,每当球拍未命中时,他都会根据球拍到球的实际距离来训练网络。

  2. 原始论文通过简单地训练两个网络相互对抗来移动相反的球拍。这有一些缺点,但在这种情况下应该不是问题。 py 的值似乎是当前桨的 y 坐标

  3. 在代码中,他在每一帧向网络提供游戏的当前状态,然后允许它们选择移动到的目标距离。然后,每当他们错过球时,他都会训练 NN。

这种设计有一些缺点。例如,对于每个球,您只能获得一个数据点来对其进行训练,并且由于当我们收集该数据点时球始终位于游戏板的边缘,因此我们并没有学到太多关于球何时移动的知识实际上是在地图上弹跳。

我建议在播放时跟踪网络的所有值。稍后您可以使用原始游戏状态和球最终到达的实际位置来训练网络。这样即使成功阻挡球也可以有效地训练网络,并从游戏中的所有点获取数据。