函数逼近:瓦片编码与高度离散化状态 space 有何不同?
Function Approximation: How is tile coding different from highly discretized state space?
我正在从连续状态的离散化 space 过渡到函数逼近。我的动作和状态 space(3D) 都是连续的。我的问题主要是由于混叠导致的错误,并且在长时间训练后几乎没有收敛。我也不知道如何为离散化选择正确的步长。
阅读 Sutton & Barto 帮助我理解了图块编码的力量,即让状态 space 由多个相互重叠的偏移图块描述。给定一个连续的 query/state,它由 N 个基函数描述,每个基函数对应于它所属的一个 block/square 纵横交错的拼贴。
1) 性能与高度离散化状态有何不同 space?
2) 任何人都可以指点我在 python 中的 tile 编码的工作示例吗?我同时学习了太多东西,变得非常困惑! (Q学习、离散化困境、瓦片编码、函数逼近和处理问题本身)
对于 RL 中的连续问题,似乎没有任何详尽的 Python 编码教程。
正如 Simon 的评论所描述的那样,高度离散化状态 space 和使用分块编码的函数逼近器之间的一个关键区别在于分块编码能够将从一个状态学习到的值推广到其他类似状态(即,瓷砖可以重叠)。在高度离散化状态 space 的情况下,您需要访问所有(并且可能很多)状态以获得值函数(或 Q 函数)的良好表示。
关于第二个问题,在此 link 中,您可以找到由 Rich Sutton 及其实验室的其他成员编写的分块编码实现(使用 C、C++、Lisp 和 Python)。
添加到 Pablo 的回答中 -
分块编码(作为粗编码的特例)可以与简单的状态聚合进行比较。例如,一个简单的状态聚合是一个网格。瓦片编码将是一堆彼此重叠的网格,每个网格都从前一个偏移一点。
好处是双重的——它可以让你有更好的辨别力(更细粒度的控制,更少的偏差)而不会丢失泛化(方差较小)。
这是因为使用拼贴编码 可以覆盖更多状态,但功能更少。
网格类似于单热编码。一个 3x3 网格相当于一个 9 维 1 热编码向量 - 总共涵盖 10 个状态 - 一个对象要么在 9 个网格块之一中,要么在其中的 none 个中。
所以中间点可以表示为 (0,0,0,0,1,0,0,0,0)。
你拿 4 - 1x1 的盒子怎么样,然后将它们稍微移动 0.5 个盒子(这样它们每个都覆盖网格的 2x2 区域)。
现在您仅用 4 个维度或 4 个输入覆盖了 10 个状态:红框、绿框、蓝框和紫框。
现在同一个中点可以表示为(1,1,1,1)。
这意味着您可以更好地概括。之前 - 梯度下降只会影响中间点参数。现在,由于一个点受几个特征组合的影响 - 所有这些特征参数都会受到影响。这也允许更快的学习(正如 Pablo 提到的)。
Coursera 优惠(付费)specialization which has exercises you need to implement in Python. Specifically Course 3 week 3 let's you work with tiles. They are using an updated (compared to Pablo's answer) Sutton's implementation of the code, which is more simplified and uses python 3. Since the code can be quite cryptic at first, here is my comments on it.
我正在从连续状态的离散化 space 过渡到函数逼近。我的动作和状态 space(3D) 都是连续的。我的问题主要是由于混叠导致的错误,并且在长时间训练后几乎没有收敛。我也不知道如何为离散化选择正确的步长。
阅读 Sutton & Barto 帮助我理解了图块编码的力量,即让状态 space 由多个相互重叠的偏移图块描述。给定一个连续的 query/state,它由 N 个基函数描述,每个基函数对应于它所属的一个 block/square 纵横交错的拼贴。
1) 性能与高度离散化状态有何不同 space?
2) 任何人都可以指点我在 python 中的 tile 编码的工作示例吗?我同时学习了太多东西,变得非常困惑! (Q学习、离散化困境、瓦片编码、函数逼近和处理问题本身)
对于 RL 中的连续问题,似乎没有任何详尽的 Python 编码教程。
正如 Simon 的评论所描述的那样,高度离散化状态 space 和使用分块编码的函数逼近器之间的一个关键区别在于分块编码能够将从一个状态学习到的值推广到其他类似状态(即,瓷砖可以重叠)。在高度离散化状态 space 的情况下,您需要访问所有(并且可能很多)状态以获得值函数(或 Q 函数)的良好表示。
关于第二个问题,在此 link 中,您可以找到由 Rich Sutton 及其实验室的其他成员编写的分块编码实现(使用 C、C++、Lisp 和 Python)。
添加到 Pablo 的回答中 -
分块编码(作为粗编码的特例)可以与简单的状态聚合进行比较。例如,一个简单的状态聚合是一个网格。瓦片编码将是一堆彼此重叠的网格,每个网格都从前一个偏移一点。
好处是双重的——它可以让你有更好的辨别力(更细粒度的控制,更少的偏差)而不会丢失泛化(方差较小)。
这是因为使用拼贴编码 可以覆盖更多状态,但功能更少。
网格类似于单热编码。一个 3x3 网格相当于一个 9 维 1 热编码向量 - 总共涵盖 10 个状态 - 一个对象要么在 9 个网格块之一中,要么在其中的 none 个中。
所以中间点可以表示为 (0,0,0,0,1,0,0,0,0)。
你拿 4 - 1x1 的盒子怎么样,然后将它们稍微移动 0.5 个盒子(这样它们每个都覆盖网格的 2x2 区域)。
现在您仅用 4 个维度或 4 个输入覆盖了 10 个状态:红框、绿框、蓝框和紫框。
现在同一个中点可以表示为(1,1,1,1)。
这意味着您可以更好地概括。之前 - 梯度下降只会影响中间点参数。现在,由于一个点受几个特征组合的影响 - 所有这些特征参数都会受到影响。这也允许更快的学习(正如 Pablo 提到的)。
Coursera 优惠(付费)specialization which has exercises you need to implement in Python. Specifically Course 3 week 3 let's you work with tiles. They are using an updated (compared to Pablo's answer) Sutton's implementation of the code, which is more simplified and uses python 3. Since the code can be quite cryptic at first, here is my comments on it.