wan*_*erd 7 python artificial-intelligence machine-learning reinforcement-learning
我正在从连续状态空间的离散化过渡到函数逼近。我的动作和状态空间(3D)都是连续的。我的问题主要是由于混叠导致的错误,并且在长时间训练后几乎没有收敛。此外,我无法弄清楚如何为离散化选择正确的步长。
阅读 Sutton & Barto 帮助我理解了瓦片编码的力量,即具有由多个相互重叠的受侵扰瓦片描述的状态空间。给定一个连续的查询/状态,它由 N 个基函数描述,每个基函数对应于它所属的纵横交错的单个块/正方形。
1) 性能与高度离散的状态空间有何不同?
2)任何人都可以指点我在python中使用tile编码的工作示例吗?我同时学习了太多东西并且变得超级困惑!(Q 学习、离散化困境、瓦片编码、函数逼近和处理问题本身)
对于 RL 中的连续问题,似乎没有任何详尽的 Python 编码教程。
添加巴勃罗的答案 -
平铺编码(作为粗编码的特例)可以与简单状态聚合进行比较。例如,一个简单的状态聚合是网格。平铺编码将是一堆相互叠加的网格,每个网格都与前一个网格移动了一点。
好处有两个——它可以让你有更好的辨别力(更细粒度的控制,更少的偏见),而不损失泛化性(更少的方差)。
这是因为通过平铺编码,您可以用更少的功能覆盖更多的状态。
网格类似于 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。由于代码一开始可能相当神秘,因此以下是我对其的评论。