马尔可夫决策过程

server/2024/12/19 20:09:04/

目录标题

  • 一、简单介绍什么是马尔可夫决策过程
  • 二、马尔可夫过程
    • 2.1 随机过程
    • 2.2 马尔可夫的性质
    • 2.2 马尔可夫过程
  • 三、马尔可夫奖励过程
    • 3.1 回报
    • 3.2 价值函数
  • 四、马尔可夫决策过程
    • 4.1 策略
    • 4.2 状态价值函数
    • 4.3 动作价值函数
    • 4.4 贝尔曼期望方程
  • 五、蒙特卡洛方法
  • 六、占用度量
  • 七、最优策略
  • 八、贝尔曼最优方程

一、简单介绍什么是马尔可夫决策过程

  马尔可夫决策过程(Markov decision process,MDP)强化学习的重要概念。要学好强化学习,我们首先要掌握马尔可夫决策过程的基础知识。与多臂老虎机问题不同,马尔可夫决策过程包含状态信息以及状态之间的转移机制。如果要用强化学习去解决一个实际问题,第一步要做的事情就是把这个实际问题抽象为一个马尔可夫决策过程,也就是明确马尔可夫决策过程的各个组成要素。
  本节将从马尔可夫过程出发,一步一步地进行介绍,最后引出马尔可夫决策过程。

二、马尔可夫过程

2.1 随机过程

  随机过程(stochastic process)是概率论的“动力学”部分。概率论的研究对象是静态的随机现象,而随机过程的研究对象是随时间演变的随机现象(例如天气随时间的变化、城市交通随时间的变化)。在随机过程中,随机现象在某时刻 t t t的取值是一个向量随机变量,用 S t S_t St表示,所有可能的状态组成状态集合 S S S。随机现象便是状态的变化过程。在某时刻 t t t的状态 S t S_t St常取决于 t t t时刻之前的状态。我们将已知历史信息 ( S 1 , ⋯ , S t ) (S_1, \cdots, S_t) (S1,,St)时下一个时刻状态为 S t + 1 S_{t+1} St+1的概率表示成 P ( S t + 1 ∣ S 1 , ⋯ , S t ) P(S_{t+1} \vert S_1, \cdots, S_t) P(St+1S1,,St)

2.2 马尔可夫的性质

  当且仅当某时刻的状态只取决于上一时刻的状态时,一个随机过程被称为具有马尔可夫性质(Markov property),用公式表示为 P ( S t + 1 ∣ S t ) = P ( S t + 1 ∣ S 1 , ⋯ , S t ) P(S_{t+1} \vert S_t)=P(S_{t+1} \vert S_1, \cdots, S_t) P(St+1St)=P(St+1S1,,St)。也就是说,当前状态是未来的充分统计量,即下一个状态只取决于当前状态,而不会受到过去状态的影响。需要明确的是,具有马尔可夫性并不代表这个随机过程就和历史完全没有关系。

  因为虽然 t + 1 t+1 t+1时刻的状态只与 t t t时刻的状态有关,但是 t t t时刻的状态其实包含了 t − 1 t-1 t1时刻的状态的信息,通过这种链式的关系,历史的信息被传递到了现在。马尔可夫性可以大大简化运算,因为只要当前状态可知,所有的历史信息都不再需要了,利用当前状态信息就可以决定未来。

2.2 马尔可夫过程

  马尔可夫过程(Markov process)指具有马尔可夫性质的随机过程,也被称为马尔可夫链(Markov chain)。通常用元组 < S , P > <\mathcal S, \mathcal P> <S,P>描述一个马尔可夫过程,其中 S \mathcal S S是有限数量的状态集合, P \mathcal P P是状态转移矩阵(state transition matrix)。假设一共有 n n n个状态,此时 S = { s 1 , s 2 , ⋯ , s n } \mathcal S=\{ s_1,s_2, \cdots, s_n\} S={s1,s2,,sn}。状态转移矩阵 P \mathcal P P定义了所有状态对之间的转移概率,即
