我正在尝试为使用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阵列时要严重得多)。我必须使用“体验重播”使其学习,但是即使那样,我仍然无法完成第三个变体。我会继续努力。我很震惊,改变网格世界表示形式带来了很大的改变。它根本没有改善性能。
最佳答案
一些标准表示为:
x
坐标,第三个是y
坐标。对于更高的学位,您还将拥有x^2, y^2, xy ...
。如果环境发生变化,则还必须对对象位置执行相同的操作。 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论文以获取详细信息。
最后,您可能需要检查一些关键方面: