《强化学习Sutton》读书笔记(六)——n步Bootstrapping(n-step Bootstrapping)

此为《强化学习》第七章 n-step Bootstrapping

n步Bootstrapping是MC和TD(0)的综合。随着对参数n的调整,我们可以看到TD是如何过渡到MC的。而最佳的方法往往就是介于TD和MC之间。

n步TD估计

在上一章的TD(0)方法中,我们有

v(St)v(St)+α(Gtv(St))

并且,我们使用了一步后的状态值函数来估计Gt,从而得到

v(St)v(St)+α[Rt+1+γv(St+1)v(St)]

那么如果我们考虑n步,那么显然Gt也可以使用以下等式进行估计:

Gt=Rt+1+γv(St+1)=Rt+1+γRt+2+γ2v(St+2)=Rt+1+γRt+2++γn1Rt+n+γnv(St+n)

在书本中,上面每个v都会有一个下标,表示此处的值函数是哪一步迭代的值函数。 但实际上,我们只有一个表格用来存值函数,所以实践上应该很容易知道到底是哪一步迭代的,因此这里省略不写(可见下文伪代码即可知)。令上述表达式为Gt:t+n,则算法TD(n)

v(St)v(St)+α[Gt:t+nv(St)]

如果t+n=T,那么TD(n)将成为MC。在回溯图中,我们可以看到TD(n)包含了从TD(0)到MC的所有算法。

《强化学习Sutton》读书笔记(六)——n步Bootstrapping(n-step Bootstrapping)

TD(n)的伪代码如下:

《强化学习Sutton》读书笔记(六)——n步Bootstrapping(n-step Bootstrapping)

稍微解释一下。第一个循环当然是针对episode,第二个循环是在一个episode中产生样本。第一个if表示如果该episode没有结束,那么就继续采样;if后的τ表示已经执行的步数和n1的差。如果τ<0,就说明n步还没有走完,当然没有任何可以迭代的;如果τ0,则进入第二个if,使用n步后的状态值函数v(Sτ+n)来更新v(Sτ)

n步Sarsa

考虑完状态值函数,下一步当然是行为值函数。过程几乎完全一样,先定义Gt:t+n

Gt=Rt+1+γRt+2++γn1Rt+n+γnQ(St+n,At+n)

因此n步Sarsa更新表达式为:

Q(St,At)Q(St,At)+α[Gt:t+nQ(St,At)]

它的回溯图如下:

《强化学习Sutton》读书笔记(六)——n步Bootstrapping(n-step Bootstrapping)

伪代码如下:

《强化学习Sutton》读书笔记(六)——n步Bootstrapping(n-step Bootstrapping)

和之前TD(n)相比,除了值函数的变化,唯一的不同是增加了策略改良的步骤(倒数第二行),但这只是一个非常熟悉的ϵ-贪心而已,毕竟Sarsa只是一个On-Policy的算法。

我们也可以尝试扩展Expected Sarsa到n步。从下面的回溯图中可以看到,Expected Sarsa仅仅在最后一步使用了值函数的期望,并没有每一步都使用。我猜想可能是因为如果每一步都做成期望,那么随着树的展开,计算量将指数级增长。不过我不清楚是否存在两步使用期望的Expected Sarsa算法。

《强化学习Sutton》读书笔记(六)——n步Bootstrapping(n-step Bootstrapping)

表达式如下:

Gt=Rt+1+γRt+2++γn1Rt+n+γnaπ(a|St+n)Q(St+n,a)Q(St,At)Q(St,At)+α[Gt:t+nQ(St,At)]

n步Off-Policy学习

在MC一章中第一次提出Off-Policy方法的时候,我们需要求解一个重要性采样系数。当时由于是MC方法,因此需要求ρt:T1,而在n步的方法中,只需要求解ρt:t+n1,但过程是极其类似的。

ρt:t+n1=k=tmin{t+n1,T1}π(Ak|Sk)b(Ak|Sk)

在每次更新值函数的时候,我们需要乘上ρt+1:t+n,即

Q(St,At)Q(St,At)+αρt+1:t+n[Gt:t+nQ(St,At)]

在MC一章中,我们提到过普通重要性采样和加权重要性采样。我个人认为,这里这样的更新式应该是基于普通重要性采样的。照抄一下第四篇里基于加权重要性的公式:

