[归纳]强化学习导论 - 第四章:动态规划

1.本章内容概要

动态规划(Dynamic Programming, DP)是在完全已知任务MDP形式的模型时,一类用来计算最优策略的方法。因为完全已知模型的假设和过大的计算开销,经典的DP方法在强化学习任务中的直接使用比较受限,但在理论上还是有重要的意义。DP为本书后续介绍的各种方法提供了必要的基础,实际上,所有这些方法不过是希望在降低计算开销及不依赖环境模型的前提下达到和DP同样的效果罢了。

我们通常假设环境是finite MDP(上一章介绍了finite MDP的含义)的。虽然DP思想也能应用到连续states/actions空间的问题,却只有一些特殊情况能得到精确解。一个常用的处理办法是把连续问题离散化,也就是把states和actions分段化(quantize)。第九章我们会专门讨论连续states/actions问题。

DP的核心思想,乃至RL的基础思想,都是基于value函数(上一章已详细介绍)的策略搜索和改进。在这章中,我们将展示DP方法是如何用来计算value函数的。只要我们得到了满足Bellman最优方程的最优值函数,我们实际上就得到了最优策略。DP方法则通过prediction/improvement的update操作不断逼近最优value函数。

2.策略评估(预测)

首先考虑如何计算任意给定策略的state-value函数 v π v_\pi ,在DP中,这叫做policy evaluation,或者prediction problem。上一章我们给出了state-value的Bellman方程:

v π ( s ) E π [ G t S t = s ] = E π [ R t + 1 + γ G t + 1 S t = s ] = a π ( a s ) s , r p ( s , r s , a ) [ r + γ E π [ G t + 1 S t + 1 = s ] ] = a π ( a s ) s , r p ( s , r s , a ) [ r + γ v π ( s ) ] \begin{aligned} v_\pi(s) & \doteq \mathbb{E}_\pi[G_t | S_t =s] = \mathbb{E}_\pi[R_{t+1} + \gamma G_{t+1} | S_t =s] \\ &= \sum_a \pi(a|s) \sum_{s',r} p(s',r | s,a) \left[ r + \gamma \mathbb{E}_\pi [G_{t+1} | |S_{t+1} = s'] \right] \\ &= \sum_a \pi(a|s) \sum_{s',r} p(s',r | s,a) \left[ r + \gamma v_\pi (s') \right] \end{aligned}

如果环境的dynamics是完全已知的,则上式实际上是 S |S| S |S| 元方程组,可以直接求解。但是当 S |S| 很大时直接求解这个方程组是不现实的,因此我们可以用迭代的方法逼近真实值,迭代公式为:

