马尔可夫决策过程

目录

简介

马尔可夫决策过程(Markov decision process,MDP)是强化学习的重要概念。要学好强化学习,我们首先要掌握马尔可夫决策过程的基础知识。前两章所说的强化学习中的环境一般就是一个马尔可夫决策过程。与多臂老虎机问题不同,马尔可夫决策过程包含状态信息以及状态之间的转移机制

​ 如果要用强化学习去解决一个实际问题,第一步要做的事情就是把这个实际问题抽象为一个马尔可夫决策过程,也就是明确马尔可夫决策过程的各个组成要素。本章将从马尔可夫过程出发,一步一步地进行介绍,最后引出马尔可夫决策过程。

马尔可夫过程

随机过程

​ 随机过程(stochastic process)是概率论的"动力学"部分。概率论的研究对象是静态的随机现象,而随机过程的研究对象是随时间演变的随机现象(例如天气随时间的变化、城市交通随时间的变化)。

​ 在随机过程中,随机现象在某时刻 t t t 的取值是一个向量随机变量,用 S t S_t St 表示,所有可能的状态组成状态集合 S \mathcal{S} S 。随机现象便是状态的变化过程

​ 在某时刻 t t t 的状态 S t S_t St 通常取决于 t t t 时刻之前的状态。我们将已知历史信息 ( S 1 , … , S t ) \left(S_1, \ldots, S_t\right) (S1,,St) 时下一个时刻状态为 S t + 1 S_{t+1} St+1 的概率表示成:
P ( S t + 1 ∣ S 1 , … , S t ) P\left(S_{t+1} \mid S_1, \ldots, S_t\right) P(St+1S1,,St)

马尔可夫性质

​ 当且仅当某时刻的状态只取决于上一时刻的状态时,一个随机过程被称为具有马尔可夫性质(Markov property),用公式表示为:
P ( S t + 1 ∣ S t ) = P ( S t + 1 ∣ S 1 , … , S t ) P\left(S_{t+1} \mid S_t\right)=P\left(S_{t+1} \mid S_1, \ldots, S_t\right) P(St+1St)=P(St+1S1,,St)
​ 也就是说,当前状态是未来的充分统计量,即下一个状态只取决于当前状态,而不会受到过去状态的影响。

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

马尔可夫过程

马尔可夫过程(Markov process)指具有马尔可夫性质的随机过程,也被称为马尔可夫链 (Markov chain)。我们通常用元组 ⟨ S , P ⟩ \langle\mathcal{S}, \mathcal{P}\rangle 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}=\left\{s_1, s_2, \ldots, s_n\right\} 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}=\left[\begin{array}{ccc} P\left(s_1 \mid s_1\right) & \cdots & P\left(s_n \mid s_1\right) \\ \vdots & \ddots & \vdots \\ P\left(s_1 \mid s_n\right) & \cdots & P\left(s_n \mid s_n\right) \end{array}\right] P= P(s1s1)P(s1sn)P(sns1)P(snsn)

​ 矩阵 P \mathcal{P} P 中第 i i i 行第 j j j 列元素 P ( s j ∣ s i ) = P ( S t + 1 = s j ∣ S t = s i ) P\left(s_j \mid s_i\right)=P\left(S_{t+1}=s_j \mid S_t=s_i\right) P(sjsi)=P(St+1=sjSt=si) 表示从状态 s i s_i si 转移到状态 s j s_j sj 的概率,我们称 P ( s ′ ∣ s ) P\left(s^{\prime} \mid s\right) P(ss)状态转移函数。从某个状态出发,到达其他状态的概率和必须为 1 ,即状态转移矩阵 P \mathcal{P} P 的每一行的和为 1 。

​ 下图是一个具有 6 个状态的马尔可夫过程的简单例子。其中每个绿色圆圈表示一个状态,每个状态都有一定概率(包括概率为 0 )转移到其他状态,其中 s 6 s_6 s6 通常被称为终止状态(terminal state),因为它不会再转移到其他状态,可以理解为它永远以概率 1 转移到自己。状态之间的虚线箭头表示状态的转移,箭头旁的数字表示该状态转移发生的概率。从每个状态出发转移到其他状态的概率总和为 1 。例如, s 1 s_1 s1 90 % 90 \% 90% 概率保持不变,有 10 % 10 \% 10% 概率转移到 s 2 s_2 s2 ,而在 s 2 s_2 s2 又有 50 % 50 \% 50%概率回到 s 1 s_1 s1 ,有 50 % 50 \% 50% 概率转移到 s 3 s_3 s3

