【强化学习】有限马尔科夫模型


有限马尔可夫决策过程(有限MDP问题)既涉及“评估性反馈”,又涉及“发散联想”,即在不同情境下选择不同的动作。MDP是序列决策的经典形式化表达,其动作不仅影响当前的即时收益,还影响后续的情境(又称状态)以及未来的收益。因此,MDP涉及了延迟收益,由此也就有了在当前收益和延迟收益之间权衡的需求。

在赌博机问题中,我们估计了每个动作a的价值 q ∗ ( a ) q_*(a) q(a),而在MDP中,每个动作 a a a在每个状态s中的价值 q ∗ ( s , a ) q_*(s,a) q(s,a),或者估计给定最有动作下的每个状态的价值 v ∗ ( s ) v_*(s) v(s)

“智能体-环境”交互接口

MDP是一种通过交互式学习来实现目标的理论框架。进行学习及实施决策的机器被称为智能体(agent)。与之相互作用的事物都被称为环境(environment)。事物之间持续交互,智能体选择动作,环境对这些动作做出响应,并向智能体呈现出新的状态。而环境也会产生收益,通常是特定的数值,这就是智能体在动作选择过程中想要最大化的目标。
在这里插入图片描述
在每个离散时刻t = 0,1,2,3,…,(会有连续的情况), 智能体和环境都发生了交互。 S t ∈ S S_t∈S StS,选择一个动作, A t ∈ A ( s ) A_t∈A(s) AtA(s)。然后在下一时刻,作为其动作的结果,智能体接收到一个数值化, R t + 1 ∈ R R_{t+1}∈R Rt+1R,然后进入一个新的状态 S t + 1 S_{t+1} St+1。最后MDP和智能体共同给出了序列或者说轨迹。 S 0 , A 0 , R 1 , S 1 , A 1 , R 2 , A 2 , R 3 , . . . S_0,A_0,R_1,S_1,A_1,R_2,A_2,R_3,... S0,A0,R1,S1,A1,R2,A2,R3,...
在有限MDP中,状态、动作和收益的集合(S、A和R)都只有有限个元素。在这种情况下,随机变量 R t R_t Rt S t S_t St具有定义明确的离散概率分布,并且只依赖于前继状态和动作,换言之,给定前继状态和动作的值时, s ′ ∈ S s'∈S sS r ∈ R r∈R rR,在t时刻出现的概率是
在这里插入图片描述
对于任意 s ′ , s ∈ S , r ∈ R s',s∈S,r∈R s,sSrR,以及 a ∈ A ( s ) a∈A(s) aA(s)。函数p定义了MDP的动态特性。动态函数 p : S ∗ R ∗ S ∗ A − > [ 0 , 1 ] p:S*R*S*A->[0,1] p:SRSA>[0,1]是有4个参数的普通的确定性函数。中间“|”表示条件概率的符号,函数 p p p为每个 s s s a a a的选择都指定了一个概率分布,即:
在这里插入图片描述
在马尔科夫决策过程中,由 p p p给出的概率完全刻画了环境的动态特性。St和Rt的每个可能的值出现的概率只取决于前一个状态 S t − 1 S_{t-1} St1和前一个动作 A t − 1 A_{t-1} At1,并且与更早之前的状态和动作完全无关。这个限制并不是针对决策过程,而是针对状态的。状态必须包括过去智能体和环境交互的方方面面的信息,这些信息会对未来产生一定影响。这样,状态就被认为具有马尔科夫性。

