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

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

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

我想减少神经网络中的节点数量,以免培训花费很长时间。因此,您可以将网格世界表示为二维双精度数组吗?

我试图将4x4网格世界表示为双精度的二维数组,并使用不同的值表示不同的对象。例如,我用0.1代表玩家,用0.4代表进球。但是,当我实现此算法时,该算法完全停止了学习。

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

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

更新

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

通过更多测试,我发现可以用2d数组表示形式完成前两个变体。所以我认为我的网络体系结构可能还不错。我发现我的网络现在极易遭受灾难性的遗忘(比使用3d阵列时要严重得多)。我必须使用“体验重播”使其学习,但是即使那样,我仍然无法完成第三个变体。我会继续努力。我很震惊,改变网格世界表示形式带来了很大的改变。它根本没有改善性能。

最佳答案

一些标准表示为:

  • 多项式(通常为1或2度):对于1度,您将具有3维 vector ,其中第一个元素是偏差(度0),第二个是x坐标,第三个是y坐标。对于更高的学位,您还将拥有x^2, y^2, xy ...。如果环境发生变化,则还必须对对象位置执行相同的操作。
  • Radial basis functions(由于状态空间是离散的,所以为tile coding):您将拥有一个N x N vector (N是环境的大小),并且每个基数/图块都会告诉您代理是否在相应的单元格中。您还可以减少基础/图块,每个基础/图块覆盖一个以上的单元。然后,您可以为环境中的对象添加多项式(如果它们的位置发生变化)。

  • 无论如何,对于NN,64维输入应该不是问题。我不确定tanh是要使用的最佳非线性函数。如果您阅读the famous DeepMind paper,您会发现它们使用了校正的线性激活(why? read this)。

    另外,请确保在反向传播期间使用gradient descent optimizer

    编辑

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

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

    如我上面引用的DeepMind论文所述,体验重播几乎是必不可少的。此外,使用第二个深度网络作为Q函数的目标可能会有所帮助。我认为本教程中不建议这样做(我可能已经错过了)。基本上,目标r + max(a) gamma * Q(s', a)由与您的策略所使用的Q网络不同的网络提供。您需要在每个C步骤中将Q网络的参数复制到Q目标网络,以便在时间差异备份期间提供一致的目标。
    这两个技巧(使用迷你批处理回放体验并拥有独立的目标网络)使Deep Q学习取得成功。同样,请参阅DeepMind论文以获取详细信息。

    最后,您可能需要检查一些关键方面:
  • 您的迷你批次有多大?
  • 您的政策有多探索性?
  • 在开始学习之前,您收集了多少个带有随机策略的样本?
  • 您还等什么? (总共很容易需要学习500k样本来学习)
  • 10-02 08:44