img

我们可以写出这个马尔可夫过程的状态转移矩阵
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}=\left[\begin{array}{cccccc} 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{array}\right] 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 3 → s 6 s_1 \rightarrow s_1 \rightarrow s_2 \rightarrow s_3 \rightarrow s_4 \rightarrow s_5 \rightarrow s_3 \rightarrow s_6 s1s1s2s3s4s5s3s6 等。生成这些序列的概率和状态转移矩阵有关。

马尔可夫奖励过程

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

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

回报

​ 在一个马尔可夫奖励过程中,从第 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^2 R_{t+2}+\cdots=\sum_{k=0}^{\infty} \gamma^k R_{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 之后奖励为零,并且此时序列也终止了。

img

​ 比如选取 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 ) + 0. 5 3 × ( 0 ) = − 2.5 G_1=-1+0.5 \times(-2)+0.5^2 \times(-2)+0.5^3 \times(0)=-2.5 G1=1+0.5×(2)+0.52×(2)+0.53×(0)=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)
# 定义奖励函数
rewards = [-1, -2, -2, 10, 1, 0] # s1,s2,s3,s4,s5,s6
# 定义折扣因子
gamma = 0.5
# 给定一条序列,计算从某个索引(起始状态)开始到序列最后(终止状态)得到的回报
def compute_return(start_index, chain, gamma):
    G = 0
    for i in reversed(range(start_index, len(chain))):
        G = gamma * G + rewards[chain[i] - 1] #从后往前计算return
    return G

# main函数
chain = [1,2,3,6]
start_index = 0
G = compute_return(start_index, chain, gamma)
print("根据本序列计算得到回报为:%s。" % G)
根据本序列计算得到回报为:-2.5

价值函数

​ 在马尔可夫奖励过程中,一个状态的期望回报(即从这个状态出发的未来累积奖励的期望)被称为这个状态的价值(value)。所有状态的价值就组成了价值函数(value function),价值函数的输入为某个状态,输出为这个状态的价值。我们将价值函数写成:
V ( s ) = E [ G t ∣ S t = s ] V(s)=\mathbb{E}\left[G_t \mid S_t=s\right] 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}\left[G_t \mid S_t=s\right] \\ & =\mathbb{E}\left[R_t+\gamma R_{t+1}+\gamma^2 R_{t+2}+\ldots \mid S_t=s\right] \\ & =\mathbb{E}\left[R_t+\gamma\left(R_{t+1}+\gamma R_{t+2}+\ldots\right) \mid S_t=s\right] \\ & =\mathbb{E}\left[R_t+\gamma G_{t+1} \mid S_t=s\right] \\ & =\mathbb{E}\left[R_t+\gamma V\left(S_{t+1}\right) \mid S_t=s\right] \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]

​ 在上式的最后一个等号中,一方面,即时奖励的期望正是奖励函数的输出,即 E [ R t ∣ S t = s ] = r ( s ) \mathbb{E}\left[R_t \mid S_t=s\right]=r(s) E[RtSt=s]=r(s) ;另一方面,等式中剩余部分 E [ γ V ( S t + 1 ) ∣ S t = s ] \mathbb{E}\left[\gamma V\left(S_{t+1}\right) \mid S_t=s\right] 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\left(s^{\prime} \mid s\right) V\left(s^{\prime}\right) V(s)=r(s)+γsSp(ss)V(s)