从四参数动态函数 p p p中,我们可以计算出关于环境的任何信息,例如状态转移概率(我们将其表示为一个三参数函数 p : S ∗ S ∗ A − > [ 0 , 1 ] p:S*S*A->[0,1] pSSA>[0,1]
在这里插入图片描述
我们还可以定义“状态-动作”二元组的期望收益,将其表示为一个双参数函数 r : S ∗ A − > R r:S*A->R rSA>R
在这里插入图片描述
和“状态-动作-后继状态”三元组的期望收益,并将其表示为一个三参数函数 r : S ∗ A ∗ S − > R r:S*A*S->R r:SAS>R
在这里插入图片描述
MDP框架非常灵活,能以不同的方式应用到许多实际问题中。
例如,时间步长不需要真实时间的固定间隔,也可以是决策和行动的任意的连贯阶段。动作可以是低级的控制,例如机器臂的发动机的电压,也可以是高级的决策,例如是否吃午餐。同样地,状态可以采取多种表述形式,例如传感器的直接读数。状态的一些组成成分可以是基于过去感知的记忆,甚至可以是完全主观的。例如,智能体可能不确定对象位置,也可能刚刚响应过某种特定的感知。类似地,一些动作可能是完全主观或完全可计算的。例如,一些动作可以控制智能体选择考虑的内容,或者控制它把注意力集中在哪里,一般而言,动作可以是我们想要做的决策,而状态则可以使对决策有所帮助的事情。

MDP框架是目标导向的交互式学习问题的一个高度抽象。任何目标导向的行为的学习问题都可以概括为智能体及其环境之间来回传递的三个信号:
(1)用来表示智能体做出的选择(行动)
(2)一个信号用来表示做出该选择的基础(状态)
(3)定义智能体的目标(收益)

目标和收益

在强化学习中,智能体的目标呗形式化表征为一种特殊信号,称为收益,它通过环境传递给智能体。在每个时刻,收益都是一个单一标量数值, R t ∈ R R_t∈R RtR。非正式地说,智能体的目标是最大化所收到的总收益。这意味着需要最大化的不是当前收益,而是长期的累计收益。使用收益信号来形式化目标是强化学习最显著的特征之一。
智能体总是学习如何最大化收益。如果我们想要它为我们做某件事,我们提供收益的方式必须要使得智能体在最大化收益的同时,也实现我们的目标。此外,收益信号并不是传授智能体如何实现目标的先验知识。例如,国际象棋智能体只有当最终获胜时才能获得收益,而非达到某个子目标,比如吃掉对方的子,或者控制中心区域。如果实现这些子目标也能得到收益,那么智能体可能会避开最终目的,来实现子目标。比如为了吃对手的子,输掉了比赛也没关系。所以收益信号只能用来传达什么是你想要实现的目标,而不是如何实现目标。

回报和分幕

智能体的目标是最大限度地提高长期收益。那应该怎样正式定义?如果把时刻t后接收的收益序列表示为 R t + 1 , R t + 2 , R t + 3 , . . . , R_{t+1},R_{t+2},R_{t+3},..., Rt+1Rt+2Rt+3...那么最大化这个序列的那一方面?一般来说,我们寻求的是最大化期望回报,记为 G t G_t Gt,它被定义为收益序列的一些特定函数。在最简单的情况下,回报是收益的总和:
在这里插入图片描述
其中T是最终时刻。在有“最终时刻”的应用中,智能体和环境的交互能被自然地分成一系列子序列(每个序列都存在最终时刻),我们称每个子序列为幕(episodes,或者是试验,trials),也可以感性地认识为一段情节,并且上一幕和下一幕并无关联。在这些分幕式任务中,我们需要区分非终结状态集合,记为S,和包含终结与非终结状态的所有状态集,记作S+。终结的时间T是一个随机变量,通常随着幕的不同而不同。
另一方面,在许多情况下,智能体-环境交互不一定能被自然地分为单独的幕,而是持续不断地发生。比如一个连续的过程控制任务或者长期运行机器人的应用。这些一般称为持续性任务。
使用上面的回报公式描述持续性任务会出现问题,因为最终时刻T = ∞,因为最大化的回报容易趋于无穷。所以这里引入一个额外概念,即折扣。根据这种方法,智能体尝试选择动作,使得它在未来收到的经过折扣系数加权后的收益总和是最大化的。它选择 A t A_t At来最大化期望折后回报。
在这里插入图片描述
其中 r r r是一个参数, 0 ≦ r ≦ 1 0≦r≦1 0r1,被称为折扣率。
折扣率决定了未来收益的当前价值:未来时刻 k k k的收益值只有它的当前值的 r k − 1 r^{k-1} rk1倍。如果 r < 1 r<1 r<1,那么只要收益序列{ R k R_k Rk}有界,那么上式的无限序列总和就是一个有限值。如果r=0,那么智能体是“目光短浅的”,即只关心最大化当前收益(即,选择 A t A_t At来最大化 R t + 1 R_{t+1} Rt+1)。如果每个智能体的行为都碰巧只影响当前收益,而不是未来的回报,那么目光短浅的智能体可以通过单独最大化每个当前收益来最大化上面的式子。但一般来说,最大化当前收益会减少未来的收益,以至于实际上的收益变少了。随着r接近1,折后回报将更多地考虑未来的收益,也就是说智能体变得有远见了。
邻接时刻的回报可以用如下递归方式相互联系起来,这对于强化学习的理论和算法来说至关重要。
在这里插入图片描述
尽管上面式子中定义的回报是对无限个收益子项求和,但只要收益是一个非零常数且r<1,那这个回报仍是有限的。比如,如果收益是一个常数+1,那么回报就是
在这里插入图片描述

分幕式和持续性任务的统一表示法

分幕式任务对比持续性任务,前一种情况更容易表示,因为在这一幕,每个动作只能影响到之后收到的有限个收益。为了能够同时精确地讨论两种情况,我们需要建立一个统一的表示法。

我们需要使用另一个约定来获得一个统一符号,它可以同时适用于分幕式和持续性任务。在一种情况下,我们汇报定义为有限项的总和;而在另一种情况中,我们将回报定义为无限项的总和。这两者可以通过一个方法进行统一,即把幕的终止当做一个特殊的吸收状态的入口,它只会转移到自己并且只产生零收益。
在这里插入图片描述
这里的方块表示与幕结束对应的吸收状态。从 S 0 S_0 S0开始,我们就会得到收益序列: + 1 , + 1 , + 1 , 0 , 0 , 0... +1,+1,+1,0,0,0... +1+1+1000...。此时无论我们是计算前T个收益(这里T=3)的综合,还是计算无限序列的全部综合,我们都能得到相同的回报。即使我们引入折扣,这也仍然成立。所以我们可以把回报表示为:
在这里插入图片描述
并允许上式包括T=∞或r=1(但是两者不能同时)的可能性。这些惯例用来简化符号,并表达分幕式和持续性任务之间的紧密联系。

策略和价值函数

几乎所有的强化学习算法都涉及价值函数的计算。价值函数是状态(或状态与动作二元组)的函数,用来评估当前智能体的给定状态(或外加动作)下有多好,也就是用未来预期的收益(回报)来定义的期望值。智能体期望未来能得到的收益取决于智能体所选择的动作。因此,价值函数是与特定的行为方式相关的,称为策略。

策略是从状态到每个动作的选择概率之间的映射。如果智能体在时刻t选择了策略π,那么π(a|s)就是当St=s时 At=a的概率。就像p一样,π就是一个普通的函数, π ( a ∣ s ) π(a|s) π(as)中间的“|”只是提醒我们它为每个 s ∈ S s∈S sS都定义了一个在 a ∈ A a∈A aA上的概率分布。强化学习方法规定了智能体的策略如何随着经验而发生变化。

把策略π下状态s的价值函数记为 v π ( s ) v_π(s) vπ(s),即从状态s开始,智能体按照策略π进行决策所获得的回报的概率期望值。对于MDP,我们可以正式定义 v π v_π vπ
在这里插入图片描述
其中, E π [ ∗ ] E_π[*] Eπ[]表示在给定策略π时一个随机变量的期望值,t可以是任意时刻。请注意,终止状态的价值始终是零。我们把函数 v π v_π vπ称为策略 π π π的状态价值函数。类似地,我们把策略 π π π下载状态s时采取动作 a a a的价值记为 q π ( s , a ) q_π(s,a) qπ(s,a)。这就是根据策略π,从状态s开始,执行动作a之后,所有可能的决策序列的期望回报。
在这里插入图片描述
价值函数 v π v_π vπ q π q_π qπ都能从经验中估算得到。比如,一个智能体遵循策略π,并且对每个遇到的状态都记录该状态后的实际回报的平均值,那么,随着状态出现的次数接近无穷大,这个平均值会收敛到状态价值 v π ( s ) v_π(s) vπ(s)。如果为每个状态的每个动作都保留单独的平均值,那么,随着状态出现的次数接近无穷大,这个平均值会收敛到状态价值 v π ( s ) v_π(s) vπ(s)。如果为每个状态的每个动作都保留单独的平均值,那么类似地,这些平均值也会收敛到动作价值 q π ( s , a ) q_π(s,a) qπ(s,a)。我们将这种估算方法称作蒙特卡洛方法,因为该方法涉及从真实回报的多个随机样本中求平均值。当环境中有很多状态时,独立地估算每个状态的平均值是不切实际的。此时我们可以将价值函数 v π v_π vπ q π q_π qπ参数化(参数的数量要远少于状态的数量),然后通过调整价值函数的参数来更好地计算回报值。

在强化学习和动态规划中,价值函数有一个基本特性,就是满足某种递归关系。对于任何策略π和任何状态s,s的价值与其可能的后继状态的价值之间存在以下关系
在这里插入图片描述
其中,动作a取自集合A(s),下一时刻状态s’取自集合S(在分幕式的问题中,取自集合S+),收集值r取自集合R。上式被称作 v π v_π vπ的贝尔曼方程。它用等式表达了状态价值和后继状态价值之间的关系,从一个状态向后观察所有可能到达的后继状态。
在这里插入图片描述
如上图所示,空心圆代表状态,而实心圆表示一个“状态-动作”二元组。从状态s开始,并将其作为根节点,智能体可以根据其策略π,采取动作集合中的任意一个动作(图中显示了三个动作)。对每一个动作,环境会根据其动态特性函数p,以一个后继状态s’,及其收益r作为响应。贝尔曼方程对所有可能性采用其出现概率进行了加权平均。说明起始状态的价值一定等于后继状态的(折扣)期望值加上对应的收益期望值。

贝尔曼方程是一系列计算、近似和学习 v π v_π vπ的基础。上图叫回溯图,因为图中的关系是回溯运算的基础,这也是强化学习方法的核心内容。通俗地讲,回溯操作就是将后继状态的价值信息回传给当前时刻的状态(或 “状态-动作”二元组)。

最优策略和最优价值函数

强化学习任务意味着要找出一个策略,使其能够在长期过程中获得大量的收益。对于有限MDP,我们通过比较价值函数精确地定义一个最优策略。本质上,价值函数定义了策略上的偏序关系。若对于 s ∈ S s∈S sS π ≥ π ′ π≥π' ππ,那么应当 v π ( s ) ≥ v π ′ ( s ) v_π(s)≥v_{π'}(s) vπ(s)vπ(s),即总会存在一个策略不劣于其他所有的测录,就是最优策略。可以用 π ∗ π_* π来表示所有这些最优策略。他们共享相同的状态价值函数,称为最优状态价值函数,记为 v ∗ v_* v

