文章目录
- 1. 本章内容概要
- 2. $\lambda$-return
- 3. TD($\lambda$)
- 4. n-step截断$\lambda$-return方法
- 5. 重新更新:在线$\lambda$-return算法
- 6. 真正的在线TD($\lambda$)
- 7. MC学习中的Dutch Trace
- 8. Sarsa($\lambda$)
- 9. 变量$\lambda$和$\gamma$
- 10. 带有控制变异(Control Variates)的离线迹
- 11. Watkins的Q($\lambda$)到Tree-Backup($\lambda$)
- 12. 带有迹的稳定off-policy方法
- 13. 实现中的问题
- 14. 总结
- 参考文献
1. 本章内容概要
资格迹(eligibility trace)是RL的基本技术。例如, TD ( λ ) \operatorname{TD}(\lambda) TD(λ)算法就使用了资格迹,其中的 λ \lambda λ表明该算法含有资格迹。几乎所有的TD方法(Q-learning,Sarsa)都能结合资格迹,使之更通用、更高效。
资格迹统一和泛化了TD与MC方法,使用资格迹增强TD方法,我们就像第一Part总结的一样,得到了算法族一个新的维度,一端是MC( λ = 1 \lambda=1 λ=1),另一端是TD( λ = 0 \lambda=0 λ=0),中间分布的方法则是其混合,往往在实际问题中效果更好。资格迹方法使得MC能在线的实现,即使对于continuing任务也能工作。
第七章中的n-step TD方法也是TD和MC的综合,但是资格迹的算法框架更加优雅,且具有计算优势。实际上资格迹的机制是引入了短记忆向量 z t ∈ R d \mathbf{z}_{t} \in \mathbb{R}^{d} zt∈Rd,也叫做资格迹,而 λ \lambda λ因子叫做迹衰减,满足 λ ∈ [ 0 , 1 ] \lambda \in[0,1] λ∈[0,1]。不同于我们之前介绍的方法,我们之前介绍的方法都是需要后续n个状态的,叫做forward views,而资格迹则依赖前面的状态,叫做backward views,更容易实现,也更简洁。
其为何具有优势我们详细了解后就清楚了。像往常一样,我们先讨论状态值的预测,然后扩展到动作值,并讨论控制过程;在此基础上,扩展on-policy到off-policy的情形,并特别讨论线性拟合器的应用,此时资格迹的效果很好。所有这些讨论也是适用于表格与state aggregation的,它们是线性拟合器的特殊情形。
2. λ \lambda λ-return
带有拟合器的n-step return的形式为:
G
t
:
t
+
n
≐
R
t
+
1
+
γ
R
t
+
2
+
⋯
+
γ
n
−
1
R
t
+
n
+
γ
n
v
^
(
S
t
+
n
,
w
t
+
n
−
1
)
,
0
≤
t
≤
T
−
n
G_{t : t+n} \doteq R_{t+1}+\gamma R_{t+2}+\cdots+\gamma^{n-1} R_{t+n}+\gamma^{n} \hat{v}\left(S_{t+n}, \mathbf{w}_{t+n-1}\right), \quad 0 \leq t \leq T-n
Gt:t+n≐Rt+1+γRt+2+⋯+γn−1Rt+n+γnv^(St+n,wt+n−1),0≤t≤T−n
当
n
≥
1
n \ge1
n≥1时就可以根据这个return更新了。
如果把不同n的n-step return加权作为更新目标,且保证加权因子非负且和为1,那么也是有效的,能保证收敛,例如: 1 2 G t : t + 2 + 1 2 G t : t + 4 \frac{1}{2} G_{t : t+2}+\frac{1}{2} G_{t : t+4} 21Gt:t+2+21Gt:t+4,把TD和MC混合,把TD/MC和DP混合等。 这种混合大大扩展了算法的种类。这种混合的更新叫做复合更新(compound update),更新的时刻显然由最长的那个组分决定,其backup diagram如下:
TD( λ \lambda λ)的return就是上述这种compound update,将无穷多n-step return加权,加权因子为 ( 1 − λ ) λ n − 1 (1-\lambda)\lambda^{n-1} (1−λ)λn−1,其更新目标叫做 λ \lambda λ-return, G t λ ≐ ( 1 − λ ) ∑ n = 1 ∞ λ n − 1 G t : t + n G_{t}^{\lambda} \doteq(1-\lambda) \sum_{n=1}^{\infty} \lambda^{n-1} G_{t : t+n} Gtλ≐(1−λ)∑n=1∞λn−1Gt:t+n。其backup diagram如下:
当 n ≥ T n \ge T n≥T时,所有的return都认为等于 G t G_t Gt,因而有: G t λ = ( 1 − λ ) ∑ n = 1 T − t − 1 λ n − 1 G t : t + n + λ T − t − 1 G t G_{t}^{\lambda}=(1-\lambda) \sum_{n=1}^{T-t-1} \lambda^{n-1} G_{t : t+n}+\lambda^{T-t-1} G_{t} Gtλ=(1−λ)∑n=1T−t−1λn−1Gt:t+n+λT−t−1Gt。显然,当 λ = 1 \lambda=1 λ=1时,相当于MC,当 λ = 0 \lambda=0 λ=0时,相当于TD(0)。容易地,我们可以仿照第三章写出这些return的迭代形式。权重因子 λ \lambda λ的衰减曲线如下图所示:
下面介绍基于 λ \lambda λ-return的第一个算法离线 λ \lambda λ-return算法。离线指的是,在episode期间不进行权重更新,在episode结束的时候再根据得到的各个step的 G t λ G_{t}^{\lambda} Gtλ进行更新(即非in-place方式)。权重更新公式为:
w t + 1 ≐ w t + α [ G t λ − v ^ ( S t , w t ) ] ∇ v ^ ( S t , w t ) , t = 0 , … , T − 1 \mathbf{w}_{t+1} \doteq \mathbf{w}_{t}+\alpha\left[G_{t}^{\lambda}-\hat{v}\left(S_{t}, \mathbf{w}_{t}\right)\right] \nabla \hat{v}\left(S_{t}, \mathbf{w}_{t}\right), \quad t=0, \ldots, T-1 wt+1≐wt+α[Gtλ−v^(St,wt)]∇v^(St,wt),t=0,…,T−1
对于我们前面介绍过的19状态random walk问题,我们分别用离线 λ \lambda λ-return算法和n-step TD算法估计值函数,并变化步长 α \alpha α以及 n n n或 λ \lambda λ,得到如下图所示的结果,看起来离线 λ \lambda λ-return算法效果稍好,而且与n-step方法类似,也是当 λ \lambda λ取适中的数字时效果最好。
这种方法也是forward view的,每个状态的更新都与后续状态有关。
3. TD( λ \lambda λ)
TD( λ \lambda λ)是RL中最古老、应用最广的算法。TD( λ \lambda λ)相比于离线 λ \lambda λ-return算法有三点改进:1. 在每个时间步都进行更新权重,而不是只在episode结尾一次性更新;2. 计算均匀地分布在每个step上;3. 可以用到continuing任务中。本节我们给出半梯度TD( λ \lambda λ)算法。
资格迹是一个与权重向量 w t \textbf{w}_t wt元素数相等的向量 z t ∈ R d \mathbf{z}_{t} \in \mathbb{R}^{d} zt∈Rd。权重向量 w t \textbf{w}_t wt是长期的记忆,而资格迹是短期的,往往维持的时间短于一个episode。资格迹的作用是辅助学习过程,对权重的更新造成一定的影响,然后由权重决定估计的值。
在TD(
λ
\lambda
λ)中,资格迹向量在每个episode开始时初始化未0,然后由下式逐step的更新:
z
−
1
≐
0
\mathbf{z}_{-1} \doteq \mathbf{0}
z−1≐0
z
t
≐
γ
λ
z
t
−
1
+
∇
v
^
(
S
t
,
w
t
)
,
0
≤
t
≤
T
\mathbf{z}_{t} \doteq \gamma \lambda \mathbf{z}_{t-1}+\nabla \hat{v}\left(S_{t}, \mathbf{w}_{t}\right), \quad 0 \leq t \leq T
zt≐γλzt−1+∇v^(St,wt),0≤t≤T
其中,
γ
\gamma
γ是折扣因子,
λ
\lambda
λ是资格迹的迹衰减因子。资格迹衡量的是最近哪个参数被修正的较多(对于线性模型,公式中的梯度就是输入的特征向量
x
(
s
)
\mathbf{x}(s)
x(s),因此资格迹就是最近一些输入的加权和)。资格迹表征权重中的每个成分得到学习的潜力,因而我们得到TD(
λ
\lambda
λ)的更新公式:
δ
t
≐
R
t
+
1
+
γ
v
^
(
S
t
+
1
,
w
t
)
−
v
^
(
S
t
,
w
t
)
\delta_{t} \doteq R_{t+1}+\gamma \hat{v}\left(S_{t+1}, \mathbf{w}_{t}\right)-\hat{v}\left(S_{t}, \mathbf{w}_{t}\right)
δt≐Rt+1+γv^(St+1,wt)−v^(St,wt)
w
t
+
1
≐
w
t
+
α
δ
t
z
t
\mathbf{w}_{t+1} \doteq \mathbf{w}_{t}+\alpha \delta_{t} \mathbf{z}_{t}
wt+1≐wt+αδtzt
与之前的算法相比,梯度项包含在了 z t \mathbf{z}_t zt之中,且每个step的梯度不仅仅在这一步发生作用,它的作用会持续一段时间,逐渐衰减。其算法伪代码为:
这是一种backward view的算法,其更新机制如下图所示:
这个过程的推导其实不难(我尝试了下,觉得不难><),思路为:
我们考虑几个特殊情况。当 λ = 0 \lambda=0 λ=0时,显然算法变成了半梯度TD(0)算法;当 λ = 1 \lambda=1 λ=1时,则算法叫做TD(1),基本变为了MC方法[回顾下TD误差与MC误差的关系就能理解,参考第六章第二节]。当 λ \lambda λ取中间数字时,则是两种方法的折中。
TD(1)是MC算法更通用的实现方式,极大增加了MC方法的应用范围,使之可以应用到continuing类的任务中,并且可以增量、在线的实现。关于在episode才更新的问题,这里给了另一种思路:如果在一个episode中间遇到了一个很好或者很差的动作,那么step-by-step的方法可以立即修改策略,使得这个episode后续的steps降低如此动作的概率;而在episode-by-episode的方法中则无法在episode中间提高策略,导致这个episode中的samples不太好。
回顾上一节介绍的离线 λ \lambda λ-return算法,其也是在 λ = 0 \lambda=0 λ=0时等价于TD(0),在 λ = 1 \lambda=1 λ=1时等价于MC。在19状态random-walk问题中,可以看出TD( λ \lambda λ)的表现与离线 λ \lambda λ-return算法是类似的。但是需要注意,当 α \alpha α增大时,TD( λ \lambda λ)的效果会迅速变坏,甚至会不稳定。
线性TD(
λ
\lambda
λ)在step-size满足第二章给出的收敛条件时,在on-policy情形下是能够收敛的,但是正如第九章中所提到的TD不动点,线性TD(
λ
\lambda
λ)也是收敛到靠近最优的一个点上,continuing任务的VE上界如下式所示:
V E ‾ ( w ∞ ) ≤ 1 − γ λ 1 − γ min w V E ‾ ( w ) \overline{\mathrm{VE}}\left(\mathbf{w}_{\infty}\right) \leq \frac{1-\gamma \lambda}{1-\gamma} \min _{\mathbf{w}} \overline{\mathrm{VE}}(\mathbf{w}) VE(w∞)≤1−γ1−γλminwVE(w)
当 λ = 1 \lambda=1 λ=1时,线性TD( λ \lambda λ)等价于MC,因此上界缩放系数是1;当 λ = 0 \lambda=0 λ=0时,线性TD( λ \lambda λ)等价于TD(0),因此上界缩放系数与TD不动点的缩放系数一致。 λ = 1 \lambda=1 λ=1是比较差的选择,后面我们会讨论这个问题。
离线 λ \lambda λ-return算法的更新误差项(中括号里的)也可以写成TD误差之和的形式。
4. n-step截断 λ \lambda λ-return方法
离线 λ \lambda λ-return算法是重要的想法,但是由于 λ \lambda λ-return只有在episode的末尾才能计算,因此造成计算分布不均衡,对于continuing任务甚至无法得到。实际上,由于因子 γ λ \gamma \lambda γλ的存在,计算 G t λ G_{t}^{\lambda} Gtλ时越往后的项发挥的作用越小,因此我们可以限制这个求和的长度。这就是截断 λ \lambda λ-return方法,求和长度由horizon h决定:
G t : h λ ≐ ( 1 − λ ) ∑ n = 1 h − t − 1 λ n − 1 G t : t + n + λ h − t − 1 G t : h , 0 ≤ t < h ≤ T G_{t : h}^{\lambda} \doteq(1-\lambda) \sum_{n=1}^{h-t-1} \lambda^{n-1} G_{t : t+n}+\lambda^{h-t-1} G_{t : h}, \quad 0 \leq t<h \leq T Gt:hλ≐(1−λ)∑n=1h−t−1λn−1Gt:t+n+λh−t−1Gt:h,0≤t<h≤T
这样的处理衍生出了一系列新的算法。如果应用于状态值函数,这族算法就叫做截断TD(
λ
\lambda
λ)或者TTD(
λ
\lambda
λ)。下图给出了它的backup diagram,注意
t
+
n
≥
T
t+n\ge T
t+n≥T的情况:
TTD(
λ
\lambda
λ)的更新公式如下:
w t + n ≐ w t + n − 1 + α [ G t : t + n λ − v ^ ( S t , w t + n − 1 ) ] ∇ v ^ ( S t , w t + n − 1 ) , 0 ≤ t < T \mathbf{w}_{t+n} \doteq \mathbf{w}_{t+n-1}+\alpha\left[G_{t : t+n}^{\lambda}-\hat{v}\left(S_{t}, \mathbf{w}_{t+n-1}\right)\right] \nabla \hat{v}\left(S_{t}, \mathbf{w}_{t+n-1}\right), \qquad 0 \leq t<T wt+n≐wt+n−1+α[Gt:t+nλ−v^(St,wt+n−1)]∇v^(St,wt+n−1),0≤t<T
这个算法是比较高效的,但是需要注意,每个episode前n-1个step是不能更新的,而且需要终止状态后n-1个额外更新。 对 G t : h λ G_{t : h}^{\lambda} Gt:hλ也可以写成TD误差之和的形式:
G
t
:
t
+
k
λ
=
v
^
(
S
t
,
w
t
−
1
)
+
∑
i
=
t
t
+
k
−
1
(
γ
λ
)
i
−
t
δ
i
′
G_{t : t+k}^{\lambda}=\hat{v}\left(S_{t}, \mathbf{w}_{t-1}\right)+\sum_{i=t}^{t+k-1}(\gamma \lambda)^{i-t} \delta_{i}^{\prime}
Gt:t+kλ=v^(St,wt−1)+∑i=tt+k−1(γλ)i−tδi′
δ
t
′
≐
R
t
+
1
+
γ
v
^
(
S
t
+
1
,
w
t
)
−
v
^
(
S
t
,
w
t
−
1
)
\delta_{t}^{\prime} \doteq R_{t+1}+\gamma \hat{v}\left(S_{t+1}, \mathbf{w}_{t}\right)-\hat{v}\left(S_{t}, \mathbf{w}_{t-1}\right)
δt′≐Rt+1+γv^(St+1,wt)−v^(St,wt−1)
5. 重新更新:在线 λ \lambda λ-return算法
截断 λ \lambda λ-return中n的选择是需要权衡的,大的n可以让算法更接近离线 λ \lambda λ-return的性能,小的n可以减小更新延迟,尽快改变策略。我们可以以计算量提高为代价,得到同时拥有这两个优点的算法:也就是,在每个step,我们得到新的数据后,我们回溯再次更新episode中的每个step,直到该episode的起点。每次回溯的时候,我们相当于逐渐增大horizon,从而逐渐得到更好的结果。在这个过程中,我们需要始终保存 w 0 \mathbf{w}_0 w0,每次我们前进一个step,到达step j,我们利用 G i : j λ , i = 0 , 1 , 2 , . . . , j G_{i : j}^{\lambda},i = 0, 1, 2, ..., j Gi:jλ,i=0,1,2,...,j作为更新目标,再次从 w 0 \mathbf{w}_0 w0出发更新参数,然后利用更新好的参数决定下一步动作。
为了区分不同step时的更新,我们在 w 0 h \mathbf{w}_0^h w0h中的上标表示目前进展到的step编号,下标仍然表示实际执行该更新所处的时间步,那么对于一个episode,step 1~3 时的更新为:
h
=
1
:
w
1
1
≐
w
0
1
+
α
[
G
0
:
1
λ
−
v
^
(
S
0
,
w
0
1
)
]
∇
v
^
(
S
0
,
w
0
1
)
\begin{aligned} h=1 : \quad & \mathbf{w}_{1}^{1} \doteq \mathbf{w}_{0}^{1}+\alpha\left[G_{0 : 1}^{\lambda}-\hat{v}\left(S_{0}, \mathbf{w}_{0}^{1}\right)\right] \nabla \hat{v}\left(S_{0}, \mathbf{w}_{0}^{1}\right) \end{aligned}
h=1:w11≐w01+α[G0:1λ−v^(S0,w01)]∇v^(S0,w01)
h
=
2
:
w
1
2
≐
w
0
2
+
α
[
G
0
:
2
λ
−
v
^
(
S
0
,
w
0
2
)
]
∇
v
^
(
S
0
,
w
0
2
)
w
2
2
≐
w
1
2
+
α
[
G
1
:
2
λ
−
v
^
(
S
1
,
w
1
2
)
]
∇
v
^
(
S
1
,
w
1
2
)
\begin{aligned} h=2 : \quad & \mathbf{w}_{1}^{2} \doteq \mathbf{w}_{0}^{2}+\alpha\left[G_{0 : 2}^{\lambda}-\hat{v}\left(S_{0}, \mathbf{w}_{0}^{2}\right)\right] \nabla \hat{v}\left(S_{0}, \mathbf{w}_{0}^{2}\right) \\ & \mathbf{w}_{2}^{2} \doteq \mathbf{w}_{1}^{2}+\alpha\left[G_{1 : 2}^{\lambda}-\hat{v}\left(S_{1}, \mathbf{w}_{1}^{2}\right)\right] \nabla \hat{v}\left(S_{1}, \mathbf{w}_{1}^{2}\right) \end{aligned}
h=2:w12≐w02+α[G0:2λ−v^(S0,w02)]∇v^(S0,w02)w22≐w12+α[G1:2λ−v^(S1,w12)]∇v^(S1,w12)
h
=
3
:
w
1
3
≐
w
0
3
+
α
[
G
0
:
3
λ
−
v
^
(
S
0
,
w
0
3
)
]
∇
v
^
(
S
0
,
w
0
3
)
w
2
3
≐
w
1
3
+
α
[
G
1
:
3
λ
−
v
^
(
S
1
,
w
1
3
)
]
∇
v
^
(
S
1
,
w
1
3
)
w
3
3
≐
w
2
3
+
α
[
G
2
:
3
λ
−
v
^
(
S
2
,
w
2
3
)
]
∇
v
^
(
S
2
,
w
2
3
)
\begin{aligned} h=3 : \quad & \mathbf{w}_{1}^{3} \doteq \mathbf{w}_{0}^{3}+\alpha\left[G_{0 : 3}^{\lambda}-\hat{v}\left(S_{0}, \mathbf{w}_{0}^{3}\right)\right] \nabla \hat{v}\left(S_{0}, \mathbf{w}_{0}^{3}\right) \\ & \mathbf{w}_{2}^{3} \doteq \mathbf{w}_{1}^{3}+\alpha\left[G_{1 : 3}^{\lambda}-\hat{v}\left(S_{1}, \mathbf{w}_{1}^{3}\right)\right] \nabla \hat{v}\left(S_{1}, \mathbf{w}_{1}^{3}\right) \\ & \mathbf{w}_{3}^{3} \doteq \mathbf{w}_{2}^{3}+\alpha\left[G_{2 : 3}^{\lambda}-\hat{v}\left(S_{2}, \mathbf{w}_{2}^{3}\right)\right] \nabla \hat{v}\left(S_{2}, \mathbf{w}_{2}^{3}\right) \end{aligned}
h=3:w13≐w03+α[G0:3λ−v^(S0,w03)]∇v^(S0,w03)w23≐w13+α[G1:3λ−v^(S1,w13)]∇v^(S1,w13)w33≐w23+α[G2:3λ−v^(S2,w23)]∇v^(S2,w23)
更新公式为:
w
t
+
1
h
≐
w
t
h
+
α
[
G
t
:
h
λ
−
v
^
(
S
t
,
w
t
h
)
]
∇
v
^
(
S
t
,
w
t
h
)
,
0
≤
t
<
h
≤
T
\mathbf{w}_{t+1}^{h} \doteq \mathbf{w}_{t}^{h}+\alpha\left[G_{t : h}^{\lambda}-\hat{v}\left(S_{t}, \mathbf{w}_{t}^{h}\right)\right] \nabla \hat{v}\left(S_{t}, \mathbf{w}_{t}^{h}\right), \quad 0 \leq t<h \leq T
wt+1h≐wth+α[Gt:hλ−v^(St,wth)]∇v^(St,wth),0≤t<h≤T
定义 w t ≐ w t t \mathbf{w}_{t} \doteq \mathbf{w}_{t}^{t} wt≐wtt,则我们得到比较完整的表示。这个算法是完全在线的,在每个step都计算得到一个新的权重向量 w t \mathbf{w}_t wt,且只利用到时间步t为止的信息。这个方法计算复杂度很高,比离线 λ \lambda λ-return算法还要复杂很多,但是学习效率是比离线方法好很多的。
回到19状态random walk问题,可以看到在线方法确实比离线方法好。
6. 真正的在线TD( λ \lambda λ)
在线方法效果是目前所有算法中最好的,但是计算量过大,我们可以考虑资格迹的方法简化它,也就是采用backward-view的视角,这对于线性拟合器来说是可行的。这种方法就叫做真正在线TD( λ \lambda λ)算法。
该方法的推导是很复杂的(参考下一节介绍及文献van Seijen et al., 2016),所以这里没有详述,但是给出了参考文献。其实它的思想是简单的。首先,我们把离线算法的所有中间权重列成三角形,每一行都是单个推进的step基础上产生的,我们关心的只是右侧倾斜排列的那些权重:
w 0 0 w 0 1 w 1 1 w 0 2 w 1 2 w 2 2 w 0 3 w 1 3 w 2 3 w 3 3 ⋮ ⋮ ⋮ ⋮ ⋱ w 0 T w 1 T w 2 T w 3 T ⋯ w T T \begin{array}{cccccc}{\mathbf{w}_{0}^{0}} & {} & {} & {} \\ {\mathbf{w}_{0}^{1}} & {\mathbf{w}_{1}^{1}} \\ {\mathbf{w}_{0}^{2}} & {\mathbf{w}_{1}^{2}} & {\mathbf{w}_{2}^{2}} \\ {\mathbf{w}_{0}^{3}} & {\mathbf{w}_{1}^{3}} & {\mathbf{w}_{2}^{3}} & {\mathbf{w}_{3}^{3}} \\ {\vdots} & {\vdots} & {\vdots} & {\vdots} & {\ddots} \\ {\mathbf{w}_{0}^{T}} & {\mathbf{w}_{1}^{T}} & {\mathbf{w}_{2}^{T}} & {\mathbf{w}_{3}^{T}} & {\cdots} & {\mathbf{w}_{T}^{T}}\end{array} w00w01w02w03⋮w0Tw11w12w13⋮w1Tw22w23⋮w2Tw33⋮w3T⋱⋯wTT
如果我们能从上一个 w t t \mathbf{w}_t^t wtt计算出下一个,那么就能作为离线算法的高效形式。对于线性拟合器,可以得到如下形式:
w t + 1 ≐ w t + α δ t z t + α ( w t ⊤ x t − w t − 1 ⊤ x t ) ( z t − x t ) \mathbf{w}_{t+1} \doteq \mathbf{w}_{t}+\alpha \delta_{t} \mathbf{z}_{t}+\alpha\left(\mathbf{w}_{t}^{\top} \mathbf{x}_{t}-\mathbf{w}_{t-1}^{\top} \mathbf{x}_{t}\right)\left(\mathbf{z}_{t}-\mathbf{x}_{t}\right) wt+1≐wt+αδtzt+α(wt⊤xt−wt−1⊤xt)(zt−xt)
z t ≐ γ λ z t − 1 + ( 1 − α γ λ z t − 1 ⊤ x t ) x t \mathbf{z}_{t} \doteq \gamma \lambda \mathbf{z}_{t-1}+\left(1-\alpha \gamma \lambda \mathbf{z}_{t-1}^{\top} \mathbf{x}_{t}\right) \mathbf{x}_{t} zt≐γλzt−1+(1−αγλzt−1⊤xt)xt
可以证明,这个算法和离线算法的效果是一致的,计算量仅仅比普通的TD( λ \lambda λ)算法高50%,还是O(d),而存储量则与普通TD( λ \lambda λ)算法一致。该算法的伪代码如下:
为了区分目前提到的两种资格迹,这一节的方法叫做dutch trace,之前介绍的方法叫做accumulating trace。早期的工作常用一种叫做replacing trace的形式(可以粗略地看作dutch trace的近似),这种形式只对表格情形/二进制编码情形(如tile coding)有效,其定义为:
z i , t ≐ { 1 if x i , t = 1 γ λ z i , t − 1 otherwise z_{i, t} \doteq\left\{\begin{array}{ll}{1} & {\text { if } x_{i, t}=1} \\ {\gamma \lambda z_{i, t-1}} & {\text { otherwise }}\end{array}\right. zi,t≐{1γλzi,t−1 if xi,t=1 otherwise
注意这里两个下标,第一个下标表明是资格迹的分量,第二个下标表明时间步。dutch trace比replacing trace表现好,且理论依据明确,accumulating trace则对非线性方法也适用,但是dutch trace则不适用。
7. MC学习中的Dutch Trace
虽然资格迹在发展上和TD很密切,但实际上却没那么紧密,因为我们可以看到资格迹与MC方法也是有关联的。我们前面已经示意,线性MC这种forward view算法,可以由与其等价的使用dutch traces的backward view算法代替,且大大降低计算量。我们这里对其等价性给出证明,这个证明对真正在线TD( λ \lambda λ)算法与在线TD( λ \lambda λ)算法的等价性证明有启发作用。
MC算法的线性版本更新公式如下:
w
t
+
1
≐
w
t
+
α
[
G
−
w
t
⊤
x
t
]
x
t
,
0
≤
t
<
T
\mathbf{w}_{t+1} \doteq \mathbf{w}_{t}+\alpha\left[G-\mathbf{w}_{t}^{\top} \mathbf{x}_{t}\right] \mathbf{x}_{t}, \quad 0 \leq t<T
wt+1≐wt+α[G−wt⊤xt]xt,0≤t<T
为了简化,假设只有在episode的结尾才有非零的reward,且折扣因子为1.0,因此在任何step t,更新目标都是一样的,因此直接用G表示。作为MC算法,所有的更新都依赖于最终的reward,而这必须等到episode的结尾,因此MC算法是离线的。但是这里我们首先不去寻求改成在线的方法,我们主要关注如何提高计算效率。我们在episode中间进行计算,但是在episode的结尾再更新,这样可以让计算的分布更加均匀,每个step都是 O ( d ) O(d) O(d)的复杂度,同时也降低了内存开销,因为不需要存储中间的step了。资格迹的方法就实现了这样的效果,且其与MC方法是等价的:
w T = w T − 1 + α ( G − w T − 1 ⊤ x T − 1 ) x T − 1 = w T − 1 + α x T − 1 ( − x T − 1 ⊤ w T − 1 ) + α G x T − 1 = ( I − α x T − 1 x T − 1 ⊤ ) w T − 1 + α G x T − 1 = F T − 1 w T − 1 + α G x T − 1 = F T − 1 ( F T − 2 w T − 2 + α G x T − 2 ) + α G x T − 1 = F T − 1 F T − 2 w T − 2 + α G ( F T − 1 x T − 2 + x T − 1 ) = F T − 1 F T − 2 ( F T − 3 w T − 3 + α G x T − 3 ) + α G ( F T − 1 x T − 2 + x T − 1 ) = F T − 1 F T − 2 F T − 3 w T − 3 + α G ( F T − 1 F T − 2 x T − 3 + F T − 1 X T − 2 + x T − 1 ) ⋮ = F T − 1 F T − 2 ⋯ F 0 w 0 ⎵ a T − 1 + α G ∑ k = 0 T − 1 F T − 1 F T − 2 ⋯ F k + 1 x k ⎵ z T − 1 = a T − 1 + α G z T − 1 \begin{aligned} \mathbf{w}_{T} &=\mathbf{w}_{T-1}+\alpha\left(G-\mathbf{w}_{T-1}^{\top} \mathbf{x}_{T-1}\right) \mathbf{x}_{T-1} \\ &=\mathbf{w}_{T-1}+\alpha \mathbf{x}_{T-1}\left(-\mathbf{x}_{T-1}^{\top} \mathbf{w}_{T-1}\right)+\alpha G \mathbf{x}_{T-1} \\ &=\left(\mathbf{I}-\alpha \mathbf{x}_{T-1} \mathbf{x}_{T-1}^{\top}\right) \mathbf{w}_{T-1}+\alpha G \mathbf{x}_{T-1} \\ &=\mathbf{F}_{T-1} \mathbf{w}_{T-1}+\alpha G \mathbf{x}_{T-1} \\&=\mathbf{F}_{T-1}\left(\mathbf{F}_{T-2} \mathbf{w}_{T-2}+\alpha G \mathbf{x}_{T-2}\right)+\alpha G \mathbf{x}_{T-1}\\&=\mathbf{F}_{T-1} \mathbf{F}_{T-2} \mathbf{w}_{T-2}+\alpha G\left(\mathbf{F}_{T-1} \mathbf{x}_{T-2}+\mathbf{x}_{T-1}\right)\\&=\mathbf{F}_{T-1} \mathbf{F}_{T-2}\left(\mathbf{F}_{T-3} \mathbf{w}_{T-3}+\alpha G \mathbf{x}_{T-3}\right)+\alpha G\left(\mathbf{F}_{T-1} \mathbf{x}_{T-2}+\mathbf{x}_{T-1}\right)\\&=\mathbf{F}_{T-1} \mathbf{F}_{T-2} \mathbf{F}_{T-3} \mathbf{w}_{T-3}+\alpha G\left(\mathbf{F}_{T-1} \mathbf{F}_{T-2} \mathbf{x}_{T-3}+\mathbf{F}_{T-1} \mathbf{X}_{T-2}+\mathbf{x}_{T-1}\right) \\& \vdots \\&=\underbrace{\mathbf{F}_{T-1} \mathbf{F}_{T-2} \cdots \mathbf{F}_{0} \mathbf{w}_{0}}_{\mathbf{a}_{T-1}}+\alpha G\underbrace{ \sum_{k=0}^{T-1} \mathbf{F}_{T-1} \mathbf{F}_{T-2} \cdots \mathbf{F}_{k+1} \mathbf{x}_{k}}_{\mathbf{z}_{T-1}}\\&=\mathbf{a}_{T-1}+\alpha G \mathbf{z}_{T-1} \end{aligned} wT=wT−1+α(G−wT−1⊤xT−1)xT−1=wT−1+αxT−1(−xT−1⊤wT−1)+αGxT−1=(I−αxT−1xT−1⊤)wT−1+αGxT−1=FT−1wT−1+αGxT−1=FT−1(FT−2wT−2+αGxT−2)+αGxT−1=FT−1FT−2wT−2+αG(FT−1xT−2+xT−1)=FT−1FT−2(FT−3wT−3+αGxT−3)+αG(FT−1xT−2+xT−1)=FT−1FT−2FT−3wT−3+αG(FT−1FT−2xT−3+FT−1XT−2+xT−1)⋮=aT−1 FT−1FT−2⋯F0w0+αGzT−1 k=0∑T−1FT−1FT−2⋯Fk+1xk=aT−1+αGzT−1
这两项都可以逐step计算的,且与 G G G无关, F t ≐ I − α x t x t ⊤ \mathbf{F}_{t} \doteq \mathbf{I}-\alpha \mathbf{x}_{t} \mathbf{x}_{t}^{\top} Ft≐I−αxtxt⊤只与第t个step的特征向量有关,因而 a T − 1 \mathbf{a}_{T-1} aT−1很容易逐step地计算:
a t ≐ F t F t − 1 ⋯ F 0 w 0 = F t a t − 1 = a t − 1 − α x t x t ⊤ a t − 1 , 1 ≤ t < T \mathbf{a}_{t} \doteq \mathbf{F}_{t} \mathbf{F}_{t-1} \cdots \mathbf{F}_{0} \mathbf{w}_{0}=\mathbf{F}_{t} \mathbf{a}_{t-1}=\mathbf{a}_{t-1}-\alpha \mathbf{x}_{t} \mathbf{x}_{t}^{\top} \mathbf{a}_{t-1}, \quad 1 \leq t<T at≐FtFt−1⋯F0w0=Ftat−1=at−1−αxtxt⊤at−1,1≤t<T
而 z T − 1 \mathbf{z}_{T-1} zT−1也可以迭代地计算,实际上是dutch风格的资格迹( γ λ = 1 \gamma\lambda =1 γλ=1),初始化为 z 0 = x 0 \mathbf{z}_{0}=\mathbf{x}_{0} z0=x0并根据下式迭代:
z t ≐ ∑ k = 0 t F t F t − 1 ⋯ F k + 1 x k , 1 ≤ t < T = ∑ k = 0 t − 1 F t F t − 1 ⋯ F k + 1 x k + x t = F t ∑ k = 0 t − 1 F t − 1 F t − 2 ⋯ F k + 1 x k + x t = F t z t − 1 + x t = ( I − α x t x t ⊤ ) z t − 1 + x t = z t − 1 − α x t x t ⊤ z t − 1 + x t = z t − 1 − α ( z t − 1 ⊤ x t ) x t + x t = z t − 1 + ( 1 − α z t − 1 ⊤ x t ) x t \begin{aligned} \mathbf{z}_{t} & \doteq \sum_{k=0}^{t} \mathbf{F}_{t} \mathbf{F}_{t-1} \cdots \mathbf{F}_{k+1} \mathbf{x}_{k}, \quad 1 \leq t<T \\ &=\sum_{k=0}^{t-1} \mathbf{F}_{t} \mathbf{F}_{t-1} \cdots \mathbf{F}_{k+1} \mathbf{x}_{k}+\mathbf{x}_{t} \\ &=\mathbf{F}_{t} \sum_{k=0}^{t-1} \mathbf{F}_{t-1} \mathbf{F}_{t-2} \cdots \mathbf{F}_{k+1} \mathbf{x}_{k}+\mathbf{x}_{t} \\&=\mathbf{F}_{t} \mathbf{z}_{t-1}+\mathbf{x}_{t} \\&=\left(\mathbf{I}-\alpha \mathbf{x}_{t} \mathbf{x}_{t}^{\top}\right) \mathbf{z}_{t-1}+\mathbf{x}_{t} \\&=\mathbf{z}_{t-1}-\alpha \mathbf{x}_{t} \mathbf{x}_{t}^{\top} \mathbf{z}_{t-1}+\mathbf{x}_{t} \\&=\mathbf{z}_{t-1}-\alpha\left(\mathbf{z}_{t-1}^{\top} \mathbf{x}_{t}\right) \mathbf{x}_{t}+\mathbf{x}_{t} \\&=\mathbf{z}_{t-1}+\left(1-\alpha \mathbf{z}_{t-1}^{\top} \mathbf{x}_{t}\right) \mathbf{x}_{t} \end{aligned} zt≐k=0∑tFtFt−1⋯Fk+1xk,1≤t<T=k=0∑t−1FtFt−1⋯Fk+1xk+xt=Ftk=0∑t−1Ft−1Ft−2⋯Fk+1xk+xt=Ftzt−1+xt=(I−αxtxt⊤)zt−1+xt=zt−1−αxtxt⊤zt−1+xt=zt−1−α(zt−1⊤xt)xt+xt=zt−1+(1−αzt−1⊤xt)xt
可以看到这就是上一小节的dutch风格的迹的形式。
以上过程等价于所设定条件下的MC/LMS方法,但是改善了计算和存储过程,这说明资格迹与TD方法关联没那么紧密,是更基础底层的技巧。因此,在需要学习长期预测时都可以应用资格迹的技巧。
8. Sarsa( λ \lambda λ)
这里开始讨论如何在动作值上应用资格迹,实际上需要的变化很少。首先给出n-step return的动作值版本:
G t : t + n ≐ R t + 1 + ⋯ + γ n − 1 R t + n + γ n q ^ ( S t + n , A t + n , w t + n − 1 ) , t + n < T G_{t : t+n} \doteq R_{t+1}+\cdots+\gamma^{n-1} R_{t+n}+\gamma^{n} \hat{q}\left(S_{t+n}, A_{t+n}, \mathbf{w}_{t+n-1}\right), \quad t+n<T Gt:t+n≐Rt+1+⋯+γn−1Rt+n+γnq^(St+n,At+n,wt+n−1),t+n<T
其中, G t : t + n ≐ G t G_{t : t+n} \doteq G_{t} Gt:t+n≐Gt 如果 t + n ≥ T t+n \geq T t+n≥T。
动作值版本的离线 λ \lambda λ-return算法更新公式为:
w t + 1 ≐ w t + α [ G t λ − q ^ ( S t , A t , w t ) ] ∇ q ^ ( S t , A t , w t ) , t = 0 , … , T − 1 \mathbf{w}_{t+1} \doteq \mathbf{w}_{t}+\alpha\left[G_{t}^{\lambda}-\hat{q}\left(S_{t}, A_{t}, \mathbf{w}_{t}\right)\right] \nabla \hat{q}\left(S_{t}, A_{t}, \mathbf{w}_{t}\right), \quad t=0, \ldots, T-1 wt+1≐wt+α[Gtλ−q^(St,At,wt)]∇q^(St,At,wt),t=0,…,T−1
其中, G t λ ≐ G t : ∞ λ G_{t}^{\lambda} \doteq G_{t : \infty}^{\lambda} Gtλ≐Gt:∞λ。下图给出了其backup diagram,和TD( λ \lambda λ)算法是差不多的。引入资格迹,就得到了Sarsa( λ \lambda λ),和TD( λ \lambda λ)是类似的:
w
t
+
1
≐
w
t
+
α
δ
t
z
t
\mathbf{w}_{t+1} \doteq \mathbf{w}_{t}+\alpha \delta_{t} \mathbf{z}_{t}
wt+1≐wt+αδtzt
δ
t
≐
R
t
+
1
+
γ
q
^
(
S
t
+
1
,
A
t
+
1
,
w
t
)
−
q
^
(
S
t
,
A
t
,
w
t
)
\delta_{t} \doteq R_{t+1}+\gamma \hat{q}\left(S_{t+1}, A_{t+1}, \mathbf{w}_{t}\right)-\hat{q}\left(S_{t}, A_{t}, \mathbf{w}_{t}\right)
δt≐Rt+1+γq^(St+1,At+1,wt)−q^(St,At,wt)
z
−
1
≐
0
\mathrm{z}_{-1} \doteq 0
z−1≐0
z
t
≐
γ
λ
z
t
−
1
+
∇
q
^
(
S
t
,
A
t
,
w
t
)
,
0
≤
t
≤
T
\mathrm{z}_{t} \doteq \gamma \lambda \mathrm{z}_{t-1}+\nabla \hat{q}\left(S_{t}, A_{t}, \mathrm{w}_{t}\right), \quad 0 \leq t \leq T
zt≐γλzt−1+∇q^(St,At,wt),0≤t≤T
带有线性拟合器、二进制编码特征、使用accumulating或replacing迹的Sarsa(
λ
\lambda
λ)的伪代码如下,其显示了在这个特殊设定下算法的进一步简化:
这个算法也可以使用dutch迹。
example 12.1 Traces in Gridworld
使用资格迹可以提高控制算法的效率,比one-step方法甚至n-step方法都要好的。对于Gridworld问题,设定值函数初始都是0,所有回报,除了终止状态都是0,终止状态的回报是正数。用箭头表示得到提高的状态-动作对,箭头的大小表示经验信息对更新指引的程度( λ \lambda λ)。则能得到如下结果:
example 12.2 Sarsa( λ \lambda λ) on Mountain Car
对第十章中的Mountain Car问题,我们采用Sarsa( λ \lambda λ)求解,并变化参数 λ \lambda λ画出多条曲线。可以看到Sarsa( λ \lambda λ)比n-step方法看起来好很多:
当然,也可以写出动作值版本的在线 λ \lambda λ-return算法,以及其高效的实现真正在线Sarsa( λ \lambda λ)。这两种算法与前面介绍的状态值的版本基本是一样的。其算法伪代码如下:
下图给出了不同版本的Sarsa(
λ
\lambda
λ)在Mountain Car问题上的表现:
此外,还有截断版本的Sarsa( λ \lambda λ),叫做forward Sarsa( λ \lambda λ),其效果也是不错的(van Seijen, 2016)。
9. 变量 λ \lambda λ和 γ \gamma γ
到这里,我们就完成了基本的TD学习的全部进展。我们可以把bootstrapping和discounting的程度改写成状态和动作的函数,而不是固定的参数,这样每个step我们就会有不同的 λ \lambda λ和 γ \gamma γ,即: λ t \lambda_{t} λt 和 γ t \gamma_{t} γt。因此,我们定义 λ : S × A → [ 0 , 1 ] \lambda : \mathcal{S} \times \mathcal{A} \rightarrow[0,1] λ:S×A→[0,1]是[0, 1]值域的状态和动作的函数,记为 λ t ≐ λ ( S t , A t ) \lambda_{t} \doteq \lambda\left(S_{t}, A_{t}\right) λt≐λ(St,At),定义 γ : S → [ 0 , 1 ] \gamma : \mathcal{S} \rightarrow[0,1] γ:S→[0,1]是[0, 1]值域的状态的函数,记为 γ t ≐ γ ( S t ) \gamma_{t} \doteq \gamma\left(S_{t}\right) γt≐γ(St),也叫做termination function。
这样,我们可以写出更一般的return定义:
G t ≐ R t + 1 + γ t + 1 G t + 1 = R t + 1 + γ t + 1 R t + 2 + γ t + 1 γ t + 2 R t + 3 + γ t + 1 γ t + 2 γ t + 3 R t + 4 + ⋯ = ∑ k = t ∞ ( ∏ i = t + 1 k γ i ) R k + 1 \begin{aligned} G_{t} & \doteq R_{t+1}+\gamma_{t+1} G_{t+1} \\ &=R_{t+1}+\gamma_{t+1} R_{t+2}+\gamma_{t+1} \gamma_{t+2} R_{t+3}+\gamma_{t+1} \gamma_{t+2} \gamma_{t+3} R_{t+4}+\cdots \\ &=\sum_{k=t}^{\infty}\left(\prod_{i=t+1}^{k} \gamma_{i}\right) R_{k+1} \end{aligned} Gt≐Rt+1+γt+1Gt+1=Rt+1+γt+1Rt+2+γt+1γt+2Rt+3+γt+1γt+2γt+3Rt+4+⋯=k=t∑∞(i=t+1∏kγi)Rk+1
为了保证收敛,要求 ∏ k = t ∞ γ k = 0 \prod_{k=t}^{\infty} \gamma_{k}=0 ∏k=t∞γk=0对所有的t,依概率1成立。这种写法带来了一些好处,例如我们不必再针对episodic类任务定义终止状态了,只需令对应状态的 γ ( s ) = 0 \gamma(s)=0 γ(s)=0,并转移到起始状态即可。依状态的终止,包括之前为了降低方差引入的伪终止,都可以用这种方法处理。因此,这种方法统一了episodic和discounted-continuing情形(undiscounted-continuing仍需特殊处理)。
基于
λ
\lambda
λ函数的
λ
\lambda
λ-return更新目标需要改写为迭代形式,由上面给出的
G
t
G_t
Gt的定义以及
λ
\lambda
λ-return的原始定义可以导出:
G
t
λ
s
≐
R
t
+
1
+
γ
t
+
1
(
(
1
−
λ
t
+
1
)
v
^
(
S
t
+
1
,
w
t
)
+
λ
t
+
1
G
t
+
1
λ
s
)
G_{t}^{\lambda s} \doteq R_{t+1}+\gamma_{t+1}\left(\left(1-\lambda_{t+1}\right) \hat{v}\left(S_{t+1}, \mathbf{w}_{t}\right)+\lambda_{t+1} G_{t+1}^{\lambda s}\right)
Gtλs≐Rt+1+γt+1((1−λt+1)v^(St+1,wt)+λt+1Gt+1λs)。
λ
s
\lambda s
λs表示这个return是从状态值bootstrap的,后面我们引入的
λ
a
\lambda a
λa则表明这个return是从动作值bootstrap的。对于动作值的
λ
\lambda
λ-return,可以写成Sarsa或者Expected Sarsa的形式:
Sarsa:
G
t
λ
a
≐
R
t
+
1
+
γ
t
+
1
(
(
1
−
λ
t
+
1
)
q
^
(
S
t
+
1
,
A
t
+
1
,
w
t
)
+
λ
t
+
1
G
t
+
1
λ
a
)
G_{t}^{\lambda a} \doteq R_{t+1}+\gamma_{t+1}\left(\left(1-\lambda_{t+1}\right) \hat{q}\left(S_{t+1}, A_{t+1}, \mathbf{w}_{t}\right)+\lambda_{t+1} G_{t+1}^{\lambda a}\right)
Gtλa≐Rt+1+γt+1((1−λt+1)q^(St+1,At+1,wt)+λt+1Gt+1λa)
Expected Sarsa:
G
t
λ
a
≐
R
t
+
1
+
γ
t
+
1
(
(
1
−
λ
t
+
1
)
V
‾
t
(
S
t
+
1
)
+
λ
t
+
1
G
t
+
1
λ
a
)
G_{t}^{\lambda a} \doteq R_{t+1}+\gamma_{t+1}\left(\left(1-\lambda_{t+1}\right) \overline{V}_{t}\left(S_{t+1}\right)+\lambda_{t+1} G_{t+1}^{\lambda a}\right)
Gtλa≐Rt+1+γt+1((1−λt+1)Vt(St+1)+λt+1Gt+1λa)
V
‾
t
(
s
)
≐
∑
a
π
(
a
∣
s
)
q
^
(
s
,
a
,
w
t
)
\overline{V}_{t}(s) \doteq \sum_{a} \pi(a | s) \hat{q}\left(s, a, \mathbf{w}_{t}\right)
Vt(s)≐∑aπ(a∣s)q^(s,a,wt)
10. 带有控制变异(Control Variates)的离线迹
最后,我们考虑off-policy下的情形,此时需要引入重要性采样。不像n-step情形,我们无法使重要性采样独立于目标return,因此此处直接采用带有控制变异的per-decision方式,结合上一节的式子,得到:
G t λ s ≐ ρ t ( R t + 1 + γ t + 1 ( ( 1 − λ t + 1 ) v ^ ( S t + 1 , w t ) + λ t + 1 G t + 1 λ s ) ) + ( 1 − ρ t ) v ^ ( S t , w t ) G_{t}^{\lambda s} \doteq \rho_{t}\left(R_{t+1}+\gamma_{t+1}\left(\left(1-\lambda_{t+1}\right) \hat{v}\left(S_{t+1}, \mathbf{w}_{t}\right)+\lambda_{t+1} G_{t+1}^{\lambda s}\right)\right)+\left(1-\rho_{t}\right) \hat{v}\left(S_{t}, \mathbf{w}_{t}\right) Gtλs≐ρt(Rt+1+γt+1((1−λt+1)v^(St+1,wt)+λt+1Gt+1λs))+(1−ρt)v^(St,wt)
以上公式可以参考第7.5小节。
其中,
ρ
t
=
π
(
A
t
∣
S
t
)
b
(
A
t
∣
S
t
)
\rho_{t}=\frac{\pi\left(A_{t} | S_{t}\right)}{b\left(A_{t} | S_{t}\right)}
ρt=b(At∣St)π(At∣St)。这个式子约等于基于状态的TD误差的和(如果估计的值函数不变的话,就变得准确了):
δ
t
s
≐
R
t
+
1
+
γ
t
+
1
v
^
(
S
t
+
1
,
w
t
)
−
v
^
(
S
t
,
w
t
)
\delta_{t}^{s} \doteq R_{t+1}+\gamma_{t+1} \hat{v}\left(S_{t+1}, \mathbf{w}_{t}\right)-\hat{v}\left(S_{t}, \mathbf{w}_{t}\right)
δts≐Rt+1+γt+1v^(St+1,wt)−v^(St,wt)
G
t
λ
s
≈
v
^
(
S
t
,
w
t
)
+
ρ
t
∑
k
=
t
∞
δ
k
s
∏
i
=
t
+
1
k
γ
i
λ
i
ρ
i
G_{t}^{\lambda s} \approx \hat{v}\left(S_{t}, \mathbf{w}_{t}\right)+\rho_{t} \sum_{k=t}^{\infty} \delta_{k}^{s} \prod_{i=t+1}^{k} \gamma_{i} \lambda_{i} \rho_{i}
Gtλs≈v^(St,wt)+ρt∑k=t∞δks∏i=t+1kγiλiρi
forward view的更新公式为:
w
t
+
1
=
w
t
+
α
(
G
t
λ
s
−
v
^
(
S
t
,
w
t
)
)
∇
v
^
(
S
t
,
w
t
)
≈
w
t
+
α
ρ
t
(
∑
k
=
t
∞
δ
k
s
∏
i
=
t
+
1
k
γ
i
λ
i
ρ
i
)
∇
v
^
(
S
t
,
w
t
)
\begin{aligned} \mathbf{w}_{t+1} &=\mathbf{w}_{t}+\alpha\left(G_{t}^{\lambda s}-\hat{v}\left(S_{t}, \mathbf{w}_{t}\right)\right) \nabla \hat{v}\left(S_{t}, \mathbf{w}_{t}\right) \\ & \approx \mathbf{w}_{t}+\alpha \rho_{t}\left(\sum_{k=t}^{\infty} \delta_{k}^{s} \prod_{i=t+1}^{k} \gamma_{i} \lambda_{i} \rho_{i}\right) \nabla \hat{v}\left(S_{t}, \mathbf{w}_{t}\right) \end{aligned}
wt+1=wt+α(Gtλs−v^(St,wt))∇v^(St,wt)≈wt+αρt(k=t∑∞δksi=t+1∏kγiλiρi)∇v^(St,wt)
这看起来像基于资格迹的TD更新,乘积和资格迹类似,然后乘上TD误差。但是这种只是one-step forward view。我们希望寻找将forward-view更新沿时间加和,把backward-view也沿着时间加和,使这两个和大致相等。forward-view沿着时间的加和为:
∑ t = 1 ∞ ( w t + 1 − w t ) ≈ ∑ t = 1 ∞ ∑ k = t ∞ α ρ t δ k s ∇ v ^ ( S t , w t ) ∏ i = t + 1 k γ i λ i ρ i = ∑ k = 1 ∞ ∑ t = 1 k α ρ t ∇ v ^ ( S t , w t ) δ k s ∏ i = t + 1 k γ i λ i ρ i = ∑ k = 1 ∞ α δ k s ∑ t = 1 k ρ t ∇ v ^ ( S t , w t ) ∏ i = t + 1 k γ i λ i ρ i \begin{aligned} \sum_{t=1}^{\infty}\left(\mathbf{w}_{t+1}-\mathbf{w}_{t}\right) & \approx \sum_{t=1}^{\infty} \sum_{k=t}^{\infty} \alpha \rho_{t} \delta_{k}^{s} \nabla \hat{v}\left(S_{t}, \mathbf{w}_{t}\right) \prod_{i=t+1}^{k} \gamma_{i} \lambda_{i} \rho_{i} \\ &=\sum_{k=1}^{\infty} \sum_{t=1}^{k} \alpha \rho_{t} \nabla \hat{v}\left(S_{t}, \mathbf{w}_{t}\right) \delta_{k}^{s} \prod_{i=t+1}^{k} \gamma_{i} \lambda_{i} \rho_{i} \\&=\sum_{k=1}^{\infty} \alpha \delta_{k}^{s} \sum_{t=1}^{k} \rho_{t} \nabla \hat{v}\left(S_{t}, \mathbf{w}_{t}\right) \prod_{i=t+1}^{k} \gamma_{i} \lambda_{i} \rho_{i}\end{aligned} t=1∑∞(wt+1−wt)≈t=1∑∞k=t∑∞αρtδks∇v^(St,wt)i=t+1∏kγiλiρi=k=1∑∞t=1∑kαρt∇v^(St,wt)δksi=t+1∏kγiλiρi=k=1∑∞αδkst=1∑kρt∇v^(St,wt)i=t+1∏kγiλiρi
如果第二个求和可以写成并按照资格迹的形式增量更新,这个式子就能构成backward-view TD更新的加和形式,我们下面给出如何实现。如果表达式是在时刻k的迹,我们就能用k-1时刻的值更新它:
z k = ∑ t = 1 k ρ t ∇ v ^ ( S t , w t ) ∏ i = t + 1 k γ i λ i ρ i = ∑ t = 1 k − 1 ρ t ∇ v ^ ( S t , w t ) ∏ i = t + 1 k γ i λ i ρ i + ρ k ∇ v ^ ( S k , w k ) = γ k λ k ρ k ∑ t = 1 k − 1 ρ t ∇ v ^ ( S t , w t ) ∏ i = t + 1 k − 1 γ i λ i ρ i ⎵ z k − 1 + ρ k ∇ v ^ ( S k , w k ) = ρ k ( γ k λ k z k − 1 + ∇ v ^ ( S k , w k ) ) \begin{aligned} \mathbf{z}_{k} &=\sum_{t=1}^{k} \rho_{t} \nabla \hat{v}\left(S_{t}, \mathbf{w}_{t}\right) \prod_{i=t+1}^{k} \gamma_{i} \lambda_{i} \rho_{i} \\ &=\sum_{t=1}^{k-1} \rho_{t} \nabla \hat{v}\left(S_{t}, \mathbf{w}_{t}\right) \prod_{i=t+1}^{k} \gamma_{i} \lambda_{i} \rho_{i}+\rho_{k} \nabla \hat{v}\left(S_{k}, \mathbf{w}_{k}\right) \\ &=\gamma_{k} \lambda_{k} \rho_{k} \underbrace{\sum_{t=1}^{k-1} \rho_{t} \nabla \hat{v}\left(S_{t}, \mathbf{w}_{t}\right) \prod_{i=t+1}^{k-1} \gamma_{i} \lambda_{i} \rho_{i}}_{\mathbf{z_{k-1}}}+\rho_{k} \nabla \hat{v}\left(S_{k}, \mathbf{w}_{k}\right) \\ &=\rho_{k}\left(\gamma_{k} \lambda_{k} \mathbf{z}_{k-1}+\nabla \hat{v}\left(S_{k}, \mathbf{w}_{k}\right)\right) \end{aligned} zk=t=1∑kρt∇v^(St,wt)i=t+1∏kγiλiρi=t=1∑k−1ρt∇v^(St,wt)i=t+1∏kγiλiρi+ρk∇v^(Sk,wk)=γkλkρkzk−1 t=1∑k−1ρt∇v^(St,wt)i=t+1∏k−1γiλiρi+ρk∇v^(Sk,wk)=ρk(γkλkzk−1+∇v^(Sk,wk))
下标则从k变化到t,是针对状态值常规的accumulating迹更新:
z
t
≐
ρ
t
(
γ
t
λ
t
z
t
−
1
+
∇
v
^
(
S
t
,
w
t
)
)
\mathbf{z}_{t} \doteq \rho_{t}\left(\gamma_{t} \lambda_{t} \mathbf{z}_{t-1}+\nabla \hat{v}\left(S_{t}, \mathbf{w}_{t}\right)\right)
zt≐ρt(γtλtzt−1+∇v^(St,wt))
这个资格迹,结合TD( λ \lambda λ)的半梯度参数更新规则 w t + 1 ≐ w t + α δ t z t \mathbf{w}_{t+1} \doteq \mathbf{w}_{t}+\alpha \delta_{t} \mathbf{z}_{t} wt+1≐wt+αδtzt,可以构成既可用于on-policy也可用于off-policy的通用TD( λ \lambda λ)算法。在on-policy情形下,这个算法就退化为 T D ( λ ) \mathrm{TD}(\lambda) TD(λ)。在off-policy情形,这个算法通常效果很好,但是却不能保证收敛稳定,因为其是半梯度的。在之后几个章节中,我们会改造这个算法使之稳定。
对于动作值的off-policy资格迹及与之相关Sarsa(
λ
\lambda
λ)算法,也可访上导出。我们可以从迭代或者一般形式的动作值
λ
\lambda
λ-return开始,也就是:
G
t
λ
a
≐
R
t
+
1
+
γ
t
+
1
(
(
1
−
λ
t
+
1
)
q
^
(
S
t
+
1
,
A
t
+
1
,
w
t
)
+
λ
t
+
1
G
t
+
1
λ
a
)
G_{t}^{\lambda a} \doteq R_{t+1}+\gamma_{t+1}\left(\left(1-\lambda_{t+1}\right) \hat{q}\left(S_{t+1}, A_{t+1}, \mathbf{w}_{t}\right)+\lambda_{t+1} G_{t+1}^{\lambda a}\right)
Gtλa≐Rt+1+γt+1((1−λt+1)q^(St+1,At+1,wt)+λt+1Gt+1λa)
G
t
λ
a
≐
R
t
+
1
+
γ
t
+
1
(
(
1
−
λ
t
+
1
)
V
‾
t
(
S
t
+
1
)
+
λ
t
+
1
G
t
+
1
λ
a
)
G_{t}^{\lambda a} \doteq R_{t+1}+\gamma_{t+1}\left(\left(1-\lambda_{t+1}\right) \overline{V}_{t}\left(S_{t+1}\right)+\lambda_{t+1} G_{t+1}^{\lambda a}\right)
Gtλa≐Rt+1+γt+1((1−λt+1)Vt(St+1)+λt+1Gt+1λa)
但是Expected Sarsa(后者)形式的更容易推导。我们把其拓展到off-policy情形,并结合七章中的控制变体方法:
G t λ a ≐ R t + 1 + γ t + 1 ( ( 1 − λ t + 1 ) V ‾ t ( S t + 1 ) + λ t + 1 [ ρ t + 1 G t + 1 λ a + V ‾ t ( S t + 1 ) − ρ t + 1 q ^ ( S t + 1 , A t + 1 , w t ) ] ) = R t + 1 + γ t + 1 ( V ‾ t ( S t + 1 ) + λ t + 1 ρ t + 1 [ G t + 1 λ a − q ^ ( S t + 1 , A t + 1 , w t ) ] ) \begin{aligned} G_{t}^{\lambda a} & \doteq R_{t+1}+\gamma_{t+1}\left(\left(1-\lambda_{t+1}\right) \overline{V}_{t}\left(S_{t+1}\right)+\lambda_{t+1}\left[\rho_{t+1} G_{t+1}^{\lambda a}+\overline{V}_{t}\left(S_{t+1}\right)-\rho_{t+1} \hat{q}\left(S_{t+1}, A_{t+1}, \mathbf{w}_{t}\right)\right]\right) \\ &=R_{t+1}+\gamma_{t+1}\left(\overline{V}_{t}\left(S_{t+1}\right)+\lambda_{t+1} \rho_{t+1}\left[G_{t+1}^{\lambda a}-\hat{q}\left(S_{t+1}, A_{t+1}, \mathbf{w}_{t}\right)\right]\right) \end{aligned} Gtλa≐Rt+1+γt+1((1−λt+1)Vt(St+1)+λt+1[ρt+1Gt+1λa+Vt(St+1)−ρt+1q^(St+1,At+1,wt)])=Rt+1+γt+1(Vt(St+1)+λt+1ρt+1[Gt+1λa−q^(St+1,At+1,wt)])
其中, V ‾ t ( S t + 1 ) \overline{V}_{t}\left(S_{t+1}\right) Vt(St+1)与之前定义的一致: V ‾ t ( s ) ≐ ∑ a π ( a ∣ s ) q ^ ( s , a , w t ) \overline{V}_{t}(s) \doteq \sum_{a} \pi(a | s) \hat{q}\left(s, a, \mathbf{w}_{t}\right) Vt(s)≐∑aπ(a∣s)q^(s,a,wt)。再次, λ \lambda λ-return可以写成近似的形式(TD误差之和):
G t λ a ≈ q ^ ( S t , A t , w t ) + ∑ k = t ∞ δ k a ∏ i = t + 1 k γ i λ i ρ i G_{t}^{\lambda a} \approx \hat{q}\left(S_{t}, A_{t}, \mathbf{w}_{t}\right)+\sum_{k=t}^{\infty} \delta_{k}^{a} \prod_{i=t+1}^{k} \gamma_{i} \lambda_{i} \rho_{i} Gtλa≈q^(St,At,wt)+∑k=t∞δka∏i=t+1kγiλiρi
使用期望形式的动作值TD误差:
δ
t
a
=
R
t
+
1
+
γ
t
+
1
V
‾
t
(
S
t
+
1
)
−
q
^
(
S
t
,
A
t
,
w
t
)
\delta_{t}^{a}=R_{t+1}+\gamma_{t+1} \overline{V}_{t}\left(S_{t+1}\right)-\hat{q}\left(S_{t}, A_{t}, \mathbf{w}_{t}\right)
δta=Rt+1+γt+1Vt(St+1)−q^(St,At,wt)
和之前一样,当近似值函数不变化的话,则这个近似公式就很准确了。
参考针对状态值的处理,我们能写出forward-view的更新,得到如下的形式:
z
t
≐
γ
t
λ
t
ρ
t
z
t
−
1
+
∇
q
^
(
S
t
,
A
t
,
w
t
)
\mathbf{z}_{t} \doteq \gamma_{t} \lambda_{t} \rho_{t} \mathbf{z}_{t-1}+\nabla \hat{q}\left(S_{t}, A_{t}, \mathbf{w}_{t}\right)
zt≐γtλtρtzt−1+∇q^(St,At,wt)
这个资格迹和期望形式TD误差一起,以及半梯度参数更新方法,就构成了优雅、高效的Expected Sarsa( λ \lambda λ)算法,这个算法既可以应用到on-policy情形,也可以应用到off-policy情形。这可能是目前此类算法中最好的一个(但是这个原始版本不保证收敛稳定,加入后续小节的技巧就能保证稳定了)。在on-policy情形时,固定 λ \lambda λ和 γ \gamma γ和动作值的TD误差,这个算法就和Sarsa( λ \lambda λ)一样了。
当 λ = 1 \lambda=1 λ=1时,这些算法就和MC算法非常相关了,对于episodic问题,如果采用offline更新策略,则和MC方法完全一致。但实际上,这种关联性是比较微妙的,在这些条件下,实际上只是期望上等价,episode-by-episode的更新并不等价。这是不奇怪的,因为在轨迹展开的过程中,这些方法都是要更新的,然而对于MC方法,如果实际采取的某个动作对于target policy来说是0概率的,那么就不会针对这个轨迹更新了。特别地,所有这些方法,在 λ = 1 \lambda=1 λ=1时,实际上还是有bootstrap的,因为target依赖于当前的估计值,只有在期望形式的时候,这种依赖才能去掉。这些方法需要额外的临时权重,来跟踪updates,这些updates需要根据后续的动作逐渐衰减。状态和状态动作版本的方法叫做PTD( λ \lambda λ)和PQ( λ \lambda λ),其中P表示临时的。
这些新的off-policy方法的效果目前还不明确,但是无可置疑的,因为这些方法在off-policy情形下都包含重要性采样,因此其方差是比较大的。
如果 λ < 1 \lambda<1 λ<1,那么所有这些off-policy算法都包含bootstrapping,且符合死亡三角,这意味着只有在表格、state aggregation、或者其它受限拟合器的情形下才能保证稳定。对于线性和更一般的拟合器形式,其参数可能发散。正如我们之前讨论的,off-policy的挑战包含两部分,off-policy资格迹能高效地处理第一个挑战,但是对于第二个挑战却没法克服。对于第二个挑战的解决,我们在12节中给出一些方法。
11. Watkins的Q( λ \lambda λ)到Tree-Backup( λ \lambda λ)
为了在Q学习中使用资格迹,已经有几种方法提出来了。最早的方法就是Watkins的Q( λ \lambda λ),只要采取greedy的动作,就像之前介绍的逐渐衰减资格迹,然后在第一个non-greedy的位置把迹置为0。Watkins的Q( λ \lambda λ)的backup diagram如下图所示:
在第六章中,我们给出了 Q-learning 和 Expected Sarsa 的统一框架,并在之后给出了其 off-policy 的版本,在这个框架中,Q-learning 是特殊的情形,且可以泛化到任意的 target policy 上。在之前的章节中,我们已经把 Expected Sarsa 融入了 off-policy 资格迹,在第七章中,我们给出了 n-step Tree Backup 方法,它能处理 off-policy 情形,且不需要显式的重要性采样,在资格迹版本的 Q 算法中,我们也采用这个方法,叫做Tree-Backup(
λ
\lambda
λ),简称TD(
λ
\lambda
λ)。
TD(
λ
\lambda
λ)的概念是很直接的,如下图所示
每个长度的tree-backup更新由bootstrapping参数
λ
\lambda
λ决定,为了得到方程,我们从
λ
\lambda
λ-return的迭代形式出发:
G t λ a ≐ R t + 1 + γ t + 1 ( ( 1 − λ t + 1 ) V ‾ t ( S t + 1 ) + λ t + 1 [ ∑ a ≠ A t + 1 π ( a ∣ S t + 1 ) q ^ ( S t + 1 , a , w t ) + π ( A t + 1 ∣ S t + 1 ) G t + 1 λ a ] ) = R t + 1 + γ t + 1 ( V ‾ t ( S t + 1 ) + λ t + 1 π ( A t + 1 ∣ S t + 1 ) ( G t + 1 λ a − q ^ ( S t + 1 , A t + 1 , w t ) ) ) \begin{aligned} G_{t}^{\lambda a} & \doteq R_{t+1}+\gamma_{t+1}\left(\left(1-\lambda_{t+1}\right) \overline{V}_{t}\left(S_{t+1}\right)+\lambda_{t+1}\left[\sum_{a \neq A_{t+1}} \pi\left(a | S_{t+1}\right) \hat{q}\left(S_{t+1}, a, \mathbf{w}_{t}\right)+\pi\left(A_{t+1} | S_{t+1}\right) G_{t+1}^{\lambda a}\right]\right) \\ &=R_{t+1}+\gamma_{t+1}\left(\overline{V}_{t}\left(S_{t+1}\right)+\lambda_{t+1} \pi\left(A_{t+1} | S_{t+1}\right)\left(G_{t+1}^{\lambda a}-\hat{q}\left(S_{t+1}, A_{t+1}, \mathbf{w}_{t}\right)\right)\right) \end{aligned} Gtλa≐Rt+1+γt+1⎝⎛(1−λt+1)Vt(St+1)+λt+1⎣⎡a̸=At+1∑π(a∣St+1)q^(St+1,a,wt)+π(At+1∣St+1)Gt+1λa⎦⎤⎠⎞=Rt+1+γt+1(Vt(St+1)+λt+1π(At+1∣St+1)(Gt+1λa−q^(St+1,At+1,wt)))
依据通常的处理方式,我们可以写出其TD误差和的近似形式(忽略估计的值函数的变化):
G
t
λ
a
≈
q
^
(
S
t
,
A
t
,
w
t
)
+
∑
k
=
t
∞
δ
k
a
∏
i
=
t
+
1
k
γ
i
λ
i
π
(
A
i
∣
S
i
)
G_{t}^{\lambda a} \approx \hat{q}\left(S_{t}, A_{t}, \mathbf{w}_{t}\right)+\sum_{k=t}^{\infty} \delta_{k}^{a} \prod_{i=t+1}^{k} \gamma_{i} \lambda_{i} \pi\left(A_{i} | S_{i}\right)
Gtλa≈q^(St,At,wt)+∑k=t∞δka∏i=t+1kγiλiπ(Ai∣Si)
这里使用了基于动作的TD误差的期望形式。
依照前面章节相同的步骤,我们可以得到考虑target policy动作选择概率的资格迹更新:
z
t
≐
γ
t
λ
t
π
(
A
t
∣
S
t
)
z
t
−
1
+
∇
q
^
(
S
t
,
A
t
,
w
t
)
\mathbf{z}_{t} \doteq \gamma_{t} \lambda_{t} \pi\left(A_{t} | S_{t}\right) \mathbf{z}_{t-1}+\nabla \hat{q}\left(S_{t}, A_{t}, \mathbf{w}_{t}\right)
zt≐γtλtπ(At∣St)zt−1+∇q^(St,At,wt)
结合参数更新的规则 w t + 1 ≐ w t + α δ t z t \mathbf{w}_{t+1} \doteq \mathbf{w}_{t}+\alpha \delta_{t} \mathbf{z}_{t} wt+1≐wt+αδtzt,我们就得到了TB( λ \lambda λ)算法。和所有的半梯度方法一样,使用off-policy数据和拟合器时这个算法不能保证稳定,而为了保证稳定,TB( λ \lambda λ)必须结合下一节所介绍的任一个方法。
12. 带有迹的稳定off-policy方法
目前人们已经提出了几种off-policy训练下能保证稳定的资格迹方法,这里我们给出四种比较重要的。这些方法要么基于梯度TD,要么基于Emphatic TD,所有的算法都假设使用线性拟合器,也有文献把它们扩充到非线性情形。
GTD( λ \lambda λ)是类似于TDC的资格迹算法,这两种状态值梯度TD预测算法的比较在11.8节中已经讨论过了。这种算法的目标是基于on-policy或者off-policy的样本,学习到参数 w t \mathbf{w}_{t} wt,使 v ^ ( s , w ) ≐ w t ⊤ x ( s ) ≈ v π ( s ) \hat{v}(s, \mathbf{w}) \doteq \mathbf{w}_{t}^{\top} \mathbf{x}(s) \approx v_{\pi}(s) v^(s,w)≐wt⊤x(s)≈vπ(s),其更新公式为:
w t + 1 ≐ w t + α δ t s z t − α γ t + 1 ( 1 − λ t + 1 ) ( z t ⊤ v t ) x t + 1 \mathbf{w}_{t+1} \doteq \mathbf{w}_{t}+\alpha \delta_{t}^{s} \mathbf{z}_{t}-\alpha \gamma_{t+1}\left(1-\lambda_{t+1}\right)\left(\mathbf{z}_{t}^{\top} \mathbf{v}_{t}\right) \mathbf{x}_{t+1} wt+1≐wt+αδtszt−αγt+1(1−λt+1)(zt⊤vt)xt+1
其中,参数
δ
t
s
,
z
t
,
ρ
t
\delta_{t}^{s}, \mathbf{z}_{t}, \rho_t
δts,zt,ρt的定义和前面的定义一样,即:
δ
t
s
≐
R
t
+
1
+
γ
t
+
1
v
^
(
S
t
+
1
,
w
t
)
−
v
^
(
S
t
,
w
t
)
\delta_{t}^{s} \doteq R_{t+1}+\gamma_{t+1} \hat{v}\left(S_{t+1}, \mathbf{w}_{t}\right)-\hat{v}\left(S_{t}, \mathbf{w}_{t}\right)
δts≐Rt+1+γt+1v^(St+1,wt)−v^(St,wt)
z
t
≐
ρ
t
(
γ
t
λ
t
z
t
−
1
+
∇
v
^
(
S
t
,
w
t
)
)
\mathbf{z}_{t} \doteq \rho_{t}\left(\gamma_{t} \lambda_{t} \mathbf{z}_{t-1}+\nabla \hat{v}\left(S_{t}, \mathbf{w}_{t}\right)\right)
zt≐ρt(γtλtzt−1+∇v^(St,wt))
ρ
t
≐
ρ
t
:
t
=
π
(
A
t
∣
S
t
)
b
(
A
t
∣
S
t
)
\rho_{t} \doteq \rho_{t : t}=\frac{\pi\left(A_{t} | S_{t}\right)}{b\left(A_{t} | S_{t}\right)}
ρt≐ρt:t=b(At∣St)π(At∣St)
而
v
t
v_t
vt的迭代式为:
v
t
+
1
≐
v
t
+
β
δ
t
s
z
t
−
β
(
v
t
⊤
x
t
)
x
t
\mathbf{v}_{t+1} \doteq \mathbf{v}_{t}+\beta \delta_{t}^{s} \mathbf{z}_{t}-\beta\left(\mathbf{v}_{t}^{\top} \mathbf{x}_{t}\right) \mathbf{x}_{t}
vt+1≐vt+βδtszt−β(vt⊤xt)xt
正如11.8节中讨论的,
v
∈
R
d
\mathbf{v} \in \mathbb{R}^{d}
v∈Rd是和参数
w
\mathbf{w}
w维度一样的向量,且初值为0:
v
∈
R
d
\mathbf{v} \in \mathbb{R}^{d}
v∈Rd;
β
\beta
β是大于零的第二个步长参数。
GQ( λ \lambda λ)是针对动作值的带有资格迹的梯度TD算法。其目标是基于off-policy数据,学习到参数 w t \mathbf{w}_{t} wt,使之满足: q ^ ( s , a , w t ) ≐ w t ⊤ x ( s , a ) ≈ q π ( s , a ) \hat{q}\left(s, a, \mathbf{w}_{t}\right) \doteq \mathbf{w}_{t}^{\top} \mathbf{x}(s, a) \approx q_{\pi}(s, a) q^(s,a,wt)≐wt⊤x(s,a)≈qπ(s,a)。如果target策略针对贪婪策略是有偏的,那么GQ( λ \lambda λ)可以被用作控制算法。其更新公式为:
w t + 1 ≐ w t + α δ t a z t − α γ t + 1 ( 1 − λ t + 1 ) ( z t ⊤ v t ) x ‾ t + 1 \mathbf{w}_{t+1} \doteq \mathbf{w}_{t}+\alpha \delta_{t}^{a} \mathbf{z}_{t}-\alpha \gamma_{t+1}\left(1-\lambda_{t+1}\right)\left(\mathbf{z}_{t}^{\top} \mathbf{v}_{t}\right) \overline{\mathbf{x}}_{t+1} wt+1≐wt+αδtazt−αγt+1(1−λt+1)(zt⊤vt)xt+1
其中, x ‾ t ≐ ∑ a π ( a ∣ S t ) x ( S t , a ) \overline{\mathbf{x}}_{t} \doteq \sum_{a} \pi\left(a | S_{t}\right) \mathbf{x}\left(S_{t}, a\right) xt≐∑aπ(a∣St)x(St,a), δ t a ≐ R t + 1 + γ t + 1 w t ⊤ x ‾ t + 1 − w t ⊤ x t \delta_{t}^{a} \doteq R_{t+1}+\gamma_{t+1} \mathbf{w}_{t}^{\top} \overline{\mathbf{x}}_{t+1}-\mathbf{w}_{t}^{\top} \mathbf{x}_{t} δta≐Rt+1+γt+1wt⊤xt+1−wt⊤xt。 z t \mathbf{z}_t zt的定义和前面一小节一致: z t ≐ γ t λ t ρ t z t − 1 + ∇ q ^ ( S t , A t , w t ) \mathbf{z}_{t} \doteq \gamma_{t} \lambda_{t} \rho_{t} \mathbf{z}_{t-1}+\nabla \hat{q}\left(S_{t}, A_{t}, \mathbf{w}_{t}\right) zt≐γtλtρtzt−1+∇q^(St,At,wt)。其余参数则与本节前面介绍的GTD( λ \lambda λ)算法一致。
HTD( λ \lambda λ)是混合GTD( λ \lambda λ)和TD( λ \lambda λ)的状态值算法。其最有吸引力的特征为:其为TD( λ \lambda λ)在off-policy情形下的严格泛化,也就是如果behavior策略恰好与target策略一样,那么HTD( λ \lambda λ)就变得和TD( λ \lambda λ)完全一致,而这个特点对于GTD( λ \lambda λ)是不成立的。这个特点很有用,因为TD( λ \lambda λ)通常比GTD( λ \lambda λ)要快,因为GTD( λ \lambda λ)涉及两个步长因子。HTD( λ \lambda λ)的定义为:
w
t
+
1
≐
w
t
+
α
δ
t
s
z
t
+
α
(
(
z
t
−
z
t
b
)
⊤
v
t
)
(
x
t
−
γ
t
+
1
x
t
+
1
)
\mathbf{w}_{t+1} \doteq \mathbf{w}_{t}+\alpha \delta_{t}^{s} \mathbf{z}_{t}+\alpha\left(\left(\mathbf{z}_{t}-\mathbf{z}_{t}^{b}\right)^{\top} \mathbf{v}_{t}\right)\left(\mathbf{x}_{t}-\gamma_{t+1} \mathbf{x}_{t+1}\right)
wt+1≐wt+αδtszt+α((zt−ztb)⊤vt)(xt−γt+1xt+1)
v
t
+
1
≐
v
t
+
β
δ
t
s
z
t
−
β
(
z
t
b
⊤
v
t
)
(
x
t
−
γ
t
+
1
x
t
+
1
)
,
\mathbf{v}_{t+1} \doteq \mathbf{v}_{t}+\beta \delta_{t}^{s} \mathbf{z}_{t}-\beta\left(\mathbf{z}_{t}^{b \top} \mathbf{v}_{t}\right)\left(\mathbf{x}_{t}-\gamma_{t+1} \mathbf{x}_{t+1}\right), \quad
vt+1≐vt+βδtszt−β(ztb⊤vt)(xt−γt+1xt+1), with
v
0
≐
0
\mathbf{v}_{0} \doteq \mathbf{0}
v0≐0
z
t
≐
ρ
t
(
γ
t
λ
t
z
t
−
1
+
x
t
)
,
\mathbf{z}_{t} \doteq \rho_{t}\left(\gamma_{t} \lambda_{t} \mathbf{z}_{t-1}+\mathbf{x}_{t}\right), \quad
zt≐ρt(γtλtzt−1+xt), with
z
−
1
≐
0
\mathbf{z}_{-1} \doteq \mathbf{0}
z−1≐0
z
t
b
≐
γ
t
λ
t
z
t
−
1
b
+
x
t
,
\mathbf{z}_{t}^{b} \doteq \gamma_{t} \lambda_{t} \mathbf{z}_{t-1}^{b}+\mathbf{x}_{t}, \quad
ztb≐γtλtzt−1b+xt, with
z
−
1
b
≐
0
\mathbf{z}_{-1}^{b} \doteq \mathbf{0}
z−1b≐0
其中, β \beta β是大于零的第二个步长参数。注意这里 v t \mathbf{v}_t vt和 z t b \mathbf{z}_t^b ztb的定义和前面不一样,他们是behavior策略通常的accumulating资格迹,并且当 ρ t = 1 \rho_{t}=1 ρt=1时, z t b = z t \mathbf{z}_t^b=\mathbf{z}_t ztb=zt,使得 w t \mathbf{w}_t wt更新公式中的最后一项是0,因此更新公式变得和TD( λ \lambda λ)一致。
Emphatic TD( λ \lambda λ)是one-step Emphatic-TD算法引入资格迹的扩展,在off-policy下有很好的收敛保证,但是这是以较大的方差和较慢的收敛速度为代价的。其定义为:
w t + 1 ≐ w t + α δ t z t δ t ≐ R t + 1 + γ t + 1 w t ⊤ x t + 1 − w t ⊤ x t z t ≐ ρ t ( γ t λ t z t − 1 + M t x t ) , with z − 1 ≐ 0 M t ≐ λ t I t + ( 1 − λ t ) F t F t ≐ ρ t − 1 γ t F t − 1 + I t , with F 0 ≐ i ( S 0 ) \begin{aligned} \mathbf{w}_{t+1} & \doteq \mathbf{w}_{t}+\alpha \delta_{t} \mathbf{z}_{t} \\ \delta_{t} & \doteq R_{t+1}+\gamma_{t+1} \mathbf{w}_{t}^{\top} \mathbf{x}_{t+1}-\mathbf{w}_{t}^{\top} \mathbf{x}_{t} \\ \mathbf{z}_{t} & \doteq \rho_{t}\left(\gamma_{t} \lambda_{t} \mathbf{z}_{t-1}+M_{t} \mathbf{x}_{t}\right), \quad \text { with } \mathbf{z}_{-1} \doteq \mathbf{0} \\ M_{t} & \doteq \lambda_{t} I_{t}+\left(1-\lambda_{t}\right) F_{t} \\ F_{t} & \doteq \rho_{t-1} \gamma_{t} F_{t-1}+I_{t}, \quad \text { with } F_{0} \doteq i\left(S_{0}\right) \end{aligned} wt+1δtztMtFt≐wt+αδtzt≐Rt+1+γt+1wt⊤xt+1−wt⊤xt≐ρt(γtλtzt−1+Mtxt), with z−1≐0≐λtIt+(1−λt)Ft≐ρt−1γtFt−1+It, with F0≐i(S0)
其中, M t ≥ 0 M_{t} \geq 0 Mt≥0,也就是所谓的emphasis, F t ≥ 0 F_{t} \geq 0 Ft≥0被称作followon迹, I t ≥ 0 I_{t} \geq 0 It≥0是所谓的interest。注意, M t M_{t} Mt像 δ t \delta_{t} δt一样,不是真正的额外记忆变量,使用资格迹的形式替换可以去掉这个变量。这个算法的真正在线版本伪代码可以在网络上查到(Sutton, 2015b)。
在on-policy情形下,Emphatic TD( λ \lambda λ)和经典的TD( λ \lambda λ)是相似的,但仍然有较大的不同。实际上,Emphatic TD( λ \lambda λ)对于所有状态独立的 λ \lambda λ函数都能保证收敛,但是TD( λ \lambda λ)就不能保证,TD( λ \lambda λ)只有在恒定 λ \lambda λ时才能保证收敛性。这个可以参考(Ghiassian, Rafiee, and Sutton, 2016)。
13. 实现中的问题
对于表格化算法,使用资格迹地方法比one-step算法计算上复杂很多。最naive的实现要求在每个step都要更新估计值和资格迹,这对于单指令、多数据、并行计算机或者神经网络中都不是问题,但是对于串行计算机则问题较大。幸运的是,对于典型的 λ \lambda λ和 γ \gamma γ取值,几乎所有状态的资格迹都将经常是0,只有那些最近被访问的状态才有明显大于0的迹,且只有很少的状态需要更新。
实践中,通常只有那些明显大于0的迹才会被跟踪和更新,使用这个技巧,在表格方法中使用资格迹的计算代价只是one-step方法的数倍,具体则取决于参数 λ \lambda λ和 γ \gamma γ的取值,而表格情形是使用资格迹最差的情形。当使用拟合器时,则资格迹造成的计算提高就小很多,例如,使用ANN和反向传播算法时,资格迹只会导致存储和计算代价增加一倍(per step),截断 λ \lambda λ-return则在传统计算机上计算效率更高,虽然会增加一定的内存开销。
14. 总结
资格迹与TD误差结合,提供了一种高效、增量的折中TD和MC的方式。虽然第七章中的n-step方法也有这个作用,但是资格迹方法更加通用,学习速度更快,并且能够提供不同程度的计算复杂度权衡。本章给出了各种基于资格迹的算法,真正在线方法在保证和TD方法类似的计算复杂度的同时,达到了那些需要更多计算的方法的性能;另一类则是增量backward-view算法。
正如我们第五章提到的,MC方法在非马尔可夫任务中可能有优势,因为它不需要bootstrap。而资格迹方法使得TD方法接近于MC方法,从而在这种场景中也能表现得较好。如果我们既需要TD的某些优点,任务本身又带有一定的非马尔可夫性,那么资格迹方法就是好的选择。资格迹方法是长期延迟回报和非马尔可夫任务的第一道防线。
通过调整 λ \lambda λ,我们可以在MC和one-step TD之间平滑移动,得到一系列新的方法。那么如何设置这个参数呢?目前还没有理论上的指导,但是经验上的指导还是有的。对于每个episode有很多steps的任务,或者折扣的半衰期覆盖很多steps的任务,使用资格迹效果会很好,如下图。另一方面,如果使用资格迹时使之过于接近MC方法( λ \lambda λ接近1.0),那么性能会快速下降。因此,选择折中的参数是效果最好的,资格迹方法应该让我们的方法向MC靠近,但是不能太近。
使用资格迹的方法比one-step方法需要更多的计算,但是大大加速了学习,特别是当reward延迟了很多步的时候。因此,当数据是稀疏的或者难以重复处理时(在线应用),使用资格迹是很有价值的。另一方面,在离线应用中,数据可以廉价地大量产生,此时使用资格迹就不合适了,因为这时需要尽可能快的处理大量数据。