用于强化学习(Q 学习)的二维平面中位置的状态表示

人工智能 强化学习 楷模 执行 q学习
2021-10-27 11:44:25

我最近完成了 David Silver 的 RL 课程(在 YT 上),并考虑在 Unity 游戏引擎中的简单应用程序上进行尝试,在那里我用球构建了简单的迷宫,并想教球从 A 点到达 B 点在那里,同时避开障碍物和火(你会被烧毁的地方如此大的负面奖励)

我在设计整个事物(编程方面)时遇到的问题是:在 2D 空间中表示位置的正确(或至少是好的)方式是什么?它是连续的,所以我考虑将其表示为由 [up, down, left, right, posX, posY] 组成的特征向量,其中方向是我是否按下以二进制形式向该方向移动的按钮(或如果你想要的动作)和pos 是浮点数 (0-1),表示从整个地图所在平面的一个角开始的标准化位置。这将伴随着向量 W,它表示使用梯度下降调整的权重。

问题是:这行得通吗?我问有两个原因。一个是我对 posX 和 posY 不太确定,因为它可以为 0,如果我将它乘以权重向量,那么除了 0 之外,怎么可能得到奖励呢?第二个原因是我不确定这些操作是否应该成为功能的一部分。我的意思是,这对我来说很有意义,但我很容易犯错,因为我是初学者。

非常感谢你们。如果您还有其他问题或认为问题描述得不够深入,请在评论中提问,我会编辑问题。:)

PS:我可以按照我认为正确的方式对其进行编码,但我也想在编码之前在纸上设计应用程序(项目管理)。

1个回答

我认为你的网络应该有各种动作作为输出,但我不是深度网络的专家。我只是认为这种轻量级的多任务学习形式可能会更好。多任务学习的想法是预测器使用几乎相同的结构(仅改变输出权重)预测多个变量(在这种情况下是各种 Q(s,a1)、Q(s,a2)...)会学到更明智的东西。虽然我承认在这里应用它可能有点牵强。

至于真正的问题,强化学习中一种流行的技术是平铺编码

基本思想是离散化(在您的情况下为二维)状态空间 - 想象一个放置在二维空间上的网格 - 并为每个单元分配一个输入特征;所有这些变量都设置为零,除了你的连续变量落入的那个。例如,如果您的网格是 20x20,您将有 400 个变量,其中 399 个设置为零,1 个设置为 1。

Tile Coding 更进一步,并使用网格的轻微偏移重复此操作。想象一下,您创建了一个相同的网格,但将其稍微向右移动了单元格宽度的 1/10:您将像以前一样拥有另一组 400 个变量,但设置为 1 的单元格可能不一样. 然后你重复这个移动网格 2/10 并且你有另一组 400 个变量,同样,只有一个被设置为一个。总共你有 10 组 400 个变量(如果你重复更多,你会得到和以前一样的网格);在您的 4000 个变量中,只有 10 个设置为 1。现在通过在 Y 轴上添加 1/10 的单元格偏移来重复此操作,并获得另外 4000 个变量。重复 2/10,你会得到另外 4000 个。到最后,你有 40000 个变量,其中 100 个设置为 1。

现在您的网络可以更轻松地学习不同位置的不同权重。我建议您点击上面的链接以获得比我更好的解释(和数字!)

我的建议是将所有这些变量输入你的网络,让它预测所有动作的 Q 值。但是,再说一次,我不是深度网络方面的专家,所以我可能是错的。

此外,根据 Andrej Karpathy 的说法,“大多数人更喜欢使用 Policy Gradients,包括原始 DQN 论文的作者,他们已经证明 Policy Gradients 在调整良好时比 Q Learning 工作得更好。”。这意味着您最好不要使用 Q-learning(就像他们在原始 DQN 公式中所做的那样)来训练您的网络。看看Andrej 的博客他指向的论文