最优策略下各个状态的价值一定等于这个状态下最优动作的期望回报,这就是贝尔曼最优方程。
在这里插入图片描述
q ∗ q_* q的贝尔曼最优方程如下:
在这里插入图片描述

最优性和近似算法

即使我们有一个关于环境动态变化特性的完备精确模型,贝尔曼最优方程仍然不能简单地计算出一个最优策略,例如象棋之类的棋类游戏只是人类经验的一小部分,对于大型定制的计算机来说,其仍然十分复杂,以至于无法计算出最优的走棋策略。现在智能体面临的一个关键问题是能用多少计算力,特别是每一步能用的计算力。
存储容量是一个很重要的约束,价值函数、策略和模型的估计通常需要大量的存储空间,在状态集合小而有限的任务中,用数组或者表格估计每个状态是有可能的。我们称之为表格型任务,对应的方法我们称作表格型方法。但在很多实际情况下,很多状态不能用表格的一行来表达。在这些情况下,价值函数必须采用近似算法,这时通常使用紧凑的参数化函数表示方法。
强化学习问题是我们不得不认真面对近似的问题。例如,在近似最优行为时,智能体可能会有大量的状态,每个状态出现的概率都很低,这使得选择次优的动作对整个智能体所获得的收益的影响很小。

例子,GridWorld问题

