【上一节6 Temporal-Difference (TD) Learning 】
【下一节8 Planning and Learning with Tabular Methods 】
TD 和 蒙特卡洛方法在原理上是有一定区别的,例如利用在给定规则 π {\pi} π 下产生的样本 episodes 来估计 v π v_{\pi} vπ,蒙特卡洛方法会基于整个 episode 结束之后的 reward 来对每个状态进行更新。而 one-step TD 方法的 backup 是基于下一个reward的。有一些介于这两种方法之间的算法,会基于中间一定数量的rewards来 backup,例如,two-step backup 会基于一个状态之后两步的rewards和两步之后的估计value。对 v π v_{\pi} vπ 的n-step backups的图形化表示如下所示:
使用 n-steps backups 的方法仍然是 TD 方法,因为它们都是基于之前的估计与之后的估计的偏差来更新值,只不过这里用的是n步之后的值,因此可以将它们称为是 n-step TD 方法。
我们知道,在蒙特卡洛方法中,对 v π ( S t ) v_{\pi}(S_{t}) vπ(St) 的更新是利用完整的return,即更新方程为:
G t ≐ R t + 1 + γ R t + 2 + γ 2 R t + 3 + ⋯ + γ T − t − 1 R T G_t \doteq R_{t+1} + \gamma R_{t+2}+\gamma^2 R_{t+3}+\cdots+\gamma^{T-t-1} R_{T} Gt≐Rt+1+γRt+2+γ2Rt+3+⋯+γT−t−1RT
其中T是episode的最后一个time step,从中可以看出,蒙特卡洛方法中的 target 是 return,而在one-step方法中其 target 是第一个reward加上之后状态的估计值乘上一个衰减系数,称之为 one-step return:
G t ( 1 ) ≐ R t + 1 + γ V t ( S t + 1 ) G_t^{(1)} \doteq R_{t+1} + \gamma V_{t}(S_{t+1}) Gt(1)≐Rt+1+γVt(St+1)
其中,KaTeX parse error: Expected '}', got '\cal' at position 6: V_t:{\̲c̲a̲l̲ ̲S}\rightarrow {… 是在时间点 t 对 v π v_{\pi} vπ的估计值,即是对 γ R t + 2 + γ 2 R t + 3 + ⋯ + γ T − t − 1 R T \gamma R_{t+2}+\gamma^2 R_{t+3}+\cdots+\gamma^{T-t-1} R_{T} γRt+2+γ2Rt+3+⋯+γT−t−1RT 的代替,因此对 two-step return 即为:
G t ( 2 ) ≐ R t + 1 + γ R t + 2 + γ 2 V t + 1 ( S t + 2 ) G_t^{(2)} \doteq R_{t+1} + \gamma R_{t+2} + \gamma ^2 V_{t+1}(S_{t+2}) Gt(2)≐Rt+1+γRt+2+γ2Vt+1(St+2)
这个式子中, γ 2 V t + 1 ( S t + 2 ) \gamma ^2 V_{t+1}(S_{t+2}) γ2Vt+1(St+2) 即是对 γ 2 R t + 3 + ⋯ + γ T − t − 1 R T \gamma^2 R_{t+3} + \cdots + \gamma^{T-t-1} R_{T} γ2Rt+3+⋯+γT−t−1RT 的代替,类似的我们就可以推导出任意 n-step backup的return为:
G t ( n ) ≐ R t + 1 + γ R t + 2 + ⋯ + γ n − 1 R t + n + γ n V t + n − 1 ( S t + n ) , n ≥ 1 , 0 ≤ t < T − n G_t^{(n)} \doteq R_{t+1} + \gamma R_{t+2} +\cdots + \gamma ^{n-1} R_{t+n}+ \gamma ^n V_{t+n-1}(S_{t+n}) , n\geq 1, 0 \leq t < T-n Gt(n)≐Rt+1+γRt+2+⋯+γn−1Rt+n+γnVt+n−1(St+n),n≥1,0≤t<T−n
注意到,对 n > 1 n>1 n>1,n-step 的 returns 包含了未来的rewards和value function,在从时刻 t 到时刻 t+1 转换的时候是未知的,只有在时刻 t+n 之后才可用,因此,对 n-step 算法来说其算法应该是:
V t + n ( S t ) ≐ V t + n − 1 ( S t ) + α [ G t ( n ) – V t + n − 1 ( S t ) ] , 0 ≤ < T V_{t+n}(S_t) \doteq V_{t+n-1}(S_t) + \alpha [G_t^{(n)} – V_{t+n-1}(S_t)], 0\leq<T Vt+n(St)≐Vt+n−1(St)+α[Gt(n)–Vt+n−1(St)],0≤<T
在这个更新过程中,除了状态 S t S_t St,其他所有状态都未改变,这种更新方法就称作是 n-step TD。注意到,在每个episode的前 n-1 个step中不会有任何改变,为此,在每个 episode 结束之后会附加更新相同次数,整个过程的伪代码如下:
第 n-step return 使用 value 函数 V t + n − 1 V_{t+n-1} Vt+n−1 来对缺失的 rewards R t + n R_{t+n} Rt+n 进行更正,对n-step returns来说,最重要的特性在于它们的期望保证了对 v π v_{\pi} vπ 的估计在最坏的情况下也要比 V t + n − 1 V_{t+n-1} Vt+n−1 好,也就是说,期望的 n-step 的return的最差的error值保证了比 V t + n − 1 V_{t+n-1} Vt+n−1 的 γ n \gamma ^n γn 次方小:
m a x s ∣ E π [ G t n ∣ S t = s ] – v π ( s ) ∣ ≤ γ n m a x s ∣ V t + n − 1 ( s ) − v π ( s ) ∣ , ∀ n ≥ 1 max_s \mid E_{\pi}[G_t^{n} \mid S_t = s] – v_{\pi}(s) \mid \leq \gamma^n max_s \mid V_{t+n-1}(s) - v_{\pi}(s) \mid , \forall n \geq 1 maxs∣Eπ[Gtn∣St=s]–vπ(s)∣≤γnmaxs∣Vt+n−1(s)−vπ(s)∣,∀n≥1
上面这个式子称为是 n-step returns 的 e r r o r r e d u c t i o n p r o p e r t y error reduction property errorreductionproperty。根据这个性质可以知道,对所有的 n-step TD 方法在恰当的条件下都可以收敛到正确的预测值。
这一小部分主要介绍的是 n-step 方法是如何直接与 Sarsa 相结合从而产生 on-policy TD 控制方法的,Sarsa的 n-step 版本就称为是 n-step Sarsa( λ {\lambda} λ),前面章节中介绍的最原始的版本就称为是 one-step Sarsa 或 Sarsa(0)。
简单来说,其主要思想就是改变了state-action pairs并使用了 ϵ − \epsilon- ϵ−greedy policy。n-step Sarsa 的 backup diagrams 如图3所示,它与 n-step TD 方法很相似,都是连接线两端不断的变化states和actions,不同点在于Sarsa均是起始和终止与action而非state。
依据估计的action values,这里定义n-step returns为:
G t ( n ) ≐ R t + 1 + γ R t + 2 + ⋯ + g a m m a n − 1 R t + n + g a m m a n Q t + n − 1 ( S t + n , A t + n ) , n ≥ 1 , 0 ≤ t < T − n G^{(n)}_t \doteq R_{t+1} + \gamma R_{t+2} + \cdots + gamma^{n-1} R_{t+n}+ gamma^{n} Q_{t+n-1} (S_{t+n}, A_{t+n}), n\geq 1, 0 \leq t < T-n Gt(n)≐Rt+1+γRt+2+⋯+gamman−1Rt+n+gammanQt+n−1(St+n,At+n),n≥1,0≤t<T−n
其中,当 t + n ≥ T t+n \geq T t+n≥T时, G t n ≐ G t G_t^{n} \doteq G_t Gtn≐Gt,因此算法为:
Q t + n ( S t , A t ) ≐ Q t + n − 1 ( S t , A t ) + α [ G t ( n ) – Q t + n − 1 ( S t , A t ) ] , 0 ≤ t < T Q_{t+n}(S_t, A_t) \doteq Q_{t+n-1}(S_t, A_t) + \alpha [G_t^{(n)} – Q_{t+n-1}(S_t, A_t)], 0 \leq t < T Qt+n(St,At)≐Qt+n−1(St,At)+α[Gt(n)–Qt+n−1(St,At)],0≤t<T
而其他的states的values值保持不变, Q t + n ( s , a ) = Q t + n − 1 ( s , a ) , ∀ s , a , s ≠ S t o r a ≠ A t Q_{t+n} (s,a)= Q_{t+n-1} (s,a), \forall s,a, s\neq S_t or a\neq A_t Qt+n(s,a)=Qt+n−1(s,a),∀s,a,s̸=Stora̸=At。这个算法就称为是 n-step Sarsa。伪代码如图4所示。
下面介绍一下 Expected Sarsa,它的 n-step 版本在图3的最右边所示,它与n-step Sarsa很相似,不同点在于,最后一个元素是在概率 π \pi π下对所有action的概率加权,其算法与n-step Sarsa的定义方程相同:
G t ( n ) ≐ R t + 1 + γ R t + 2 + ⋯ + g a m m a n − 1 R t + n + g a m m a n ∑ a π ( a ∣ S t + n ) Q t + n − 1 ( S t + n , a ) , n ≥ 1 , 0 ≤ t ≤ T − n G^{(n)}_t \doteq R_{t+1} + \gamma R_{t+2} + \cdots + gamma^{n-1} R_{t+n}+ gamma^{n}\sum_a{\pi(a|S_{t+n})Q_{t+n-1}(S_{t+n},a)}, n\geq 1, 0 \leq t \leq T-n Gt(n)≐Rt+1+γRt+2+⋯+gamman−1Rt+n+gammana∑π(a∣St+n)Qt+n−1(St+n,a),n≥1,0≤t≤T−n
Off-policy learning是在依据规则 μ \mu μ 下,对 policy π \pi π 的的value函数的学习。通常情况下, π \pi π 是对当前 action-value-function 估计的贪婪policy,而 μ \mu μ 是具有更多探索性的policy(也许是 ϵ \epsilon ϵ-greedy)。为了利用 μ \mu μ 下生成的数据,就必须比较两种policies之间的不同,通常采用的方法是利用他们执行 actions 的相对概率来对比。在n-step方法中,返回值是在n个步骤之上构建的,因此我们关心的仅仅是这n个步骤的相对概率。例如,以n-step TD的 off-policy 版本为例,在时间 t 的更新(实际是在时间 t+n 发生的)可通过加权 ρ t t + n \rho_t^{t+n} ρtt+n 而简化为:
V t + n ( S t ) ≐ V t + n − 1 ( S t ) + α ρ t t + n [ G t ( n ) – V t + n − 1 ( S t ) ] , 0 ≤ t < T V_{t+n}(S_t) \doteq V_{t+n-1}(S_t) + \alpha \rho_t^{t+n} [G_t^{(n)} – V_{t+n-1}(S_t)], 0 \leq t < T Vt+n(St)≐Vt+n−1(St)+αρtt+n[Gt(n)–Vt+n−1(St)],0≤t<T
其中 ρ t t + n \rho_t^{t+n} ρtt+n 称为是 i m p o r t a n c e s a m p l i n g r a t i o importance\ sampling\ ratio importance sampling ratio,它的实际意义是在两种 policies 下,从 A t A_t At 执行n个actions 到 A t + n − 1 A_{t+n-1} At+n−1 的相对概率:
ρ t t + n ≐ ∏ k = t m i n ( t + n − 1 , T − 1 ) π ( A k ∣ S k ) μ ( A k ∣ S k ) \rho_t^{t+n} \doteq \prod_{k=t}^{min(t+n-1, T-1)} \frac{\pi(A_k | S_k)}{ \mu (A_k | S_k)} ρtt+n≐k=t∏min(t+n−1,T−1)μ(Ak∣Sk)π(Ak∣Sk)
比如说,如果一个action在规则 π \pi π 下执行的概率为0,那么n-step return应该为0;如果一个action在规则 π \pi π 下执行的概率高于在规则 μ \mu μ 下执行的概率,那么就应该增加其权重。如果两个policies是相同的,那么 importance sampling ratio 就应该永远为1。N-step Sarsa 的更新公式可以写成更通用的 off-policy 形式:
Q t + n ( S t , A t ) ≐ Q t + n − 1 ( S t , A t ) + α ρ t + 1 t + n [ G t ( n ) – Q t + n − 1 ( S t , A t ) ] , 0 ≤ t < T Q_{t+n}(S_t, A_t) \doteq Q_{t+n-1}(S_t, A_t) + \alpha \rho_{t+1}^{t+n} [G_t^{(n)} – Q_{t+n-1}(S_t, A_t)], 0 \leq t < T Qt+n(St,At)≐Qt+n−1(St,At)+αρt+1t+n[Gt(n)–Qt+n−1(St,At)],0≤t<T
从这个公式中我们注意到,该 importance sampling ratio 比 n-step TD 要晚一个step,这是因为Sarsa中更新的是 state-action pair,我们不需要关心我们选择这个action的概率是多大,既然我们已经选择了这个action,那么就应该利用importance sampling从后面一系列的actions中学习。算法的伪代码如图5所示。
Off-policy learning 中可以没有importance sampling吗?答案是可以的,这一节将要介绍的就是这样一种 n-step 方法,称为是 t r e e − b a c k u p tree-backup tree−backup algorithm,它的主要思想可以用图6 这样的 3-step tree-backup 图来展示,这种backup是对样本转换的交替混合,在每种状态下都会考虑在 π \pi π 下所有可能的actions和actions values,并且实际执行的action会做特殊处理。因为到这个状态有下一个状态的样本,所以并不需要利用该action的value值做bootstrap,直接继续下一个状态和其对应的action values即可。这个过程持续进行直到完成n-step tree backup,每个连接state和action的箭头的权值是由该action在规则 π \pi π 下的概率决定的,真正执行的 action 的权重也是由执行它的概率来决定的,但该权重并不应用于它的 action value,而是它下面的整个tree。也就是说,在它的第二层分支中,未被选中的actions的values是通过该action执行的概率值乘上未被选中的actions在 π \pi π 下被执行的概率得到的,而在第三层分支(图中最后一层)中,action values 是利用三个概率值加权得到的。
首先,定义在目标policy下期望的action vlue:
V t ≐ ∑ a π ( a ∣ S t ) Q T − 1 ( S t , A t ) V_t \doteq \sum_a{\pi(a|S_t) Q_{T-1} (S_t,A_t)} Vt≐a∑π(a∣St)QT−1(St,At)
接着,定义TD error:
δ t ≐ R t + 1 + γ V t + 1 – Q t − 1 ( S t , A t ) \delta_t \doteq R_{t+1} + \gamma V_{t+1} – Q_{t-1}(S_t,A_t) δt≐Rt+1+γVt+1–Qt−1(St,At)
接下来就可以定义tree-backup算法的n-step returns:
G t ( 1 ) ≐ R t + 1 + γ V t + 1 = Q t − 1 ( S t , A t ) + δ t \begin{aligned} G_t^{(1)} &\doteq R_{t+1} + \gamma V_{t+1} \\ &= Q_{t-1} (S_t,A_t) + \delta_t \end{aligned} Gt(1)≐Rt+1+γVt+1=Qt−1(St,At)+δt
G t ( 2 ) ≐ R t + 1 + γ V t + 1 + γ π ( A t + 1 ∣ S t + 1 ) Q t ( S t + 1 , A t + 1 ) + γ π ( A t + 1 ∣ S t + 1 ) [ R t + 2 + γ V t + 2 ] = R t + 1 + γ V t + 1 + γ π ( A t + 1 ∣ S t + 1 ) [ R t + 2 + γ V t + 2 – Q t ( S t + 1 , A t + 1 ) ] = R t + 1 + γ V t + 1 + γ π ( A t + 1 ∣ S t + 1 ) δ t + 1 = Q t − 1 ( S t , A t ) + δ t + γ π ( A t + 1 ∣ S t + 1 ) δ t + 1 \begin{aligned} G_t^{(2)} &\doteq R_{t+1} + \gamma V_{t+1} + \gamma \pi (A_{t+1}|S_{t+1}) Q_t(S_{t+1},A_{t+1}) + \gamma \pi (A_{t+1}|S_{t+1})[R_{t+2} + \gamma V_{t+2}]\\ & = R_{t+1} + \gamma V_{t+1} + \gamma \pi (A_{t+1}|S_{t+1}) [R_{t+2} + \gamma V_{t+2} – Q_t(S_{t+1},A_{t+1})] \\ & = R_{t+1} + \gamma V_{t+1} + \gamma \pi (A_{t+1}|S_{t+1}) \delta_{t+1} \\ &= Q_{t-1} (S_t,A_t) + \delta_t +\gamma \pi (A_{t+1}|S_{t+1}) \delta_{t+1} \end{aligned} Gt(2)≐Rt+1+γVt+1+γπ(At+1∣St+1)Qt(St+1,At+1)+γπ(At+1∣St+1)[Rt+2+γVt+2]=Rt+1+γVt+1+γπ(At+1∣St+1)[Rt+2+γVt+2–Qt(St+1,At+1)]=Rt+1+γVt+1+γπ(At+1∣St+1)δt+1=Qt−1(St,At)+δt+γπ(At+1∣St+1)δt+1
G t ( 3 ) ≐ Q t − 1 ( S t , A t ) + δ t + γ π ( A t + 1 ∣ S t + 1 ) δ t + 1 + γ 2 π ( A t + 1 ∣ S t + 1 ) π ( A t + 2 ∣ S t + 2 ) δ t + 2 G_t^{(3)} \doteq Q_{t-1} (S_t,A_t) + \delta_t +\gamma \pi (A_{t+1}|S_{t+1}) \delta_{t+1} + \gamma ^2 \pi (A_{t+1}|S_{t+1}) \pi (A_{t+2}|S_{t+2}) \delta_{t+2} Gt(3)≐Qt−1(St,At)+δt+γπ(At+1∣St+1)δt+1+γ2π(At+1∣St+1)π(At+2∣St+2)δt+2
G t ( n ) ≐ Q t − 1 ( 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^{(n)} \doteq Q_{t-1} (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(n)≐Qt−1(St,At)+k=t∑min(t+n−1,T−1)δki=t+1∏kγπ(Ai∣Si)
式子推导中使用了零因子的乘积是1。接下来就是常用的action-value更新公式:
Q t + n ( S t , A t ) ≐ Q t + n − 1 ( S t , A t ) + γ [ G t ( n ) – Q t + n − 1 ( S t , A t ) ] , 0 ≤ t < T Q_{t+n}(S_t,A_t) \doteq Q_{t+n-1}(S_t,A_t) + \gamma [G_t^{(n)} – Q_{t+n-1} (S_t,A_t)], 0 \leq t< T Qt+n(St,At)≐Qt+n−1(St,At)+γ[Gt(n)–Qt+n−1(St,At)],0≤t<T
过程中其他状态的values保持不变, Q t + n ( s , a ) = Q t + n − 1 , ∀ s , a , s ≠ S t o r a ≠ A t Q_{t+n}(s,a) = Q_{t+n-1}, \forall s,a, s\neq S_t \ or\ a \neq A_t Qt+n(s,a)=Qt+n−1,∀s,a,s̸=St or a̸=At。
算法的伪代码如图7所示。
参考文献
[1] Reinforcement Learning: An Introduction, Richard S. Sutton and Andrew G. Barto
[2] UCL Course on RL