神经网络的网格世界表示

Grid World representation for a neural network

我正在尝试为 Q 学习算法提出更好的二维网格世界状态表示,该算法将神经网络用于 Q 函数。

在教程 Q-learning with Neural Networks 中,网格表示为一个 3 维整数数组(0 或 1)。第一维和第二维表示对象在网格世界中的位置。第三维编码它是哪个对象。

因此,对于其中包含 4 个对象的 4x4 网格,您可以使用包含 64 个元素 (4x4x4) 的 3 维数组来表示状态。这意味着神经网络在输入层将有 64 个节点,因此它可以接受网格世界的状态作为输入。

我想减少神经网络中的节点数量,这样训练时间就不会那么长。那么,您能否将网格世界表示为二维双精度数组?

我试图将 4x4 网格世界表示为双精度的二维数组,并使用不同的值来表示不同的对象。比如我用0.1代表球员,0.4代表进球。然而,当我实现这个算法时,算法完全停止了学习。

现在我认为我的问题可能是我需要更改我在图层中使用的激活函数。我目前正在使用双曲正切激活函数。我的输入值范围为 (0 - 1)。我的输出值范围从(-1 到 1)。我也试过 sigmoid 函数。

我意识到这是一个需要提出问题的复杂问题。任何关于网络架构的建议都将不胜感激。

更新

游戏共有三种变体: 1.世界是静止的。所有对象都从同一个地方开始。 2. 玩家的起始位置是随机的。所有其他对象保持不变。 3.每个格子都是完全随机的。

通过更多测试,我发现我可以用我的二维数组表示完成前两个变体。所以我认为我的网络架构可能没问题。我发现我的网络现在非常容易受到灾难性遗忘的影响(比我使用 3d 阵列时更容易发生)。我不得不用"experience replay"让它学习,但即便如此我仍然无法完成第三个变体。我会继续努力。我很震惊改变网格世界表示的差异有多大。它根本没有提高性能。

一些标准表示是:

  • 多项式(通常是一阶或二阶):对于一阶,您将有一个三维向量,其中第一个元素是偏差( 0 度),第二个是 x 坐标,第三个是 y 坐标。对于更高的学位,您还将获得 x^2, y^2, xy ...。如果环境改变,你也必须对物体位置做同样的事情。

  • Radial basis functions (or tile coding 因为状态 space 是离散的):你将有一个 N x N 向量(N 是环境的大小) 并且每个 basis / tile 都会告诉你代理是否在相应的单元格中。你也可以有更少的底座/瓷砖,每一个都覆盖一个以上的单元格。然后你可以为环境中的对象附加一个多项式(如果它们的位置发生变化)。

反正64维的输入对于神经网络应该不是问题。我不确定 tanh 是最好的非线性函数。如果你阅读 the famous DeepMind paper you'll see that they use a rectified linear activation (why? read this).

此外,请务必在反向传播期间使用 gradient descent optimizer

编辑

第一版和第二版基本上没有区别(实际上,随机代理初始位置甚至可以加快学习速度)。第三个版本当然更难,因为您必须在状态表示中包含有关环境的详细信息。

无论如何,我建议的特征还是一样的:多项式或径向基函数。

经验回放几乎是强制性的,正如我在上面引用的 DeepMind 论文中所描述的那样。此外,您可能会发现使用第二个深度网络作为 Q 函数的目标是有益的。我认为教程中没有建议这样做(我可能错过了)。基本上,目标 r + max(a) gamma * Q(s', a) 是由与您的策略使用的 Q 网络不同的网络给出的。每 C 步,您将 Q 网络的参数复制到 Q 目标网络,以便在时间差异备份期间提供一致的目标。 这两个技巧(使用小批量进行经验回放和拥有单独的目标网络)是深度 Q 学习成功的原因。再次强调,详情请参考 DeepMind 论文。

最后,您可能需要检查的一些关键方面:

  • 你的小批量有多大?
  • 您的政策的探索性如何?
  • 在开始学习之前,您收集了多少具有随机策略的样本?
  • 你还等多少钱? (它很容易需要总共 500k 个样本来学习)