vn+1(s)=vn(s)+Wn+1Cn+1(Gn+1vn(s))

这里的W几乎就是这章中的ρ,但显然没有对应的Cn=k=1nWn。如果考虑基于普通重要性采样,那么把上式中的分母去掉就好了,另外α实际上对应这经过状态s的次数,这样两边就说得通了。

n步Off-Policy方法的伪代码如下:

《强化学习Sutton》读书笔记(六)——n步Bootstrapping(n-step Bootstrapping)

注意决策(目标策略)使用的是纯贪心,而数据生成(行为策略)使用的是探索性的策略。

* 单次决策法与决策变量

略。

不带重要性采样的n步Off-Policy学习

在上一章中,我们已经看到像Q-Learning或者Off-Policy的Expected Sarsa都没有重要性采样的步骤,这能在n步Off-Policy中实现吗?本节中我们将介绍具有这样性质的树回溯 (Tree Backup) 算法。

树回溯算法的回溯图如下所示(以3步为例)。

《强化学习Sutton》读书笔记(六)——n步Bootstrapping(n-step Bootstrapping)

可以看到,树回溯的最后一步和一步Expected Sarsa是一致的,即一层的树回溯法得到的回报为

Gt:t+1=Rt+1+γaπ(a|St+1)Q(St+1,a)

两层的树回溯法就有点不同了,在倒数第二层的分支中,每个实际中不会被选择的行为值函数将被计入回报,而实际中选择的行为将作为下一层的回报间接计入,即

Gt:t+2=Rt+1+γaAt+1π(a|St+1)Q(St+1,a)+γπ(At+1|St+1)[Rt+2+γaπ(a|St+2)Q(St+2,a)]=Rt+1+γaAt+1π(a|St+1)Q(St+1,a)+γπ(At+1|St+1)Gt+1:t+2

这里的表达式启示我们可以用递归的方法来定义和求解Gt:t+n,即

Gt:t+n=Rt+1+γaAt+1π(a|St+1)Q(St+1,a)+γπ(At+1|St+1)Gt+1:t+n

于是更新行为值函数的表达式为

Q(St,At)=Q(St,At)+α[Gt:t+nQ(St,At)]

在阅读这一节时,我有好几个疑问。首先,注意到π是纯贪心得到的,因此上述式子中许多π(a|s)将等于0,一方面树看起来将变成棍子,另一方面由于行为策略b不一定选择了π认定最优的路线,因此树高也可能发生变化。我一度认为这看起来是不合理的,把它们都改成了b。然而,改成b之后,这将不再是一个Off-Policy的方法了。因此,我认为这里确实应该是π,也确实会出现许多的0,使用π(a|s)只是另一种形式的最大化。

第二个问题是,为什么树回溯法是Off-Policy的?在每一步选择中,数据(具体的行为)都是由行为策略b来生成的,但更新的算法隐含了最大化,因此和Q-Learning一样,它是按照目标策略π来更新值函数的。假如n步的中间某一步不是最优的,那么它下面的树的权重将全是0,不会对值函数产生影响。需要注意的是,在2017年草稿及以前的版本中,伪代码里使用了ϵ-贪心的算法来生成π,我认为这是不对的(这样就是On-Policy方法了),且已在2018年草稿中得到更正。

第三个问题是,为什么这样就不需要重要性采样了?我个人的理解是,和Q-Learning类似,采用重要性采样的根本原因是避免行为策略b做出一些非常差的行为,从而拉低了上一行为的值函数,而实际上目标策略π却根本不会考虑这样差的行为(可见上一章)。这里,我们使用了目标策略π作为更新的算法,通过隐含的最大化去掉了可能的差行为对上一行为的影响,所以就不需要重要性采样了。

n步树回溯法伪代码如下:

《强化学习Sutton》读书笔记(六)——n步Bootstrapping(n-step Bootstrapping)

* 一种统一的算法:n步Q(σ)

略。

参考文献

《Reinforcement Learning: An Introduction (second edition)》Richard S. Sutton and Andrew G. Barto

上一篇:《强化学习Sutton》读书笔记(五)——时序差分学习(Temporal-Difference Learning)
下一篇:暂无