忙于琐事,有几天没更新啦。原来计划是去年放假回去把这个专栏写的差不多,奈何在家中真是无心学习啊(主要是冷)。即使开学这么久还没完成。索性就悠然下来,闲暇放松的时候写一写。一方面是因为觉得太急促,容易出错;再者写文章还真是个费时费力的活,需要心平气和。但是,我相信一定会一个不拉的写完这个系列,毕竟有始有终嘛。
好了,言归正传。本节我们继续介绍一个n-step的TD方法。叫做树备份算法(tree-backup algorithm),也是一个off-policy的方法。但是我们不用重要性采样。(对于待带*号的章节,后续在补充)
我们先介绍一下树备份备份算法的主要思想。
看到这个名字,我们大概就能知道这个算法的核心思想:一是采用树的结构,二是在树结构上执行备份操作。
回想什么叫备份?通过后续状态的值更新当前状态值的操作,叫做备份。所有的更新操作都可以叫做备份,区别在于用那些状态备份,如何备份。
我们先给出一个3步树备份算法的备份图:
![9dfc56f3410253521397817be97f4a08.png](https://i-blog.csdnimg.cn/blog_migrate/219349ace986703e3a5c4ab38cf56a29.png)
包含两个采样动作
有个这个备份图,到底怎么更新父节点的值呢?比如对于节点
更新目标
正常的,我们可能就是使用实际采样的序列
大概知道了更新目标(父节点)是通过叶子节点值函数构造的。到底怎么写这个方程呢?这里我们给每个叶子节点都分配一个权重,权重的大小正比于叶子节点所对应的动作
![1025aee1ba66664ae6cb8ab7d415fa46.png](https://i-blog.csdnimg.cn/blog_migrate/47184388d888a2b3b1a04b3e2146ce4d.jpeg)
对于每个叶子节点以及他们的加权权重如上图所示,我们的备份操作是从下往上的,如红色箭头所示。
下面具体的给出树备份算法的公式:
对于一步的备份算法,update target是:
2步备份算法的update target是:
可以通过下图理解上图的公式:
![6528235dd7720f8b077630d781d56612.png](https://i-blog.csdnimg.cn/blog_migrate/2dc49e49f79349615de85cd7600f2623.jpeg)
公式中第一项对应的是第一层叶子节点的加权和(蓝色节点),第二项表示的是图中阴影部分的加权值。稍微观察我们就发现,阴影部分又构成了一颗子树,它的值就等于
当
控制算法
有了更新的update target,我们可以依照
整个流程伪代码如下:
![ddb520a35abf891eaf1271c50486126e.png](https://i-blog.csdnimg.cn/blog_migrate/0ef96fb1598ab92a063a89c0cd330048.jpeg)
思考
为什么这种树备份的操作避免了重要性采样?
我谈谈理解,不一定对。首先这无疑是一个off-policy的算法。因为通过上面伪代码黄色部分字体,我们知道每一步选择动作的时候是随机选择的。那么对于重要性采样,它的核心的作用是什么呢?是为了纠正行为策略和目标策略导致的状态动作对的分布差异(state distribution inducted by behavior policy and target policy)。树备份的这种操作,有点类似DP算法,因为它考虑了所有的动作,但是树的延伸方向又依赖于采样操作。只有采样到的动作才生长出子节点来。更新的时候,把未采样的动作值函数也考虑进去,这无疑降低了采样动作(行为策略)对于更新的影响。另一个方面,所有更新权重都是依赖于目标策略的。这可以看做是一种纠正。所以综上两点,就能最大限度的降低离策略对更新的影响。