在这里插入图片描述
如上图所示是一个包含5*5的网格,在每一个单元格中,agent都有四种行动可以执行,它们分别是“上”、“下”、“左”、“右”。假设agent在每个格子处采取四种行动的概率是相同的,也就是1/4=0.25,同时未来回报的折扣因子设为0.9,而agent的状态转移以及回报值分为以下四种情况:
(1)如果agent在边缘处,那么如果它此时执行的动作使它溢出网格的话,我们限制它的位置仍然固定不变,但是同时它会得到-1的回报值。
(2)如果agent处在A点,那么它的任意行动都将得到10的回报值,同时下一步的状态移至A’处;
(3)如果agent处在B点,那么它的任意行动都将得到5的回报值,同时下一步的状态移至B’处;
(4)其他情况则会得到0的回报值,状态转移遵从格子的位置变化;

根据以上提示,计算每个格子的状态-价值函数以及最优状态-价值函数。

一、初始化相关参数

grid_size = 5 #网格大小
posA=[0,1] #A的位置
posB=[0,3] #B的位置
primeA=[4,1] #A'的位置
primeB=[2,3] #B'的位置
discount=0.9 #折扣参数
actions=["U","D","L","R"] #动作列表

二、初始化每个格子(状态)处的行动概率,即均匀随机决策

#初始化每个格子(状态)处的行动概率,即均匀随机决策
actionProb = []
for i in range(0,grid_size):
    actionProb.append([])
    for j in range(0,grid_size):
        actionProb[i].append(dict({"L":0.25,"U":0.25,"R":0.25,"D":0.25}))

三、初始化每个格子(状态)出的状态转移和收益

#定义好每个状态处的状态转移,以及回报值
successorState=[]
actionReward=[]
for i in range(0,grid_size):
    successorState.append([])
    actionReward.append([])
    for j in range(0,grid_size):
        next = dict()
        reward = dict()
        #设置向上移动时的收益以及新的位置(状态)
        if i== 0:
            next["U"]=[i,j]
            reward["U"]=-1.0
        else:
            next["U"]=[i-1,j]
            reward["U"]=0.0
        
        #设置向下移动时的收益以及新的位置(状态)
        if i==grid_size - 1:
            next["D"]=[i,j]
            reward["D"]=-1.0
        else:
            next["D"]=[i+1,j]
            reward["D"]=0.0
            
        #设置向左移动时的收益以及新的位置(状态)
        if j==0:
            next["L"]=[i,j]
            reward["L"]=-1.0
        else:
            next["L"]=[i,j-1]
            reward["L"]=0.0
            
        #设置向右移动时的收益以及新的位置(状态)
        if j == grid_size-1:
            next["R"]=[i,j]
            reward["R"]=-1.0
        else:
            next["R"]=[i,j+1]
            reward["R"]=0.0
        
        #到达A的位置时,直接到A',并且收益为10.0
        if [i,j] == posA:
            next["L"]=next["R"]=next["D"]=next["U"]=primeA
            reward["L"]=reward["R"]=reward["D"]=reward["U"]=10.0
        if [i,j]==posB:
            next["L"] = next["R"] = next["D"] = next["U"] = primeB
            reward["L"] = reward["R"] = reward["D"] = reward["U"] = 5.0
            
        successorState[i].append(next)
        actionReward[i].append(reward)

