3

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

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

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

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

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

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

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

更新

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

通过更多的测试,我发现我可以用我的二维数组表示来完成前两个变体。所以我认为我的网络架构可能没问题。我发现我的网络现在特别容易发生灾难性遗忘(比我使用 3d 数组时更容易)。我必须使用“经验回放”让它学习,但即使如此我仍然无法完成第三个变体。我会继续努力的。我很震惊改变网格世界表示所产生的差异。它根本没有提高性能。

4

1 回答 1

2

一些标准表示是:

  • 多项式(通常是 1 或 2 阶):对于 1 阶,您将有一个 3 维向量,其中第一个元素是偏差(0 阶),第二个是x坐标,第三个是y坐标。对于更高的学位,您还将拥有x^2, y^2, xy .... 如果环境发生变化,您还必须对对象位置执行相同的操作。

  • 径向基函数(或瓦片编码,因为状态空间是离散的):您将有一个N x N向量(N是环境的大小),每个基/瓦片都会告诉您代理是否在相应的单元格中。你也可以有更少的基地/瓷砖,每一个覆盖一个以上的细胞。然后,您可以为环境中的对象附加多项式(如果它们的位置发生变化)。

无论如何,64 维输入对于 NN 来说应该不是问题。我不确定 atanh是最好的非线性函数。如果您阅读著名的 DeepMind 论文,您会发现他们使用了校正线性激活(为什么?请阅读此)。

此外,一定要在反向传播期间使用梯度下降优化器

编辑

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

无论如何,我建议的特征仍然相同:多项式或径向基函数。

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

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

  • 你的小批量有多大?
  • 您的政策探索性如何?
  • 在开始学习之前,您收集了多少具有随机策略的样本?
  • 你在等多少?(它可以很容易地总共需要 500k 个样本来学习)
于 2016-04-26T07:52:06.790 回答