​ 上式就是马尔可夫奖励过程中非常有名的贝尔曼方程(Bellman equation),对每一个状态都成立。若一个马尔可夫奖励过程一共有 n n n 个状态,即 S = { s 1 , s 2 , … , s n } \mathcal{S}=\left\{s_1, s_2, \ldots, s_n\right\} S={s1,s2,,sn} ,我们将所有状态的价值表示成一个列向量:
V = [ V ( s 1 ) , V ( s 2 ) , … , V ( s n ) ] T \mathcal{V}=\left[V\left(s_1\right), V\left(s_2\right), \ldots, V\left(s_n\right)\right]^T V=[V(s1),V(s2),,V(sn)]T
同理,将奖励函数写成一个列向量:
R = [ r ( s 1 ) , r ( s 2 ) , … , r ( s n ) ] T \mathcal{R}=\left[r\left(s_1\right), r\left(s_2\right), \ldots, r\left(s_n\right)\right]^T R=[r(s1),r(s2),,r(sn)]T
于是我们可以将贝尔曼方程写成矩阵的形式
V = R + γ P V [ 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{gathered} \mathcal{V}=\mathcal{R}+\gamma \mathcal{P} \mathcal{V} \\ {\left[\begin{array}{c} V\left(s_1\right) \\ V\left(s_2\right) \\ \ldots \\ V\left(s_n\right) \end{array}\right]=\left[\begin{array}{c} r\left(s_1\right) \\ r\left(s_2\right) \\ \ldots \\ r\left(s_n\right) \end{array}\right]+\gamma\left[\begin{array}{cccc} P\left(s_1 \mid s_1\right) & p\left(s_2 \mid s_1\right) & \ldots & P\left(s_n \mid s_1\right) \\ P\left(s_1 \mid s_2\right) & P\left(s_2 \mid s_2\right) & \ldots & P\left(s_n \mid s_2\right) \\ \ldots & & & \\ P\left(s_1 \mid s_n\right) & P\left(s_2 \mid s_n\right) & \ldots & P\left(s_n \mid s_n\right) \end{array}\right]\left[\begin{array}{c} V\left(s_1\right) \\ V\left(s_2\right) \\ \ldots \\ V\left(s_n\right) \end{array}\right]} \end{gathered} V=R+γPV 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\left(n^3\right) O(n3) ,其中 n n n 是状态个数,因此这种方法只适用很小的马尔可夫奖励过程

​ 求解较大规模的马尔可夫奖励过程中的价值函数时,可以使用动态规划(dynamic programming)算法、蒙特卡洛方法(Monte-Carlo method)和时序差分(temporal difference),这些方法将在之后的章节介绍。

接下来编写代码来实现求解价值函数解析解方法,并据此计算该马尔可夫奖励过程中所有状态的价值

def compute(P, rewards, gamma, states_num):
    """利用贝尔曼方程的矩阵形式计算解析解,states_num是马尔可夫奖励过程MRP的状态数"""
    #将rewards写成列向量形式
    rewards = np.array(rewards).reshape((-1,1))
    #带入上述公式求得解析解:
    value = np.dot(np.linalg.inv(np.eye(states_num, states_num)-gamma*P), rewards)
    #返回所求解
    return value
#main
V = 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 ] \left[\begin{array}{l} V\left(s_1\right) \\ V\left(s_2\right) \\ V\left(s_3\right) \\ V\left(s_4\right) \\ V\left(s_5\right) \\ V\left(s_6\right) \end{array}\right]=\left[\begin{array}{c} -2.02 \\ -2.21 \\ 1.16 \\ 10.54 \\ 3.59 \\ 0 \end{array}\right] 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 ) \begin{aligned} V\left(s_4\right) & =r\left(s_4\right)+\gamma \sum_{s^{\prime} \in \mathcal{S}} P\left(s^{\prime} \mid s_4\right) V\left(s^{\prime}\right) \\ 10.54 & =10+0.5 \times(0.7 \times 0+0.3 \times 3.59) \end{aligned} V(s4)10.54=r(s4)+γsSP(ss4)V(s)=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,γ 构成,其中:

  1. S \mathcal{S} S状态的集合
  2. A \mathcal{A} A动作的集合
  3. γ \gamma γ折扣因子
  4. r ( s , a ) r(s, a) r(s,a)奖励函数,此时奖励可以同时取决于状态 s s s 和动作 a a a ,在奖励函数只取决于状态 s s s时,则退化为 r ( s ) r(s) r(s)
  5. P ( s ′ ∣ s , a ) P\left(s^{\prime} \mid s, a\right) 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选择一个动作的函数,被称为策略

img

策略

智能体的策略(Policy)通常用字母 π \pi π 表示。具体定义为:
π ( a ∣ s ) = P ( A t = a ∣ S t = s ) \pi(a \mid s)=P\left(A_t=a \mid S_t=s\right) π(as)=P(At=aSt=s)
​ 策略 π ( a ∣ s ) = P ( A t = a ∣ S t = s ) \pi(a \mid s)=P\left(A_t=a \mid S_t=s\right) π(as)=P(At=aSt=s) 是一个函数,表示在输入状态 s s s 情况下采取动作 a a a 的概率

​ 当一个策略是确定性策略(deterministic policy)时,它在每个状态时只输出一个确定性的动作,即只有该动作的概率为 1 ,其他动作的概率为 0 ;

