RL 学习笔记 [5] | 用时序差分法(TD)求解

注意
本文最后更新于 2024-02-28,文中内容可能已过时。

0 引言

强化学习(四)用蒙特卡罗法(MC)求解中,我们讲到了使用蒙特卡罗法来求解强化学习问题的方法,虽然蒙特卡罗法很灵活,不需要环境的状态转化概率模型,但是它需要所有的采样序列都是经历完整的状态序列。如果我们没有完整的状态序列,那么就无法使用蒙特卡罗法求解了。本文我们就来讨论可以不使用完整状态序列求解强化学习问题的方法:时序差分 (Temporal-Difference, TD)。

时序差分这一篇对应 Sutton 书的第六章部分和 UCL 强化学习课程的第四讲部分,第五讲部分。

1. 时序差分 TD 简介

时序差分法和蒙特卡罗法类似,都是不基于模型的强化学习问题求解方法。所以在上一篇定义的不基于模型的强化学习控制问题和预测问题的定义,在这里仍然适用。

预测问题:即给定强化学习的 5 个要素:状态集 SS, 动作集 AA, 即时奖励 RR,衰减因子 γγ, 给定策略 ππ, 求解该策略的状态价值函数 v(π)v(π)

控制问题:也就是求解最优的价值函数和策略。给定强化学习的 5 个要素:状态集 SS, 动作集 AA, 即时奖励 RR,衰减因子 γγ, 探索率 ϵϵ, 求解最优的动作价值函数 qq∗ 和最优策略 ππ∗ 

回顾蒙特卡罗法中计算状态收获的方法是:

Gt=Rt+1+γRt+2+γ2Rt+3+γTt1RTG_t=R_{t+1}+\gamma R_{t+2}+\gamma^2R_{t+3}+\ldots\gamma^{T-t-1}R_T

而对于时序差分法来说,我们没有完整的状态序列,只有部分的状态序列,那么如何可以近似求出某个状态的收获呢?回顾强化学习(二)马尔科夫决策过程 (MDP)中的贝尔曼方程:

vπ(s)=Eπ(Rt+1+γvπ(St+1)St=s)v_\pi(s)=\mathbb{E}_\pi(R_{t+1}+\gamma v_\pi(S_{t+1})|S_t=s)

这启发我们可以用 Rt+1+γv(St+1)R_{t+1}+\gamma v(S_{t+1}) 来近似的代替收获 GtG_t, 一般我们把 Rt+1+γV(St+1)R_{t+1}+\gamma V(S_{t+1}) 称为 TD 目标值。Rt+1+γV(St+1)V(St)R_{t+1}+\gamma V(S_{t+1})-V(S_t) 称为 TD 误差,将用 TD 目标值近似代替收获 G(t)G(t) 的过程称为引导 (bootstrapping)。这样我们只需要两个连续的状态与对应的奖励,就可以尝试求解强化学习问题了。

现在我们有了自己的近似收获 GtG_t 的表达式,那么就可以去求解时序差分的预测问题和控制问题了。

2. 时序差分 TD 的预测问题求解

时序差分的预测问题求解和蒙特卡罗法类似,但是主要有两个不同点。一是收获 GtG_t 的表达式不同,时序差分 G(t)G(t) 的表达式为:

G(t)=Rt+1+γV(St+1)G(t)=R_{t+1}+\gamma V(S_{t+1})

二是迭代的式子系数稍有不同,回顾蒙特卡罗法的迭代式子是:

V(St)=V(St)+1N(St)(GtV(St))V(S_t)=V(S_t)+\frac1{N(S_t)}(G_t-V(S_t))

由于在时序差分我们没有完整的序列,也就没有对应的次数 N(St)N(S_t) , 一般就用一个 [0,1] 的系数 αα 代替。这样时序差分的价值函数迭代式子是:

V(St)=V(St)+α(GtV(St))Q(St,At)=Q(St,At)+α(GtQ(St,At))V(S_t)=V(S_t)+\alpha(G_t-V(S_t)) \\\\ Q(S_t,A_t)=Q(S_t,A_t)+\alpha(G_t-Q(S_t,A_t))

