我正在尝试理解一篇关于如何训练神经网络玩乒乓球游戏的论文。 https://cloud.github.com/downloads/inf0-warri0r/neural_pong/README.pdf
我最近开始研究神经网络,并且了解反向传播的概念。在这篇论文中使用了反向传播来训练神经网络。
这个神经网络有五个输入神经元。
- 球的x坐标(bx)
- 球的y坐标(by)
- 球在x方向的速度(bvx)
- 球在y方向的速度(bvy)
- 球拍的位置(py)。
隐藏层中有十个神经元,输出层中有一个神经元,它将输出球拍的位置(py)。
从这一点开始,我有一些疑问需要澄清。
由于反向传播是一种监督学习方法,它应该有一些期望的输出,我们可以从中迭代地减去当前输出以找出输出中的误差,并计算梯度下降。
-
现在我不明白的是,在这种情况下期望的输出是什么。可以是球撞击墙壁的位置与球拍位置之间的距离,我们应该将其保持为零吗?
-
我知道控制球拍将被硬编码为与球同步移动,但我们在训练时如何随机移动另一侧的球拍?我们应该在输入“py”中提供什么值?
-
在游戏的哪个点应该提供所有五个输入bx,by,bvx, bvy和py?我们应该仅在球撞击墙壁时提供这些输入并执行一次神经网络迭代吗?
回答:
首先,我建议你不要使用这篇论文作为教育工具。代码文档不全,论文本身也不太有信息量。
-
在代码库中,他似乎使用输出作为球拍与其应在位置之间的距离。然后,他根据球拍未击中球时的实际距离来训练网络。
-
原始论文通过训练两个网络相互对抗来移动对面的球拍。这有一些缺点,但在这种情况下应该不是问题。py的值似乎是当前球拍的y坐标
-
在代码中,他为网络提供了游戏的当前状态,并允许它们选择移动到的目标距离。然后,当他们未击中球时,他训练神经网络。
这种设计有一些缺点。例如,每个球你只能得到一个数据点来训练它,而且由于我们在收集这个数据点时球总是处于游戏板的边缘,我们学不到多少关于球在整个地图上弹跳时如何移动的信息。
我建议在游戏过程中记录所有提供给网络的值。之后,你可以使用原始游戏状态和球最终的位置来训练网络。这样,即使网络成功地挡住了球,也可以有用地进行训练,并且它可以从游戏中的所有点获得数据。