简介

动态规划算法是解决复杂问题的一个方法,算法通过把复杂问题分解为子问题,通过求解子问题进而得到整个问题的解。在解决子问题的时候,其结果通常需要存储起来被用来解决后续复杂问题。当问题具有下列特性时,通常可以考虑使用动态规划来求解:第一个特性是一个复杂问题的最优解由数个小问题的最优解构成,可以通过寻找子问题的最优解来得到复杂问题的最优解;子问题在复杂问题内重复出现,使得子问题的解可以被存储起来重复。

马尔科夫决定过程(MDP)具有上述两个属性:Bellman方程把问题递归为求解子问题,价值函数就相当于存储了一些子问题的解,可以复用。因此可以使用动态规划来求解MDP。

我们用动态规划算法来求解一类称为“规划”的问题。“规划”指的是在了解整个MDP的基础上求解最优策略,也就是在已知模型结构的基础上进行评估和控制,具体来说就是在了解包括状态和行为空间、转移概率矩阵、奖励等信息的基础上求解一个给定策略的价值函数,或判断一个策略的优劣并最终找到最优的策略和最优价值函数。尽管多数强化学习问题并不会给出具体的环境动力学,并且多数复杂的强化学习问题无法通过动态规划算法来快速求解,但本文在讲解利用动态规划算法进行规划的同时将重点阐述一些非常重要的概念,例如预测和控制、策略迭代、价值迭代等。正确理解这些概念对于了解后续的内容非常重要,因而可以说本文内容是整个强化学习核心内容的引子。

预测和控制是规划的两个重要内容。预测是对给定策略的评估过程,控制是寻找一个最优策略的过程。对预测和控制的数学描述是这样:

预测:给定一个MDP <S, A, P, R, γ>和策略 π ,或者给定一个MRP <S, Pπ, Rπ, γ> ,要求输出基于当前策略π的价值函数Vπ
控制:给定一个MDP <S, A, P, R, γ> ,要求确定最优价值函数 V*和最优策略 π*

策略评估(解决预测问题)

策略评估 (policy evaluation) 指给定一个MDP和一个策略π,我们来评价这个策略有多好。如何判断这个策略有多好呢?根据基于当前策略π的价值函数vπ来决定。所以我们的关键就是给定一个MDP和一个策略π,求出价值函数vπ。
    如何求解呢?我们可以使用同步迭代联合动态规划的算法:从任意一个状态价值函数开始,依据给定的策略,结合贝尔曼期望方程、状态转移概率和奖励同步迭代更新状态价值函数,直至其收敛,得到该策略下最终的状态价值函数。理解该算法的关键在于在一个迭代周期内如何更新每一个状态的价值。该迭代法可以确保收敛形成一个稳定的价值函数。
    用算法的角度来描述就是:
强化学习【三】动态规划寻找最优策略
    举例使用同步迭代法进行小型方格世界的策略评估:
强化学习【三】动态规划寻找最优策略
    这是一个强化学习的问题:如图4×4 的方格阵列,我们把它看成一个小世界。这个世界环境有16个状态,图中每一个小方格对应一个状态,依次用0−15标记它们。图中状态0和15分别位于左上角和右下角,是终止状态,用灰色表示。假设在这个小型方格世界中有一个可以进行上、下、左、右移动的agent,它需要通过移动自己来到达两个灰色格子中的任意一个来完成任务。这个小型格子世界作为环境有着自己的动力学特征:当agent采取的移动行为不会导致agent离开格子世界时,agent将以 100% 的几率到达它所要移动的方向的相邻的那个格子,之所以是相邻的格子而不能跳格是由于环境约束agent每次只能移动一格,同时规定agent也不能斜向移动;如果agent采取会跳出格子世界的行为,那么环境将让agent以 100% 的概率停留在原来的状态;如果agent到达终止状态,任务结束,否则agent可以持续采取行为。每当agent采取了一个行为后,只要这个行为是agent在非终止状态时执行的,不管agent随后到达哪一个状态,环境都将给予agent值为 −1 的奖励值;而当agent处于终止位置时,任何行为将获得值为 0 的奖励并仍旧停留在终止位置。环境设置如此的奖励机制是利用了agent希望获得累计最大奖励的天性,而为了让agent在格子世界中用尽可能少的步数来到达终止状态,因为agent在世界中每多走一步,都将得到一个负值的奖励。为了简化问题,我们设置衰减因子γ=1。
    在这个小型格子世界的强化学习问题中,agent为了达到在完成任务时获得尽可能多的奖励(在此例中是为了尽可能减少负值奖励带来的惩罚)这个目标,它至少需要思考一个问题:“当处在格子世界中的某一个状态时,我应该采取如何的行为才能尽快到达表示终止状态的格子。”这个问题对于拥有人类智慧的我们来说不是什么难题,因为我们知道整个世界环境的运行规律(动力学特征)。但对于格子世界中的agent来说就不那么简单了,因为agent身处格子世界中一开始并不清楚各个状态之间的位置关系,它不知道当自己处在状态4时只需要选择“向上”移动的行为就可以直接到达终止状态。此时agent能做的就是在任何一个状态时,它选择朝四个方向移动的概率相等。agent想到的这个办法就是一个基于均一概率的随机策略(uniform random policy) 。agent遵循这个均一随机策略,不断产生行为,执行移动动作,从格子世界环境获得奖励(大多数是−1 代表的惩罚),并到达一个新的或者曾经到达过的状态。长久下去,agent会发现:遵循这个均一随机策略时,每一个状态跟自己最后能够获得的最终奖励有一定的关系:在有些状态时自己最终获得的奖励并不那么少;而在其他一些状态时,自己获得的最终奖励就少得多了。agent最终发现,在这个均一随机策略指导下,每一个状态的价值是不一样的。这是一条非常重要的信息。对于agent来说,它需要通过不停的与环境交互,经历过多次的终止状态后才能对各个状态的价值有一定的认识。agent形成这个认识的过程就是策略评估的过程。而作为人类,我们知晓描述整个格子世界的信息特征,不必要向格子世界中的agent那样通过与环境不停的交互来形成这种认识,我们可以直接通过迭代更新状态价值的办法来评估该策略下每一个状态的价值。