这里我们用一个简单的例子来看看蒙特卡罗法和时序差分法求解预测问题的不同。

假设我们的强化学习问题有 A,B 两个状态,模型未知,不涉及策略和行为。只涉及状态转化和即时奖励。一共有 8 个完整的状态序列如下:

  ① A,0,B,0 ②B,1 ③B,1 ④ B,1 ⑤ B,1 ⑥B,1 ⑦B,1 ⑧B,0

只有第一个状态序列是有状态转移的,其余 7 个只有一个状态。设置衰减因子 γ=1γ=1

首先我们按蒙特卡罗法来求解预测问题。由于只有第一个序列中包含状态 A,因此 A 的价值仅能通过第一个序列来计算,也就等同于计算该序列中状态 A 的收获:

V(A)=G(A)=RA+γRB=0V(A)=G(A)=R_A+\gamma R_B=0

对于 B,则需要对其在 8 个序列中的收获值来平均,其结果是 6/8。

再来看看时序差分法求解的过程。其收获是在计算状态序列中某状态价值时是应用其后续状态的预估价值来计算的,对于 B 来说,它总是终止状态,没有后续状态,因此它的价值直接用其在 8 个序列中的收获值来平均,其结果是 6/8。

对于 A,只在第一个序列出现,它的价值为:

V(A)=RA+γV(B)=68V(A)=R_A+\gamma V(B)=\frac68

从上面的例子我们也可以看到蒙特卡罗法和时序差分法求解预测问题的区别。

一是时序差分法在知道结果之前就可以学习,也可以在没有结果时学习,还可以在持续进行的环境中学习,而蒙特卡罗法则要等到最后结果才能学习,时序差分法可以更快速灵活的更新状态的价值估计,这在某些情况下有着非常重要的实际意义。

二是时序差分法在更新状态价值时使用的是 TD 目标值,即基于即时奖励和下一状态的预估价值来替代当前状态在状态序列结束时可能得到的收获,是当前状态价值的有偏估计,而蒙特卡罗法则使用实际的收获来更新状态价值,是某一策略下状态价值的无偏估计,这一点蒙特卡罗法占优。

三是虽然时序差分法得到的价值是有偏估计,但是其方差却比蒙特卡罗法得到的方差要低,且对初始值敏感,通常比蒙特卡罗法更加高效。

从上面的描述可以看出时序差分法的优势比较大,因此现在主流的强化学习求解方法都是基于时序差分的。后面的文章也会主要基于时序差分法来扩展讨论。

3. n 步时序差分

在第二节的时序差分法中,我们使用了用 Rt+1+γv(St+1)R_{t+1}+\gamma v(S_{t+1}) 来近似的代替收获 GtG_t。即向前一步来近似我们的收获 GtG_{t}, 那么能不能向前两步呢?当然可以,这时我们的收获 GtG_t 的近似表达式为:

Gt(2)=Rt+1+γRt+2+γ2V(St+2)G_t^{(2)}=R_{t+1}+\gamma R_{t+2}+\gamma^2V(S_{t+2})

从两步,到三步,再到 n 步,我们可以归纳出 n 步时序差分收获 Gt(n)G^{(n)}_t表达式为:Gt(n)=Rt+1+γRt+2++γn1Rt+n+γnV(St+n)G_t^{(n)}=R_{t+1}+\gamma R_{t+2}+\ldots+\gamma^{n-1}R_{t+n}+\gamma^nV(S_{t+n})

当 n 越来越大,趋于无穷,或者说趋于使用完整的状态序列时,n 步时序差分就等价于蒙特卡罗法了。

对于 n 步时序差分来说,和普通的时序差分的区别就在于收获的计算方式的差异。那么既然有这个 n 步的说法,那么 n 到底是多少步好呢?如何衡量 n 的好坏呢?我们在下一节讨论。

4. TD(λ)

