文章目录
第七章 n步自举法
在本章中,我们将统一前两章介绍的两种方法。单独的蒙特卡洛方法或时序差分方法都不会总是最好的方法。n步时序差分方法
是这两种方法更一般的推广,在这个框架下可以更加平滑地切换这两种方法。蒙特卡洛方法和时序差分方法是这个框架中的两种极端的特例,中间方法的性能一般要比这两种极端方法好。
从另一个角度来看,n步时序差分方法的另一个好处是可以解决之前更新时刻不灵活的问题。(现在是n步更新一次?对)在单步时序差分方法中,相同的时刻步长(单步)决定了动作变化的频度以及执行自举操作的时间段。在很多应用中,我们希望能够尽可能快地根据任何变化来更新动作,但自举法往往需要在一个时间段中操作才能得到好的效果,(是因为要累积一定的变化值吗)在这个时间段需要有显著的状态变化。而在单步时序差分方法中,时间间隔(即时刻步长)总是一样的,所以需要进行折中。n步方法能够使子句法在一个较长的时间段内进行,从而解决单步时序差分方法的不灵活问题。
n步时序差分方法的思想一般会作为资格迹(第12章)算法思想的一个引子,资格迹算法允许自举法在多个时间段同时开展操作。但是在本章中,我们将只从n步时序差分方法自己的角度进行讨论,稍后我们将遭第12章介绍资格迹相关的方法。这可以让我们更好地把问题进行分解,在n步时序差分方法的框架下进行尽可能详细的讨论。
和之前一样,我们首先考虑预测问题,再考虑控制问题,即我们首先讨论n步方法如何能够更好地对一个固定的策略预测其状态价值函数 V π V_\pi Vπ。然后,我们将此方法扩展到估计动作价值函数并讨论控制问题。
7.1 n步时序差分预测
介于蒙特卡洛和时序差分两种方法中间的方法是什么样呢?考虑在固定策略π下利用多幕采样序列估计
v
π
v_\pi
vπ的情况。蒙特卡洛方法根据从某一状态开始 到终止状态 的收益序列,对这个状态 的价值进行更新。而时序差分方法则只根据后面的单个即时收益,在下一个后继状态的价值估计值的基础上进行自举更新。在这里,用于自举的后继状态价值代表了后面所有剩余时刻的累积收益。因此,一种介于两者之间的方法根据多个中间时刻的收益来进行更新:多于一个时刻的收益,但又不是到终止状态的所有收益。例如,两步更新基于紧接着的两步收益和两步之后的价值函数的估计值。类似地,可以有三步更新、四步更新,等等。图7.1是
v
π
v_\pi
vπ的一个n步更新
的回溯图,最左边是时序差分更新示意图,最右边是蒙特卡洛更新示意图。
图7.1 n步方法的回溯图。这些方法构成了一个从单步时序差分到蒙特卡洛的方法族
更严格地讲,考虑根据“状态-收益”序列
S
t
,
R
t
+
1
,
S
t
+
1
,
R
t
+
2
,
.
.
.
,
R
T
,
S
T
S_t,R_{t+1},S_{t+1},R_{t+2},...,R_T,S_T
St,Rt+1,St+1,Rt+2,...,RT,ST(为了简便,这里省略了动作)来进行状态
S
t
S_t
St的更新。我们知道,在基于蒙特卡洛的更新中,
v
π
(
S
t
)
v_\pi(S_t)
vπ(St)的估计值会沿着完整回报的方向进行更新,即
G
t
=
˙
R
t
+
1
+
γ
R
t
+
2
+
γ
2
R
t
+
3
+
⋯
+
γ
T
−
t
−
1
R
T
,
G_t \dot= R_{t+1}+\gamma R_{t+2}+ \gamma^2 R_{t+3}+\dots+\gamma^{T-t-1} R_{T},
Gt=˙Rt+1+γRt+2+γ2Rt+3+⋯+γT−t−1RT,
其中,T是终止状态的时刻,
G
t
G_t
Gt是更新的目标。尽管在蒙特卡洛更新中的目标是上面的累积收益(也即回报)
G
t
G_t
Gt,但是在单步时序差分更新中的目标,却是即时收益加上后继状态的价值函数估计值乘以折扣系数,称其为单步回报
G
t
:
t
+
1
=
˙
R
t
+
1
+
γ
V
t
(
S
t
+
1
)
,
G_{\color{red}{t:t+1}} \dot= R_{t+1}+\gamma V_t(S_{t+1}),
Gt:t+1=˙Rt+1+γVt(St+1),
其中,
V
t
:
S
→
R
V_t:S\rightarrow\mathbb{R}
Vt:S→R是在t时刻
V
π
V_\pi
Vπ的估计值。(实际上,在t和t+1时刻,
V
π
V_\pi
Vπ都不会改变,因为没有进行任何更新)
G
t
:
t
+
1
G_{\color{red}{t:t+1}}
Gt:t+1的下标表示这是一种截断回报,它由当前时刻t到时刻t+1的累积收益和折后回报
γ
V
t
(
S
t
+
1
)
\gamma V_t(S_{t+1})
γVt(St+1)组成,其中
γ
V
t
(
S
t
+
1
)
\gamma V_t(S_{t+1})
γVt(St+1)替代了完整回报中的
γ
R
t
+
2
+
γ
2
R
t
+
3
+
⋯
+
γ
T
−
t
−
1
R
T
\gamma R_{t+2}+ \gamma^2 R_{t+3}+\dots+\gamma^{T-t-1} R_{T}
γRt+2+γ2Rt+3+⋯+γT−t−1RT。类似地,这种想法也能扩展到两步的情况。两步更新的目标是两步回报
G
t
:
t
+
2
=
˙
R
t
+
1
+
γ
R
t
+
2
+
γ
2
V
t
+
1
(
S
t
+
2
)
,
G_{\color{red}{t:t+2}} \dot= R_{t+1}+\gamma R_{t+2}+\gamma^2 V_{\color{blue}{t+1}}(S_{t+2}),
Gt:t+2=˙Rt+1+γRt+2+γ2Vt+1(St+2),
其中,
γ
2
V
t
+
1
(
S
t
+
2
)
\gamma^2 V_{\color{blue}{t+1}}(S_{t+2})
γ2Vt+1(St+2)替代了
γ
2
R
t
+
3
+
⋯
+
γ
T
−
t
−
1
R
T
\gamma^2 R_{t+3}+\dots+\gamma^{T-t-1} R_{T}
γ2Rt+3+⋯+γT−t−1RT。类似地,任意n步更新的目标是n步回报
G
t
:
t
+
n
=
˙
R
t
+
1
+
γ
R
t
+
2
+
⋯
+
γ
n
−
1
R
t
+
n
+
γ
n
V
t
+
n
−
1
(
S
t
+
n
)
,
(7.1)
G_{\color{red}{t:t+n}} \dot= R_{t+1}+\gamma R_{t+2}+\dots+\gamma ^{\color{red}{n-1}}R_{t+n}+\gamma^n V_{\color{blue}{t+n-1}}(S_{\color{blue}{t+n}}), \tag{7.1}
Gt:t+n=˙Rt+1+γRt+2+⋯+γn−1Rt+n+γnVt+n−1(St+n),(7.1)
其中, n ≥ 1 , 0 ≤ t < T − n n \geq 1, 0 \leq t< T-n n≥1,0≤t<T−n。所有的n步回报都可以看做完整回报的近似,即在n步后截断得到n步回报,然后其余部分用 V t + n − 1 ( S t + n ) V_{\color{blue}{t+n-1}}(S_{\color{blue}{t+n}}) Vt+n−1(St+n)来代替。如果 t + n ≥ T t + n \geq T t+n≥T(即n步回报超出了终止状态),则其余部分的值都为0,即n步回报等于完整的回报(如果 t + n ≥ T t + n \geq T t+n≥T,则 G t : t + n = G t G_{\color{red}{t:t+n}} =G_t Gt:t+n=Gt)。
注意,计算n步回报(n>1)需要涉及若干将来时刻的收益和状态,当状态从当前时刻t转移到下一时刻t+1时,我们没法获取这些收益和状态。n步回报只有在获取到
R
t
+
n
R_{t+n}
Rt+n和
V
t
+
n
−
1
V_{\color{blue}{t+n-1}}
Vt+n−1后才能计算,而这些值只能等到时刻t+n时才能全部得到。一个比较自然的基于n步回报的状态价值函数更新算法是
V
t
+
n
(
S
t
)
=
˙
V
t
+
n
−
1
(
S
t
)
+
α
[
G
t
:
t
+
n
−
V
t
+
n
−
1
(
S
t
)
]
,
0
≤
t
≤
T
,
(7.2)
\color{purple}{V_{t+n}(S_t) \dot= V_{t+n-1}(S_t)+\alpha [G_{t:t+n}-V_{t+n-1}(S_t)], 0 \leq t \leq T}, \tag{7.2}
Vt+n(St)=˙Vt+n−1(St)+α[Gt:t+n−Vt+n−1(St)],0≤t≤T,(7.2)
而对于任意其他状态
s
(
s
≠
S
t
)
s(s≠S_t)
s(s=St)的价值估计保持不变:
V
t
+
n
(
S
)
=
V
t
+
n
−
1
(
S
)
V_{t+n}(S)=V_{t+n-1}(S)
Vt+n(S)=Vt+n−1(S)。这个算法被称为n步时序差分(n步TD)算法
。注意,在最开始的n-1个时刻,价值函数不会被更新。为了弥补这个缺失,在终止时刻后还将执行对应次数的更新(此时的更新就相当于完整回报更新了吧?)。完整的伪代码如图中所示
练习7.1
在第6章,我们注意到,如果价值函数的估计值不是每步都被更新,则蒙特卡洛误差可以被改写成时序差分(式6.6)的和:
请推广该结论,即将式(7.2)中的n步误差也改写为时序差分误差之和的形式(同样假设在此过程中价值估计不更新)。
答:
G
t
:
t
+
n
−
V
t
+
n
−
1
(
S
t
)
=
R
t
+
1
+
γ
G
t
+
1
:
t
+
n
−
V
t
+
n
−
1
(
S
t
)
+
γ
V
t
+
n
(
S
t
+
1
)
−
γ
V
t
+
n
(
S
t
+
1
)
=
δ
t
+
1
+
γ
(
G
t
+
1
:
t
+
n
−
V
t
+
n
(
S
t
+
1
)
)
=
δ
t
+
1
+
γ
(
δ
t
+
2
+
…
)
=
∑
k
=
t
+
1
t
+
n
−
1
γ
k
−
t
−
1
δ
k
\begin{aligned} G_{t:t+n}-V_{t+n-1}(S_t)&=R_{t+1}+\gamma G_{t+1:t+n}-V_{t+n-1}(S_t)+\gamma V_{t+n}(S_{t+1})-\gamma V_{t+n}(S_{t+1}) \\&=\delta_{t+1}+\gamma (G_{t+1:t+n}-V_{t+n}(S_{t+1})) \\&=\delta_{t+1}+\gamma(\delta_{t+2}+\dots) \\&=\sum_{k=t+1}^{t+n-1} \gamma ^{k-t-1} \delta_k \end{aligned}
Gt:t+n−Vt+n−1(St)=Rt+1+γGt+1:t+n−Vt+n−1(St)+γVt+n(St+1)−γVt+n(St+1)=δt+1+γ(Gt+1:t+n−Vt+n(St+1))=δt+1+γ(δt+2+…)=k=t+1∑t+n−1γk−t−1δk
其中,
δ
t
+
1
=
R
t
+
1
+
γ
V
t
+
n
(
S
t
+
1
)
−
γ
V
t
+
n
−
1
(
S
t
)
\delta_{t+1}=R_{t+1}+\gamma V_{t+n}(S_{t+1})-\gamma V_{t+n-1}(S_{t})
δt+1=Rt+1+γVt+n(St+1)−γVt+n−1(St)
练习7.2(编程)
在n步方法中,价值函数需要每步都更新,所以利用时序差分误差之和来代替公式(7.2)中的错误项算法将会与之前有些不同。这种算法是一个更好的还是更差的算法?请设计一个小实验并编程验证这个问题。
n步回报利用价值函数
V
t
+
n
−
1
V_{t+n-1}
Vt+n−1来校正
R
t
+
n
R_{t+n}
Rt+n之后的所有剩余收益之和。n步回报的一个重要特性是:在最坏的情况下,采用它(n步回报)的期望值作为对
v
π
v_\pi
vπ的估计可以保证比
V
t
+
n
−
1
(
s
)
V_{t+n-1}(s)
Vt+n−1(s)更好。换句话说,n步回报的期望的最坏误差能够保证不大于
V
t
+
n
−
1
V_{t+n-1}
Vt+n−1最坏误差的
V
t
+
n
−
1
V_{t+n-1}
Vt+n−1倍
m
a
x
s
∣
E
π
[
G
t
:
t
+
n
∣
S
t
=
s
]
−
v
π
(
s
)
∣
≤
γ
n
m
a
x
s
∣
V
t
+
n
−
1
(
s
)
−
v
π
(
s
)
∣
(7.3)
\underset{s}{max}|\mathbb{E}_\pi[G_{t:t+n}|S_t=s]-v_{\pi}(s)| \leq \gamma ^n \underset{s}{max}|V_{t+n-1}(s)-v_{\pi}(s)| \tag{7.3}
smax∣Eπ[Gt:t+n∣St=s]−vπ(s)∣≤γnsmax∣Vt+n−1(s)−vπ(s)∣(7.3)
此式对于任意n≥1都成立。这被称为n步回报的误差减少性质。根据这个性质,可以证明所有的n步时序差分方法在合适的条件下都能收敛到正确的预测。因此,n步时序差分方法是一类有坚实数学基础的方法,其中单步时序差分方法和蒙特卡洛方法是两个极端特例。
例7.1 n步时序差分方法在随机游走上的应用
在例6.2中描述的随机游走任务中使用n步时序差分方法。假设从中间状态开始,往右边走,经过D和E,最后停在右边,收到回报1。最开始,所有的状态价值都是0.5,即 V ( s ) = 0.5 V(s)=0.5 V(s)=0.5。有过这样一次经验后,单步时序差分方法只能更新最后一个状态的值V(E),即向着1的方向更新。然而,两步差分方法能够更新两个状态的值:V(D)和V(E),它们都要朝着1方向增大。三步差分方法或者任意n步方法(n>2)都可以向1的方向更新所有经过的状态的价值函数,并且更新的大小相同。(我感觉这个地方是想说,更新后的价值函数实际上变化了,因为单步时序差分也会更新所有经过的状态的价值函数呀,只不过更新V(D)的时候,使用到V(E),和R,使得V(D)实质上没有变化,但是更新的步骤还是有的。)
图7.2 在19个状态的随机游走任务中(例7.1),对于不同的n,作为α的函数的n步时序差分方法的性能
n为多少时是最好的呢?图7.2展示了一个有19个状态的随机游走过程的实验结果,其中在左边的收益为-1,所有的初始状态价值为0。在本章的后面我们也将使用这个例子。结果展示了在不同的n和α情况下n步方法的性能。不同情况下的性能测试指标(纵坐标表示)是最后19个状态在每幕终止时的价值函数的估计值和真实值的均方误差的平均值的开方,图中展示的是最开始10幕,并重复100次(在所有的设置下动作的集合相同)(?)的平均结果。从图中可以看出,n取中间大小的值时效果最好。这也证明了将单步时序差分方法和蒙特卡洛方法推广到n步时序差分方法可能会得到更好的结果。
练习7.3
你认为使用一个更大随机游走任务(19个状态取代5个状态)的原因是什么呢?在小任务上n的不同值的优势会改变吗?把左边的收益从0改到-1的原因呢?这会改变n的最优值吗?
答1:式蒙特卡洛方法和TD(0)走向更极端的两种情况,以此来尽可能探求中间方法的表现。我认为在小任务上n的不同值会改变优势,因为对于小任务,蒙特卡洛方法和TD(0)这两个极端的差别变小了。把左边的收益从0改为-1是为了加速收敛吗?我认为这不会改变n的最优值。
答2:使用更大随机游走任务使各n的取值更多以探究n的最佳取值;在小任务上的的不同值的优势降低了;把左边的收益从0改为-1是为了降低最大化偏差的影响,但不会改变n的最优值。
标答:
更小的行走会将优势转移到更小的n上,因为当n≥(状态数−1)/ 2(#状态数是奇数)算法更新所有的状态访问的终端奖励。 这意味着该算法只改变大小为α的值,因为这些值不再被引导或备份。
左边的−1奖励的增加会使n的值更小,因为在更长的时间内更大的n值将不得不通过最终奖励更新许多状态(现在是−1而不是0),从而增加方差。
7.2 n步Sarsa
如何使得n步方法不单用来进行预测,同时也可以用作控制呢?在本章中,我们将展示n步方法是如何和Sarsa直接结合来产生同轨策略下的时序差分学习控制方法的。这种n步版本的Sarsa我们统称为n步Sarsa,并且从此开始,之前章节介绍的初始版本的Sarsa我们会统称为单步Sarsa或者Sarsa(0)。
图7.3 基于“状态-动作”二元组的n步方法的回溯图,这些方法构成了一个从单步更新的Sarsa(0)到基于终止状态更新的蒙特卡洛算法的方法族。介于两者之间的是n步更新,它由n步真实收益和对第n步“状态-动作”二元组的价值的估计值组成,所以价值都有适当的折扣。最右边的图是n步期望Sarsa的回溯图
该方法的核心思想是将状态替换为“状态-动作”二元组,然后使用
ε
\varepsilon
ε-贪心策略。 n步Sarsa的回溯图(见图7.3)和n步时序差分方法的回溯图类似,都是由交替出现的状态和动作构成,唯一不同的是Sarsa的回溯图的首末两端都是动作而不是状态。我们重新根据动作的价值估计定义如下的n步方法的回报(更新目标)
G
t
:
t
+
n
=
˙
R
t
+
1
+
γ
R
t
+
2
+
⋯
+
γ
n
−
1
R
t
+
n
+
γ
n
Q
t
+
n
−
1
(
S
t
+
n
,
A
t
+
n
)
,
(7.4)
G_{t:t+n} \dot= R_{t+1}+\gamma R_{t+2}+\dots+\gamma ^{n-1}R_{t+n}+\gamma^n \color{red}Q_{t+n-1}(S_{t+n},A_{t+n}), \tag{7.4}
Gt:t+n=˙Rt+1+γRt+2+⋯+γn−1Rt+n+γnQt+n−1(St+n,At+n),(7.4)
当
t
+
n
≥
T
t+n \geq T
t+n≥T 时,
G
t
:
t
+
n
=
G
t
G_{t:t+n}=G_t
Gt:t+n=Gt。基于此,很自然可以得到如下算法
Q
t
+
n
−
1
(
S
t
+
n
,
A
t
+
n
)
=
˙
Q
t
+
n
−
1
(
S
t
+
n
,
A
t
+
n
)
+
α
[
G
t
:
t
+
n
−
Q
t
+
n
−
1
(
S
t
+
n
,
A
t
+
n
)
]
,
0
≤
t
≤
T
,
(7.5)
\color{purple}{Q_{t+n-1}(S_{t+n},A_{t+n}) \dot=Q_{t+n-1}(S_{t+n},A_{t+n})+\alpha [G_{t:t+n}-Q_{t+n-1}(S_{t+n},A_{t+n})], 0 \leq t \leq T}, \tag{7.5}
Qt+n−1(St+n,At+n)=˙Qt+n−1(St+n,At+n)+α[Gt:t+n−Qt+n−1(St+n,At+n)],0≤t≤T,(7.5)
除了上面更新的状态之外,所有其他状态的价值都保持不变,即对于所有满足
s
≠
S
t
s \neq S_t
s=St或
a
≠
A
t
a \neq A_t
a=At的
s
,
a
s,a
s,a来说,有
Q
t
+
n
(
s
,
a
)
=
Q
t
+
n
−
1
(
s
,
a
)
Q_{t+n}(s,a)=Q_{t+n-1}(s,a)
Qt+n(s,a)=Qt+n−1(s,a)。这就是n步Sarsa算法
算法伪代码展示在下框中,关于为什么n步Sarsa相较于单步Sarsa能够加速学习,参见图7.4的例子。
练习7.4
证明Sarsa算法的n步回报(式7.4)可以被严格写成一个新的时序差分的形式,如下所示
G
t
:
t
+
n
=
Q
t
−
1
(
S
t
,
A
t
)
+
∑
k
=
t
m
i
n
(
t
+
n
,
T
)
−
1
γ
k
−
t
[
R
k
+
1
+
γ
Q
k
(
S
k
+
1
,
A
k
+
1
)
−
Q
k
−
1
(
S
k
,
A
k
)
]
.
(7.6)
G_{t:t+n}=Q_{t-1}(S_t,A_t)+\sum_{k=t}^{min(t+n,T)-1}\gamma ^{k-t}[R_{k+1} + \gamma Q_k(S_{k+1},A_{k+1})-Q_{k-1}(S_k,A_k)]. \tag{7.6}
Gt:t+n=Qt−1(St,At)+k=t∑min(t+n,T)−1γk−t[Rk+1+γQk(Sk+1,Ak+1)−Qk−1(Sk,Ak)].(7.6)
标答:
G
t
:
t
+
n
≐
R
t
+
1
+
γ
R
t
+
2
+
⋯
+
γ
n
−
1
R
t
+
n
+
γ
n
Q
t
+
n
−
1
(
S
t
+
n
,
A
t
+
n
)
=
∑
i
=
1
n
γ
i
−
1
R
t
+
i
+
γ
n
Q
t
+
n
−
1
(
S
t
+
n
,
A
t
+
n
)
\begin{aligned} G_{t:t+n} &\doteq R_{t+1}+\gamma R_{t+2}+\dots+\gamma ^{n-1}R_{t+n}+\gamma^n Q_{t+n-1}(S_{t+n},A_{t+n}) \\&=\sum_{i=1}^n\gamma^{i-1}R_{t+i}+\gamma^n Q_{t+n-1}(S_{t+n},A_{t+n}) \end{aligned}
Gt:t+n≐Rt+1+γRt+2+⋯+γn−1Rt+n+γnQt+n−1(St+n,At+n)=i=1∑nγi−1Rt+i+γnQt+n−1(St+n,At+n)
对
n
≥
1
n \geq 1
n≥1和
0
≤
t
<
T
−
n
0 \leq t < T-n
0≤t<T−n 以及当
t
+
n
>
T
G
t
:
t
+
n
=
G
t
t+n >T \quad G_{t:t+n}=G_t
t+n>TGt:t+n=Gt
设
τ
=
m
i
n
(
t
+
n
,
T
)
−
1
\tau=min(t+n,T)-1
τ=min(t+n,T)−1 并且有:
∑
k
=
t
τ
γ
k
−
t
[
R
t
+
1
+
γ
Q
k
(
S
k
+
1
,
A
k
+
1
)
−
Q
k
−
1
(
S
k
,
A
k
)
]
=
∑
k
=
t
τ
γ
k
−
t
R
t
+
1
+
γ
∑
k
=
t
τ
γ
k
−
t
Q
k
(
S
k
+
1
,
A
k
+
1
)
−
∑
k
=
t
τ
γ
k
−
t
Q
k
−
1
(
S
k
,
A
k
)
=
G
t
:
t
+
n
−
1
{
t
+
n
<
T
}
γ
n
Q
t
+
n
−
1
(
S
t
+
n
,
A
t
+
n
)
+
γ
τ
Q
τ
(
S
τ
,
A
τ
)
−
Q
t
−
1
(
S
t
,
A
t
)
=
G
t
:
t
+
n
−
Q
t
−
1
(
S
t
,
A
t
)
.
\begin{aligned} &\sum_{k=t}^{\tau} \gamma^{k-t}\left[R_{t+1}+\gamma Q_{k}\left(S_{k+1}, A_{k+1}\right)-Q_{k-1}\left(S_{k}, A_{k}\right)\right] \\ &=\sum_{k=t}^{\tau} \gamma^{k-t} R_{t+1}+\gamma \sum_{k=t}^{\tau} \gamma^{k-t} Q_{k}\left(S_{k+1}, A_{k+1}\right)-\sum_{k=t}^{\tau} \gamma^{k-t} Q_{k-1}\left(S_{k}, A_{k}\right) \\ &=G_{t: t+n}-\mathbb{1}\{t+n<T\} \gamma^{n} Q_{t+n-1}\left(S_{t+n}, A_{t+n}\right)+\gamma^{\tau} Q_{\tau}\left(S_{\tau}, A_{\tau}\right)-Q_{t-1}(S_{t}, A_{t}) \\ &=G_{t: t+n}-Q_{t-1}(S_{t}, A_{t}) . \end{aligned}
k=t∑τγk−t[Rt+1+γQk(Sk+1,Ak+1)−Qk−1(Sk,Ak)]=k=t∑τγk−tRt+1+γk=t∑τγk−tQk(Sk+1,Ak+1)−k=t∑τγk−tQk−1(Sk,Ak)=Gt:t+n−1{t+n<T}γnQt+n−1(St+n,At+n)+γτQτ(Sτ,Aτ)−Qt−1(St,At)=Gt:t+n−Qt−1(St,At).
整不会了…
图7.4 在网格世界的例子中,使用n步方法而导致的策略学习加速。第一张图显示了在一幕中智能体所走过的路径,最终停在一个具有高收益的位置,将其标记为G。在这个例子中,收益全部被初始化为0,并且除了在G位置设置了正的收益之外,所有的收益都初始化为0。其他两张图的箭头显示了在单步Sarsa和n步Sarsa方法中,按照第一张图的路径,哪一个动作的价值得到了增强。单步Sarsa仅仅增强了这一系列动作的最后一个,使得这个动作得到一个高收益;而n步Sarsa则将这一系列动作中的最后n个动作都增强了,这样从一幕序列中可以学习到更多知识
期望Sarsa是什么样的呢?n步期望Sarsa的回溯图展示在图7.3最右边。它和n步Sarsa的回溯图一样,包括一个由采样动作和状态组成的线性串,不同之处在于它最后一个节点是一个分支,其对所有可能的动作采用策略π下的概率进行了加权。这个算法也可以用n步Sarsa的公式来描述,不同之处是需要重新定义n步回报
G
t
:
t
+
n
=
˙
R
t
+
1
+
γ
R
t
+
2
+
⋯
+
γ
n
−
1
R
t
+
n
+
γ
n
V
ˉ
t
+
n
−
1
(
S
t
+
n
)
,
(7.7)
G_{{t:t+n}} \dot= R_{t+1}+\gamma R_{t+2}+\dots+\gamma ^{{n-1}}R_{t+n}+\gamma^n {\color{red}\bar{V}}_{{t+n-1}}(S_{{t+n}}), \tag{7.7}
Gt:t+n=˙Rt+1+γRt+2+⋯+γn−1Rt+n+γnVˉt+n−1(St+n),(7.7)
当
t
+
n
≥
T
t+n \geq T
t+n≥T 时,
G
t
:
t
+
n
=
˙
G
t
G_{t:t+n}\dot=G_t
Gt:t+n=˙Gt。其中,
V
ˉ
t
+
n
−
1
(
S
t
)
\bar{V}_{t+n-1}(S_t)
Vˉt+n−1(St)是状态s的期望近似价值
,它采用了在目标策略下,t时刻的动作的价值估计值来计算
V
ˉ
t
(
S
)
≐
∑
a
π
(
a
∣
s
)
Q
t
(
s
,
a
)
,
对
所
有
的
s
∈
S
.
(7.8)
\bar{V}_t(S) \doteq \sum_a \pi(a|s)Q_t(s,a),对所有的s \in S.\tag{7.8}
Vˉt(S)≐a∑π(a∣s)Qt(s,a),对所有的s∈S.(7.8)
期望估计值在本书接下来提及的很多动作价值函数方法中会用到。如果s是终止状态,那么我们定义它的期望估计值为0。
7.3 n步离轨策略学习
回顾一下,离轨策略学习是在学习策略π时,智能体却遵循另一个策略b的学习方法。通常π是针对当前的动作价值函数的贪心策略,而b是一个更具试探性的策略,例如
ε
\varepsilon
ε-贪心策略。为了使用遵循策略b得到的数据,我们必须考虑两种策略之间的不同,使用它们对应动作的相对概率(详见5.5节)。在n步方法中,回报根据n步来建立,所以我们感兴趣的是这n步的相对概率。例如,实现一个简单离轨策略版本的n步时序差分学习,对于t时刻的更新(实际上在t+n时刻),可以简单地用
ρ
t
:
t
+
n
−
1
\rho_{t:t+n-1}
ρt:t+n−1来加权
V
t
+
n
(
S
t
)
≐
V
t
+
n
−
1
(
S
t
)
+
α
ρ
t
:
t
+
n
−
1
[
G
t
:
t
+
n
−
V
t
+
n
−
1
(
S
t
)
]
,
0
≤
t
<
T
,
(7.9)
V_{t+n}(S_t) \doteq V_{t+n-1}(S_t)+\alpha {\color{red}\rho_{t:t+n-1}}[G_{t:t+n}-V_{t+n-1}(S_t)], 0 \leq t < T, \tag{7.9}
Vt+n(St)≐Vt+n−1(St)+αρt:t+n−1[Gt:t+n−Vt+n−1(St)],0≤t<T,(7.9)
其中,
ρ
t
:
t
+
n
−
1
\rho_{t:t+n-1}
ρt:t+n−1叫做重要度采样率
,是两种策略采取
A
t
A
t
+
n
A_t~A_{t+n}
At At+n这n个动作的相对概率(参见式5.3,对于蒙特卡洛方法,这里的h就是T-1)
ρ
t
:
h
≐
∏
k
=
t
m
i
n
(
h
,
T
−
1
)
π
(
A
k
∣
S
k
)
b
(
A
k
∣
S
k
)
.
(7.10)
\rho_{t:h}\doteq \prod_{k=t}^{min(h,T-1)}\frac{\pi(A_k|S_k)}{b(A_k|S_k)}.\tag{7.10}
ρt:h≐k=t∏min(h,T−1)b(Ak∣Sk)π(Ak∣Sk).(7.10)
例如,假定策略π永远都不会采取某个特定动作(
π
(
A
k
∣
S
k
)
=
0
\pi(A_k|S_k)=0
π(Ak∣Sk)=0),则n步回报的权重应该为0,即完全忽略。另一方面,假如碰巧某个动作在策略π下被采取的概率远远大于行动策略b,那么将增加对应回报的权重。这是有意义的,因为该动作是策略π的特性(因此我们需要学习它),但是该动作很少被b选择,因此也很少出现在数据中。为了弥补这个缺陷,当该动作发生时,我们不得不提高它的权重。注意,如果这两种策略实际上是一样的,那么重要度采样率总是1。所以更新公式(7.9)是之前的n步时序差分学习方法(同步策略)的推广,并且可以完整替代它。同样,之前的n步Sarsa的更新方法可以完整地被如下简单的离轨策略版本方法代替。对于
0
≤
t
<
T
0 \leq t < T
0≤t<T,
Q
t
+
n
(
S
t
,
A
t
)
≐
Q
t
+
n
−
1
(
S
t
,
A
t
)
+
α
ρ
t
+
1
:
t
+
h
[
G
t
:
t
+
n
−
Q
t
+
n
−
1
(
S
t
,
A
t
)
]
,
(7.11)
Q_{t+n}(S_t,A_t)\doteq Q_{t+n-1}(S_t,A_t)+\alpha {\color{red}\rho_{{\color{brown}t+1}:t+h}}[G_{t:t+n}-{\color{blue}Q_{t+n-1}(S_t,A_t)}],\tag{7.11}
Qt+n(St,At)≐Qt+n−1(St,At)+αρt+1:t+h[Gt:t+n−Qt+n−1(St,At)],(7.11)
**注意这里的重要度采样率,其起点和终点比n步时序差分学习方法(式7.9)都要晚一步。**这是因为在这里我们更新的是“状态-动作”二元组。这是我们并不需要关心这些动作有多大概率被选择,既然我们已经确定了这个动作,那么我们想要的是充分地学习发生的事情, 这个学习过程会使用基于后继动作计算出的重要度采样加权系数。这个算法的完整伪代码展示在下面的框里。
离轨策略版本的n步期望Sarsa使用上文中和Sarsa相同的更新方法,除了重要度采样率少一个参数外。上面等式使用 ρ t + 1 : t + n − 1 \color{red}\rho_{t+1:t+n-1} ρt+1:t+n−1而不是 ρ t + 1 : t + n \rho_{t+1:t+n} ρt+1:t+n,以及使用期望Sarsa版本的n步回报(式7.7)。这是因为在期望Sarsa方法中,所有可能的动作都会在最后一个状态中被考虑,实际采取的那个具体动作对期望Sarsa的计算没有影响,也就不需要去修正。
7.4 * 带控制变量的每次决策型方法
之前章节展示的多步离轨策略方法非常简单,在概念上很清晰,但是可能不是最高效的。一种更精巧、复杂的方法采用了5.9节中介绍的“每次决策型重要度采样”思想。为理解这种方法,首先要注意普通的n步方法的回报,像所有的回报一样,其可以写成递归形式。对于视界终点为h的n个时刻,n步回报可以写成
G
t
:
h
=
R
t
+
1
+
γ
G
t
+
1
:
h
,
t
<
h
<
T
(7.12)
G_{t:h}=R_{t+1}+\gamma G_{t+1:h}, t < h < T \tag{7.12}
Gt:h=Rt+1+γGt+1:h,t<h<T(7.12)
其中,
G
h
:
h
=
˙
V
h
−
1
(
S
h
)
G_{h:h}\dot=V_{h-1}(S_h)
Gh:h=˙Vh−1(Sh)(回顾一下,这个回报是在时刻h使用的,之前的公式中它的角标时刻的写法是t+n)。现在考虑遵循不同于目标策略π的行动策略b产生的影响。所有产生的经验,包括对于t时刻的第一次收益
R
t
+
1
R_{t+1}
Rt+1和下一个状态
S
t
+
1
S_{t+1}
St+1都必须用重要度采样率
ρ
t
=
π
(
A
k
∣
S
k
)
b
(
A
k
∣
S
k
)
\rho_t = \frac{\pi(A_k|S_k)}{b(A_k|S_k)}
ρt=b(Ak∣Sk)π(Ak∣Sk)加权(?之前好像是直接在更新公式加权)。也需要有人觉得,对上述等式右侧直接加权不就行了吗?但其实我们有更好的方法。假设t时刻的动作永远都不会被π选择,则
ρ
t
\rho_t
ρt为零。那么简单加权会让n步方法的回报为0,当它被当作目标时可能会产生很大的方差。而在更精巧的方法中,我们采用一个替换定义。在视界h结束的n步回报的离轨策略版本的定义可以写成
G
t
:
h
≐
ρ
t
(
R
t
+
1
+
γ
G
t
+
1
:
h
)
+
(
1
−
ρ
t
)
V
h
−
1
(
S
t
)
,
t
<
h
<
T
(7.13)
G_{t:h} \doteq \rho_t(R_{t+1}+\gamma G_{t+1:h})+(1-\rho_t)V_{h-1}(S_t), t < h < T \tag{7.13}
Gt:h≐ρt(Rt+1+γGt+1:h)+(1−ρt)Vh−1(St),t<h<T(7.13)
其中,依然有
G
h
:
h
=
˙
V
h
−
1
(
S
h
)
G_{h:h}\dot=V_{h-1}(S_h)
Gh:h=˙Vh−1(Sh)。**在这个方法中,如果
ρ
t
\rho_t
ρt为0,则它并不会使得目标为0并导致估计值收缩,而是使得目标和估计值一样,因而其不会带来任何变化。**重要度采样率为0意味着我们应当忽略样本,所以让估计值保持不变看起来是一个合理的结果。在式(7.13)中额外添加的第二项被称为控制变量
。注意,这个控制变量并不会改变更新值的期望:**重要度采样率的期望为1(参见5.9节)**并且与估计值没有关联,所以第二项的期望值为0。注意,n步回报的离轨策略版本的定义(式7.13)是前面同轨策略版本的定义(7.1)的严格推广。当
ρ
t
\rho_t
ρt恒为1时,这两个式子是完全等价的。
对于一个传统的n步方法,对应公式(7.13)的学习规则是n步TD更新(式7.2)。它没有明显的重要度采样率(除了嵌入在回报当中的部分)。
练习7.5
写出上述离轨策略下的“状态-动作”二元组预测算法的伪代码
标答:
更新和n步TD更新是相同的,只不过乘上了重要度采样,加上了控制变量这一项(如7.13式)。所以算法保持不变,只是用新的回报计算代替了旧的。
如果你从字面上理解递归关系,那么我们应该得到每个中间状态的控制变量(t + 1,…t + n),但我不认为这是我们想要的,因为这只会进一步增加方差。(?)
对于动作价值,n步回报的离轨策略版本定义稍有不同。这是因为第一个动作在重要度采样中不起作用。
首先需要注意,对动作价值而言,终止于视界h的同轨策略
下的n步回报(式7.7的期望形式)可以像式(7.12)一样写成递归公式,唯一的不同是对动作价值来说,这个递归公式结束于
G
h
:
h
≐
V
ˉ
h
−
1
(
S
h
)
G_{h:h} \doteq \bar{V}_{h-1}(S_h)
Gh:h≐Vˉh−1(Sh),如式(7.8)所示。而使用控制变量的离轨策略的形式可以为:
G
t
:
h
≐
R
t
+
1
+
γ
(
ρ
t
+
1
G
t
+
1
:
h
+
V
ˉ
h
−
1
(
S
h
)
−
ρ
t
+
1
Q
h
−
1
(
S
t
+
1
,
A
t
+
1
)
)
=
R
t
+
1
+
γ
ρ
t
+
1
(
G
t
+
1
:
h
−
Q
h
−
1
(
S
t
+
1
,
A
t
+
1
)
)
+
γ
V
ˉ
h
−
1
(
S
h
)
,
t
<
h
≤
T
.
(7.14)
\begin{aligned} G_{t:h}&\doteq R_{t+1} +\gamma (\rho_{t+1}G_{t+1:h}+\bar{V}_{h-1}(S_h)-\rho_{t+1}Q_{h-1}(S_{t+1},A_{t+1})) \\&= R_{t+1}+\gamma \rho_{t+1}(G_{t+1:h}-Q_{h-1}(S_{t+1},A_{t+1}))+\gamma\bar{V}_{h-1}(S_h),t<h\leq T. \tag{7.14} \end{aligned}
Gt:h≐Rt+1+γ(ρt+1Gt+1:h+Vˉh−1(Sh)−ρt+1Qh−1(St+1,At+1))=Rt+1+γρt+1(Gt+1:h−Qh−1(St+1,At+1))+γVˉh−1(Sh),t<h≤T.(7.14)
如果 h < T h<T h<T,则上面递归公式结束于 G h : h ≐ Q h − 1 ( S h , A h ) G_{h:h} \doteq Q_{h-1}(S_h,A_h) Gh:h≐Qh−1(Sh,Ah);如果 h ≥ T h\geq T h≥T,则递归公式结束于 G T − 1 : h ≐ R T G_{T-1:h} \doteq R_T GT−1:h≐RT。由此得到的预测算法(结合了式7.5之后)是期望Sarsa的扩展。
练习7.6
证明上面式子中的控制变量不会改变回报的期望值
标答:
在(7.13)中,我们有:
E
[
(
1
−
ρ
t
)
V
h
−
1
(
S
t
)
]
=
E
b
[
(
1
−
ρ
t
)
V
h
−
1
(
S
t
)
]
=
E
b
[
(
1
−
ρ
t
)
]
E
b
[
V
h
−
1
(
S
t
)
]
=
0
×
E
b
[
V
h
−
1
(
S
t
)
]
.
=
0
\begin{aligned} \mathbb{E}[(1-\rho_t)V_{h-1}(S_t)]&= \mathbb{E}_b[(1-\rho_t)V_{h-1}(S_t)] \\&=\mathbb{E}_b[(1-\rho_t)]\mathbb{E}_b[V_{h-1}(S_t)] \\&=0 \times \mathbb{E}_b[V_{h-1}(S_t)]. \\&=0 \end{aligned}
E[(1−ρt)Vh−1(St)]=Eb[(1−ρt)Vh−1(St)]=Eb[(1−ρt)]Eb[Vh−1(St)]=0×Eb[Vh−1(St)].=0
在(7.14)中,有:
E
b
[
V
ˉ
h
−
1
(
S
h
)
−
ρ
t
+
1
Q
h
−
1
(
S
t
+
1
,
A
t
+
1
)
∣
S
t
+
1
]
=
∑
a
π
(
a
∣
S
t
+
1
)
Q
h
−
1
(
S
t
+
1
,
a
)
−
∑
a
b
(
a
∣
S
t
+
1
)
π
(
a
∣
S
t
+
1
)
b
(
a
∣
S
t
+
1
)
Q
h
−
1
(
S
t
+
1
,
a
)
=
0
\begin{aligned} &\mathbb{E}_b[\bar{V}_{h-1}(S_h)-\rho_{t+1}Q_{h-1}(S_{t+1},A_{t+1})|S_{t+1}] \\&=\sum_a \pi(a|S_{t+1})Q_{h-1}(S_{t+1},a)-\sum_a b(a|S_{t+1})\frac{\pi(a|S_{t+1})}{b(a|S_{t+1})} Q_{h-1}(S_{t+1},a) \\&=0 \end{aligned}
Eb[Vˉh−1(Sh)−ρt+1Qh−1(St+1,At+1)∣St+1]=a∑π(a∣St+1)Qh−1(St+1,a)−a∑b(a∣St+1)b(a∣St+1)π(a∣St+1)Qh−1(St+1,a)=0
* 练习7.7
写出上述离轨策略下的动作价值预测算法的伪代码。尤其要注意递归的不同终止条件,在视界的终点还是整幕数据的终点情况是不同的。
练习7.8
证明如果近似状态价值函数( V ˉ \bar{V} Vˉ)不变,则通用(离轨策略)版本的n步回报(式7.13)仍然可以简洁地写为基于状态的TD误差(式6.5)的和的形式。
标答:
更新目标为:
G
t
:
h
=
ρ
t
(
R
t
+
1
+
γ
G
t
+
1
:
h
)
+
(
1
−
ρ
t
)
V
h
−
1
(
S
t
)
G_{t:h}=\rho_t(R_{t+1} + \gamma G_{t+1:h})+(1-\rho_t)V_{h-1}(S_t)
Gt:h=ρt(Rt+1+γGt+1:h)+(1−ρt)Vh−1(St)
假设状态价值函数不变,引入TD误差:
δ
t
≐
R
t
+
1
+
γ
V
(
S
t
+
1
)
−
V
(
S
t
)
.
\delta_t \doteq R_{t+1}+\gamma V(S_{t+1})-V(S_t).
δt≐Rt+1+γV(St+1)−V(St).
那么:
G
t
:
h
−
V
(
S
t
)
=
ρ
t
(
R
t
+
1
+
γ
G
t
+
1
:
h
−
V
(
S
t
)
)
=
ρ
t
(
R
t
+
1
+
γ
[
G
t
+
1
:
h
−
V
(
S
t
+
1
)
]
+
γ
V
(
S
t
+
1
)
−
V
(
S
t
)
)
=
ρ
t
δ
t
+
ρ
t
γ
[
G
t
+
1
:
h
−
V
(
S
t
+
1
)
]
⋮
=
∑
i
=
t
m
i
n
(
t
,
T
)
−
1
ρ
t
:
i
γ
i
=
t
δ
i
\begin{aligned} G_{t:h}-V(S_t)&=\rho_t(R_{t+1}+\gamma G_{t+1:h}-V(S_t)) \\&=\rho_t(R_{t+1}+\gamma[G_{t+1:h}-V(S_{t+1})]+\gamma V(S_{t+1}) -V(S_t)) \\&=\rho_t \delta_t+\rho_t \gamma [G_{t+1:h}-V(S_{t+1})] \\ &\quad\, \vdots \\&=\sum_{i=t}^{min(t,T)-1} \rho_{t:i}\gamma^{i=t}\delta_i \end{aligned}
Gt:h−V(St)=ρt(Rt+1+γGt+1:h−V(St))=ρt(Rt+1+γ[Gt+1:h−V(St+1)]+γV(St+1)−V(St))=ρtδt+ρtγ[Gt+1:h−V(St+1)]⋮=i=t∑min(t,T)−1ρt:iγi=tδi
练习7.9
针对动作版本(Q)的离轨策略n步回报(式7.14)和期望Sarsa TD误差(式6.9括号中的量)重复上面的练习题。
标答:
动作价值函数更新:
G
t
:
h
=
R
t
+
1
+
γ
ρ
t
+
1
(
G
t
+
1
:
h
−
Q
h
−
1
(
S
t
+
1
,
A
t
+
1
)
)
+
γ
V
ˉ
h
−
1
(
S
h
)
G_{t:h}=R_{t+1}+\gamma \rho_{t+1}(G_{t+1:h}-Q_{h-1}(S_{t+1},A_{t+1}))+\gamma \bar{V}_{h-1}(S_h)
Gt:h=Rt+1+γρt+1(Gt+1:h−Qh−1(St+1,At+1))+γVˉh−1(Sh)
其中,
V
ˉ
h
≐
∑
a
π
(
a
∣
S
h
)
Q
(
S
h
,
a
)
\bar{V}_h \doteq \sum_a \pi(a|S_h)Q(S_h,a)
Vˉh≐a∑π(a∣Sh)Q(Sh,a)
假设动作价值函数在迭代时保持不变,定义:
δ
t
≐
R
t
+
1
+
γ
V
(
S
t
+
1
)
−
Q
(
S
t
,
A
t
)
.
\delta_t \doteq R_{t+1}+\gamma V(S_{t+1})-Q(S_t,A_t).
δt≐Rt+1+γV(St+1)−Q(St,At).
所以有:
G
t
:
h
−
Q
(
S
t
,
A
t
)
=
δ
t
+
γ
ρ
t
+
1
(
G
t
+
1
:
h
−
Q
(
S
t
+
1
,
A
t
+
1
)
)
⋮
=
∑
i
=
t
m
i
n
(
t
,
T
)
−
1
ρ
t
+
1
:
i
γ
i
=
t
δ
i
\begin{aligned} G_{t:h}-Q(S_t,A_t)&=\delta_t+\gamma \rho_{t+1}(G_{t+1:h}-Q(S_{t+1},A_{t+1})) \\ &\quad\, \vdots \\&=\sum_{i=t}^{min(t,T)-1} \rho_{t+1:i}\gamma^{i=t}\delta_i \end{aligned}
Gt:h−Q(St,At)=δt+γρt+1(Gt+1:h−Q(St+1,At+1))⋮=i=t∑min(t,T)−1ρt+1:iγi=tδi
约定当
a
>
b
,
ρ
a
:
b
=
1
a>b, \rho_{a:b}=1
a>b,ρa:b=1
练习7.10(编程)
设计一个小型的离轨策略预测问题,并且用它来证实:使用式(7.13)和式(7.2)的离轨策略学习算法比简单地使用式(7.1)和式(7.9)的算法在数据使用上更高效。
(略)
我们在本节和上一节以及第五章中用到的重要度采样方法使得离轨策略学习有了坚实的基础,但代价是增加了更新过程的方差。这就迫使我们使用很小的步长参数,因而导致学习过程非常缓慢。离轨策略学习比同轨策略学习更缓慢可能是无法避免的——毕竟数据与所学的东西相关性更少。但是,我们这里展示的方法也是有可能改进的。一种可能是快速地改变步长参数来适应观察到的方差,就像在Autostep方法中实现的那样。另一个有前景的方法是“不变更新”,这个方法进一步被Tian扩展到了TD。…
下一节中,我们会讨论一个不使用重要度采样的离轨策略学习方法。
7.5 不需要使用重要度采样的离轨策略学习方法:n步树回溯算法
不使用重要度采样的离轨策略学习方法可能存在吗?在第6章中我们讨论了单步的Q学习和期望Sarsa方法,但是有没有相对应的多步算法呢?本节中我们就要展示这样一个n步算法,叫作树回溯算法
。
这个算法的思想受到下图所示的三步树回溯图的启发。沿着中心轴向下,图中标出的是三个采样状态和收益,以及两个采样动作。这些都是随机变量,表示在初始“状态-动作”二元组
S
t
,
A
t
S_t,A_t
St,At之后发生的事件。连接在每个状态侧边的是没有
被采样选择的动作(对于最后一个状态,所有的动作都被认为是还没有被选择的)。由于我们没有未被选择的动作的样本数据,因此我们采用自举方法并且使用它们的估计价值来构建用于价值函数更新的目标。这稍稍扩展了回溯图的思想。**迄今为止我们总是更新图顶端的节点的估计价值,使其向更新目标前进,这个目标是由沿途所有的收益(经过适当的打折)和地步节点的估计价值组合而成的。**在树回溯中,目标包含了所有的这些东西再加上
每一层悬挂在两侧的动作节点的估计价值。这也是为什么它被称为树回溯
;它的更新来源于整个树的动作价值的估计。
三步树回溯更新
更精确地说,更新量是从树的叶子结点
的动作价值的估计值计算出来的。内部的动作节点(对应于实际采取的动作),并不参与回溯。每个叶子结点的贡献会被加权,权值与它在目标策略π下出现的概率成正比。因此除了实际被采用的动作
A
t
+
1
A_{t+1}
At+1完全不产生贡献之外,一个一级动作a的贡献权值为
π
(
a
∣
S
t
+
1
)
\pi(a|S_{t+1})
π(a∣St+1)。它的
π
(
A
t
+
1
∣
S
t
+
1
)
\pi(A_{t+1}|S_{t+1})
π(At+1∣St+1)被用来给所有二级动作的价值加权。所有每个未被选择的二级动作
a
′
a'
a′的贡献权值为
π
(
A
t
+
1
∣
S
t
+
1
)
π
(
a
′
∣
S
t
+
2
)
\pi(A_{t+1}|S_{t+1})\pi(a'|S_{t+2})
π(At+1∣St+1)π(a′∣St+2),每个三级动作的贡献权值为
π
(
A
t
+
1
∣
S
t
+
1
)
π
(
A
t
+
2
∣
S
t
+
2
)
π
(
a
′
′
∣
S
t
+
1
)
\pi(A_{t+1}|S_{t+1})\pi(A_{t+2}|S_{t+2})\pi(a''|S_{t+1})
π(At+1∣St+1)π(At+2∣St+2)π(a′′∣St+1),依此类推。就好像每个指向动作节点的箭头得到了加权,权重就是该动作在目标策略中被选择的概率。如果在这个动作的下面还有一棵树,则对应的权重会对它下面的整棵树都产生作业。
我们可以把三步树回溯看成由6个子步骤组成。“采样子步骤”是从一个动作到其后继状态的过程;“期望子步骤”则是从这个状态到所有可能的动作的选择过程,每个动作同时带上了在目标策略下的出现概率。
现在我们来详细介绍n步树回溯算法的公式细节。树回溯算法的单步回报与期望Sarsa相同,对于
t
<
T
−
1
t < T - 1
t<T−1,有
G
t
:
t
+
1
≐
R
t
+
1
+
γ
∑
a
π
(
a
∣
S
t
+
1
)
Q
t
(
S
t
+
1
,
a
)
,
(7.15)
G_{t:t+1} \doteq R_{t+1}+\gamma \sum_a \pi(a|S_{t+1})Q_t(S_{t+1},a),\tag{7.15}
Gt:t+1≐Rt+1+γa∑π(a∣St+1)Qt(St+1,a),(7.15)
对于
t
<
T
−
2
t < T -2
t<T−2,两步树回溯的回报是
G
t
:
t
+
2
≐
R
t
+
1
+
γ
∑
a
≠
A
t
+
1
π
(
a
∣
S
t
+
1
)
Q
t
+
1
(
S
t
+
1
,
a
)
+
γ
π
(
A
t
+
1
∣
S
t
+
1
)
(
R
t
+
2
+
γ
∑
a
π
(
a
∣
S
t
+
2
)
Q
t
+
1
(
S
t
+
2
,
a
)
)
=
R
t
+
1
+
γ
∑
a
≠
A
t
+
1
π
(
a
∣
S
t
+
1
)
Q
t
+
1
(
S
t
+
1
,
a
)
+
γ
π
(
A
t
+
1
∣
S
t
+
1
)
G
t
+
1
:
t
+
2
,
\begin{aligned} G_{t:t+2} &\doteq R_{t+1}+\gamma \sum_{a\neq A_{t+1}} \pi(a|S_{t+1})Q_{t+1}(S_{t+1},a)+\gamma \pi(A_{t+1}|S_{t+1})(R_{t+2}+\gamma \sum_a \pi(a|S_{t+2})Q_{t+1}(S_{t+2},a)) \\&=R_{t+1}+\gamma \sum_{a\neq A_{t+1}} \pi(a|S_{t+1})Q_{t+1}(S_{t+1},a)+\gamma \pi(A_{t+1}|S_{t+1})\color{red}{G_{t+1:t+2}}, \end{aligned}
Gt:t+2≐Rt+1+γa=At+1∑π(a∣St+1)Qt+1(St+1,a)+γπ(At+1∣St+1)(Rt+2+γa∑π(a∣St+2)Qt+1(St+2,a))=Rt+1+γa=At+1∑π(a∣St+1)Qt+1(St+1,a)+γπ(At+1∣St+1)Gt+1:t+2,
后者显示了树回溯的n步回报的递归定义的一般形式。对于
t
<
T
−
1
,
n
≥
2
t<T-1,n \geq 2
t<T−1,n≥2,有
G
t
:
t
+
n
≐
R
t
+
1
+
γ
∑
a
≠
A
t
+
1
π
(
a
∣
S
t
+
1
)
Q
t
+
n
−
1
(
S
t
+
1
,
a
)
+
γ
π
(
A
t
+
1
∣
S
t
+
1
)
G
t
+
1
:
t
+
n
,
(7.16)
G_{t:t+\color{red}n} \doteq R_{t+1}+\gamma \sum_{a\neq A_{t+1}} \pi(a|S_{t+1})Q_{t+n-1}(S_{t+1},a)+\gamma \pi(A_{t+1}|S_{t+1}){G_{t+1:t+\color{red}n}},\tag{7.16}
Gt:t+n≐Rt+1+γa=At+1∑π(a∣St+1)Qt+n−1(St+1,a)+γπ(At+1∣St+1)Gt+1:t+n,(7.16)
除了
G
T
−
1
:
t
+
n
≐
R
T
G_{T-1:t+n} \doteq R_T
GT−1:t+n≐RT之外,n=1的情况可由公式(7.15)解决。这个目标就可以用于n步Sarsa的动作价值更新规则,对于
0
≤
t
<
T
0\leq t<T
0≤t<T,有
Q
t
+
n
(
S
t
,
A
t
)
≐
Q
t
+
n
−
1
(
S
t
,
A
t
)
+
α
[
G
t
:
t
+
n
−
Q
t
+
n
−
1
(
S
t
,
A
t
)
]
Q_{t+n}(S_t,A_t) \doteq Q_{t+n-1}(S_t,A_t)+\alpha[G_{t:t+n}-Q_{t+n-1(S_t,A_t)}]
Qt+n(St,At)≐Qt+n−1(St,At)+α[Gt:t+n−Qt+n−1(St,At)]
其他所有“状态-动作”二元组的价值保持不变,即对于所有满足
s
≠
S
t
s \neq S_t
s=St或
a
≠
A
t
a \neq A_t
a=At的s,a,有
Q
t
+
n
(
s
,
a
)
=
Q
t
+
n
−
1
(
s
,
a
)
Q_{t+n}(s,a)=Q_{t+n-1}(s,a)
Qt+n(s,a)=Qt+n−1(s,a)。下面框中显示了这一算法的伪代码。
练习 7.11
证明如果近似动作价值不变,那么树回溯的回报(式7.16)可以写成期望TD误差之和
G
t
:
t
+
n
=
Q
(
S
t
,
A
t
)
+
∑
k
=
t
m
i
n
(
t
+
n
−
1
,
T
−
1
)
δ
k
∏
i
=
t
+
1
k
γ
π
(
A
i
∣
S
i
)
,
G_{t:t+n}=Q(S_t,A_t)+\sum_{k=t}^{min(t+n-1,T-1)} \delta_k \prod_{i=t+1}^k \gamma \pi(A_i|S_i),
Gt:t+n=Q(St,At)+k=t∑min(t+n−1,T−1)δki=t+1∏kγπ(Ai∣Si),
其中,
δ
t
≐
R
t
+
1
+
γ
V
ˉ
t
(
S
t
+
1
)
−
Q
(
S
t
,
A
t
)
,
V
ˉ
\delta_t \doteq R_{t+1}+\gamma \bar{V}_t(S_{t+1})-Q(S_t,A_t), \bar{V}
δt≐Rt+1+γVˉt(St+1)−Q(St,At),Vˉ由式(7.8)给出。
标答:
假设动作价值不变,树回溯的递归公式为:
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
.
G_{t:t+n}= R_{t+1} +\gamma \sum_{a\neq A_{t+1}}\pi(a|S_{t+1})Q(S_{t+1},a) +\gamma \pi(A_{t+1},S_{t+1})G_{t+1:t+n}.
Gt:t+n=Rt+1+γa=At+1∑π(a∣St+1)Q(St+1,a)+γπ(At+1,St+1)Gt+1:t+n.
定义:
δ
t
≐
R
t
+
1
+
γ
V
ˉ
t
(
S
t
+
1
)
−
Q
(
S
t
,
A
t
)
\delta_t \doteq R_{t+1}+\gamma \bar{V}_t(S_{t+1})-Q(S_t,A_t)
δt≐Rt+1+γVˉt(St+1)−Q(St,At)
其中,
V
ˉ
h
≐
∑
a
π
(
a
∣
S
h
)
Q
(
S
h
,
a
)
\bar{V}_h \doteq \sum_a \pi(a|S_h)Q(S_h,a)
Vˉh≐a∑π(a∣Sh)Q(Sh,a)
则有:
G
t
:
t
+
n
−
Q
(
S
t
,
A
t
)
=
R
t
+
1
+
γ
V
ˉ
t
(
S
t
+
1
)
−
γ
π
(
A
t
+
1
,
S
t
+
1
)
Q
(
S
t
+
1
,
A
t
+
1
)
−
Q
(
S
t
,
A
t
)
+
γ
π
(
A
t
+
1
,
S
t
+
1
)
G
t
+
1
:
t
+
n
=
δ
t
−
γ
π
(
A
t
+
1
,
S
t
+
1
)
[
G
t
+
1
:
t
+
n
−
Q
(
S
t
+
1
,
A
t
+
1
)
]
⋮
=
∑
i
=
1
m
i
n
(
t
+
n
−
1
,
T
−
1
)
δ
i
∏
j
=
t
+
1
i
γ
π
(
A
j
∣
S
j
)
,
\begin{aligned} G_{t:t+n}-Q(S_t,A_t)&=R_{t+1} +\gamma \bar{V}_t(S_{t+1})-\gamma \pi(A_{t+1},S_{t+1})Q(S_{t+1},A_{t+1})-Q(S_t,A_t)+\gamma \pi(A_{t+1},S_{t+1})G_{t+1:t+n} \\&=\delta_t-\gamma \pi(A_{t+1},S_{t+1})[G_{t+1:t+n}-Q(S_{t+1},A_{t+1})] \\ &\quad \vdots \\&=\sum_{i=1}^{min(t+n-1,T-1)} \delta_i \prod_{j=t+1}^i \gamma \pi(A_j|S_j), \end{aligned}
Gt:t+n−Q(St,At)=Rt+1+γVˉt(St+1)−γπ(At+1,St+1)Q(St+1,At+1)−Q(St,At)+γπ(At+1,St+1)Gt+1:t+n=δt−γπ(At+1,St+1)[Gt+1:t+n−Q(St+1,At+1)]⋮=i=1∑min(t+n−1,T−1)δij=t+1∏iγπ(Aj∣Sj),
其中我们定义累乘操作符有如下行为:对于
a
>
b
,
∏
a
b
=
1
a>b ,\prod_a^b=1
a>b,∏ab=1
7.6 * 一个统一的算法:n步Q(σ)
到目前为止,我们已经考虑了三种不同的动作价值回溯算法,分别与图7.5中展示的前三个回溯图相对应。n步Sarsa算法中的节点转移全部基于采样得到的单独路径,而树回溯算法对于状态到动作的转移,则是将所有可能路径分支全部展开而没有任何采样,n步期望Sarsa算法则只对最后一个状态到动作的转移进行全部分支展开(用期望值),其余转移都是基于采样进行的。这些算法在多大程度上可以统一?
一种统一框架的思想如图7.5中的第四个回溯图所示。这个思想就是:对状态逐个决定是否要采取采样操作,即依据分布选取某一个动作作为样本(Sarsa算法的情况),或者考虑所有可能动作的期望(树回溯算法的情况)。如果一个人总是用采样操作,他就会得到Sarsa算法;反之,如果从不采样,就会得到树回溯算法。期望Sarsa算法是在最后一步之前进行采样。当然还有很多其他的可能性,正如图7.5中最后一个图所揭示的。为了进一步增加可能性,我们可以考虑采样和期望之间的连续变化。令 σ t ∈ [ 0 , 1 ] \sigma_t \in [0,1] σt∈[0,1]表示在步骤t时采样的程度, σ = 1 \sigma=1 σ=1表示完整的采样, σ = 0 \sigma=0 σ=0表示求期望而不进行采样。随机变量 σ t \sigma_t σt可以表示成在时间t时,关于状态、动作或者“状态-动作”二元组的函数。我们称这个新的算法为n步 Q ( σ ) Q(\sigma) Q(σ)。
图7.5 本章中的三种n步动作价值更新的回溯图(4步方法为例)和第四种将它们全部统一在一起的算法的回溯图。ρ表示转移过程在离轨策略下需要重要度采样。第四种更新算法统一了其他所有算法,其通过引入对每个状态的采样操作标识来实现。σt=1表示进行采样操作,σt=0表示不采样
现在我们来推导n步
Q
(
σ
)
Q(\sigma)
Q(σ)的公式。首先我们写出视界
h
=
t
+
n
h=t+n
h=t+n时的树回溯算法的n步回报(式7.16),然后再将其用期望近似价值
V
ˉ
\bar{V}
Vˉ(式7.8)来表示
G
t
:
h
=
R
t
+
1
+
γ
∑
a
≠
A
t
+
1
π
(
a
∣
S
t
+
1
)
Q
h
−
1
(
S
t
+
1
,
a
)
+
γ
π
(
A
t
+
1
∣
S
t
+
1
)
G
t
+
1
:
h
=
R
t
+
1
+
γ
V
ˉ
h
−
1
(
S
t
+
1
)
−
γ
π
(
A
t
+
1
∣
S
t
+
1
)
Q
h
−
1
(
S
t
+
1
,
A
t
+
1
)
+
γ
π
(
A
t
+
1
∣
S
t
+
1
)
G
t
+
1
:
h
=
R
t
+
1
+
γ
π
(
A
t
+
1
∣
S
t
+
1
)
(
G
t
+
1
:
h
−
Q
h
−
1
(
S
t
+
1
,
A
t
+
1
)
)
+
γ
V
ˉ
h
−
1
(
S
t
+
1
)
,
\begin{aligned} G_{t: h} &=R_{t+1}+\gamma \sum_{a \neq A_{t+1}} \pi\left(a \mid S_{t+1}\right) Q_{h-1}\left(S_{t+1}, a\right)+\gamma \pi\left(A_{t+1} \mid S_{t+1}\right) G_{t+1: h} \\ &=R_{t+1}+\gamma \bar{V}_{h-1}\left(S_{t+1}\right)-\gamma \pi\left(A_{t+1} \mid S_{t+1}\right) Q_{h-1}\left(S_{t+1}, A_{t+1}\right)+\gamma \pi\left(A_{t+1} \mid S_{t+1}\right) G_{t+1: h} \\ &=R_{t+1}+\gamma \pi\left(A_{t+1} \mid S_{t+1}\right)\left(G_{t+1: h}-Q_{h-1}\left(S_{t+1}, A_{t+1}\right)\right)+\gamma \bar{V}_{h-1}\left(S_{t+1}\right), \end{aligned}
Gt:h=Rt+1+γa=At+1∑π(a∣St+1)Qh−1(St+1,a)+γπ(At+1∣St+1)Gt+1:h=Rt+1+γVˉh−1(St+1)−γπ(At+1∣St+1)Qh−1(St+1,At+1)+γπ(At+1∣St+1)Gt+1:h=Rt+1+γπ(At+1∣St+1)(Gt+1:h−Qh−1(St+1,At+1))+γVˉh−1(St+1),
经过上面重写后,这个式子的形式就很像带控制变量的n步Sarsa回报,不同之处是动作概率
π
(
A
t
+
1
∣
S
t
+
1
)
\pi(A_{t+1}|S_{t+1})
π(At+1∣St+1)代替了重要度采样比
ρ
t
+
1
\rho_{t+1}
ρt+1。对于
Q
(
σ
)
Q(\sigma)
Q(σ),我们会将两种线性情形组合起来,即对
t
<
h
≤
T
t < h \leq T
t<h≤T,有
G
t
:
h
≐
R
t
+
1
+
γ
(
σ
t
+
1
ρ
t
+
1
+
(
1
−
σ
t
+
1
)
π
(
A
t
+
1
∣
S
t
+
1
)
)
(
G
t
+
1
:
h
−
Q
h
−
1
(
S
t
+
1
,
A
t
+
1
)
)
+
γ
V
ˉ
h
−
1
(
S
t
+
1
)
,
\begin{array}{r} G_{t: h} \doteq R_{t+1}+\color{red}\gamma\left(\sigma_{t+1} \rho_{t+1}+\left(1-\sigma_{t+1}\right) \pi\left(A_{t+1} \mid S_{t+1}\right)\right) \\ \left(G_{t+1: h}-Q_{h-1}\left(S_{t+1}, A_{t+1}\right)\right)+\gamma \bar{V}_{h-1}\left(S_{t+1}\right), \end{array}
Gt:h≐Rt+1+γ(σt+1ρt+1+(1−σt+1)π(At+1∣St+1))(Gt+1:h−Qh−1(St+1,At+1))+γVˉh−1(St+1),
上面递归公式的终止条件为:
h
<
T
h<T
h<T时
G
h
:
h
≐
Q
h
−
1
(
S
h
,
A
h
)
G_{h:h} \doteq Q_{h-1}(S_h,A_h)
Gh:h≐Qh−1(Sh,Ah),或者
h
=
T
h=T
h=T时
G
T
−
1
:
T
≐
R
T
G_{T-1:T} \doteq R_T
GT−1:T≐RT。然后我们使用通用(离轨策略)版本的n步Sarsa更新公式(7.5)。完整的算法如下框所示。
7.7 本章小结
本章中,我们介绍了一系列时序差分学习方法,它们介于上一章中的单步时序差分方法和第5章中的蒙特卡洛方法之间。在学习方法中使用数量适中的自举操作是非常重要的,因为它们的表现通常优于纯粹的TD方法和蒙特卡洛方法。
本章侧重介绍了n步方法,这类方法会向前看若干步的收益、状态和动作。下面的两个4步回溯图汇总了介绍的大部分方法。图中所示的“状态-动作”二元组更新对应于带重要度采样的n步TD,动作价值更新对应于n步
Q
(
σ
)
Q(\sigma)
Q(σ),它是期望Sarsa和Q学习方法的推广。所有n步方法都要在更新之前延迟n个时刻步长,因为这些方法必须知道一些未来发生的事件才能进行计算。另一个缺点是,它们涉及的计算量比以前的方法要大。与单步方法相比,n步方法还需要更多的内存来记忆最近的n步中的状态、动作、收益以及其他变量。在第12章中,我们将看到如何借助资格迹,用最少的内存和最小的计算复杂度来实现多步TD方法。当然,相比单步方法,多步方法总会有一些额外的计算。但这样的代价还是值得的,毕竟我们可以很好地摆脱使用单步方法 时带来的限制 。
尽管n步方法比使用资格迹的方法复杂得多,但在概念上它更清楚一些。 我们试图利用这一点,在n步的情况下开发两种方法来进行离轨策略学习。其一,基于重要度采样的方法。这个方法在概念上简单但方差大。*如果目标策略和行动策略差别很大,则需要使用一些新的算法思想,其才能真正变得高效和实用。*另一种是基于树回溯的方法,它是Q学习方法在使用随机目标策略的多步情况下的自然扩展。它不涉及任何重要度采样,但如果目标策略和行动策略显著不同,则即使n很大,自举操作也只能跨越几个有限的时刻。(?)