强化学习【三】动态规划寻找最优策略
 

下边说一下这些数值怎么计算得出

首先,我们假设所有除终止状态以外的14个状态的价值为0。同时,由于终止状态获得的奖励为0,我们可以认为两个终止状态的价值始终保持为0。这样产生了上图(a)中第k=0次迭代的状态价值函数。
    在随后的每一次迭代内,agent处于在任意状态都以均等的概率(1/4)选择朝上、下、左、右等四个方向中的一个进行移动;只要agent不处于终止状态,随后产生任意一个方向的移动后都将得到−1的奖励,并依据环境动力学将100%进入行为指向的相邻的格子或碰壁后留在原位,在更新某一状态的价值时需要分别计算4个行为带来的价值分量。
    以上图(b)(c)(d)中加粗的状态价值-1.0,-1.7和-2.4为例,详细的计算过程如下:
计算公式:
当前迭代时状态s的价值=
当前状态s向上移动行为的概率×[当前状态s向上移动行为的奖励+γ (当前状态s向上移动行为进行下一状态s’的状态转化概率) × 上一轮迭代时状态s’的价值 ] +
当前状态s向下移动行为的概率×[当前状态s向下移动行为的奖励+γ (当前状态s向下移动行为进行下一状态s’的状态转化概率) × 上一轮迭代时状态s’的价值 ] +
当前状态s向左移动行为的概率×[当前状态s向左移动行为的奖励+γ (当前状态s向左移动行为进行下一状态s’的状态转化概率) × 上一轮迭代时状态s’的价值 ] +
当前状态s向右移动行为的概率×[当前状态s向右移动行为的奖励+γ (当前状态s向右移动行为进行下一状态s’的状态转化概率) × 上一轮迭代时状态s’的价值 ]
代入计算:
−1.0=0.25∗(−1+1∗0)+0.25∗(−1+1∗0)+0.25∗(−1+1∗0)+0.25∗(−1+1∗0)
−1.7=0.25∗(−1+1∗0)+0.25∗(−1+1∗−1)+0.25∗(−1+1∗−1)+0.25∗(−1+1∗−1)
−2.4=0.25∗(−1+1∗0)+0.25∗(−1+1∗−2)+0.25∗(−1+1∗−1.7)+0.25∗(−1+1∗−2)

   最终可以求出 均等概率的策略的状态价值函数如上图,每个数值表征每个状态的价值,但并不代表现在采取的策略是按照数值大小排列的路径(比如:并不是说在2号点下一步要朝着-14的方向行动),此时的策略仍然是每个方向均等概率

策略迭代(解决控制问题)

完成对一个策略的评估,将得到基于该策略下每一个状态的价值。很明显,不同状态对应的价值一般也不同,那么个体是否可以根据得到的价值状态来调整自己的行动策略呢,例如考虑一种如下的贪婪策略:个体在某个状态下选择的行为是其能够到达后续所有可能的状态中价值最大的那个状态。我们以均一随机策略下第2次迭代后产生的价值函数为例说明这个贪婪策略。