n 步时序差分选择多少步数作为一个较优的计算参数是需要尝试的超参数调优问题。为了能在不增加计算复杂度的情况下综合考虑所有步数的预测,我们引入了一个新 [0,1] 的参数 λ\lambda, 定义入 — 收获是 nn11\infty 所有步的收获乘以权重的和。每一步的权重是 (1λ)λn1(1-\lambda)\lambda^{n-1}, 这样 λ\lambda-收获的计算公式表示为:

Gtλ=(1λ)n=1λn1Gt(n)G_t^\lambda=(1-\lambda)\sum_{n=1}^\infty\lambda^{n-1}G_t^{(n)}

进而我们可以得到 TD(λ)TD(λ) 的价值函数的迭代公式:

V(St)=V(St)+α(GtλV(St))Q(St,At)=Q(St,At)+α(GtλQ(St,At))V(S_t)=V(S_t)+\alpha(G_t^\lambda-V(S_t)) \\\\ Q(S_t,A_t)=Q(S_t,A_t)+\alpha(G_t^\lambda-Q(S_t,A_t))

每一步收获的权重定义为 (1λ)λn1(1−λ)λ^{n−1} 的原因是什么呢?其图像如下图所示,可以看到随着 n 的增大,其第 n 步收获的权重呈几何级数的衰减。当在 T 时刻到达终止状态时,未分配的权重全部给予终止状态的实际收获值。这样可以使一个完整的状态序列中所有的 n 步收获的权重加起来为 1,离当前状态越远的收获其权重越小。



TD(λ)

从前向来看 TD(λ)TD(λ), 一个状态的价值 V(St)V(St)GtG_t得到,而 Gt��又间接由所有后续状态价值计算得到,因此可以认为更新一个状态的价值需要知道所有后续状态的价值。也就是说,必须要经历完整的状态序列获得包括终止状态的每一个状态的即时奖励才能更新当前状态的价值。这和蒙特卡罗法的要求一样,因此 TD (λ)��(�) 有着和蒙特卡罗法一样的劣势。当 λ=0λ=0 时,就是第二节讲到的普通的时序差分法,当 λ=1λ=1 时,就是蒙特卡罗法。

从反向来看 TD(λ)TD(λ),它可以分析我们状态对后续状态的影响。比如老鼠在依次连续接受了 3 次响铃和 1 次亮灯信号后遭到了电击,那么在分析遭电击的原因时,到底是响铃的因素较重要还是亮灯的因素更重要呢?如果把老鼠遭到电击的原因认为是之前接受了较多次数的响铃,则称这种归因为频率启发 (frequency heuristic) 式;而把电击归因于最近少数几次状态的影响,则称为就近启发 (recency heuristic) 式。

如果给每一个状态引入一个数值:效用 (eligibility, E) 来表示该状态对后续状态的影响,就可以同时利用到上述两个启发。而所有状态的效用值总称为效用迹 (eligibility traces,ES)。定义为:

$$ E_0(s)=0 \\\\ \left.E_t(s)=\gamma\lambda E_{t-1}(s)+1(S_t=s)=\left\\{\begin{array}{ll}0&t<k\\\\(\gamma\lambda)^{t-k}&t\geq k\end{array}\right.\right.,\quad s.t.\quad\lambda,\gamma\in[0,1],s\textit{ is visited once at time k}$$

此时我们 TD(λ)TD(λ) 的价值函数更新式子可以表示为:

δt=Rt+1+γv(St+1)V(St)V(St)=V(St)+αδtEt(s)\delta_t=R_{t+1}+\gamma v(S_{t+1})-V(S_t)\\\\V(S_t)=V(S_t)+\alpha\delta_tE_t(s)

也许有人会问,这前向的式子和反向的式子看起来不同啊,是不是不同的逻辑呢?其实两者是等价的。现在我们从前向推导一下反向的更新式子。

GtλV(St)=V(St)+(1λ)λ0(Rt+1+γV(St+1))(1)+(1λ)λ1(Rt+1+γRt+2+γ2V(St+2))(2)+(1λ)λ2(Rt+1+γRt+2+γ2Rt+3+γ3V(St+3))(3)+(4)=V(St)+(γλ)0(Rt+1+γV(St+1)γλV(St+1))(5)+(γλ)1(Rt+2+γV(St+2)γλV(St+2))(6)+(γλ)2(Rt+3+γV(St+3)γλV(St+3))(7)+(8)=(γλ)0(Rt+1+γV(St+1)V(St))(9)+(γλ)1(Rt+2+γV(St+2)V(St+1))(10)+(γλ)2(Rt+3+γV(St+3)V(St+2))(11)+(12)=δt+γλδt+1+(γλ)2δt+2+(13)\begin{aligned} G_t^\lambda-V(S_t)& =-V(S_t)+(1-\lambda)\lambda^0(R_{t+1}+\gamma V(S_{t+1})) && \text{(1)} \\\\ &+(1-\lambda)\lambda^1(R_{t+1}+\gamma R_{t+2}+\gamma^2V(S_{t+2}))&& (2) \\\\ &+(1-\lambda)\lambda^2(R_{t+1}+\gamma R_{t+2}+\gamma^2R_{t+3}+\gamma^3V(S_{t+3}))&& (3) \\\\ &+\ldots && \text{(4)} \\\\ &=-V(S_t)+(\gamma\lambda)^0(R_{t+1}+\gamma V(S_{t+1})-\gamma\lambda V(S_{t+1}))&& (5) \\\\ &+(\gamma\lambda)^1(R_{t+2}+\gamma V(S_{t+2})-\gamma\lambda V(S_{t+2}))&& \text{(6)} \\\\ &+(\gamma\lambda)^2(R_{t+3}+\gamma V(S_{t+3})-\gamma\lambda V(S_{t+3}))&& \text{(7)} \\\\ &\begin{array}{c}+\ldots\end{array}&& \text{(8)} \\\\ &=(\gamma\lambda)^0(R_{t+1}+\gamma V(S_{t+1})-V(S_t))&& \left(9\right) \\\\ &+(\gamma\lambda)^1(R_{t+2}+\gamma V(S_{t+2})-V(S_{t+1}))&& \text{(10)} \\\\ &+(\gamma\lambda)^2(R_{t+3}+\gamma V(S_{t+3})-V(S_{t+2}))&& (11) \\\\ &\begin{array}{c}+\ldots\end{array}&& (12) \\\\ &=\delta_t+\gamma\lambda\delta_{t+1}+(\gamma\lambda)^2\delta_{t+2}+\ldots && (13) \end{aligned}

可以看出前向 TD 误差和反向的 TD 误差实际上一致的。

5. 时序差分的控制问题求解

现在我们回到普通的时序差分,来看看它控制问题的求解方法。回想上一篇蒙特卡罗法在线控制的方法,我们使用的是 ϵϵ−贪婪法来做价值迭代。对于时序差分,我们也可以用 ϵϵ−贪婪法来价值迭代,和蒙特卡罗法在线控制的区别主要只是在于收获的计算方式不同。时序差分的在线控制 (on-policy) 算法最常见的是 SARSA 算法,我们在下一篇单独讲解。

而除了在线控制,我们还可以做离线控制 (off-policy),离线控制和在线控制的区别主要在于在线控制一般只有一个策略 (最常见的是 ϵϵ−贪婪法)。而离线控制一般有两个策略,其中一个策略 (最常见的是 ϵϵ−贪婪法) 用于选择新的动作,另一个策略 (最常见的是贪婪法) 用于更新价值函数。时序差分的离线控制算法最常见的是 Q-Learning 算法,我们在下下篇单独讲解。

6. 时序差分小结

时序差分和蒙特卡罗法比它更加灵活,学习能力更强,因此是目前主流的强化学习求解问题的方法,现在绝大部分强化学习乃至深度强化学习的求解都是以时序差分的思想为基础的。因此后面我们会重点讨论。

下一篇我们会讨论时序差分的在线控制算法 SARSA。

Buy me a coffee~
支付宝
微信
0%