强化学习 4 —— Model Free TD
在上篇文章强化学习 3 ——蒙特卡洛 (MC) 采样法的预测与控制中讨论了 Model Free 情况下的策略评估问题,主要介绍了蒙特卡洛(MC)采样法的预测与控制问题,这次介绍另外一种方法——时序差分法(TD)
一、时序差分采样法(TD)
对于MC采样法,如果没有完整的状态序列,那么就无法使用蒙特卡罗法求解了。当获取不到完整状态序列时, 可以使用时序差分法(Temporal-Difference, TD)。
1、TD 简介
对于蒙特卡洛采样法计算状态收益的方法是:
G t = R t + 1 + γ R t + 2 + γ 2 R t + 3 + ⋯ γ T − t − 1 R T G_t = R_{t+1} + \gamma R_{t+2} + \gamma^2R_{t+3}+\cdots \gamma^{T-t-1}R_T Gt=Rt+1+γRt+2+γ2Rt+3+⋯γT−t−1RT
而对于时序差分法来说,没有完整的状态序列,只有部分的状态序列,那么如何可以近似求出某个状态的收获呢?回顾贝尔曼方程:
v π ( s ) = E π [ R t + 1 + γ v π ( S t + 1 ) ∣ S t = s ] v_\pi(s) = E_\pi[R_{t+1} + \gamma v_\pi(S_{t+1}) | S_t = s] vπ(s)=Eπ[Rt+1+γvπ(St+1)∣St=s]
用 R t + 1 + γ v π ( S t + 1 ) R_{t+1} + \gamma v_\pi(S_{t+1}) Rt+1+γvπ(St+1) 近似代替 G t G_t Gt ,此时有:
v ( S t ) ← v ( S t ) + α ( R t + 1 + γ v ( S t + 1 ) − v ( S t ) ) \color{red}{v(S_t) \leftarrow v(S_t) + \alpha(R_{t+1} + \gamma v(S_{t+1})-v(S_t))} v(St)←v(St)+α(Rt+1+γv(St+1)−v(St))
一般把 R t + 1 + γ v ( S t + 1 ) R_{t+1} + \gamma v(S_{t+1}) Rt+1+γv(St+1) 叫做 TD Target
把叫做 R t + 1 + γ v ( S t + 1 ) − v ( S t ) R_{t+1} + \gamma v(S_{t+1})-v(S_t) Rt+1+γv(St+1)−v(St) TD Error
把 用 TD Target 近似的代替 Gt 的过程称为 引导(Bootstraping)
这样一来,只需要两个连续的状态与对应的奖励,就可以尝试求解强化学习问题了。
2、n步时序差分
上文用 R t + 1 + γ v π ( S t + 1 ) R_{t+1} + \gamma v_\pi(S_{t+1}) Rt+1+γvπ(St+1) 近似代替 G t G_t Gt 。即向前一步来近似收获 G t G_t Gt,那能不能向前两步呢?当然是可以的,此时 G t G_t Gt 近似为:
G t ( 2 ) = R t + 1 + γ R t + 2 + ⋯ + γ 2 V ( S t + 2 ) G_t^{(2)} = R_{t+1} + \gamma R_{t+2}+\cdots + \gamma^2V(S_{t+2}) Gt(2)=Rt+1+γRt+2+⋯+γ2V(St+2)
近似价值函数 v ( S t ) v(S_t) v(St) 为:
v ( S t ) ← v ( S t ) + α ( R t + 1 + γ R t + 2 + γ v ( S t + 2 ) − v ( S t ) ) v(S_t) \leftarrow v(S_t) + \alpha(R_{t+1} + \gamma R_{t+2} + \gamma v(S_{t+2})-v(S_t)) v(St)←v(St)+α(Rt+1+γRt+2+γv(St+2)−v(St))
从两步,到三步,再到n步,可以归纳出n步时序差分收获 G t ( n ) G_t^{(n)} Gt(n)的表达式为:
G t ( 2 ) = R t + 1 + γ R t + 2 + ⋯ + γ n − 1 R t + n + γ n V ( S t + n ) G_t^{(2)} = R_{t+1} + \gamma R_{t+2}+\cdots + \gamma^{n-1}R_{t+n} + \gamma^nV(S_{t+n}) Gt(2)=Rt+1+γRt+2+⋯+γn−1Rt+n+γnV(St+n)
往前走两步时,对应的算法叫 TD(2) ,往前走三步时,对应的算法叫 (TD3) 。当n越来越大,趋于无穷,或者说趋于使用完整的状态序列时,n步时序差分就等价于蒙特卡罗法了。特别的对于往前走一步的算法叫 TD(0)。
3、TD小结
TD 对比 MC:
TD在知道结果之前就可以学习,也可以在没有结果时学习,还可以在持续进行的环境中学习,而MC则要等到最后结果才能学习,时序差分法可以更快速灵活的更新状态的价值估计。TD在更新状态价值时使用的是TD 目标值,即基于即时奖励和下一状态的预估价值来替代当前状态在状态序列结束时可能得到的收获,是当前状态价值的有偏估计,而MC则使用实际的收获来更新状态价值,是某一策略下状态价值的无偏估计,这点 MC 优于 TD。虽然TD得到的价值是有偏估计,但是其方差却比MC得到的方差要低,且对初始值敏感,通常比MC更加高效。
二、TD 解决控制问题
TD对比MC有很多优势,比如TD有更低方差,可以学习不完整的序列。所以可以在策略控制循环中使用TD来代替MC。因此现在主流的强化学习求解方法都是基于TD的,下面就介绍两种最常用的算法,分别是 Sarsa 和 Q-Learning
1、Sarsa:
对于一个动作序列如下图所示:
在迭代的时候,基于 ϵ \epsilon ϵ -贪婪法在当前状态 S t S_t St 选择一个动作 A t A_t At, 然后会进入到下一个 状态 S t + 1 S_{t+1} St+1,同时获得奖励 R t + 1 R_{t+1} Rt+1,在新的状态 S t + 1 S_{t+1} St+1 同样基于 ϵ \epsilon ϵ-贪婪法选择一个动作 A t + 1 A_{t+1} At+1,然后用它来更新的价值函数,更新公式如下:
Q ( S t , A t ) ← Q ( S t , A t ) + α [ R t + 1 + γ Q ( S t + 1 , A t + 1 ) − Q ( S t , A t ) ] Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha \left[R_{t+1} + \gamma Q(S_{t+1}, A_{t+1}) - Q(S_t, A_t)\right] Q(St,At)←Q(St,At)+α[Rt+1+γQ(St+1,At+1)−Q(St,At)]
注意:这里选择的动作 A t + 1 A_{t+1} At+1,就是下一步要执行的动作,这点是和Q-Learning算法的最大不同这里的 TD Target: δ t = R t + 1 + γ Q ( S t + 1 , A t + 1 ) \delta_t = R_{t+1} + \gamma Q(S_{t+1}, A_{t+1}) δt=Rt+1+γQ(St+1,At+1)在每一个 非终止状态 S t S_t St 都要更新进行一次更新,需要获取5个数据, < S t , A t , R t + 1 , S t + 1 , A t + 1 > <S_t, A_t, R_{t+1}, S_{t+1}, A_{t+1}> <St,At,Rt+1,St+1,At+1> ,这也是算法名字 Sarsa 的由来
Sarsa算法流程如下
n-step Sarsa
上面的 Sarsa 算法是每向前走一步就更新,其实可以 类比 TD,可以向前走多步然后进行更新,就叫n-step Sarsa
Q ( S t , A t ) ← Q ( S t , A t ) + α ( q t ( n ) − Q ( S t , A t ) ) Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha(q_t^{(n)} - Q(S_t, A_t)) Q(St,At)←Q(St,At)+α(qt(n)−Q(St,At))
其中 q ( n ) q_{(n)} q(n) 为:
q t ( n ) = R t + 1 + γ R t + 2 + ⋯ + γ n − 1 R t + n + γ n Q ( S t + n , A t + n ) q_t^{(n)} = R_{t+1} + \gamma R_{t+2} + \cdots + \gamma^{n-1}R_{t+n} + \gamma^nQ(S_{t+n}, A_{t+n}) qt(n)=Rt+1+γRt+2+⋯+γn−1Rt+n+γnQ(St+n,At+n)
2、On-policy 和 Off-policy
比如上面的 Sarsa 算法就是一个 On-Policy 算法。从更新公式可以看出,Sarsa 算法的探索使用 ϵ − \epsilon- ϵ−贪婪法,而更新value 的动作也是带有 ϵ \epsilon ϵ 的探索。也就是说探索和更新 V ( s ) V(s) V(s) 是用的同一种策略 π \pi π ,叫做同策略学习(On-Policy Learning)。
而另外一个重要的方法就是Off-Policy Learning,也就是异策略学习。在异策略学习算法中有两个不同的策略,一个策略 π \pi π 是获取最优的 V ( s ) V(s) V(s) (比如使用贪心法),称为target policy。而另外一个 策略 μ \mu μ 是为了生成不同的轨迹,同时拥有更多的探索性(比如 ϵ − \epsilon- ϵ−贪婪法),称为behavior policy。
强化学习过程主要是探索和利用的问题。如何更好的探索环境以采集轨迹,以及如何利用采集到的轨迹经验。Off Policy 其实就是把探索和优化 一分为二,优化的时候我只追求最大化,二不用像 On Policy 那样还要考虑 epsilon 探索,所以Off Policy 的优点就是可以更大程度上保证达到全局最优解。
如上图所示,就是一个 Off policy 很好的比喻。海盗更具有冒险精神,他可以把与风浪(环境)中获得的轨迹(或者经验)保留下来,然后其的小白就可以利用这些经验来学习如何更好的在海上航行。对于 On-policy,每次更新之后,策略都会发生变化,所以之前产生的交互数据已经没有价值了,需要丢弃掉再重新产生新的交互数据。而Off Policy 在这方面就有着优势,他可以反复的利用以前过往的数据,因为他的目标策略和行为策略是分离的。而 Q-Learning 就是一个 Off-Policy 算法。
3、Q-Learning
对于Q-Learning,使用 ϵ − \epsilon- ϵ−贪婪法来选择新的动作,这部分和SARSA完全相同。但是对于价值函数的更新,Q-Learning使用的是贪婪法,而不是SARSA的 ϵ − \epsilon- ϵ−贪婪法。这一点就是SARSA和Q-Learning本质的区别。
首先基于状态 S t S_t St,用 ϵ − \epsilon- ϵ−贪婪法选择到动作 A t A_t At, 然后执行动作 A t A_t At,得到奖励 R t R_{t} Rt,并进入状态 S t + 1 S_{t+1} St+1,对于 Q-Learning,它基于状态 S t + 1 S_{t+1} St+1 没有用 ϵ − \epsilon- ϵ−贪婪法选择到动作 A ′ A' A′, 而是使用贪心策略选择 A ′ A' A′ 。也就是选择使 Q ( S t + 1 , a ) Q(S_{t+1}, a) Q(St+1,a) 最大的 a a a 来作为 A ′ A' A′ 来更新价值函数。对应到上图中就是在图下方的三个黑圆圈动作中选择一个使 Q ( S ′ , a ) Q(S', a) Q(S′,a) 最大的动作作为 A ′ A' A′ 。注意: 此时选择的动作只会参与价值函数的更新,不会真正的执行。
对于 behavior policy μ \mu μ 使用 ϵ − \epsilon- ϵ− 贪心策略对于 target policy π \pi π 使用贪心策略选取
π ( S t + 1 ) = a r g m a x a ′ Q ( S t + 1 , a ′ ) \pi(S_{t+1}) = argmax_{a'} \; Q(S_{t+1}, a') π(St+1)=argmaxa′Q(St+1,a′)
因此 Q-Learning Target :
R t + 1 + γ Q ( S t + 1 , A ′ ) = R t + 1 + γ Q ( S t + 1 , a r g m a x Q ( S t + 1 , a ′ ) ) = R t + 1 + γ m a x a ′ Q ( S t + 1 , a ′ ) R_{t+1} + \gamma Q(S_{t+1}, A') = R_{t+1} + \gamma Q(S_{t+1}, argmax \; Q(S_{t+1}, a')) \\ = R_{t+1} + \gamma \; max_{a'} Q(S_{t+1}, a') Rt+1+γQ(St+1,A′)=Rt+1+γQ(St+1,argmaxQ(St+1,a′))=Rt+1+γmaxa′Q(St+1,a′)
Q-Learning 的更新式子如下:
Q ( S t , A t ) ← Q ( S t , A t ) + α [ R t + 1 + γ m a x a ′ Q ( S t + 1 , a ′ ) − Q ( S t , A t ) ] Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha[R_{t+1} + \gamma \; max_{\red{a'}}Q(S_{t+1}, \red{a'}) - Q(S_t, A_t)] Q(St,At)←Q(St,At)+α[Rt+1+γmaxa′Q(St+1,a′)−Q(St,At)]
注意公式中标红的部分,这应该是 a a a还是 a ′ a' a′,我看有资料写的是 a a a有些资料是 a ′ a' a′,如果理解了这个公式这两者貌似都有道理:Qlearning中这个动作没有实际执行,只是对下一个状态下不同动作的Q值做了比较,从这个角度来说应该用 a a a。但是下一状态的不同动作的Q值是哪来的?是先前迭代计算出来的,虽然当前次迭代没有执行下一状态的动作,但是以前的迭代过程计算过 Q ( S t + 1 , a r g m a x Q ( S t + 1 , a ′ ) Q(S_{t+1}, argmax \; Q(S_{t+1}, a') Q(St+1,argmaxQ(St+1,a′),这么一想这里应确实应该用 a ′ a' a′。这是我的一点思考,这么说着可能不知所云,但是下面结合代码一看便知。注意该系列后面的公式可能有混用情况,再次说明。
Q-Learning 算法
4、Sarsa VS Q-learning
作为时序差分法控制算法的两个经典的算法,他们各自有特点。
Q-Learning直接学习的是最优策略,而Sarsa在学习最优策略的同时还在做探索。这导致在学习最优策略的时候,如果用Sarsa,为了保证收敛,需要制定一个策略,使 ϵ − \epsilon- ϵ−贪婪法的超参数 ϵ \epsilon ϵ 在迭代的过程中逐渐变小。Q-Learning没有这个烦恼。
另外一个就是Q-Learning直接学习最优策略,但是最优策略会依赖于训练中产生的一系列数据,所以受样本数据的影响较大,因此受到训练数据方差的影响很大,甚至会影响Q函数的收敛。Q-Learning的深度强化学习版Deep Q-Learning也有这个问题。
在学习过程中,Sarsa在收敛的过程中鼓励探索,这样学习过程会比较平滑,不至于过于激进,而 Q-Learning 是直接选择最优的动作,相比于 Sarsa 算法更激进。
比如在 Cliff Walk 问题中,如下所示,Sarsa 算法会走蓝色的安全线,而激进的 Q-Learning 算法则会选择红色的最优路线。(其中灰色部分是悬崖)
关于 Sarsa 和 Q-Learning 算法的代码详解可以看下一篇文章强化学习——Sarsa 和 Q-Learning 算法实战
三、DP、MC、TD的对比
1 有无 Bootstrapping 和 Sampling
2、DP 和 TD
3 对于三种算法的直观理解
DP MCTD
3 三种算法之间的关系
上图是强化学习方法空间的一个横切面,突出两个重要维度:更新的深度和宽度
这两个维度是与改善价值函数的更新操作的类型联系在一起的。水平方向代表的是:使用采样更新(基于一个采样序列)还是期望更新(基于可能序列的分布)。期望更新需要一个概率分布模型,采样更新只需要一个采样模型即可。
垂直方向对应的是更新的深度,也是“自举(bootstrap)”的程度。从单步时序差分更新到蒙特卡洛更新。中间部分包括了基于 n 步更新的方法(例如基于资格迹的 λ \lambda λ 更新)
可以看到,动态规划在图示空间的右上方,因为动态规划属于单步期望更新。右下角是期望更新的一个极端情况,每次更新都会遍历虽有可能情况直到到达最后的终止状态(或者在持续任务中,折扣因子的类乘导致之后的收益对当前回报不再有影响为止)。这是启发式搜索中的一中情况。
—— 《强化学习》第二版 Sutton
至此,传统的强化学习基本理论就介绍完了,下一篇是SARSA 和Q-Learning算法的代码介绍。当然本系列博客比较基础,若想更深入了解可以读 Sutton 大牛的《强化学习》这本手,英文电子版云盘地址 提取码: hn77。
最近这几年,随着神经网络的兴起,基于神经网络的强化学习发展的如火如荼,出现了许多新的有意思的算法,当然也更加的强大。所以接下来的文章都是介绍 神经网络 + 强化学习,也就是深度强化学习(DRL)。我这枚菜鸟也会尽自己最大所能,给大家讲解清楚,还请大家不要走开,多多关注!