4.动态规划--阅读笔记【Reinforcement Learning An Introduction 2nd】

文章目录

  • 动态规划
    • 前言
    • 策略评估/预测
    • 策略提升
    • 策略迭代
    • 值迭代
    • 异步动态规划
    • 广义策略迭代
    • 动态规划算法的效率问题
    • 总结

内容梳理:

本文主要讲解动态规划方法,首先讲解了策略评估用以计算值函数,然后提到了策略提升的方法,接着又提出了策略迭代的方法,针对策略迭代每次都要进行策略评估,且每次策略评估都要对状态集合中的所有状态进行更新,由此导致的训练时间成本大,故此提出了值迭代的方法。为了加快DP解决问题的速度,提出了ADP,最后提出了广义策略迭代的方法,并就DP算法的效率问题展开叙述。

动态规划

前言

DP这个术语可以用来指给定完整环境模型的MDP情况下计算最优策略的算法集合。传统的DP方法在rl应用中十分有限,因为其不仅要求有理性的模型,同时计算量也很大,但是了解其理论有助于我们后续的学习。事实上,后续的一些方法都可以看作是取得了与DP方法一样效果的尝试,只是计算量小,并且无需假设理想的环境模型。

通常情况下,我们假设环境是finite MDPs,也就是说我们假设状态、动作以及奖励集合都是有限的,其dynamic model由概率 p ( s ′ , r ∣ s , a ) p(s^{'},r|s,a) p(s,rs,a)表示。尽管DP理论上可以被应用到连续状态、动作空间中,但是仅有在部分特殊情况下才可得到解决方案。想要获得连续状态、动作空间的近似解,通常的方法是量化状态和动作空间,然后应用有限状态的DP方法。DP和RL思想的核心通常来说就是利用价值函数来组织构建搜索方式从而找到好的策略。本章将介绍DP如何被用来计算上一章定义的价值函数。贝尔曼最优方程如下:

4.动态规划--阅读笔记【Reinforcement Learning An Introduction 2nd】_第1张图片

DP实际上是将贝尔曼方程转换为更新规则以此来提升价值函数的近似效果。

策略评估/预测

首先我们考虑如何计算状态价值函数 v π v_{\pi} vπ,在DP中也被称作策略评估policy evaluation,也可以把它当作是一个预测问题。之前我们所定义的状态价值函数如下:

4.动态规划--阅读笔记【Reinforcement Learning An Introduction 2nd】_第2张图片

s∈S, π ( a ∣ s ) \pi(a|s) π(as)表示的是在策略 π \pi π的引导下,在状态s下采取动作a的概率。 v π v_{\pi} vπ存在且唯一的条件是γ<1或者所有的state在policy下都可达到最终状态。如果环境的动力学模型是完全已知的,那么image该式就是一个带有|S|个未知数和|S|个线性方程的系统。对线性系统而言通过简单暴力的解法可以求解,但是如果状态空间很大,那么我们可以通过迭代的方式来进行近似计算,迭代式为:

image

就是把v中的下标 π \pi π换做k和k+1,以此来表示一个迭代更新的过程,由此我们可以得到一个更新序列 v 0 , v 1 , v 2 v_{0},v_{1},v_{2} v0,v1,v2 v 0 v_{0} v0可以被初始化为任意值。如果有终止状态的话,其值必须设置为0,根据贝尔曼方程的一致性可得,当v收敛到 v π v_{\pi} vπ时,等式成立,这个算法叫做迭代策略评估iterative policy evaluation

为了产生下一步的 v k + 1 v_{k+1} vk+1值估计,迭代策略需要对状态集S中的每个状态都进行上述的更新方式,使用下一状态的旧的状态价值估计值并对其取打折扣再加上转移到下一状态所得到的即时奖励即可得到本状态的一个更新值,我们把这种方式叫做期望更新excepted update,(完全回溯),根据求状态值还是状态-动作值以及后续状态的精确方式可以把excepted update分为很多种方式,DP中所有的更新都被称作式excepted update,因为它是基于对所有可能的下一状态的期望而不是通过采样得到下一状态进行更新的。

为了实现上述过程,我们有两种方式,一种是使用两个数组,一个是 v k + 1 ( s ) v_{k+1}(s) vk+1(s),一个是 v k ( s ) v_{k}(s) vk(s),这种情况下,更新某个状态的值并不影响后续状态值的更新,因为一轮更新中 v k ( s ) v_{k}(s) vk(s)是保持不变的,这种更新方式与更新顺序无关。另一种方式是只使用一个数组进行更新 in-place更新,计算出新的状态的值会立即替代状态的旧值,这样在一轮迭代更新中一些状态值的更新可能就会受到其他状态值更新的影响。这种更新方式收敛更快,响应快,但是这种方式的更新速度受更新顺序的影响。每轮迭代都更新状态空间中每个状态的值,这叫做一个sweep,in-place update的速率受sweep顺序的影响。一般的讨论DP算法都是采用in-place的更新方式。

迭代策略更新的伪代码如下,注意终止条件:

4.动态规划--阅读笔记【Reinforcement Learning An Introduction 2nd】_第3张图片

首先初始化值函数,然后对于状态空间中的每个状态按照上述的状态值函数更新方式进行更新,当所有状态更新前后的值函数变化小于给定的阈值θ时则结束。

初始化中,终止状态对应的值为0.

策略提升

提升值函数的目的是为了找到一个更好的策略。通过上一节的策略迭代方法我们可以得到一个状态值函数,在此基础上可以得到一个动作值函数:

image

如果我们选择某个动作a可以满足 q π ( s , a ) q_\pi(s,a) qπ(s,a)大于等于 v π ( s ) v_\pi(s) vπ(s),也就是说在s下选择动作a的这个策略要比在s下根据策略 π \pi π选择动作的策略更好。

现在假设我们初始和改进的策略都是确定性策略,那么对于策略改进我们可以描述为这样一个问题:对于某些状态s来说,我们应该按照原有的策略 π \pi π选择动作 a = π ( s ) a=\pi(s) a=π(s),还是说可以选择一个新的策略 π ′ \pi' π?如果说新的策略更好那么该如何设计这一策略,也就是说如何保证 π ′ > π \pi'>\pi π>π

策略提升定理:假设 π \pi π π ′ \pi' π是一对确定性策略,满足所有的s∈S,

image

那么这个新策略就不比原来的策略差,即对所有的s∈S满足:

image

策略提升定理的具体推导证明过程如下:

4.动态规划--阅读笔记【Reinforcement Learning An Introduction 2nd】_第4张图片

那么我们如何根据策略提升定理选择一个新的策略,也就是新策略下选择的动作 a ′ a' a对应的动作值函数要大于等于状态值函数。我们知道状态值函数与动作值函数之间的关系:image,状态值函数是不同动作下对应的动作值函数的期望,对于确定性策略来说,因为只有一个动作,所以二者是相等的。因此只要选择让 q ( s , a ) q(s,a) q(s,a)取值最大即可,所以新的策略就可以定义为:

4.动态规划--阅读笔记【Reinforcement Learning An Introduction 2nd】_第5张图片

那么我们怎么能保证这个新的策略就比之前的策略好呢?有什么理由这样说呢?现在我们假设这个新的策略和旧的策略是一样好的,即可得:
image

这实际上就是贝尔曼最优方程,也就是说 v π ′ = v ∗ v_\pi'=v_* vπ=v,这样一来就说明新旧策略都等于最优策略(贝尔曼最优等式具有唯一解)也就是说策略提升算法会不断改进算法到其收敛至最优策略。

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

4.动态规划--阅读笔记【Reinforcement Learning An Introduction 2nd】_第6张图片

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

4.动态规划--阅读笔记【Reinforcement Learning An Introduction 2nd】_第7张图片

策略迭代

假如我们有一个策略 π {\pi} π,通过使用 v π v_{\pi} vπ进行迭代策略评估和策略提升,得到一个更好的策略 π ′ {\pi'} π,然后使用 v π ′ v_{\pi'} vπ再次进行策略提升,得到一个更好的策略 π ′ ′ {\pi^{''}} π。我们可以获得整个策略提升的序列过程如下:

image

其中E表示的是进行策略评估,I表示的是进行策略提升。

策略迭代算法的伪代码如下:

4.动态规划--阅读笔记【Reinforcement Learning An Introduction 2nd】_第8张图片

首先初始化,然后进行策略评估,得到当前策略对应的状态价值函数,根据值函数改善策略,如果新的策略和旧的策略不同,那么继续执行步骤2,否则结束。(在进行新策略的policy evaluation的过程中初始化v是使用上一个旧策略的值函数,这样可以加速收敛。)

注:上述策略迭代伪代码存在一个bug,当有两个及以上的同样好的策略时,算法就会陷入一个死循环当中,因此还需要添加一个条件避免这种情况的发生,在步骤3中的第一个if后添加判断 q ( s , o l d − a c t i o n ) < q ( s , π ( s ) ) q(s,old-action)q(s,oldaction)<q(s,π(s))即可,保证两个条件同时成立才会把policy-stable赋值为false。

例子:出租车辆问题

4.动态规划--阅读笔记【Reinforcement Learning An Introduction 2nd】_第9张图片

分析一下这个问题,可以构造为一个马尔科夫决策过程(MDP)问题。状态是两个公司一天结束时的车辆数,决策的行为是两个公司之间调度的车辆数。回报值可以设置为收益值。

4.动态规划--阅读笔记【Reinforcement Learning An Introduction 2nd】_第10张图片

具体来说就是转移的车辆数(范围是-5到5,默认从A-first转移到B-second为正,如果转移车辆是一个负数,则表示从B转移到A).再看看策略迭代过程。首次迭代时,策略被初始为0,也就是什么都不做。第一次评估后,策略有了改善,如第一行中间图所示,此时左上角颜色深。说明在左上角区域内应该转移较多的车辆到B地。此时状态是A地车很多,B却很少,为了增加收益,转移一些车辆到B是很合理的。这说明更新后的策略比初始策略有了改善。最后得到的最优策略如policy 4所示。

值迭代

policy iteration每次迭代都需要进行策略评估,而每次策略评估都需要经过多轮sweep才可收敛,这样一来时间成本很大。而之前的gridworld例子就告诉我们,实际上并不需要值函数精确的收敛后才可进行策略提升:实际上从k=3开始所得到的策略就是最优的了。

4.动态规划--阅读笔记【Reinforcement Learning An Introduction 2nd】_第11张图片

因此我们可以不用等到值函数收敛之后再进行策略提升,可以每次进行一次策略评估之后进行一次策略提升,该算法叫做值迭代

image

这个公式实际上就是贝尔曼最优方程的迭代形式,这个迭代一定可以收敛到最优值函数 v ∗ v_{*} v

这个式子结合策略评估和策略提升的两个过程,上式与之前的策略评估的区别在于多了在动作a上的最大化操作,这个max操作实际上可以看作是一次策略提升。这类方法也叫做截断策略迭代方法truncated policy iteration。

值迭代方法的伪代码如下:

4.动态规划--阅读笔记【Reinforcement Learning An Introduction 2nd】_第12张图片

异步动态规划

之前我们所讨论的DP算法都需要在每轮迭代中sweep一次整个状态空间,如果整个状态空间很大的话,往往不切实际,因此需要ADP,也是一种in-place的迭代DP算法。ADP算法中我们可以按照任意次序来更新状态的值,也可以按照任意频率来更新某些状态,比如有些状态更新了若干次但是其他状态却只更新了一次。这种灵活的更新次序可以避免严格遍历每一个状态导致的时间成本大的问题。但是这并不意味着计算量减小,因为要收敛,理论上所有状态都要遍历无数次。只是我们可以优先选择那些有可能尽快改善策略的状态,而不至于卡在某些无意义的状态上。对于某些和最优行为关联不大的状态甚至可以直接忽略。除此之外,可以自行设计更新的次序,从而使得值信息能够更有效的传播。这种灵活的更新方式,使得我们在实时交互中更新计算,让智能体在环境中探索,然后利用DP更新探索到的状态的值,同时利用DP更新后的策略指导agent在environment中决策。

广义策略迭代

策略迭代包含两个步骤:策略评估和策略提升。策略评估的目的是使得值函数和当前的策略保持一致,策略提升是使得当前策略相对于当前值函数的一个贪婪策略。在策略迭代过程中上述两个过程轮流进行。一个过程结束另一个过程开始。但是是否必须严格的遵循这样的过程呢?通过上一节内容我们可以看出,不一定非要等到策略评估结束才可以进行策略提升,值迭代就是这么做的。在ADP中我们也了解到,通过ADP算法我们可以自由的选择状态更新的顺序和频率。因此只要保证策略评估和策略提升这两个过程能够不断地更新迭代,最终获得的结果就是一样的,都收敛到最优的值函数和策略。

这种让策略评估和策略提升过程交互进行的想法就是广义策略迭代(generalized policy iteration,GPI)。所有的RL方法都可以用GPI来描述,也就是说都有策略和值函数。策略是基于值函数得以改进,值函数总是期望收敛到当前策略的值。倘若两个过程都稳定那么就说明一定得到了最优策略。

4.动态规划--阅读笔记【Reinforcement Learning An Introduction 2nd】_第13张图片

策略评估与策略提升之间相互合作和竞争。竞争表现在如果当前的策略相对于值函数贪婪了,那么这个值函数就不是变化策略后的值函数;如果求得了当前策略的值函数,那么这个策略就不是贪婪的。合作表现在两者之间交互进行,促使值函数的解和策略的解都向最优解靠近:

4.动态规划--阅读笔记【Reinforcement Learning An Introduction 2nd】_第14张图片

蓝色箭头到达黑色线表示的是一个完整的策略评估或策略提升过程,但是对于GPI来讲,这两个过程可以不是完整的,比如:

4.动态规划--阅读笔记【Reinforcement Learning An Introduction 2nd】_第15张图片

在第2次红色箭头处进行策略评估时并没有执行策略评估的一个完整过程,而是在中途就进行策略提升了,然后又执行一次完整的策略评估,后续过程与之前类似。因此GPI可以使得我们任意决定更新的粒度(或者说更新步数),并且不会改变收敛性。

动态规划算法的效率问题

DP算法对于某些状态空间很大的情况很不适用,但与其他方法相比,DP算是一个行之有效的方法。一般的,DP算法对于状态数n动作数k的时间复杂度是多项式次的,但是对于一个一般的MDP而言策略空间的大小是k的n次方(每个状态下有k个动作,不同动作代表不同策略,所以有k的n次方个,假设是确定性策略),因此直接搜索策略的时间复杂度是指数次的。

DP方法的一个诟病就是维度灾难问题,所谓的维度灾难就是状态空间或动作空间的大小会随着状态或动作的维数指数级的增长。比如对于机械臂的控制问题,假设状态是每个关节的位置、速度,那么对于一个6自由度的机械臂而言其状态空间就是一个12维的空间集合。为了解决这个连续状态空间的问题,比如将其离散化,把每个维度假设离散化为10个值,那么就是10的12次方个状态。如果是d维的话那么就是10的d次方。

总结

本章介绍了RL中的动态规划方法,也就是如何求解MDP,主要介绍了策略迭代和值迭代的算法。同时也提到了更一般的策略迭代方法GPI,为了解决更新遍历时间成本大的问题,提出了ADP的方法。

DP的一个特点是所有的更新都依赖于其后继状态的估计值,这种情况称作自举bootstrapping,另外DP本身也是需要模型的。

你可能感兴趣的:(#,RL,An,Introduction,2nd读书笔记,深度学习,强化学习)