v k + 1 ( s ) E π [ R t + 1 + γ v k ( S t + 1 ) S t = s ] = a π ( a s ) s , r p ( s , r s , a ) [ r + γ v k ( s ) ] \begin{aligned} v_{k+1}(s) & \doteq \mathbb{E}_\pi[R_{t+1} + \gamma v_k (S_{t+1}) | S_t =s] \\ &= \sum_a \pi(a|s) \sum_{s',r} p(s',r | s,a) \left[ r + \gamma v_k (s') \right] \end{aligned}

角标k表示第k次迭代,可见该迭代公式是用第k次迭代的值计算第k+1次迭代的值。我们可以将 v 0 v_0 初始化为任何值,但是注意如果有terminal state的话,其值必须是0。由Bellman方程一致性条件,只有当 v v 收敛到 v π v_\pi 时,方程左右两边才相等,可以证明(压缩定理, [2])以上迭代操作当 k k\to \infty 一定能收敛到 v π v_\pi 。这个算法叫做迭代策略评估(iterative policy evaluation)。

为了产生下一步的值估计 v k + 1 v_{k+1} ,迭代策略评估需要对状态集 S S 中的每个状态都按照上式更新,替代旧的状态值。注意迭代公式中需要利用给定策略下所有one-step transitions的立即回报reward和旧的后续状态值 v k ( s ) v_k(s') ,并对其折扣和求期望。注意这里在 a , s , r a, s', r 三个概率上求了期望。这种操作叫做expected update。根据是求状态值还是求状态-动作值,及后续状态值的利用方式,expected update可以分为多种类型。DP的所有updates都是expected update。

编程实现上述过程可以有两种方式。第一种情况就是,我们使用两个数组,一个表示 v k + 1 ( s ) v_{k+1}(s) ,相应另一个是 v k ( s ) v_k(s) 。这种情况下,更新了某个状态值并不会影响到这次迭代其它状态值的更新。因为在一轮更新中 v k ( s ) v_k(s) 保持不变。这种更新方式和更新顺序没有关系;另一种方式是使用一个数组,替代(in-place)地更新,计算出新的值后立刻替代掉该状态旧的值,这样一轮迭代中一些状态值的更新可能会受到其它状态值更新的影响,in-place也能保证收敛到 v π v_\pi ,且更快,因此我们通常采用in-place方法。每轮迭代我们都更新状态空间每个状态的值,这叫做一个sweep,in-place的sweep顺序对收敛的速率有很大影响。

固定策略时in-place iterative policy evaluation算法如下(注意算法终止条件)。

3.策略提升

计算值函数的目的就是为了得到更好的策略,我们首先设定一个随机策略,通过上一小节介绍iterative policy evaluation可以得到其值函数,那么我们希望在其基础上能得到一个更好的策略。在值函数的基础上,我们可以得到动作值函数:

q π ( s , a ) = E [ R t + 1 + γ v π ( S t + 1 ) S t = s , A t = a ] = s , r p ( s , r s , a ) [ r + γ v π ( s ) ] \begin{aligned}q_\pi(s,a)&=\mathbb{E}[R_{t+1}+\gamma v_\pi(S_{t+1}) |S_t = s , A_t =a] \\&=\sum\limits_{s', r}p(s',r|s,a)\left[ r+\gamma v_\pi(s')\right]\end{aligned}

直觉上,如果我们选择某个动作 a a 使得满足 q π ( s , a ) v π ( s ) q_\pi(s, a) \geq v_\pi(s) ,我们记在 s s 下选择动作 a a ,而其余不变的这个策略为 π \pi' ,那么这个确定性策略就一定比 π \pi 要好。因此我们可以得到策略提升定理(policy improvement theorem):

Theorem: 如果对确定性策略 π \pi π \pi' ,对于所有 s S s\in S 都满足: q π ( s , π ( s ) ) v π ( s ) q_\pi(s, \pi'(s)) \geq v_\pi(s) 那么必然有 v π ( s ) v π ( s ) v_{\pi'}(s) \geq v_\pi(s) ,且只要至少有一个状态不等号成立,则 π \pi' 也严格好于 π \pi
proof

那么,根据策略提升定理,我们如何提高策略呢?为了尽可能提升策略,我们可以对所有状态下的策略都按照greedy原则重构,这样就符合策略提升定理了,我们可以得到一个至少不比旧策略差的新策略:
π ( s ) arg max a q π ( s , a ) = arg max a E [ R t + 1 + γ v π ( S t + 1 ) S t = s , A t = a ] = arg max a s , r p ( s , r s , a ) [ r + γ v π ( s ) ] \begin{aligned} \pi'(s) & \doteq \arg \max_a q_\pi(s,a) \\ &= \arg \max_a \mathbb{E} [R_{t+1} + \gamma v_\pi(S_{t+1})| S_t =s, A_t =a] \\ &= \arg \max_a \sum_{s', r} p(s',r |s,a) [r + \gamma v_\pi(s')] \end{aligned}
这个过程叫做策略提升(policy improvement)。

实际上,当策略无法提升时,有 v π = v π v_\pi=v_{\pi'} ,因此有:
v π ( s ) = max a E [ R t + 1 + γ v π ( S t + 1 ) S t = s , A t = a ] = max a s , r p ( s , r s , a ) [ r + γ v π ( s ) ] \begin{aligned} v_{\pi'}(s) &= \max_a \mathbb{E} [R_{t+1} + \gamma v_{\pi'}(S_{t+1})| S_t =s, A_t =a] \\ &= \max_a \sum_{s', r} p(s',r |s,a) [r + \gamma v_{\pi'}(s')] \end{aligned}
我们注意到,这实际上就是Bellman最优方程。因此,只要策略还不是最优,就一定能继续提升。

策略提升定理是针对确定性策略提出的,但是其实可以很容易扩展到随机策略情形。例如,如果在状态s下,多个动作都能取得最大的 q ( s , a ) q(s, a) ,那么我们就把概率1平分(或者任意分配)到这多个动作上去。下面举例说明随机情形的策略提升过程:

example 4.1 4*4 Gridworld

图中灰色的格子是terminal state,每次可以选择上下左右移动一格四种动作,每次移动都得到-1的奖励,移出墙壁的话则回到移动前的位置,且也得到-1的奖励。首先,我们选择初始化策略为随机动作,也就是等概率选择四个方向,按照policy evaluation方法迭代计算 v π v_\pi ,下图左侧为第k次迭代得到的 v π v_\pi ,然后我们根据 v π v_\pi 选择贪婪的动作,用箭头表示,可以看到有时一次策略提升就直接得到了全局最优策略。其实这只是这个问题比较巧合,大部分情况策略提升定理只能保证策略改善一些。

4.策略迭代

现在设想,我们初始化一个随机策略 π \pi ,通过policy evaluation得到了该策略的值函数 v π v_\pi ,然后基于 v π v_\pi 进行policy improvement,得到策略 π \pi' ,而此时我们之前通过policy evaluation得到值函数已经不准确了(策略变化了),因此我们重新进行policy evaluation得到 v π v_\pi' 。这个过程可以反复迭代进行下去:

π 0 E v π 0 I π 1 E v π 1 I π 2 E v π 2 I π 3 E v π I π \pi_0 \xrightarrow{E} v_{\pi_0} \xrightarrow{I} {\pi_1} \xrightarrow{E} v_{\pi_1} \xrightarrow{I} {\pi_2} \xrightarrow{E} v_{\pi_2} \xrightarrow{I} {\pi_3} \dots \xrightarrow{E} v_{\pi_*} \xrightarrow{I} {\pi_*}

因为finite MDP只有有限数量的策略,因此上述过程一定能在有限步骤收敛到最优策略与最优值函数。这种寻找最优策略方式叫做值迭代(policy iteration)。下图给出了算法,应该注意,每一轮的值估计都是在上一轮值估计基础上的,由于每次策略提升改动量是比较有限的,因此这样的值估计可以大大提高效率。

example 4.2 Jack’s Car Rental
假设一个老板在一个城市里有两个租车公司A和B。每天都会有一些顾客分别到不同的公司租车。如果顾客去了当中的一个公司,并且公司有车,那么出租成功,老板获得10美元的收入。相反,如果顾客去的公司没车,就失去了这笔交易。租出去的车再归还之后,又可以重新出租。老板面临的问题是如何规划两个公司的车辆数从而使收益最大。其中,在两个公司地点之间调度一辆车的花费是2美元。假设每个公司车辆的需求数和归还的数量都服从泊松分布,也就是说需求量为 n n 的概率是 λ n n ! e λ \frac{\lambda^n}{n!}e^{-\lambda} ,平均需求量是 λ \lambda 。假设公司A和B车辆的平均需求量分别是3和4,相应的平均每天归还的车辆数是3和2。为了简化问题,假设每个地方的车辆数不多于20辆,并且每天调度的车辆数不多于5辆,折扣系数 γ \gamma = 0.9 。求:在不同的情况下,应该如何调度车辆使得收益最大化[3]?

这个问题的状态由两个分量构成,第一个公司当晚车数和第二个公司当晚的车数,动作空间则有十一个元素:从第一个公司向第二个公司移动-5~5辆车。初始化时,我们让任何状态下移动的车数都是0,然后利用值迭代不断优化策略,可以得到上图所示的效果。最后一个图则给出了最优值函数。

5.值迭代

policy iteration的每次大迭代都需要policy evaluation,而policy evaluation本身就需要多轮sweep直到收敛,因此会消耗较多时间。前面小节介绍的Gridworld例子提示我们,不一定要收敛到精确的值函数才能策略提升,例子中迭代了三个sweep就得到最优策略了,极端一点,我们可以执行一次sweep后就进行策略提升,这叫truncated policy evaluation,我们把policy evaluation和policy improvement写在一起,有:

v k + 1 ( s ) max a E [ R t + 1 + γ v k ( S t + 1 ) S t = s , A t = a ] = max a s , r p ( s , r s , a ) [ r + γ v k ( s ) ] \begin{aligned}v_{k+1}(s) &\doteq \max_a \mathbb{E}[R_{t+1} + \gamma v_k (S_{t+1})| S_t =s, A_t =a] \\ &= \max_a \sum_{s',r} p(s',r|s,a)[r + \gamma v_k(s')]\end{aligned}

max操作就是策略提升,这个式子本身就是一次策略评估。因此这个式子实际上是先在上次策略评估的基础上进行了一次策略提升,然后再评估新的策略。这叫做值迭代value iteration。和之前的算法一样,只要保证 v v^* 存在,就一定能收敛到 v v^* 。注意这与Bellman最优方程的形式是一样的,相当于依照Bellman最优方程写成了更新形式。算法如下(注意终止条件):

值迭代的每次sweep相当于一个sweep的策略评估和一个sweep的策略提升,这一般能使收敛速度比策略迭代更快。

example 4.3 Gambler’s Problem
一个人赌一个硬币的正反面,硬币有 p h = 0.4 p_h=0.4 的概率是heads,这时他获得和他下注等额的奖励,如果是tails则失去他下的注。当这个人的金额达到$100时,就胜利了,如果失去了所有的钱,就失败了。因此,赌徒的状态空间为 s { 1 , 2 , . . . , 99 } s\in\{1,2,...,99\} ,可选动作为 a { 0 , 1 , . . . , m i n ( s , 100 s ) } a\in\{0,1,...,min(s, 100-s)\} 。如果胜利,reward是1,否则是0。当 γ < 1.0 \gamma<1.0 时,将得到如下结果:

该example后的第一个exercise要求解释为什么会出现这么奇怪的策略?这个问题之前一直没有弄明白,后来在ArikVoronov大哥的解释下可算明白了,如有兴趣请阅读[4]中ArikVoronov的回答。

6.异步动态规划

我们目前所讨论的DP算法都需要在每轮迭代中sweep整个状态空间,如果状态空间很大的话,那么这往往是不切实际的(棋类)。而异步DP(ADP)则能解决这个问题,它也是一种in-place的迭代DP算法,但是不在整个状态空间上sweep。ADP允许按照任意顺序更新,各个状态被visited的顺序和次数都是根据需要确定的。为了保证能正确收敛,当时间趋于无穷时,ADP也要保证能无数次访问所有状态。

对于折扣因子 γ < 1 \gamma<1 的情况,只要保证当时间趋于无穷时,所有状态能被无数次访问就一定能收敛。但是当没有折扣的时候,是否收敛可能跟更新的顺序有关,但是这比较容易避免。一个ADP的例子是按照on-policy更新,也就是只更新一个episode实际遇到的那些状态,这在后面章节会详细介绍。

这种灵活的更新次序就避免了严格遍历每一个状态导致的问题。但是这并不意味着我们的计算量减小了(因为要收敛,理论上所有状态都要遍历无限次)。只是我们可以选择那些有可能尽快改善策略的状态,而不是卡在某些毫无意义的状态上[3]。我们还可以合理选择更新的顺序,以便值函数信息可以在状态之间有效传播。有些与最优策略无关的状态我们甚至可以跳过去,这在第八章中会深入讨论。

7.广义策略迭代

策略迭代包含两个交互的部分:策略评估和策略提升,这两者是交替进行的,一个步骤的结束是另一个步骤的开始;值迭代这把这两个部分混合在了一起,只进行一次策略评估就开始提升;在ADP中,评估与提升的过程甚至更加灵活。但是总之,在这些方法中策略评估与策略提升都是交替进行的。我们可以用广义策略迭代(generalized policy iteration, GPI)来描述:

GPI只要保证策略评估与策略提升交替进行即可,不要求各自操作的粒度与两个过程的细节。几乎所有的RL方法都可以用GPI很好地描述。它们都有策略和值函数。策略基于值函数得到改进。同时,值函数总是期望收敛到当前策略的值。如果两个过程都稳定了,那么一定是得到了最优的策略(值函数只有在与当前策略一致时才稳定,策略只有在对当前值函数贪婪时才稳定,因此整个过程只有在策略对自己的值函数贪婪时才稳定,这就满足了Bellman最优方程)。

策略评估与策略提升相互竞争又相互合作。竞争表现在如果是当前策略相对于值函数贪婪了,那么这个值函数就不是变化后策略的值函数了。如果求得了当前策略的值函数,那么这个策略就不是贪婪的了。合作表现在他们彼此交互,促使值函数的解和策略的解都向最优解靠近[3]。

也可以认为评估与提升的交互是两个约束(目标),这可以用下图所示。只要这两个约束不是正交的,那么就能迭代地靠近最优目标,也就是估计和提升过程就是以最快的方向靠近这两条线。在GPI中,我们可以采用小的、不完全的向两条线靠进的步子,这样也能达到全局最优。

8.动态规划的有效性

DP算法对于状态空间很大的问题可能有些不切实际,但是与其他求解MDPs的方法相比,DP方法实际上是十分有效的。一般情况下,DP方法找到最优策略消耗的时间是状态和动作数的多项式复杂度,而直接策略搜索则复杂度达到 动作数^{状态数} 。线性规划方法(linear programming, LP)也可以用于求解MDPs,且有时在最差情形下比DP方法要好,但是LP方法适合解决的问题比DP方法要规模要小(100倍)。对于较大的问题,只有DP是可行的。

DP方法有时也会因为维度爆炸而难以有效工作,但是这是这些问题本身的复杂属性,不是DP方法导致的。与其他方法对比,DP方法在处理复杂问题时候的效果是较好的。

实践中,DP方法可以借助计算机解决百万状态规模的问题,其中策略迭代和值迭代都应用很广泛,但是哪个更好现在还不好说。实践中,DP方法比理论最差情况往往要收敛地快得多,尤其是在设置较好值函数/策略初值的情况下。

对于大状态空间问题,ADP方法是更好的,因为同步的DP有时候因为问题太复杂而不能在合理时间内计算出结果,但是由于只有其中的部分状态是经常出现或者与最优轨迹有关的,因此ADP有时是可行的。

9.总结

本章主要介绍了DP的基本思想和所涉及的基本概念。

  • policy evaluation, policy improvement \rightarrow policy iteration & value iteration.
  • operate in sweeps,performing an expected update.
  • v , v , q , q v, v^*, q, q^* \rightarrow 4 Bellman equations and their expected updates.
  • GPI. 一些情况下,GPI可以证明收敛性,大多是针对本章提到的经典DP方法的.
  • asynchronous DP.
  • DP的一个特点:所有的更新都依赖于其后继状态的估计值,我们称之为自举(bootstrapping)。这是RL最重要的思想之一(另一个比较重要的是Monte Carlo Sampling).
  • DP必须要有环境模型: p ( s , r s , a ) p(s', r|s, a) .

参考文献

[1].(旧版本RL导论翻译,这个还不错)https://download.csdn.net/download/u013695457/11064693
[2].(迭代算法收敛性证明)https://zhuanlan.zhihu.com/p/39279611
[3].(知乎专栏)https://zhuanlan.zhihu.com/c_1060499676423471104
[4].(Gambler’s Problem问题的解释)https://github.com/dennybritz/reinforcement-learning/issues/172

发布了27 篇原创文章 · 获赞 61 · 访问量 9106

猜你喜欢

转载自blog.csdn.net/u013695457/article/details/88795340