函数逼近:瓦片编码与高度离散的状态空间有何不同?

wan*_*erd 7 python artificial-intelligence machine-learning reinforcement-learning

我正在从连续状态空间的离散化过渡到函数逼近。我的动作和状态空间(3D)都是连续的。我的问题主要是由于混叠导致的错误,并且在长时间训练后几乎没有收敛。此外,我无法弄清楚如何为离散化选择正确的步长。

阅读 Sutton & Barto 帮助我理解了瓦片编码的力量,即具有由多个相互重叠的受侵扰瓦片描述的状态空间。给定一个连续的查询/状态,它由 N 个基函数描述,每个基函数对应于它所属的纵横交错的单个块/正方形。

1) 性能与高度离散的状态空间有何不同?

2)任何人都可以指点我在python中使用tile编码的工作示例吗?我同时学习了太多东西并且变得超级困惑!(Q 学习、离散化困境、瓦片编码、函数逼近和处理问题本身)

对于 RL 中的连续问题,似乎没有任何详尽的 Python 编码教程。

Pab*_* EM 5

正如 Simon 的评论所描述的那样,高度离散化的状态空间和使用瓦片编码的函数逼近器之间的一个关键区别是,瓦片编码能够将从一种状态学到的值推广到其他类似状态(即瓦片可以重叠)。在高度离散的状态空间的情况下,您需要访问所有(并且可能很多)状态以获得价值函数(或 Q 函数)的良好表示。

关于第二个问题,在此链接中,您可以找到 Rich Sutton 和他实验室的其他成员编写的 tile 编码实现(使用 C、C++、Lisp 和 Python)。


Dav*_*eli 5

添加巴勃罗的答案 -

平铺编码(作为粗编码的特例)可以与简单状态聚合进行比较。例如,一个简单的状态聚合是网格。平铺编码将是一堆相互叠加的网格,每个网格都与前一个网格移动了一点。

好处有两个——它可以让你有更好的辨别力(更细粒度的控制,更少的偏见),而不损失泛化性(更少的方差)。

这是因为通过平铺编码,您可以用更少的功能覆盖更多的状态

网格类似于 one-hot-encoding。3x3 网格相当于 9 维 1-热编码向量 - 总共覆盖 10 个状态 - 对象要么位于 9 个网格块之一中,要么不在其中任何一个中。

在此输入图像描述

所以中间点可以用(0,0,0,0,1,0,0,0,0)表示。

不如拿 4 - 1x1 的盒子,然后将它们稍微移动 0.5 个盒子(这样它们每个都覆盖网格的 2x2 区域)。

在此输入图像描述

现在,您仅用 4 个维度或 4 个输入覆盖 10 个状态:红色框、绿色框、蓝色框和紫色框。

现在相同的中点可以用(1,1,1,1)表示。

这意味着您可以更好地概括。之前 - 梯度下降只会影响中间点参数。现在,由于一个点受到少数特征组合的影响 - 所有这些特征参数都会受到影响。这也允许更快的学习(正如巴勃罗提到的)。

Coursera 提供(付费)专业课程,其中包含您需要用 Python 实现的练习。具体来说,课程 3 第 3 周让您使用图块。他们正在使用更新的(与 Pablo 的答案相比)Sutton 的代码实现,该实现更加简化并使用 python 3。由于代码一开始可能相当神秘,因此以下是我对其的评论

  • @Riya208他们使用了一个不同的例子。看图就知道他们的意思了。我有 4 个 1x1 盒子,它们之间的距离为 0.5。他们使用 4 个 4x4 的盒子,盒子之间的距离为 0.25 - 完全覆盖了 13x13 的网格。他们将维度从 169 1-hot 减少到 64。 (2认同)