强化学习【三】动态规划寻找最优策略

如图所示,右侧是根据左侧各状态的价值绘制的贪婪策略方案。个体处在任何一个状态时,将比较所有后续可能的状态的价值,从中选择一个最大价值的状态,再选择能到达这一状态的行为;如果有多个状态价值相同且均比其他可能的后续状态价值大,那么个体则从这多个最大价值的状态中随机选择一个对应的行为。在这个小型方格世界中,新的贪婪策略比之前的均一随机策略要优秀不少,至少在靠近终止状态的几个状态中,个体将有一个明确的行为,而不再是随机行为了。我们从均一随机策略下的价值函数中产生了新的更优秀的策略,这是一个策略改善的过程。

更一般的情况是,当给定一个策略π时,可以得到基于该策略的价值函数Vπ,基于产生的价值函数可以得到一个贪婪策略π'=greedy(Vπ)。
    依据新的策略π′会得到一个新的价值函数,并产生新的贪婪策略,如此重复循环迭代将最终得到最优价值函数V*和最优策略π∗。策略在循环迭代中得到更新改善的过程称为策略迭代(policy iteration) 

总结:下图表达了策略迭代的过程。策略迭代分为两个步骤:策略评估和策略改善。策略评估是基于当前的policy计算出每个状态的价值函数;策略改善是基于当前的状态价值函数,用贪婪算法找到当前最优的policy。

 图解:从一个初始策略π和初始价值函数V开始,基于该策略进行完整的价值评估过程得到一个新的价值函数,随后依据新的价值函数得到新的贪婪策略,随后计算新的贪婪策略下的价值函数,整个过程反复进行,在这个循环过程中策略和价值函数均得到迭代更新,并最终收敛值最优价值函数和最优策略。除初始策略外,迭代中的策略均是依据价值函数的贪婪策略。

强化学习【三】动态规划寻找最优策略
   回过头看看小型方格世界,使用均一随机策略初始化,然后用贪婪策略不断改善的策略迭代过程:
首先零初始化价值函数(如下左图),并采用均一随机策略(如下右图)。
强化学习【三】动态规划寻找最优策略
然后,根据上图右边的均一随机策略,第一次迭代产生新的价值函数(如下左图),根据这一新的价值函数,用贪婪策略改善前一个旧的策略,产生新的策略(如下右图)。
强化学习【三】动态规划寻找最优策略
根据上图右边的经贪婪策略改善的策略,第二次迭代产生新的价值函数(如下左图),根据这一新的价值函数,用贪婪策略改善前一个旧的策略,产生新的策略(如下右图)。
强化学习【三】动态规划寻找最优策略
重复迭代,迭代到第三轮,收敛到最优策略。左图:当前迭代的价值函数;右图:贪婪策略改善前一个旧的策略,得到新的策略。
强化学习【三】动态规划寻找最优策略

Modified Policy Iteration:有时候不需要持续迭代至最优价值函数,可以设置一些条件提前终止迭代,比如设定一个ϵ,比较两次迭代的价值函数平方差;直接设置迭代次数;以及每迭代一次更新一次策略等。

价值迭代(解决控制问题)

我们观察一个现象:
    当只采用基于均一随机策略的迭代法进行迭代时,需要经过数十次迭代才会收敛。

    当采用均一随机策略初始化,贪婪策略改善进行迭代时,在第三次迭代时,得到的策略就是最优策略了。

可见,采用不同的策略,达到最优策略时,所需要的迭代次数不同。我们先从另一个角度剖析一下最优策略的意义。
    任何一个最优策略可以分为两个阶段,首先该策略要能产生当前状态下的最优行为,其次对于该最优行为到达的后续状态时该策略仍然是一个最优策略。可以反过来理解这句话:如果一个策略不能在当前状态下产生一个最优行为,或者这个策略在针对当前状态的后续状态时不能产生一个最优行为,那么这个策略就不是最优策略。与价值函数对应起来,可以这样描述状态价值的最优化原则:一个策略能够获得某状态s的最优价值,当且仅当:该策略也同时获得状态s所有可能的后续状态 s′的最优价值。
    一个状态的最优价值可以由其后续状态的最优价值通过贝尔曼最优方程来计算:
强化学习【三】动态规划寻找最优策略
    这个公式告诉我们,如果能知道最终状态的价值和相关奖励,可以直接计算得到最终状态的前一个所有可能状态的最优价值。更乐观的是,即使不知道最终状态是哪一个状态,也可以利用上述公式进行纯粹的价值迭代,不停的更新状态价值,最终得到最优价值。而且这种单纯价值迭代的方法甚至可以允许存在循环的状态转换乃至一些随机的状态转换过程。