​ 当一个策略是随机性策略(stochastic policy)时,它在每个状态时输出关于动作的概率分布,然后根据该分布进行采样就可以得到一个动作。

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

状态价值函数

​ 用 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\left[G_t \mid S_t=s\right] Vπ(s)=Eπ[GtSt=s]
其是关于 π \pi π的函数,也是关于 s s s的函数。

动作价值函数

​ 不同于 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\left[G_t \mid S_t=s, A_t=a\right] Qπ(s,a)=Eπ[GtSt=s,At=a]

状态价值函数动作价值函数之间的关系:

​ 1.在使用策略 π \pi π 中,状态 s s s 的价值等于在该状态下基于策略 π \pi π 采取所有动作的概率与相应的价值相乘再求和:
V π ( s ) = ∑ a ∈ A π ( a ∣ s ) Q π ( s , a ) V^\pi(s)=\sum_{a \in A} \pi(a \mid s) Q^\pi(s, a) Vπ(s)=aAπ(as)Qπ(s,a)

​ 2.使用策略 π \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\left(s^{\prime} \mid s, a\right) V^\pi\left(s^{\prime}\right) Qπ(s,a)=r(s,a)+γsSP(ss,a)Vπ(s)

贝尔曼期望方程

​ 在贝尔曼方程中加上"期望"二字是为了与接下来的贝尔曼最优方程进行区分。我们通过简单推导就可以分别得到状态价值函数动作价值函数贝尔曼期望方程(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 ′ ) ) \begin{aligned} V^\pi(s) & =\mathbb{E}_\pi\left[R_t+\gamma V^\pi\left(S_{t+1}\right) \mid S_t=s\right] \\ & =\sum_{a \in A} \pi(a \mid s)\left(r(s, a)+\gamma \sum_{s^{\prime} \in S} p\left(s^{\prime} \mid s, a\right) V^\pi\left(s^{\prime}\right)\right) \end{aligned} Vπ(s)=Eπ[Rt+γVπ(St+1)St=s]=aAπ(as)(r(s,a)+γsSp(ss,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} Q^\pi(s, a) & =\mathbb{E}_\pi\left[R_t+\gamma Q^\pi\left(S_{t+1}, A_{t+1}\right) \mid S_t=s, A_t=a\right] \\ & =r(s, a)+\gamma \sum_{s^{\prime} \in S} p\left(s^{\prime} \mid s, a\right) \sum_{a^{\prime} \in A} \pi\left(a^{\prime} \mid s^{\prime}\right) Q^\pi\left(s^{\prime}, a^{\prime}\right) \end{aligned} Qπ(s,a)=Eπ[Rt+γQπ(St+1,At+1)St=s,At=a]=r(s,a)+γsSp(ss,a)aAπ(as)Qπ(s,a)

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

img

​ 上图一个马尔可夫决策过程的简单例子,其中每个深色圆圈代表一个状态,一共有从 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 0.2,0.4,0.4 0.2,0.4,0.4 转移到 s 2 , s 3 s_2, s_3 s2,s3 s 4 s_4 s4

​ 接下来我们编写代码来表示上图中的马尔可夫决策过程,并定义两个策略。第一个策略是一个完全随机策略,即在每个状态下,智能体会以同样的概率选取它可能采取的动作。例如,在下,智能体会以 0.5 和 0.5 的概率选取动作“保持s1”和“前往s2”。第二个策略是一个提前设定的一个策略

# 策略2# 状态集合
S = ["s1", "s2", "s3", "s4", "s5"]
# 动作集合
A = ["保持s1", "前往s1", "前往s2", "前往s3", "前往s4", "前往s5", "概率前往"] 
# 状态转移函数P(s'|s,a)
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(s,a)
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 \mid s) r(s, a) r(s)=aAπ(as)r(s,a)

​ 同理,我们计算采取动作的概率与使 s s s 转移到 s ′ s^{\prime} s 的概率的乘积,再将这些乘积相加,其和就是一个 MRP 的状态从 s s s 转移至 s ′ s^{\prime} s 的概率:
P ′ ( s ′ ∣ s ) = ∑ a ∈ A π ( a ∣ s ) P ( s ′ ∣ s , a ) P^{\prime}\left(s^{\prime} \mid s\right)=\sum_{a \in \mathcal{A}} \pi(a \mid s) P\left(s^{\prime} \mid s, a\right) P(ss)=aAπ(as)P(ss,a)

​ 于是,我们构建得到了一个 MRP ⟨ S , P ′ , r ′ , γ ⟩ \left\langle\mathcal{S}, P^{\prime}, r^{\prime}, \gamma\right\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.        ]]=[-1.23,-1.68,0.52,6.08,0.00]

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

占用度量

​ 之前提到,不同策略的价值函数是不一样的。这是因为对于同一个 MDP,不同策略访问到的状态的概率分布是不同的

img

​ 假如上图 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\left(s^{\prime}\right)=(1-\gamma) \nu_0\left(s^{\prime}\right)+\gamma \int P\left(s^{\prime} \mid s, a\right) \pi(a \mid s) \nu^\pi(s) d s d a νπ(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 \mid s) ρπ(s,a)=(1γ)t=0γtPtπ(s)π(as)

它表示动作状态对 ( s , a ) (s, a) (s,a) 被访问到的概率。二者之间存在如下关系:
ρ π ( s , a ) = ν π ( s ) π ( a ∣ s ) \rho^\pi(s, a)=\nu^\pi(s) \pi(a \mid s) ρπ(s,a)=νπ(s)π(as)

进一步得出如下两个定理。

定理1:智能体分别以策略 π 1 \pi_1 π1 π 2 \pi_2 π2 和同一个 MDP 交互得到的占用度量 ρ π 1 \rho^{\pi_1} ρπ1 ρ π 2 \rho^{\pi_2} ρπ2 满足
ρ π 1 = ρ π 2 ⟺ π 1 = π 2 \rho^{\pi_1}=\rho^{\pi_2} \Longleftrightarrow \pi_1=\pi_2 ρπ1=ρπ2π1=π2

定理2:给定一合法占用度量 ρ \rho ρ ,可生成该占用度量的唯一策略
π ρ = ρ ( s , a ) ∑ a ′ ρ ( s , a ′ ) \pi_\rho=\frac{\rho(s, a)}{\sum_{a^{\prime}} \rho\left(s, a^{\prime}\right)} πρ=aρ(s,a)ρ(s,a)

​ 注意:以上提到的"合法"占用度量是指存在一个策略使智能体与 MDP 交互产生的状态动作对被访问到的概率。

接下来我们编写代码来近似估计占用度量。这里我们采用近似估计,即设置一个较大的采样轨迹长度的最大值,然后采样很多次,用状态动作对出现的频率估计实际概率

def occupancy(episodes, s, a, timestep_max, gamma):
    ''' 计算状态动作对(s,a)出现的频率,以此来估算策略的占用度量 '''
    rho = 0
    total_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] += 1
            if s == s_opt and a == a_opt:
                occur_times[i] += 1
    for i in reversed(range(timestep_max)):
        if total_times[i]:
            rho += gamma**i * occur_times[i] / total_times[i]
    return (1 - gamma) * rho

#main
gamma = 0.5
timestep_max = 1000

episodes_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)=\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 ) (s, a) (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\left(s^{\prime} \mid s, a\right) V^*\left(s^{\prime}\right) 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 ′ ) \begin{aligned} V^*(s) & =\max _{a \in \mathcal{A}}\left\{r(s, a)+\gamma \sum_{s^{\prime} \in \mathcal{S}} p\left(s^{\prime} \mid s, a\right) V^*\left(s^{\prime}\right)\right\} \\ Q^*(s, a) & =r(s, a)+\gamma \sum_{s^{\prime} \in \mathcal{S}} p\left(s^{\prime} \mid s, a\right) \max _{a^{\prime} \in \mathcal{A}} Q^*\left(s^{\prime}, a^{\prime}\right) \end{aligned} V(s)Q(s,a)=aAmax{r(s,a)+γsSp(ss,a)V(s)}=r(s,a)+γsSp(ss,a)aAmaxQ(s,a)

后续将介绍如何用动态规划算法得到最优策略。

总结

​ 本章从零开始介绍了马尔可夫决策过程的基础概念知识,并讲解了如何通过求解贝尔曼方程得到状态价值的解析解。马尔可夫决策过程是强化学习中的基础概念,强化学习中的环境就是一个马尔可夫决策过程。我们接下来将要介绍的强化学习算法通常都是在求解马尔可夫决策过程中的最优策略

参考资料

《动手学强化学习》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后厂村路小狗蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值