P = [ P ( s 1 ∣ s 1 ) ⋯ P ( s n ∣ s 1 ) ⋮ ⋱ ⋮ P ( s 1 ∣ s n ) ⋯ P ( s n ∣ s n ) ] \mathcal P = \begin{bmatrix} \mathcal P(s_1 \vert s_1) & \cdots & \mathcal P(s_n \vert s_1) \\ \vdots & \ddots & \vdots \\ \mathcal P(s_1 \vert s_n) & \cdots & \mathcal P(s_n \vert s_n) \end{bmatrix} P= P(s1s1)P(s1sn)P(sns1)P(snsn)
  矩阵 P \mathcal P P中第 i i i行第 j j j列元素 P ( s i ∣ s j ) = P ( S t = 1 = s j ∣ S t = s i ) \mathcal P(s_i \vert s_j)=\mathcal P(S_{t=1} =s_j \vert S_t= s_i) P(sisj)=P(St=1=sjSt=si)表示从状态 s i s_i si转移到状态 s j s_j sj的概率,称 P ( s ′ ∣ s ) \mathcal P(s' \vert s) P(ss)为状态转移函数。从某个状态出发,到达其他状态的概率和必须为 1,即状态转移矩阵 P \mathcal P P的每一行的和为 1。
  例如下图是一个具有 6 个状态的马尔可夫过程的简单例子。其中每个绿色圆圈表示一个状态,每个状态都有一定概率(包括概率为 0)转移到其他状态,其中 s 6 s_6 s6通常被称为终止状态(terminal state),因为它不会再转移到其他状态,可以理解为它永远以概率 1 转移到自己。状态之间的虚线箭头表示状态的转移,箭头旁的数字表示该状态转移发生的概率。从每个 s 2 s_2 s2状态出发转移到其他状态的概率总和为 1。例如, s 1 s_1 s1有 90%概率保持不变,有 10%概率转移到 s 2 s_2 s2,而在 s 2 s_2 s2又有 50%概率回到 s 1 s_1 s1,有 50%概率转移到 s 3 s_3 s3
在这里插入图片描述
  我们可以写出这个马尔可夫过程的状态转移矩阵:
P = [ 0.9 0.1 0 0 0 0 0.5 0 0.5 0 0 0 0 0 0 0.6 0 0.4 0 0 0 0 0.3 0.7 0 0.2 0.3 0.5 0 0 0 0 0 0 0 1 ] \mathcal P = \begin{bmatrix} 0.9 & 0.1& 0 & 0 & 0 & 0 \\ 0.5 & 0 & 0.5 & 0 & 0 & 0 \\ 0&0&0&0.6&0&0.4\\ 0&0&0&0&0.3&0.7\\ 0&0.2&0.3&0.5&0&0\\ 0&0&0&0&0&1 \end{bmatrix} P= 0.90.500000.10000.2000.5000.30000.600.500000.300000.40.701
  其中第 i i i j j j列的值 P i , j \mathcal P_{i,j} Pi,j则代表从状态 s i s_i si转移到 s j s_j sj的概率。
  给定一个马尔可夫过程,我们就可以从某个状态出发,根据它的状态转移矩阵生成一个状态序列(episode),这个步骤也被叫做采样(sampling)。例如,从 s 1 s_1 s1出发,可以生成序列 s 1 → s 2 → s 3 → s 6 s_1 \rightarrow s_2 \rightarrow s_3 \rightarrow s_6 s1s2s3s6或序列 s 1 → s 1 → s 2 → s 3 → s 4 → s 5 → s 6 s_1 \rightarrow s_1 \rightarrow s_2 \rightarrow s_3 \rightarrow s_4 \rightarrow s_5 \rightarrow s_6 s1s1s2s3s4s5s6 。生成这些序列的概率和状态转移矩阵有关。

三、马尔可夫奖励过程

  在马尔可夫过程的基础上加入奖励函数 r r r和折扣因子 γ \gamma γ,就可以得到马尔可夫奖励过程(Markov reward process)。一个马尔可夫奖励过程由 ⟨ S , P , r , γ ⟩ \langle \mathcal S, \mathcal P, r, \gamma \rangle S,P,r,γ构成,各个组成元素的含义如下所示。

  • S \mathcal S S是有限状态的集合。
  • P \mathcal P P是状态转移矩阵。
  • r r r是奖励函数,某个状态 s s s奖励 r ( s ) r(s) r(s)指转移到该状态时可以获得奖励的期望。
  • γ \gamma γ是折扣因子(discount factor), γ \gamma γ的取值范围为[0,1)。引入折扣因子的理由为远期利益具有一定不确定性,有时我们更希望能够尽快获得一些奖励,所以我们需要对远期利益打一些折扣。接近 1 的 γ \gamma γ更关注长期的累计奖励,接近 0 的 γ \gamma γ更考虑短期奖励。

3.1 回报

  在一个马尔可夫奖励过程中,从第 t t t时刻状态 S t S_t St开始,直到终止状态时,所有奖励的衰减之和称为回报 G t G_t Gt(Return),公式如下:
G t = R t + γ R t + 1 + γ 2 R t + 2 + ⋯ = ∑ k = 0 ∞ γ k R t + k G_t=R_t+\gamma R_{t+1}+\gamma^2R_{t+2}+\cdots=\sum_{k=0}^\infty\gamma^kR_{t+k} Gt=Rt+γRt+1+γ2Rt+2+=k=0γkRt+k
   其中, R t R_t Rt表示在时刻 t t t获得的奖励。继续沿用上图马尔可夫的例子,并在其基础上添加奖励函数,构建成一个马尔可夫奖励过程。例如,进入状态 s 2 s_2 s2可以得到奖励-2,表明我们不希望进入 s 2 s_2 s2,进入 s 4 s_4 s4可以获得最高的奖励10,但是进入 s 6 s_6 s6之后奖励为零,并且此时序列也终止了。
在这里插入图片描述
   比如选取 s 1 s_1 s1为起始状态,设置 γ = 0.5 \gamma=0.5 γ=0.5采样到一条状态序列为 s 1 → s 2 → s 3 → s 6 s_1 \rightarrow s_2 \rightarrow s_3 \rightarrow s_6 s1s2s3s6,就可以计算 s 1 s_1 s1的回报 G 1 G_1 G1,得到 G 1 = − 1 + 0.5 × ( − 2 ) + 0. 5 2 × ( − 2 ) = − 2.5 。 G_{1}=-1+0.5\times(-2)+0.5^{2}\times(-2)=-2.5。 G1=1+0.5×(2)+0.52×(2)=2.5
   接下来我们用代码表示图中的马尔可夫奖励过程,并且定义计算回报的函数。

import numpy as np
np.random.seed(0)
# 定义状态转移概率矩阵P
P = [[0.9, 0.1, 0.0, 0.0, 0.0, 0.0],[0.5, 0.0, 0.5, 0.0, 0.0, 0.0],[0.0, 0.0, 0.0, 0.6, 0.0, 0.4],[0.0, 0.0, 0.0, 0.0, 0.3, 0.7],[0.0, 0.2, 0.3, 0.5, 0.0, 0.0],[0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
]
P = np.array(P) # 之前定义的列表 P 转换成一个 NumPy 数组rewards = [-1, -2, -2, 10, 1, 0]  # 定义奖励函数,定义的是每个状态下的奖励函数
gamma = 0.5  # 定义折扣因子# 给定一条序列,计算从某个索引(起始状态)开始到序列最后(终止状态)得到的回报
def compute_return(start_index, chain, gamma):G = 0# 使用 reversed 函数和 range 函数创建一个从 start_index 到 len(chain)(序列长度)的逆序列迭代器。逆序迭代允许我们从终止状态向起始状态遍历。for i in reversed(range(start_index, len(chain))):G = gamma * G + rewards[chain[i] - 1]return G# 一个状态序列,s1-s2-s3-s6
chain = [1, 2, 3, 6]
start_index = 0
G = compute_return(start_index, chain, gamma)
print("根据本序列计算得到回报为:%s。" % G)
根据本序列计算得到回报为:-2.5

3.2 价值函数

   在马尔可夫奖励过程中,一个状态的期望回报(即从这个状态出发的未来累积奖励的期望)被称为这个状态的价值(value)。( 奖励和价值不是同一概念。 )所有状态的价值就组成了价值函数(value function),价值函数的输入为某个状态,输出为这个状态的价值。我们将价值函数写成 V ( s ) = E [ G t ∣ S t = s ] , V(s)=\mathbb{E}[G_{t}|S_{t}=s], V(s)=E[GtSt=s],展开为:
V ( s ) = E [ G t ∣ S t = s ] = E [ R t + γ R t + 1 + γ 2 R t + 2 + … ∣ S t = s ] = E [ R t + γ ( R t + 1 + γ R t + 2 + … ) ∣ S t = s ] = E [ R t + γ G t + 1 ∣ S t = s ] = E [ R t + γ V ( S t + 1 ) ∣ S t = s ] \begin{aligned} V(s) & =\mathbb{E}[G_t|S_t=s] \\ & =\mathbb{E}[R_t+\gamma R_{t+1}+\gamma^2R_{t+2}+\ldots|S_t=s] \\ & =\mathbb{E}[R_t+\gamma(R_{t+1}+\gamma R_{t+2}+\ldots)|S_t=s] \\ & =\mathbb{E}[R_t+\gamma G_{t+1}|S_t=s] \\ & =\mathbb{E}[R_t+\gamma V(S_{t+1})|S_t=s] \end{aligned} V(s)=E[GtSt=s]=E[Rt+γRt+1+γ2Rt+2+St=s]=E[Rt+γ(Rt+1+γRt+2+)St=s]=E[Rt+γGt+1St=s]=E[Rt+γV(St+1)St=s]
   上式中, γ \gamma γ为折扣因子。在上式的最后一个等号中,一方面,即时奖励的期望正是奖励函数的输出,即 E [ R t ∣ S t = s ] = r ( s ) \mathbb{E}[R_{t}|S_{t}=s]=r(s) E[RtSt=s]=r(s);另一方面,等式中剩余部分 E [ γ V ( S t + 1 ) ∣ S t = s ] \mathbb{E}[\gamma V(S_{t+1})|S_{t}=s] E[γV(St+1)St=s]可以根据从状态 s s s出发的转移概率得到,即可以得到
V ( s ) = r ( s ) + γ ∑ s ′ ∈ S p ( s ′ ∣ s ) V ( s ′ ) V(s)=r(s)+\gamma\sum_{s^{\prime}\in S}p(s^{\prime}|s)V(s^{\prime}) V(s)=r(s)+γsSp(ss)V(s)
   上式就是马尔可夫奖励过程中非常有名的贝尔曼方程(Bellman equation),对每一个状态都成立。若一个马尔可夫奖励过程一共有 n n n个状态,即 S = { s 1 , s 2 , … , s n } \mathcal{S}=\{s_{1},s_{2},\ldots,s_{n}\} S={s1,s2,,sn},我们将所有状态的价值表示成一个列向量 V = [ V ( s 1 ) , V ( s 2 ) , … , V ( s n ) ] T \mathcal{V}=[V(s_{1}),V(s_{2}),\ldots,V(s_{n})]^{T} V=[V(s1),V(s2),,V(sn)]T,同理,将奖励函数写成一个列向量 R = [ r ( s 1 ) , r ( s 2 ) , … , r ( s n ) ] T \mathcal{R}=[r(s_{1}),r(s_{2}),\ldots,r(s_{n})]^{T} R=[r(s1),r(s2),,r(sn)]T。于是我们可以将贝尔曼方程写成矩阵的形式:
V = R + γ P V \mathcal{V}=\mathcal{R}+\gamma\mathcal{PV} \\ V=R+γPV
[ V ( s 1 ) V ( s 2 ) ⋯ V ( s n ) ] = [ r ( s 1 ) r ( s 2 ) ⋯ r ( s n ) ] + γ [ P ( s 1 ∣ s 1 ) p ( s 2 ∣ s 1 ) … P ( s n ∣ s 1 ) P ( s 1 ∣ s 2 ) P ( s 2 ∣ s 2 ) … P ( s n ∣ s 2 ) ⋯ P ( s 1 ∣ s n ) P ( s 2 ∣ s n ) … P ( s n ∣ s n ) ] [ V ( s 1 ) V ( s 2 ) … V ( s n ) ] \begin{aligned} \begin{bmatrix} V(s_1) \\ V(s_2) \\ \cdots \\ V(s_n) \end{bmatrix}= \begin{bmatrix} r(s_1) \\ r(s_2) \\ \cdots \\ r(s_n) \end{bmatrix}+\gamma \begin{bmatrix} P(s_1|s_1) & p(s_2|s_1) & \ldots & P(s_n|s_1) \\ P(s_1|s_2) & P(s_2|s_2) & \ldots & P(s_n|s_2) \\ \cdots \\ P(s_1|s_n) & P(s_2|s_n) & \ldots & P(s_n|s_n) \end{bmatrix} \begin{bmatrix} V(s_1) \\ V(s_2) \\ \ldots \\ V(s_n) \end{bmatrix} \end{aligned} V(s1)V(s2)V(sn) = r(s1)r(s2)r(sn) +γ P(s1s1)P(s1s2)P(s1sn)p(s2s1)P(s2s2)P(s2sn)P(sns1)P(sns2)P(snsn) V(s1)V(s2)V(sn)
   我们可以直接根据矩阵运算求解,得到以下解析解:
V = R + γ P V ( I − γ P ) V = R V = ( I − γ P ) − 1 R \begin{aligned} \mathcal{V} & =\mathcal{R}+\gamma\mathcal{P}\mathcal{V} \\ (I-\gamma\mathcal{P})\mathcal{V} & =\mathcal{R} \\ \mathcal{V} & =(I-\gamma\mathcal{P})^{-1}\mathcal{R} \end{aligned} V(IγP)VV=R+γPV=R=(IγP)1R
   以上解析解的计算复杂度是 O ( n 3 ) O(n^{3}) O(n3),其中 n n n是状态个数,因此这种方法只适用很小的马尔可夫奖励过程。求解较大规模的马尔可夫奖励过程中的价值函数时,可以使用动态规划(dynamic programming)算法、蒙特卡洛方法(Monte-Carlo method)和时序差分(temporal difference)
   接下来编写代码来实现求解价值函数的解析解方法,并据此计算该马尔可夫奖励过程中所有状态的价值。

def compute(P, rewards, gamma, states_num):''' 利用贝尔曼方程的矩阵形式计算解析解,states_num是MRP的状态数 '''rewards = np.array(rewards).reshape((-1, 1))  #将rewards写成列向量形式value = np.dot(np.linalg.inv(np.eye(states_num, states_num) - gamma * P),rewards)return valueV = compute(P, rewards, gamma, 6)
print("MRP中每个状态价值分别为\n", V)
MRP中每个状态价值分别为[[-2.01950168][-2.21451846][ 1.16142785][10.53809283][ 3.58728554][ 0.        ]]

  根据以上代码,求解得到各个状态的价值 V ( s ) V(s) V(s),具体如下:
[ V ( s 1 ) V ( s 2 ) V ( s 3 ) V ( s 4 ) V ( s 5 ) V ( s 6 ) ] = [ − 2.02 − 2.21 1.16 10.54 3.59 0 ] \begin{bmatrix} V(s_1) \\ V(s_2) \\ V(s_3) \\ V(s_4) \\ V(s_5) \\ V(s_6) \end{bmatrix}= \begin{bmatrix} -2.02 \\ -2.21 \\ 1.16 \\ 10.54 \\ 3.59 \\ 0 \end{bmatrix} V(s1)V(s2)V(s3)V(s4)V(s5)V(s6) = 2.022.211.1610.543.590
  我们现在用贝尔曼方程来进行简单的验证。例如,对于状态 s 4 s_4 s4来说,当 γ = 0.5 \gamma=0.5 γ=0.5时,有
V ( s 4 ) = r ( s 4 ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s 4 ) V ( s ′ ) 10.54 = 10 + 0.5 × ( 0.7 × 0 + 0.3 × 3.59 ) V(s_{4})=r(s_{4})+\gamma\sum_{s^{\prime}\in\mathcal{S}}P(s^{\prime}|s_{4})V(s^{\prime})\\ 10.54=10+0.5\times(0.7\times0+0.3\times3.59) V(s4)=r(s4)+γsSP(ss4)V(s)10.54=10+0.5×(0.7×0+0.3×3.59)
  可以发现左右两边的值几乎是相等的,说明我们求解得到的价值函数是满足状态为 s 4 s_4 s4时的贝尔曼方程。可以自行验证在其他状态时贝尔曼方程是否也成立。若贝尔曼方程对于所有状态都成立,就可以说明我们求解得到的价值函数是正确的。除了使用动态规划算法,马尔可夫奖励过程中的价值函数也可以通过蒙特卡洛方法估计得到。

四、马尔可夫决策过程

  上述讨论到的马尔可夫过程和马尔可夫奖励过程都是自发改变的随机过程;而如果有一个外界的“刺激”来共同改变这个随机过程,就有了马尔可夫决策过程(Markov decision process,MDP)。我们将这个来自外界的刺激称为智能体(agent)的动作,在马尔可夫奖励过程(MRP)的基础上加入动作,就得到了马尔可夫决策过程(MDP)。马尔可夫决策过程由元组 ⟨ S , A , P , r , γ ⟩ \langle\mathcal{S},\mathcal{A},P,r,\gamma\rangle S,A,P,r,γ构成,其中:\

  • S \mathcal{S} S是状态的集合;
  • A \mathcal{A} A是动作的集合;
  • γ \gamma γ是折扣因子;
  • r ( s , a ) r(s,a) r(s,a)是奖励函数,此时奖励可以同时取决于状态 s s s和动作 a a a,在奖励函数只取决于状态 s s s时,则退化为 r ( s ) r(s) r(s)
  • P ( s ′ ∣ s , a ) P(s^{\prime}|s,a) P(ss,a)是状态转移函数,表示在状态 s s s执行动作 a a a之后到达状态 s ′ s^{\prime} s的概率。

  我们发现 MDP 与 MRP 非常相像,主要区别为 MDP 中的状态转移函数和奖励函数都比 MRP 多了动作 a a a作为自变量。注意,在上面 MDP 的定义中,我们不再使用类似 MRP 定义中的状态转移矩阵方式,而是直接表示成了状态转移函数。这样做一是因为此时状态转移与动作也有关,变成了一个三维数组,而不再是一个矩阵(二维数组);二是因为状态转移函数更具有一般意义,例如,如果状态集合不是有限的,就无法用数组表示,但仍然可以用状态转移函数表示。在之后的课程学习中会遇到连续状态的 MDP 环境,那时状态集合都不是有限的。现在我们主要关注于离散状态的 MDP 环境,此时状态集合是有限的。
  不同于马尔可夫奖励过程,在马尔可夫决策过程中,通常存在一个智能体来执行动作。马尔可夫决策过程是一个与时间相关的不断进行的过程,在智能体和环境 MDP 之间存在一个不断交互的过程。一般而言,它们之间的交互是如图所示的循环过程:智能体根据当前状态 S t S_t St选择动作 A t A_t At;对于状态 S t S_t St和动作 A t A_t At,MDP 根据奖励函数和状态转移函数得到 S t = 1 S_{t=1} St=1 R t R_t Rt并反馈给智能体。智能体的目标是最大化得到的累计奖励。智能体根据当前状态从动作的集合 A \mathcal{A} A中选择一个动作的函数,被称为策略
在这里插入图片描述

4.1 策略

  智能体的策略(Policy)通常用字母 π \pi π表示。策略 π ( a ∣ s ) = P ( A t ˙ = a ∣ S t ˙ = s ) \pi(a|s)=P(A_{\dot{t}}=a|S_{\dot{t}}=s) π(as)=P(At˙=aSt˙=s)是一个函数,表示在输入状态 s s s情况下采取动作 a a a的概率。当一个策略是确定性策略(deterministic policy)时,它在每个状态时只输出一个确定性的动作,即只有该动作的概率为 1,其他动作的概率为 0;当一个策略是随机性策略(stochastic policy)时,它在每个状态时输出的是关于动作的概率分布,然后根据该分布进行采样就可以得到一个动作。在 MDP 中,由于马尔可夫性质的存在,策略只需要与当前状态有关,不需要考虑历史状态。

  回顾一下在 MRP 中的价值函数,在 MDP 中也同样可以定义类似的价值函数。但此时的价值函数与策略有关,这意为着对于两个不同的策略来说,它们在同一个状态下的价值也很可能是不同的。这很好理解,因为不同的策略会采取不同的动作,从而之后会遇到不同的状态,以及获得不同的奖励,所以它们的累积奖励的期望也就不同,即状态价值不同。

4.2 状态价值函数

  我们用 V π ( s ) V^{\pi}(s) Vπ(s)表示在 MDP 中基于策略 π \pi π状态价值函数(state-value function),定义为从状态 s s s出发遵循策略 π \pi π能获得的期望回报,数学表达为:
V π ( s ) = E π [ G t ∣ S t = s ] V^{\pi}(s)=\mathbb{E}_{\pi}[G_{t}|S_{t}=s] Vπ(s)=Eπ[GtSt=s]
  

4.3 动作价值函数

  不同于 MRP,在 MDP 中,由于动作的存在,我们额外定义一个动作价值函数(action-value function)。我们用 Q π ( s , a ) Q^{\pi}(s,a) Qπ(s,a)表示在 MDP 遵循策略 π \pi π时,对当前状态 s s s执行动作 a a a得到的期望回报:
Q π ( s , a ) = E π [ G t ∣ S t = s , A t = a ] Q^\pi(s,a)=\mathbb{E}_\pi[G_t|S_t=s,A_t=a] Qπ(s,a)=Eπ[GtSt=s,At=a]
  状态价值函数和动作价值函数之间的关系:
  在使用策略 π \pi π中,状态 s s s的价值等于在该状态下基于策略 π \pi π采取所有动作的概率与相应的价值相乘再求和的结果:
V π ( s ) = ∑ a ∈ A π ( a ∣ s ) Q π ( s , a ) V^\pi(s)=\sum_{a\in A}\pi(a|s)Q^\pi(s,a) Vπ(s)=aAπ(as)Qπ(s,a)
  在使用策略 π \pi π中,状态 s s s下采取动作 a a a的价值等于即时奖励加上经过衰减后的所有可能的下一个状态的状态转移概率与相应的价值的乘积:
Q π ( s , a ) = r ( s , a ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) V π ( s ′ ) Q^{\pi}(s,a)=r(s,a)+\gamma\sum_{s^{\prime}\in S}P(s^{\prime}|s,a)V^{\pi}(s^{\prime}) Qπ(s,a)=r(s,a)+γsSP(ss,a)Vπ(s)

4.4 贝尔曼期望方程

  在贝尔曼方程中加上“期望”二字是为了与接下来的贝尔曼最优方程进行区分。我们通过简单推导就可以分别得到两个价值函数的贝尔曼期望方程(Bellman Expectation Equation):
V π ( s ) = E π [ R t + γ V π ( S t + 1 ) ∣ S t = s ] = ∑ a ∈ A π ( a ∣ s ) ( r ( s , a ) + γ ∑ s ′ ∈ S p ( s ′ ∣ s , a ) V π ( s ′ ) ) Q π ( s , a ) = E π [ R t + γ Q π ( S t + 1 , A t + 1 ) ∣ S t = s , A t = a ] = r ( s , a ) + γ ∑ s ′ ∈ S p ( s ′ ∣ s , a ) ∑ a ′ ∈ A π ( a ′ ∣ s ′ ) Q π ( s ′ , a ′ ) \begin{aligned} V^{\pi}(s) & =\mathbb{E}_\pi[R_t+\gamma V^\pi(S_{t+1})|S_t=s] \\ & =\sum_{a\in A}\pi(a|s)\left(r(s,a)+\gamma\sum_{s^{\prime}\in S}p(s^{\prime}|s,a)V^{\pi}(s^{\prime})\right) \\ Q^{\pi}(s,a) & =\mathbb{E}_\pi[R_t+\gamma Q^\pi(S_{t+1},A_{t+1})|S_t=s,A_t=a] \\ & =r(s,a)+\gamma\sum_{s^{\prime}\in S}p(s^{\prime}|s,a)\sum_{a^{\prime}\in A}\pi(a^{\prime}|s^{\prime})Q^{\pi}(s^{\prime},a^{\prime}) \end{aligned} Vπ(s)Qπ(s,a)=Eπ[Rt+γVπ(St+1)St=s]=aAπ(as)(r(s,a)+γsSp(ss,a)Vπ(s))=Eπ[Rt+γQπ(St+1,At+1)St=s,At=a]=r(s,a)+γsSp(ss,a)aAπ(as)Qπ(s,a)

  价值函数和贝尔曼方程是强化学习非常重要的组成部分,之后的一些强化学习算法都是据此推导出来的,读者需要明确掌握!

  下图是一个马尔可夫决策过程的简单例子,其中每个深色圆圈代表一个状态,一共有从 s 1 ∼ s 5 s_{1}\sim s_{5} s1s5这 5 个状态。黑色实线箭头代表可以采取的动作,浅色小圆圈代表动作,需要注意,并非在每个状态都能采取所有动作,例如在状态 s 1 s_{1} s1,智能体只能采取“保持 s 1 s_{1} s1”和“前往 s 2 s_{2} s2这两个动作,无法采取其他动作。
在这里插入图片描述
  每个浅色小圆圈旁的数字代表在某个状态下采取某个动作能获得的奖励。虚线箭头代表采取动作后可能转移到的状态,箭头边上的数字代表转移概率,如果没有数字则表示转移概率为 1。例如,在 s 2 s_{2} s2下, 如果采取动作“前往 s 3 s_{3} s3”,就能得到奖励-2,并且转移到 s 3 s_{3} s3;在 s 4 s_{4} s4下,如果采取“概率前往”,就能得到奖励 1,并且会分别以概率 0.2, 0.4, 0.4 转移到 s 2 , s 3 或 s 4 s_{2},s_{3}或s_{4} s2,s3s4
  接下来我们编写代码来表示图 3-4 中的马尔可夫决策过程,并定义两个策略。第一个策略是一个完全随机策略,即在每个状态下,智能体会以同样的概率选取它可能采取的动作。例如,在 s 1 s_{1} s1下,智能体会以 0.5 和 0.5 的概率选取动作“保持 s 1 s_{1} s1”和“前往 s 2 s_{2} s2”。第二个策略是一个提前设定的一个策略。

S = ["s1", "s2", "s3", "s4", "s5"]  # 状态集合
A = ["保持s1", "前往s1", "前往s2", "前往s3", "前往s4", "前往s5", "概率前往"]  # 动作集合
# 状态转移函数
P = {"s1-保持s1-s1": 1.0,"s1-前往s2-s2": 1.0,"s2-前往s1-s1": 1.0,"s2-前往s3-s3": 1.0,"s3-前往s4-s4": 1.0,"s3-前往s5-s5": 1.0,"s4-前往s5-s5": 1.0,"s4-概率前往-s2": 0.2,"s4-概率前往-s3": 0.4,"s4-概率前往-s4": 0.4,
}
# 奖励函数
R = {"s1-保持s1": -1,"s1-前往s2": 0,"s2-前往s1": -1,"s2-前往s3": -2,"s3-前往s4": -2,"s3-前往s5": 0,"s4-前往s5": 10,"s4-概率前往": 1,
}
gamma = 0.5  # 折扣因子
MDP = (S, A, P, R, gamma)# 策略1,随机策略
Pi_1 = {"s1-保持s1": 0.5,"s1-前往s2": 0.5,"s2-前往s1": 0.5,"s2-前往s3": 0.5,"s3-前往s4": 0.5,"s3-前往s5": 0.5,"s4-前往s5": 0.5,"s4-概率前往": 0.5,
}
# 策略2
Pi_2 = {"s1-保持s1": 0.6,"s1-前往s2": 0.4,"s2-前往s1": 0.3,"s2-前往s3": 0.7,"s3-前往s4": 0.5,"s3-前往s5": 0.5,"s4-前往s5": 0.1,"s4-概率前往": 0.9,
}# 把输入的两个字符串通过“-”连接,便于使用上述定义的P、R变量
def join(str1, str2):return str1 + '-' + str2

  接下来我们想要计算该 MDP 下,一个策略 π \pi π的状态价值函数。我们现在有的工具是 MRP 的解析解方法。于是,一个很自然的想法是:给定一个 MDP 和一个策略 π \pi π,我们是否可以将其转化为一个 MRP?答案是肯定的。我们可以将策略的动作选择进行边缘化(marginalization),就可以得到没有动作的 MRP 了。具体来说,对于某一个状态,我们根据策略所有动作的概率进行加权,得到的奖励和就可以认为是一个 MRP 在该状态下的奖励,即:
r ′ ( s ) = ∑ a ∈ A π ( a ∣ s ) r ( s , a ) r^{\prime}(s)=\sum_{a\in\mathcal{A}}\pi(a|s)r(s,a) r(s)=aAπ(as)r(s,a)
  同理,我们计算采取动作的概率与使 s s s转移到 s ′ {s'} s的概率的乘积,再将这些乘积相加,其和就是一个 MRP 的状态从 s s s转移到 s ′ {s'} s的概率:
P ′ ( s ′ ∣ s ) = ∑ a ∈ A π ( a ∣ s ) P ( s ′ ∣ s , a ) P^{\prime}(s^{\prime}|s)=\sum_{a\in\mathcal{A}}\pi(a|s)P(s^{\prime}|s,a) P(ss)=aAπ(as)P(ss,a)
  于是,我们构建得到了一个 MRP: ⟨ S , P ′ , r ′ , γ ⟩ \langle\mathcal{S},P^{\prime},r^{\prime},\gamma\rangle S,P,r,γ。根据价值函数的定义可以发现,转化前的 MDP 的状态价值函数和转化后的 MRP 的价值函数是一样的。于是我们可以用 MRP 中计算价值函数的解析解来计算这个 MDP 中该策略的状态价值函数。
  我们接下来就编写代码来实现该方法,计算用随机策略(也就是代码中的Pi_1)时的状态价值函数。为了简单起见,我们直接给出转化后的 MRP 的状态转移矩阵和奖励函数,感兴趣的读者可以自行验证。

gamma = 0.5
# 转化后的MRP的状态转移矩阵
P_from_mdp_to_mrp = [[0.5, 0.5, 0.0, 0.0, 0.0],[0.5, 0.0, 0.5, 0.0, 0.0],[0.0, 0.0, 0.0, 0.5, 0.5],[0.0, 0.1, 0.2, 0.2, 0.5],[0.0, 0.0, 0.0, 0.0, 1.0],
]
P_from_mdp_to_mrp = np.array(P_from_mdp_to_mrp)
R_from_mdp_to_mrp = [-0.5, -1.5, -1.0, 5.5, 0]V = compute(P_from_mdp_to_mrp, R_from_mdp_to_mrp, gamma, 5)
print("MDP中每个状态价值分别为\n", V)
MDP中每个状态价值分别为[[-1.22555411][-1.67666232][ 0.51890482][ 6.0756193 ][ 0.        ]]

  知道了状态价值函数 V π ( s ) V^{\pi}(s) Vπ(s)后,我们可以计算动作价值函数 Q π ( s , a ) Q^{\pi}(s,a) Qπ(s,a)。例如( s 4 s_4 s4,概率前往)的动作价值为 2.152,根据以下公式可以计算得到:
Q π ( s , a ) = r ( s , a ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) V π ( s ′ ) 2.152 = 1 + 0.5 × [ 0.2 × ( − 1.68 ) + 0.4 × 0.52 + 0.4 × 6.08 ] Q^\pi(s,a)=r(s,a)+\gamma\sum_{s^{\prime}\in\mathcal{S}}P(s^{\prime}|s,a)V_\pi(s^{\prime})\\2.152=1+0.5\times[0.2\times(-1.68)+0.4\times0.52+0.4\times6.08] Qπ(s,a)=r(s,a)+γsSP(ss,a)Vπ(s)2.152=1+0.5×[0.2×(1.68)+0.4×0.52+0.4×6.08]
  这个 MRP 解析解的方法在状态动作集合比较大的时候不是很适用,后面将介绍用动态规划算法来计算得到价值函数。后米娜将介绍用蒙特卡洛方法来近似估计这个价值函数,用蒙特卡洛方法的好处在于我们不需要知道 MDP 的状态转移函数和奖励函数,它可以得到一个近似值,并且采样数越多越准确。

五、蒙特卡洛方法

  蒙特卡洛方法(Monte-Carlo methods)也被称为统计模拟方法,是一种基于概率统计的数值计算方法。运用蒙特卡洛方法时,我们通常使用重复随机抽样,然后运用概率统计方法来从抽样结果中归纳出我们想求的目标的数值估计。一个简单的例子是用蒙特卡洛方法来计算圆的面积。例如,在下图所示的正方形内部随机产生若干个点,细数落在圆中点的个数,圆的面积与正方形面积之比就等于圆中点的个数与正方形中点的个数之比。如果我们随机产生的点的个数越多,计算得到圆的面积就越接近于真实的圆的面积。
在这里插入图片描述
  我们现在介绍如何用蒙特卡洛方法来估计一个策略在一个马尔可夫决策过程中的状态价值函数。回忆一下,一个状态的价值是它的期望回报,那么一个很直观的想法就是用策略在 MDP 上采样很多条序列,计算从这个状态出发的回报再求其期望就可以了,公式如下:
V π ( s ) = E π [ G t ∣ S t = s ] ≈ 1 N ∑ i = 1 N G t ( i ) V^\pi(s)=\mathbb{E}_\pi[G_t|S_t=s]\approx\frac{1}{N}\sum_{i=1}^NG_t^{(i)} Vπ(s)=Eπ[GtSt=s]N1i=1NGt(i)
  在一条序列中,可能没有出现过这个状态,可能只出现过一次这个状态,也可能出现过很多次这个状态。我们介绍的蒙特卡洛价值估计方法会在该状态每一次出现时计算它的回报。还有一种选择是一条序列只计算一次回报,也就是这条序列第一次出现该状态时计算后面的累积奖励,而后面再次出现该状态时,该状态就被忽略了。假设我们现在用策略 π \pi π从状态 s s s开始采样序列,据此来计算状态价值。我们为每一个状态维护一个计数器和总回报,计算状态价值的具体过程如下所示。
  (1) 使用策略 π \pi π采样若干条序列:
s 0 ( i ) ⟶ ⁡ a 0 ( i ) r 0 ( i ) , s 1 ( i ) ⟶ ⁡ a 1 ( i ) r 1 ( i ) , s 2 ( i ) ⟶ ⁡ a 2 ( i ) ⋯ ⟶ ⁡ a T − 1 ( i ) r T − 1 ( i ) , s T ( i ) s_0^{(i)}\overset{a_0^{(i)}}{\operatorname*{\longrightarrow}}r_0^{(i)},s_1^{(i)}\overset{a_1^{(i)}}{\operatorname*{\longrightarrow}}r_1^{(i)},s_2^{(i)}\overset{a_2^{(i)}}{\operatorname*{\longrightarrow}}\cdots\overset{a_{T-1}^{(i)}}{\operatorname*{\longrightarrow}}r_{T-1}^{(i)},s_T^{(i)} s0(i)a0(i)r0(i),s1(i)a1(i)r1(i),s2(i)a2(i)aT1(i)rT1(i),sT(i)
  (2) 对每一条序列中的每一时间步 t t t的状态 s s s进行以下操作:

  • 更新状态 s s s的计数器 N ( s ) ← N ( s ) + 1 N(s)\leftarrow N(s)+1 N(s)N(s)+1
  • 更新状态 s s s的总回报 M ( s ) ← M ( s ) + G t M(s)\leftarrow M(s)+G_t M(s)M(s)+Gt
      (3) 每一个状态的价值被估计为回报的平均值 V ( s ) = M ( s ) / N ( s ) V(s)=M(s)/N(s) V(s)=M(s)/N(s)

  根据大数定律,当 N ( s ) → ∞ N(s)\to\infty N(s),有 V ( s ) → V π ( s ) V(s)\to V^{\pi}(s) V(s)Vπ(s) 。计算回报的期望时,除了可以把所有的回报加起来除以次数,还有一种增量更新的方法。对于每个状态 s s s和对应回报 G \mathrm{G} G,进行如下计算:

  • N ( s ) ← N ( s ) + 1 N(s)\leftarrow N(s)+1 N(s)N(s)+1
  • V ( s ) ← V ( s ) + 1 N ( s ) ( G − V ( S ) ) V(s)\leftarrow V(s)+\frac{1}{N(s)}(G-V(S)) V(s)V(s)+N(s)1(GV(S))
      接下来我们用代码定义一个采样函数。采样函数需要遵守状态转移矩阵和相应的策略,每次将(s,a,r,s_next)元组放入序列中,直到到达终止序列。然后我们通过该函数,用随机策略在图的 MDP 中随机采样几条序列。
def sample(MDP, Pi, timestep_max, number):''' 采样函数,策略Pi,限制最长时间步timestep_max,总共采样序列数number '''S, A, P, R, gamma = MDPepisodes = []for _ in range(number):episode = []timestep = 0s = S[np.random.randint(4)]  # 随机选择一个除s5以外的状态s作为起点# 当前状态为终止状态或者时间步太长时,一次采样结束while s != "s5" and timestep <= timestep_max:timestep += 1rand, temp = np.random.rand(), 0# 在状态s下根据策略选择动作for a_opt in A:temp += Pi.get(join(s, a_opt), 0)if temp > rand:a = a_optr = R.get(join(s, a), 0)breakrand, temp = np.random.rand(), 0# 根据状态转移概率得到下一个状态s_nextfor s_opt in S:temp += P.get(join(join(s, a), s_opt), 0)if temp > rand:s_next = s_optbreakepisode.append((s, a, r, s_next))  # 把(s,a,r,s_next)元组放入序列中s = s_next  # s_next变成当前状态,开始接下来的循环episodes.append(episode)return episodes# 采样5次,每个序列最长不超过20步
episodes = sample(MDP, Pi_1, 20, 5)
print('第一条序列\n', episodes[0])
print('第二条序列\n', episodes[1])
print('第五条序列\n', episodes[4])
第一条序列[('s1', '前往s2', 0, 's2'), ('s2', '前往s3', -2, 's3'), ('s3', '前往s5', 0, 's5')]
第二条序列[('s4', '概率前往', 1, 's4'), ('s4', '前往s5', 10, 's5')]
第五条序列[('s2', '前往s3', -2, 's3'), ('s3', '前往s4', -2, 's4'), ('s4', '前往s5', 10, 's5')]
# 对所有采样序列计算所有状态的价值
def MC(episodes, V, N, gamma):for episode in episodes:G = 0for i in range(len(episode) - 1, -1, -1):  #一个序列从后往前计算(s, a, r, s_next) = episode[i]G = r + gamma * GN[s] = N[s] + 1V[s] = V[s] + (G - V[s]) / N[s]timestep_max = 20
# 采样1000次,可以自行修改
episodes = sample(MDP, Pi_1, timestep_max, 1000)
gamma = 0.5
V = {"s1": 0, "s2": 0, "s3": 0, "s4": 0, "s5": 0}
N = {"s1": 0, "s2": 0, "s3": 0, "s4": 0, "s5": 0}
MC(episodes, V, N, gamma)
print("使用蒙特卡洛方法计算MDP的状态价值为\n", V)
使用蒙特卡洛方法计算MDP的状态价值为{'s1': -1.228923788722258, 's2': -1.6955696284402704, 's3': 0.4823809701532294, 's4': 5.967514743019431, 's5': 0}

六、占用度量

  不同策略的价值函数是不一样的。这是因为对于同一个 MDP,不同策略会访问到的状态的概率分布是不同的。假设例图的 MDP 中现在有一个策略,它的动作执行会使得智能体尽快到达终止状态 s 5 s_5 s5,于是当智能体处于状态 s 3 s_3 s3时,不会采取“前往 s 4 s_4 s4”的动作,而只会以 1 的概率采取“前往 s 5 s_5 s5”的动作,所以智能体也不会获得在 s 4 s_4 s4状态下采取“前往 s 5 s_5 s5”可以得到的很大的奖励 10可想而知,根据贝尔曼方程,这个策略在状态 s 3 s_3 s3的概率会比较小,究其原因是因为它没法到达状态 s 4 s_4 s4。因此我们需要理解不同策略会使智能体访问到不同概率分布的状态这个事实,这会影响到策略的价值函数。
  首先我们定义 MDP 的初始状态分布为 ν 0 ( s ) \nu_{0}(s) ν0(s),在有些资料中,初始状态分布会被定义进 MDP 的组成元素中。我们用 P t π ( s ) P_{t}^{\pi}(s) Ptπ(s)表示采取策略 π \pi π使得智能体在 t t t时刻状态为 s s s的概率,所以我们有 P 0 π ( s ) = ν 0 ( s ) P_{0}^{\pi}(s)=\nu_{0}(s) P0π(s)=ν0(s),然后就可以定义一个策略的状态访问分布(state visitation distribution)
ν π ( s ) = ( 1 − γ ) ∑ t = 0 ∞ γ t P t π ( s ) \nu^{\pi}(s)=(1-\gamma)\sum_{t=0}^{\infty}\gamma^{t}P_{t}^{\pi}(s) νπ(s)=(1γ)t=0γtPtπ(s)
  其中, 1 − γ 1-\gamma 1γ是用来使得概率加和为1的归一化因子。状态访问概率表示一个策略和 MDP 交互会访问到的状态的分布。需要注意的是,理论上在计算该分布时需要交互到无穷步之后,但实际上智能体和 MDP 的交互在一个序列中是有限的。不过我们仍然可以用以上公式来表达状态访问概率的思想,状态访问概率有如下性质:
ν π ( s ′ ) = ( 1 − γ ) ν 0 ( s ′ ) + γ ∫ P ( s ′ ∣ s , a ) π ( a ∣ s ) ν π ( s ) d s d a \nu^{\pi}(s^{\prime})=(1-\gamma)\nu_{0}(s^{\prime})+\gamma\int P(s^{\prime}|s,a)\pi(a|s)\nu^{\pi}(s)dsda νπ(s)=(1γ)ν0(s)+γP(ss,a)π(as)νπ(s)dsda
  此外,我们还可以定义策略的占用度量(occupancy measure)
ρ π ( s , a ) = ( 1 − γ ) ∑ t = 0 ∞ γ t P t π ( s ) π ( a ∣ s ) \rho^{\pi}(s,a)=(1-\gamma)\sum_{t=0}^{\infty}\gamma^{t}P_{t}^{\pi}(s)\pi(a|s) ρπ(s,a)=(1γ)t=0γtPtπ(s)π(as)
  它表示动作状态对 ( s , a ) \begin{pmatrix}{s,a}\end{pmatrix} (s,a)被访问到的概率。二者之间存在如下关系:
ρ π ( s , a ) = ν π ( s ) π ( a ∣ s ) \rho^{\pi}(s,a)=\nu^{\pi}(s)\pi(a|s) ρπ(s,a)=νπ(s)π(as)
  接下来我们编写代码来近似估计占用度量。这里我们采用近似估计,即设置一个较大的采样轨迹长度的最大值,然后采样很多次,用状态动作对出现的频率估计实际概率。

def occupancy(episodes, s, a, timestep_max, gamma):''' 计算状态动作对(s,a)出现的频率,以此来估算策略的占用度量 '''rho = 0total_times = np.zeros(timestep_max)  # 记录每个时间步t各被经历过几次occur_times = np.zeros(timestep_max)  # 记录(s_t,a_t)=(s,a)的次数for episode in episodes:for i in range(len(episode)):(s_opt, a_opt, r, s_next) = episode[i]total_times[i] += 1if s == s_opt and a == a_opt:occur_times[i] += 1for i in reversed(range(timestep_max)):if total_times[i]:rho += gamma**i * occur_times[i] / total_times[i]return (1 - gamma) * rhogamma = 0.5
timestep_max = 1000episodes_1 = sample(MDP, Pi_1, timestep_max, 1000)
episodes_2 = sample(MDP, Pi_2, timestep_max, 1000)
rho_1 = occupancy(episodes_1, "s4", "概率前往", timestep_max, gamma)
rho_2 = occupancy(episodes_2, "s4", "概率前往", timestep_max, gamma)
print(rho_1, rho_2)
0.112567796310472 0.23199480615618912

  通过以上结果可以发现,不同策略对于同一个状态动作对的占用度量是不一样的。

七、最优策略

  强化学习的目标通常是找到一个策略,使得智能体从初始状态出发能获得最多的期望回报。我们首先定义策略之间的偏序关系:当且仅当对于任意的状态 s s s都有 V π ( s ) ≥ V π ′ ( s ) V^{\pi}(s)\geq V^{\pi^{\prime}}(s) Vπ(s)Vπ(s) ,记 π > π ′ \pi>\pi^{\prime} π>π。于是在有限状态和动作集合的 MDP 中,至少存在一个策略比其他所有策略都好或者至少存在一个策略不差于其他所有策略,这个策略就是最优策略(optimal policy)。最优策略可能有很多个,我们都将其表示为 π ∗ ( s ) \pi^{*}(s) π(s)
  最优策略都有相同的状态价值函数,我们称之为最优状态价值函数,表示为:
V ∗ ( s ) = max ⁡ π V π ( s ) , ∀ s ∈ S V^{*}(s)=\operatorname*{max}_{\pi}V^{\pi}(s),\quad\forall s\in\mathcal{S} V(s)=πmaxVπ(s),sS
  同理,我们定义最优动作价值函数
Q ∗ ( s , a ) = max ⁡ π Q π ( s , a ) , ∀ s ∈ S , a ∈ A Q^{*}(s,a)=\max_{\pi}Q^{\pi}(s,a),\quad\forall s\in\mathcal{S},a\in\mathcal{A} Q(s,a)=πmaxQπ(s,a),sS,aA
  为了使 Q π ( s , a ) Q^{\pi}(s,a) Qπ(s,a)最大,我们需要在当前的状态动作 ( s , a ) \begin{pmatrix}{s,a}\end{pmatrix} (s,a)之后都执行最优策略。于是我们得到了最优状态价值函数和最优动作价值函数之间的关系:
Q ∗ ( s , a ) = r ( s , a ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) V ∗ ( s ′ ) Q^{*}(s,a)=r(s,a)+\gamma\sum_{s^{\prime}\in S}P(s^{\prime}|s,a)V^{*}(s^{\prime}) Q(s,a)=r(s,a)+γsSP(ss,a)V(s)
  这与在普通策略下的状态价值函数和动作价值函数之间的关系是一样的。另一方面,最优状态价值是选择此时使最优动作价值最大的那一个动作时的状态价值:
V ∗ ( s ) = max ⁡ a ∈ A Q ∗ ( s , a ) V^{*}(s)=\max_{a\in\mathcal{A}}Q^{*}(s,a) V(s)=aAmaxQ(s,a)

八、贝尔曼最优方程

  根据 V ∗ ( s ) V^{*}(s) V(s) Q ∗ ( s , a ) Q^{*}(s,a) Q(s,a)的关系,我们可以得到贝尔曼最优方程(Bellman optimality equation)
V ∗ ( s ) = max ⁡ a ∈ A { r ( s , a ) + γ ∑ s ′ ∈ S p ( s ′ ∣ s , a ) V ∗ ( s ′ ) } Q ∗ ( s , a ) = r ( s , a ) + γ ∑ s ′ ∈ S p ( s ′ ∣ s , a ) max ⁡ a ′ ∈ A Q ∗ ( s ′ , a ′ ) V^{*}(s)=\max_{a\in\mathcal{A}}\{r(s,a)+\gamma\sum_{s^{\prime}\in\mathcal{S}}p(s^{\prime}|s,a)V^{*}(s^{\prime})\}\\ Q^{*}(s,a)=r(s,a)+\gamma\sum_{s^{\prime}\in\mathcal{S}}p(s^{\prime}|s,a)\max_{a^{\prime}\in\mathcal{A}}Q^{*}(s^{\prime},a^{\prime}) V(s)=aAmax{r(s,a)+γsSp(ss,a)V(s)}Q(s,a)=r(s,a)+γsSp(ss,a)aAmaxQ(s,a)


http://www.ppmy.cn/server/151529.html

相关文章

解决 Ubuntu 20.04 上编译 OpenCV 3.2 时的类型不匹配错误

解决 Ubuntu 20.04 上编译 OpenCV 3.2 时的类型不匹配错误 make[2]: *** [modules/python3/CMakeFiles/opencv_python3.dir/build.make:329&#xff1a;modules/python3/CMakeFiles/opencv_python3.dir/__/src2/cv2.cpp.o] 错误 1 make[1]: *** [CMakeFiles/Makefile2:11856&a…

SpringBoot feign基于HttpStatus重试

场景 基于springboot开发的项目&#xff0c;对接第三方&#xff0c;第三方的接口有限流策略&#xff0c;某个时间段内有调用频率限制&#xff0c;返回的状态码HttpStatus不是200&#xff0c;而HttpStatus是429。现基于HttpStatus我们发起的重试。 技术点 springbootfeign fe…

机器学习周报(12.9-12.15)

文章目录 摘要Abstract 1 Swin Transformer1.1 输入1.2 Patch Partition1.3 Linear Embedding1.4 Patch Merging1.5 Swin Transformer Block1.6 代码总结 摘要 本篇博客介绍了采用类似于卷积核的移动窗口进行图像特征提取的Swin Transformer网络模型&#xff0c;这是一种基于T…

前端使用xlsx.js实现 Excel 文件的导入与导出功能

前端使用xlsx.js实现 Excel 文件的导入与导出功能 在现代的 Web 开发中&#xff0c;处理文件上传和导出功能已经变得越来越常见&#xff0c;尤其是 Excel 文件的导入与导出。 我们将使用 Vue.js 和 XLSX.js 库来处理 Excel 文件的读取和生成。XLSX.js 是一个强大的 JavaScrip…

基于python对网页进行爬虫简单教程

python对网页进行爬虫 基于BeautifulSoup的爬虫—源码 """ 基于BeautifulSoup的爬虫### 一、BeautifulSoup简介1. Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱&#xff0c;通过解析文档为用户提供需要…

python模拟练习第一期

问题一 如果一个数 p 是个质数&#xff0c;同时又是整数 a的约数&#xff0c;则 p 称为 a的一个质因数。 请问 2024 有多少个质因数&#xff1f; 步骤 1: 分解 2024 首先&#xff0c;2024 是偶数&#xff0c;说明可以被 2 整除。我们从 2 开始进行除法分解&#xff1a; 202…

springcloud-gateway获取应用响应信息乱码

客户端通过springcloud gateway跳转访问tongweb上的应用&#xff0c;接口响应信息乱码。使用postman直接访问tongweb上的应用&#xff0c;响应信息显示正常。 用户gateway中自定义了实现GlobalFilter的Filter类&#xff0c;在该类中获取了上游应用接口的响应信息&#xff0c;直…

CRMEB PHP多商户版DOCKER部署实战

#首先&#xff0c;制作docker 镜像# 官方有一个镜像&#xff0c;但是拉不来下&#xff0c;也不知道是没是没有维护&#xff0c;嘎了。只能自己动手做一个。 这里选择ubuntu 24 为基础&#xff0c;制作crmeb-mer的镜像&#xff0c;Dockerfile内容如下&#xff1a; # 使用官方…