强化学习【三】动态规划寻找最优策略
    如图所示是一个在 4×4 方格世界中寻找最短路径的问题。与前述的方格世界问题唯一的不同之处在于,该世界只在左上角有一个最终状态,agent在世界中需尽可能用最少步数到达左上角这个最终状态。
    首先考虑到agent知道环境的动力学特征的情形。

简要思路:在已知左上角为最终目标的情况下,我们可以从与左上角相邻的两个方格开始计算,因为这两个方格是可以仅通过1步就到达目标状态的状态,或者说目标状态是这两个状态的后继状态。最短路径可以量化为:每移动一步获得一个-1的即时奖励。为此我们可以更新与目标方格相邻的这两个方格的状态价值为-1。如此依次向右下角倒推,直至所有状态找到最短路径。

    现在考虑更广泛适用的,agent不知道环境动力学特征的情形。

在这种情况下,agent并不知道终止状态的位置,但是它依然能够直接进行价值迭代。与之前情形不同的是,此时的agent要针对所有的状态进行价值更新。为此,agent先随机地初始化所有状态价值 (V1),示例中为了演示简便全部初始化为 0。在随后的一次迭代过程中,对于任何非终止状态,因为执行任何一个行为都将得到一个−1的奖励,而所有状态的价值都为0,那么所有的非终止状态的价值经过计算后都为−1 (V2)。在下一次迭代中,除了与终止状态相邻的两个状态外的其余状态的价值都将因采取一个行为获得−1的奖励以及在前次迭代中得到的后续状态价值均为 −1,而将自身的价值更新为−2;而与终止状态相邻的两个状态在更新价值时需将终止状态的价值0作为最高价值代入计算,因而这两个状态更新的价值仍然为−1(V3)。依次类推直到最右下角的状态更新为−6后 (V7),再次迭代各状态的价值将不会发生变化,于是完成整个价值迭代的过程。

    两种情形的相同点都是根据后续状态的价值,利用贝尔曼最优方程来更新得到前接状态的价值。两者的差别体现在:前者每次迭代仅计算相关的状态的价值,而且一次计算即得到最优状态价值,后者在每次迭代时要更新所有状态的价值。
    可以看出价值迭代的目标仍然是寻找到一个最优策略,它通过贝尔曼最优方程从前次迭代的价值函数中计算得到当次迭代的价值函数,在这个反复迭代的过程中,并没有一个明确的策略参与,由于使用贝尔曼最优方程进行价值迭代时类似于贪婪地选择了最优行为对应的后续状态的价值,因而价值迭代其实等效于策略迭代中每迭代一次价值函数就更新一次策略的过程。需要注意的是,在纯粹的价值迭代寻找最优策略的过程中,迭代过程中产生的状态价值函数不对应任何策略。迭代过程中价值函数更新的公式为:强化学习【三】动态规划寻找最优策略
    其中,k表示迭代次数。公式中可以看出,价值迭代虽然不需要策略参与,但仍然需要知道状态之间的转移概率,也就是需要知道模型。

总结

至此,使用同步动态规划进行规划基本就讲解完毕了。其中迭代法策略评估属于预测问题,它使用贝尔曼期望方程来进行求解。策略迭代和价值迭代则属于控制问题,其中前者使用贝尔曼期望方程进行一定次数的价值迭代更新,随后在产生的价值函数基础上采取贪婪选择的策略改善方法形成新的策略,如此交替迭代不断的优化策略;价值迭代则不依赖任何策略,它使用贝尔曼最优方程直接对价值函数进行迭代更新。前文所述的这三类算法均是基于状态价值函数的,其每一次迭代的时间复杂度为O(mn^2),其中m,n分别为行为和状态空间的大小。读者也可以设计基于行为价值函数的上述算法,这种情况下每一次迭代的时间复杂度则变成了O(m^2n^2),本文不再详述。

前文所述的系列算法均为同步动态规划算法,它表示所有的状态更新是同步的。与之对应的还有异步动态规划算法。在这些算法中,每一次迭代并不对所有状态的价值进行更新,而是依据一定的原则有选择性的更新部分状态的价值,这种算法能显著的节约计算资源,并且只要所有状态能够得到持续的被访问更新,那么也能确保算法收敛至最优解。比较常用的异步动态规划思想有:原位动态规划、优先级动态规划、和实时动态规划等。本文不再详述。

相关文章: