在强化学习(3)中,我们讲到了使用蒙特卡罗法来求解强化学习问题的方法,虽然蒙特卡罗法很灵活,不需要环境的状态转化概率模型,但是它需要所有的采样序列都是经历完整的状态序列。如果我们没有完整的状态序列,那么就无法使用蒙特卡罗法求解了。本文我们就来讨论可以不使用完整状态序列求解强化学习问题的方法:时间差分(Temporal-Difference, TD)。
无模型时,我们可以采用蒙特卡罗的方法利用经验平均来估计当前状态的值函数。
蒙特卡罗方法利用经验平均估计状态的值函数,所谓的经验是指一次试验,而一次试验要等到终止状态出现才结束。在下式中的 G t G_t Gt是状态 S t S_t St处的折扣累积回报值。
V ( S t ) ← V ( S t ) + α ( G t − V ( S t ) ) V\left(S_t\right)\gets V\left(S_t\right)+\alpha\left(G_t-V\left(S_t\right)\right) V(St)←V(St)+α(Gt−V(St))
而对于时间差分法来说,我们没有完整的状态序列,只有部分的状态序列,那么如何可以近似求出某个状态的收获呢?回顾马尔科夫决策过程(MDP)中的贝尔曼方程:
v π ( s ) = E π ( R t + 1 + γ v π ( S t + 1 ) ∣ S t = s ) v_{\pi}(s)=\mathbb{E}_{\pi}\left(R_{t+1}+\gamma v_{\pi}\left(S_{t+1}\right) | S_{t}=s\right) vπ(s)=Eπ(Rt+1+γvπ(St+1)∣St=s)
这启发我们可以用 R t + 1 + γ v ( S t + 1 ) R_{t+1}+\gamma v\left(S_{t+1}\right) Rt+1+γv(St+1)来近似的代替收获 G t G_{t} Gt。
一般我们把 R t + 1 + γ v ( S t + 1 ) R_{t+1}+\gamma v\left(S_{t+1}\right) Rt+1+γv(St+1)称为TD目标, δ t = R t + 1 + γ V ( S t + 1 ) − V ( S t ) \delta_t=R_{t+1}+\gamma V\left(S_{t+1}\right)-V\left(S_t\right) δt=Rt+1+γV(St+1)−V(St)称为TD偏差。
时间差分方法包括同策略的 S a r s a Sarsa Sarsa方法和异策略的 Q l e a r n i n g Qlearning Qlearning方法。
同策略即一直使用一个策略来更新价值函数和选择新的动作。异策略会使用两个控制策略,一个策略用于选择新的动作,另一个策略用于更新价值函数。
同策略 S a r s a Sarsa Sarsa算法流程
输入:迭代轮数 T T T,状态集 S S S, 动作集 A A A, 步长 α α α,衰减因子 γ γ γ, 探索率 ϵ ϵ ϵ,
输出:所有的状态和动作对应的价值 Q Q Q
异策略 Q l e a r n i n g Qlearning Qlearning算法流程
输入:迭代轮数 T T T,状态集 S S S, 动作集 A A A, 步长 α α α,衰减因子 γ γ γ, 探索率 ϵ ϵ ϵ,
输出:所有的状态和动作对应的价值 Q Q Q
T D TD TD方法除了常用的 S a r s a Sarsa Sarsa方法和 Q l e a r n i n g Qlearning Qlearning方法,还包括 T D ( λ ) TD\left(\lambda\right) TD(λ)方法,下面我们讨论 T D ( λ ) TD\left(\lambda\right) TD(λ)方法。
在更新当前值函数时,用到了下一个状态的值函数。那么我们可以据此推理,能不能利用后继第二个状态的值函数来更新当前状态的值函数呢?
答案是肯定的,那么如何利用公式计算呢?
我们用 G t ( 1 ) = R t + 1 + γ V ( S t + 1 ) G_{t}^{\left(1\right)}=R_{t+1}+\gamma V\left(S_{t+1}\right) Gt(1)=Rt+1+γV(St+1)表示 T D TD TD目标,则利用第二步值函数来估计当前值函数可表示为: G t ( 2 ) = R t + 1 + γ R t + 2 + γ 2 V ( S t + 1 ) G_{t}^{\left(2\right)}=R_{t+1}+\gamma R_{t+2}+\gamma^2V\left(S_{t+1}\right) Gt(2)=Rt+1+γRt+2+γ2V(St+1) 以此类推,利用第n步的值函数更新当前值函数可表示为:
G t ( n ) = R t + 1 + γ R t + 2 + ⋯ + γ n − 1 R t + n + γ n V ( S t + n ) G_{t}^{\left(n\right)}=R_{t+1}+\gamma R_{t+2}+\cdots +\gamma^{n-1}R_{t+n}+\gamma^nV\left(S_{t+n}\right) Gt(n)=Rt+1+γRt+2+⋯+γn−1Rt+n+γnV(St+n)
我们再审视一下刚刚的结论:可以利用n步值函数来估计当前值函数,也就是说当前值函数有n种估计方法。哪种估计值更接近真实值呢?我们不知道,但是我们是不是可以对这n个估计值利用加权的方法进行融合一下呢?这就是 T D ( λ ) TD\left(\lambda\right) TD(λ)的方法。
我们在 G t ( n ) 前 乘 以 加 权 因 子 ( 1 − λ ) λ n − 1 G_{t}^{\left(n\right)}前乘以加权因子\left(1-\lambda\right)\lambda^{n-1} Gt(n)前乘以加权因子(1−λ)λn−1,为什么要乘这个加权呢?这是因为:
G t λ = ( 1 − λ ) G t ( 1 ) + ( 1 − λ ) λ G t ( 2 ) + ⋯ + ( 1 − λ ) λ n − 1 G t ( n ) ≈ [ ( 1 − λ ) + ( 1 − λ ) λ + ⋯ + ( 1 − λ ) λ n − 1 ] V ( S t ) = V ( S t ) G_{t}^{\lambda}=\left(1-\lambda\right)G_{t}^{\left(1\right)}+\left(1-\lambda\right)\lambda G_{t}^{\left(2\right)}+\cdots +\left(1-\lambda\right)\lambda^{n-1}G_{t}^{\left(n\right)} \\ \approx\left[\left(1-\lambda\right)+\left(1-\lambda\right)\lambda +\cdots +\left(1-\lambda\right)\lambda^{n-1}\right]V\left(S_t\right) \\ =V\left(S_t\right) Gtλ=(1−λ)Gt(1)+(1−λ)λGt(2)+⋯+(1−λ)λn−1Gt(n)≈[(1−λ)+(1−λ)λ+⋯+(1−λ)λn−1]V(St)=V(St)
利用 G t λ G_{t}^{\lambda} Gtλ来更新当前状态的值函数的方法称为 T D ( λ ) TD\left(\lambda\right) TD(λ)的方法。对于 T D ( λ ) TD\left(\lambda\right) TD(λ) 的理解一般可以从两个视角进行解读。
第一个视角是前向视角,该视角也是 T D ( λ ) TD\left(\lambda\right) TD(λ)的定义。
假设一个人坐在状态流上拿着望远镜看向前方,前方是那些将来的状态。当估计当前状态的值函数时, T D ( λ ) TD\left(\lambda\right) TD(λ)的定义中可以看到,它需要用来将来时刻的值函数。也就是说, T D ( λ ) TD\left(\lambda\right) TD(λ)前向观点通过观看将来状态的值函数来估计当前的值函数。
V ( S t ) ← V ( S t ) + α ( G t ( λ ) − V ( S t ) ) V\left(S_t\right)\gets V\left(S_t\right)+\alpha\left(G_{t}^{\left(\lambda\right)}-V\left(S_t\right)\right) V(St)←V(St)+α(Gt(λ)−V(St))
其中 G t λ = ( 1 − λ ) ∑ n = 1 ∞ λ n − 1 G t ( n ) G_{t}^{\lambda}=\left(1-\lambda\right)\sum_{n=1}^{\infty}{\lambda^{n-1}}G_{t}^{\left(n\right)} Gtλ=(1−λ)∑n=1∞λn−1Gt(n),而
G t ( n ) = R t + 1 + γ R t + 2 + ⋯ + γ n − 1 R t + n + γ n V ( S t + n ) G_{t}^{\left(n\right)}=R_{t+1}+\gamma R_{t+2}+\cdots +\gamma^{n-1}R_{t+n}+\gamma^nV\left(S_{t+n}\right) Gt(n)=Rt+1+γRt+2+⋯+γn−1Rt+n+γnV(St+n)
利用 T D ( λ ) TD\left(\lambda\right) TD(λ)的前向观点估计值函数时, G t λ G_{t}^{\lambda} Gtλ 的计算用到了将来时刻的值函数,因此需要等到整个试验结束之后。这跟蒙塔卡罗方法相似。那么有没有一种更新方法不需要等到试验结束就可以更新当前状态的值函数呢?
有,这种增量式的更新方法需要利用 T D ( λ ) TD\left(\lambda\right) TD(λ)的后向观点。
人骑坐在状态流上,手里拿着话筒,面朝已经经历过的状态流,获得当前回报并利用下一个状态的值函数得到 T D TD TD偏差后,此人会向已经经历过的状态喊话,告诉这些已经经历过的状态处的值函数需要利用当前时刻的 T D TD TD偏差进行更新。此时过往的每个状态值函数更新的大小应该跟距离当前状态的步数有关。假设当前状态为 s t s_t st, T D TD TD偏差为 δ t \delta_t δt ,那么 s t − 1 s_{t-1} st−1处的值函数更新应该乘以一个衰减因子 γ λ \gamma\lambda γλ ,状态 s t − 2 s_{t-2} st−2 处的值函数更新应该乘以 ( γ λ ) 2 \left(\gamma\lambda\right)^2 (γλ)2 ,以此类推。
我们给出 T D ( λ ) TD\left(\lambda\right) TD(λ)更新过程为:
首先计算当前状态的TD偏差: δ t = R t + 1 + γ V ( S t + 1 ) − V ( S t ) \delta_t=R_{t+1}+\gamma V\left(S_{t+1}\right)-V\left(S_t\right) δt=Rt+1+γV(St+1)−V(St)
更新适合度轨迹: E t ( s ) = { γ λ E t − 1 , i f s ≠ s t γ λ E t − 1 + 1 , i f s = s t E_t\left(s\right)=\left\{\begin{array}{l} \gamma\lambda E_{t-1},\ if\ s\ne s_t\\ \gamma\lambda E_{t-1}+1,\ if\ s=s_t\\ \end{array}\right. Et(s)={γλEt−1, if s̸=stγλEt−1+1, if s=st
对于状态空间中的每个状态 s s s, 更新值函数: V ( s ) ← V ( s ) + α δ t E t ( s ) V\left(s\right)\gets V\left(s\right)+\alpha\delta_tE_t\left(s\right) V(s)←V(s)+αδtEt(s)
S a r s a ( λ ) Sarsa\left(\lambda\right) Sarsa(λ)算法流程
输入:迭代轮数 T T T,状态集 S S S, 动作集 A A A, 步长 α α α,衰减因子 γ γ γ, 探索率 ϵ ϵ ϵ, 多步参数 λ λ λ
输出:所有的状态和动作对应的价值 Q Q Q
现在我们比较一下 T D ( λ ) TD\left(\lambda\right) TD(λ)的前向观点和后向观点的异同:
(1) 前向观点需要等到一次试验之后再更新当前状态的值函数;而后向观点不需要等到值函数结束后再更新值函数,而是每一步都在更新值函数,是增量式方法。
(2)前向观点在一次试验结束后更新值函数时,更新完当前状态的值函数后,此状态的值函数就不再改变。而后向观点,在每一步计算完当前的TD误差后,其他状态的值函数需要利用当前状态的TD误差进行更新。
(3)在一次试验结束后,前向观点和后向观点每个状态的值函数的更新总量是相等的,都是 G t λ G_{t}^{\lambda} Gtλ。
为了说明前向观点和后向观点的等价性,我们从公式上对其进行严格地证明。
首先,当 λ = 0 \lambda =0 λ=0 时,只有当前状态值更新,此时等价于之前说的 T D TD TD方法。所以 T D TD TD方法又称为 T D ( 0 ) TD(0) TD(0)方法。
其次,当 λ = 1 \lambda =1 λ=1时,状态 s s s值函数总的更新与蒙特卡罗方法相同:
δ t + γ δ t + 1 + γ 2 δ t + 2 + ⋯ + γ T − 1 − t δ T − 1 = R t + 1 + γ V ( S t + 1 ) − V ( S t ) + γ R t + 2 + γ 2 V ( S t + 2 ) − γ V ( S t + 1 ) + γ 2 R t + 3 + γ 3 V ( S t + 3 ) − γ 2 V ( S t + 2 ) ⋮ + γ T − 1 − t R T + γ T − t V ( S T ) − γ T − 1 − t V ( S T − 1 ) \begin{array}{l} \delta_t+\gamma\delta_{t+1}+\gamma^2\delta_{t+2}+\cdots +\gamma^{T-1-t}\delta_{T-1}\\ =R_{t+1}+\gamma V\left(S_{t+1}\right)-V\left(S_t\right)\\ +\gamma R_{t+2}+\gamma^2V\left(S_{t+2}\right)-\gamma V\left(S_{t+1}\right)\\ +\gamma^2R_{t+3}+\gamma^3V\left(S_{t+3}\right)-\gamma^2V\left(S_{t+2}\right)\\ \vdots\\ +\gamma^{T-1-t}R_T+\gamma^{T-t}V\left(S_T\right)-\gamma^{T-1-t}V\left(S_{T-1}\right)\\ \end{array} δt+γδt+1+γ2δt+2+⋯+γT−1−tδT−1=Rt+1+γV(St+1)−V(St)+γRt+2+γ2V(St+2)−γV(St+1)+γ2Rt+3+γ3V(St+3)−γ2V(St+2)⋮+γT−1−tRT+γT−tV(ST)−γT−1−tV(ST−1)
对于一般的 λ \lambda λ ,前向观点等于后向观点:
G t λ − V ( S t ) = − V ( S t ) + ( 1 − λ ) λ 0 ( R t + 1 + γ V ( S t + 1 ) ) + ( 1 − λ ) λ 1 ( R t + 1 + γ R t + 2 + γ 2 V ( S t + 2 ) ) + ( 1 − λ ) λ 2 ( R t + 1 + γ R t + 2 + γ 2 R t + 3 + γ 3 V ( S t + 2 ) ) + ⋯ \begin{array}{l} G_t^\lambda - V\left( {{S_t}} \right) = \\ - V\left( {{S_t}} \right) + \left( {1 - \lambda } \right){\lambda ^0}\left( {{R_{t + 1}} + \gamma V\left( {{S_{t + 1}}} \right)} \right)\\ + \left( {1 - \lambda } \right){\lambda ^1}\left( {{R_{t + 1}} + \gamma {R_{t + 2}} + {\gamma ^2}V\left( {{S_{t + 2}}} \right)} \right)\\ + \left( {1 - \lambda } \right){\lambda ^2}\left( {{R_{t + 1}} + \gamma {R_{t + 2}} + {\gamma ^2}{R_{t + 3}} + {\gamma ^3}V\left( {{S_{t + 2}}} \right)} \right) + \cdots \end{array} Gtλ−V(St)=−V(St)+(1−λ)λ0(Rt+1+γV(St+1))+(1−λ)λ1(Rt+1+γRt+2+γ2V(St+2))+(1−λ)λ2(Rt+1+γRt+2+γ2Rt+3+γ3V(St+2))+⋯
= − V ( S t ) + ( γ λ ) 0 ( R t + 1 + γ V ( S t + 1 ) − γ λ V ( S t + 1 ) ) + ( γ λ ) 1 ( R t + 2 + γ V ( S t + 2 ) − γ λ V ( S t + 2 ) ) + ( γ λ ) 2 ( R t + 3 + γ V ( S t + 3 ) − γ λ V ( S t + 3 ) ) + ⋯ \begin{array}{l} {\rm{ = }} - V\left( {{S_t}} \right) + {\left( {\gamma \lambda } \right)^0}\left( {{R_{t + 1}} + \gamma V\left( {{S_{t + 1}}} \right) - \gamma \lambda V\left( {{S_{t + 1}}} \right)} \right)\\ + {\left( {\gamma \lambda } \right)^1}\left( {{R_{t + 2}} + \gamma V\left( {{S_{t + 2}}} \right) - \gamma \lambda V\left( {{S_{t + 2}}} \right)} \right)\\ + {\left( {\gamma \lambda } \right)^2}\left( {{R_{t + 3}} + \gamma V\left( {{S_{t + 3}}} \right) - \gamma \lambda V\left( {{S_{t + 3}}} \right)} \right) + \cdots \end{array} =−V(St)+(γλ)0(Rt+1+γV(St+1)−γλV(St+1))+(γλ)1(Rt+2+γV(St+2)−γλV(St+2))+(γλ)2(Rt+3+γV(St+3)−γλV(St+3))+⋯
= ( γ λ ) 0 ( R t + 1 + γ V ( S t + 1 ) − V ( S t ) ) + ( γ λ ) 1 ( R t + 2 + γ V ( S t + 2 ) − V ( S t + 1 ) ) + ( γ λ ) 2 ( R t + 3 + γ V ( S t + 3 ) − V ( S t + 2 ) ) + ⋯ \begin{array}{l} {\rm{ = }}{\left( {\gamma \lambda } \right)^0}\left( {{R_{t + 1}} + \gamma V\left( {{S_{t + 1}}} \right) - V\left( {{S_t}} \right)} \right)\\ {\rm{ + }}{\left( {\gamma \lambda } \right)^1}\left( {{R_{t + 2}} + \gamma V\left( {{S_{t + 2}}} \right) - V\left( {{S_{t + 1}}} \right)} \right)\\ {\rm{ + }}{\left( {\gamma \lambda } \right)^2}\left( {{R_{t + 3}} + \gamma V\left( {{S_{t + 3}}} \right) - V\left( {{S_{t + 2}}} \right)} \right) + \cdots \end{array} =(γλ)0(Rt+1+γV(St+1)−V(St))+(γλ)1(Rt+2+γV(St+2)−V(St+1))+(γλ)2(Rt+3+γV(St+3)−V(St+2))+⋯
= δ t + γ λ δ t + 1 + ( γ λ ) 2 δ t + 2 + ⋯ {\rm{ = }}{\delta _t} + \gamma \lambda {\delta _{t + 1}} + {\left( {\gamma \lambda } \right)^2}{\delta _{t + 2}} + \cdots =δt+γλδt+1+(γλ)2δt+2+⋯
参考文献:
[1]https://zhuanlan.zhihu.com/p/25913410
[2]https://www.cnblogs.com/pinard/p/9614290.html
[3]https://www.cnblogs.com/pinard/p/9669263.html
[4]https://www.cnblogs.com/pinard/p/9529828.html