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

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

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

n n 步TD估计

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

v(St)v(St)+α(Gtv(St)) v ( S t ) ← v ( S t ) + α ( G t − v ( S t ) )

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

v(St)v(St)+α[Rt+1+γv(St+1)v(St)] v ( S t ) ← v ( S t ) + α [ R t + 1 + γ v ( S t + 1 ) − v ( S t ) ]

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

Gt=Rt+1+γv(St+1)=Rt+1+γRt+2+γ2v(St+2)=Rt+1+γRt+2++γn1Rt+n+γnv(St+n) G t = R t + 1 + γ v ( S t + 1 ) = R t + 1 + γ R t + 2 + γ 2 v ( S t + 2 ) = R t + 1 + γ R t + 2 + ⋯ + γ n − 1 R t + n + γ n v ( S t + n )

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

v(St)v(St)+α[Gt:t+nv(St)] v ( S t ) ← v ( S t ) + α [ G t : t + n − v ( S t ) ]

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

《强化学习Sutton》读书笔记(六)——n步Bootstrapping(n-step Bootstrapping)_第1张图片

TD(n)的伪代码如下:

《强化学习Sutton》读书笔记(六)——n步Bootstrapping(n-step Bootstrapping)_第2张图片

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

n n 步Sarsa

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

Gt=Rt+1+γRt+2++γn1Rt+n+γnQ(St+n,At+n) G t = R t + 1 + γ R t + 2 + ⋯ + γ n − 1 R t + n + γ n Q ( S t + n , A t + n )

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

Q(St,At)Q(St,At)+α[Gt:t+nQ(St,At)] Q ( S t , A t ) ← Q ( S t , A t ) + α [ G t : t + n − Q ( S t , A t ) ]

它的回溯图如下:

《强化学习Sutton》读书笔记(六)——n步Bootstrapping(n-step Bootstrapping)_第3张图片

伪代码如下:

《强化学习Sutton》读书笔记(六)——n步Bootstrapping(n-step Bootstrapping)_第4张图片

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

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

《强化学习Sutton》读书笔记(六)——n步Bootstrapping(n-step Bootstrapping)_第5张图片

表达式如下:

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)] G t = R t + 1 + γ R t + 2 + ⋯ + γ n − 1 R t + n + γ n ∑ a π ( a | S t + n ) Q ( S t + n , a ) Q ( S t , A t ) ← Q ( S t , A t ) + α [ G t : t + n − Q ( S t , A t ) ]

n n 步Off-Policy学习

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

ρt:t+n1=k=tmin{t+n1,T1}π(Ak|Sk)b(Ak|Sk) ρ t : t + n − 1 = ∏ k = t min { t + n − 1 , T − 1 } π ( A k | S k ) b ( A k | S k )

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

Q(St,At)Q(St,At)+αρt+1:t+n[Gt:t+nQ(St,At)] Q ( S t , A t ) ← Q ( S t , A t ) + α ρ t + 1 : t + n [ G t : t + n − Q ( S t , A t ) ]

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

vn+1(s)=vn(s)+Wn+1Cn+1(Gn+1vn(s)) v n + 1 ( s ) = v n ( s ) + W n + 1 C n + 1 ( G n + 1 − v n ( s ) )

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

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

《强化学习Sutton》读书笔记(六)——n步Bootstrapping(n-step Bootstrapping)_第6张图片

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

* 单次决策法与决策变量

略。

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

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

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

《强化学习Sutton》读书笔记(六)——n步Bootstrapping(n-step Bootstrapping)_第7张图片

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

Gt:t+1=Rt+1+γaπ(a|St+1)Q(St+1,a) G t : t + 1 = R t + 1 + γ ∑ a π ( a | S t + 1 ) Q ( S t + 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 G t : t + 2 = R t + 1 + γ ∑ a ≠ A t + 1 π ( a | S t + 1 ) Q ( S t + 1 , a ) + γ π ( A t + 1 | S t + 1 ) [ R t + 2 + γ ∑ a π ( a | S t + 2 ) Q ( S t + 2 , a ) ] = R t + 1 + γ ∑ a ≠ A t + 1 π ( a | S t + 1 ) Q ( S t + 1 , a ) + γ π ( A t + 1 | S t + 1 ) G t + 1 : t + 2

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

Gt:t+n=Rt+1+γaAt+1π(a|St+1)Q(St+1,a)+γπ(At+1|St+1)Gt+1:t+n G t : t + n = R t + 1 + γ ∑ a ≠ A t + 1 π ( a | S t + 1 ) Q ( S t + 1 , a ) + γ π ( A t + 1 | S t + 1 ) G t + 1 : t + n

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

Q(St,At)=Q(St,At)+α[Gt:t+nQ(St,At)] Q ( S t , A t ) = Q ( S t , A t ) + α [ G t : t + n − Q ( S t , A t ) ]

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

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

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

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

《强化学习Sutton》读书笔记(六)——n步Bootstrapping(n-step Bootstrapping)_第8张图片

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

略。

参考文献

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

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

你可能感兴趣的:(读书笔记,强化学习)