四、使用贝尔曼方程计算状态-价值函数并可视化

stateValue = np.zeros((grid_size,grid_size))
while True:
    newStateValue=np.zeros((grid_size,grid_size))
    for i in range(0,grid_size):
        for j in range(0,grid_size):
            for action in actions:
                newPosition = successorState[i][j][action]
                #这里计算对应公式上的p(s',r|s,a)时,值为1
                newStateValue[i,j]+=actionProb[i][j][action]*(actionReward[i][j][action]+discount*stateValue[newPosition[0],newPosition[1]])

    if np.sum(np.abs(stateValue-newStateValue))<1e-4:
        print("状态-价值")
        print(newStateValue)
        break
    stateValue = newStateValue

plt.matshow(newStateValue,cmap=plt.cm.Greys)
plt.colorbar()
plt.show()
[[ 3.30902999  8.78932551  4.42765281  5.3224012   1.49221235]
 [ 1.52162172  2.9923515   2.25017358  1.90760531  0.5474363 ]
 [ 0.05085614  0.73820423  0.67314689  0.35821982 -0.40310755]
 [-0.97355865 -0.43546179 -0.35484864 -0.58557148 -1.18304148]
 [-1.8576669  -1.34519762 -1.22923364 -1.42288454 -1.97514545]]

在这里插入图片描述
五、计算最优状态-价值函数

stateValue = np.zeros((grid_size,grid_size))
while True:
    newStateValue = np.zeros((grid_size,grid_size))
    a = ""
    for i in range(0,grid_size):
        for j in range(0,grid_size):
            values = []
            for action in actions:
                newPosition = successorState[i][j][action]
                #这里计算对应公式上的p(s',r|s,a)时,值为1
                values.append(actionReward[i][j][action]+discount*stateValue[newPosition[0],newPosition[1]])

            newStateValue[i][j]=np.max(values)
            #找出所有最优状态-价值的行动
            indexes = np.argwhere(values==np.max(values))
            indexes = indexes.flatten().tolist()
            policyOfState = "".join([actions[index] for index in indexes])
            a += policyOfState+" "

    if np.sum(np.abs(stateValue - newStateValue)) < 1e-4:
        a = a.strip().split(" ")
        policy = np.reshape(a,[grid_size,grid_size])
        print("最优状态-价值")
        print(newStateValue)
        print("最优策略")
        print(policy)
        break

    stateValue = newStateValue
plt.matshow(newStateValue,cmap=plt.cm.Greys)
plt.colorbar()
plt.title("optimal state value")
plt.show()
最优状态-价值
[[21.97744338 24.41938153 21.97744338 19.41938153 17.47744338]
 [19.77969904 21.97744338 19.77969904 17.80172914 16.02153504]
 [17.80172914 19.77969904 17.80172914 16.02153504 14.41938153]
 [16.02153504 17.80172914 16.02153504 14.41938153 12.97744338]
 [14.41938153 16.02153504 14.41938153 12.97744338 11.67969904]]
最优策略
[['R' 'UDLR' 'L' 'UDLR' 'L']
 ['UR' 'U' 'UL' 'L' 'L']
 ['UR' 'U' 'UL' 'UL' 'UL']
 ['UR' 'U' 'UL' 'UL' 'UL']
 ['UR' 'U' 'UL' 'UL' 'UL']]

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值