Neural network 神经网络的网格世界表示

Neural network 神经网络的网格世界表示,neural-network,reinforcement-learning,q-learning,Neural Network,Reinforcement Learning,Q Learning,我试图为Q学习算法提供一个更好的表示二维网格世界状态的方法,该算法使用神经网络作为Q函数 在本教程中,网格表示为三维整数数组(0或1)。第一个维度和第二个维度表示对象在栅格世界中的位置。第三维度对它是哪个对象进行编码 因此,对于包含4个对象的4x4网格,可以使用包含64个元素的三维数组(4x4x4)来表示状态。这意味着meural网络在输入层中将有64个节点,因此它可以接受网格世界的状态作为输入 我想减少神经网络中的节点数量,这样训练就不会花那么长时间。那么,你能把网格世界表示成二维的双倍数组吗

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

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

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

我想减少神经网络中的节点数量,这样训练就不会花那么长时间。那么,你能把网格世界表示成二维的双倍数组吗

我尝试将4x4网格世界表示为二维双精度数组,并使用不同的值表示不同的对象。例如,我使用0.1表示玩家,0.4表示目标。然而,当我实现这个算法时,它停止了学习

现在我想我的问题可能是我需要更改我在层中使用的激活函数。我现在正在使用双曲正切激活函数。我的输入值范围为(0-1)。我的输出值范围为(-1到1)。我还尝试了sigmoid函数

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

更新

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


通过更多的测试,我发现我可以用2d数组表示完成前两个变体。所以我认为我的网络架构可能很好。我发现我的网络现在特别容易发生灾难性遗忘(比我使用3d阵列时更容易)。我必须使用“体验重播”来学习,但即使如此,我仍然无法完成第三个变体。我会继续努力的。我相当震惊改变网格世界表示法所带来的巨大变化。它根本没有提高性能。

一些标准表示法是:

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

  • (或者因为状态空间是离散的):您将有一个
    nxn
    向量(
    N
    是环境的大小),每个基/分片将告诉您代理是否在相应的单元中。也可以使用较少的底座/瓷砖,每个底座/瓷砖覆盖多个单元。然后,可以为环境中的对象附加多项式(如果其位置发生更改)

无论如何,64维输入对于NN来说应该不是问题。我不确定一个
tanh
是最好的非线性函数。如果你阅读,你会发现他们使用了一个校正的线性激活()

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

编辑

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

不管怎样,我建议的特征仍然是一样的:多项式或径向基函数

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

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

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

是的,环境确实在变化。我更新了我的问题。@Galen我也编辑了我的答案。我再次强调:尝试使用
ReLU
而不是
tanh
。你用过梯度下降优化器吗?试试Adam或RMSprop。我目前正在使用从2000个unqiue体验池中随机抽取的500个小批量进行测试。至于它的探索性,我从1.0开始,慢慢衰减到0.1。我通常等到3万集左右。如果到那时还没有改善,我就停止。它需要几天才能达到500k(不使用GPU)@Galen 2000非常小,500非常大。在Atari Games的论文中,他们使用了大小为32的小批量和100万个唯一样本的数据集。他们学到的问题比网格世界要复杂得多:你的设置的问题是,你在每个步骤中使用了1/4的样本,所以你太频繁地使用相同的数据。我会将数据集大小增加到100k,并使用32个样本的小批量