DeepMind 的马尔可夫决策过程(MDP)课堂笔记

DeepMind Teaching by David Silver

视频课程链接(Youtube资源,需梯子):https://youtu.be/lfHX2hHRMVQ

1. 马尔可夫过程(Markov Processes)

马尔可夫过程是一种形式化描述强化学习过程中的环境的数学模型,与字面理解的意思可能有所不同,马尔可夫过程并没有涉及到跟“过程”相关的问题,仅仅只是对“环境”进行了定义。一个问题要想被定义为马尔可夫问题,必须具备以下几个特征

  • 整个环境需要完全可观测(fully observable),这意味着整个环境中不可以出现部分可观测。
  • 环境中下一时刻的状态( S t + 1 S_{t+1} )只与当前的状态( S t S_t )有关,不能依赖于之前的历史状态,即:

P ( S t + 1 S t ) = P ( S t + 1 S 1 , . . . , S t 1 , S t ) P(S_{t+1}|S_t) = P(S_{t+1}|S_1,...,S_{t-1},S_t)

几乎所有的RL相关的问题都可以转化为MDP问题,部分可观测的问题(POMDP)问题同样也可以转换为MDP问题,因此MDP问题是所有问题的核心基础问题。

状态转移矩阵(State Transition Matrix

在马尔可夫过程中,一个状态 s s 在被执行了一个行为 a a 后会转变为下一个状态 s s' ,但从 s s s \rightarrow s' 的转移并不一定是百分之百成功的,因此定义一个状态转移概率来描述状态是否能够成功转移的概率:
P s s = P [ S t + 1 = s S t = s ] P_{ss'} = P[S_{t+1}=s'|S_t=s]
由于在马尔可夫过程中,环境是完全可观测的,因此所有可能的出现状态都能被观测到,我们把每一个可能的状态列举出来,并统计他们的状态转移概率,最终可以得到整个环境下状态转移矩阵为:
M = [ P 11 P 12 . . . P 1 n . . . P n 1 P n 1 . . . P n n ] M= \left[ \begin{matrix} P_{11} & P_{12} & ... & P_{1n}\\ . \\ . \\ . \\ P_{n1} & P_{n1} & ... & P_{nn} \end{matrix} \right]
note: 矩阵中每一行加起来的和为1。

马尔可夫过程的定义

马尔可夫过程(马尔科夫链)是一个随机过程,是一个由若干个随机的、具有马尔可夫性质的状态( S S )组成的序列。一条 Markov Chain 是一个元组< S , P S, P >,由2个部分组成:

  • S S \rightarrow 一个状态(state)的集合
  • P P \rightarrow 一个状态转移概率矩阵

2. 马尔可夫回报过程(Markov Reward Processes)

在第1章中我们讲了 Markov 决策过程,是一个的状态的集合和一个状态转移概率矩阵,但我们如何去评判在一个状态下我们应该往哪一个状态去转移是最优的呢?这里我们将引入回报(Reward)来对状态转移效用进行一个量化表示。

马尔可夫回报过程的定义

马尔可夫回报过程是在马尔可夫决策过程上添加了汇报函数 R R 和折扣因子 γ \gamma ,是一个4元组 < S , P , R , γ S, P, R, \gamma > :

  • S S \rightarrow 一个状态(state)的集合
  • P P \rightarrow 一个状态转移概率矩阵
  • R R \rightarrow 一个用于计算回报的函数,计算的是在 t t 时刻下的即时回报
  • γ \gamma \rightarrow 一个折扣因子,用于做未来回报计算时的衰减系数, γ ( 0 , 1 ) \gamma \in (0, 1)

上面所提到的回报函数 R R 只是用于计算在某一时刻下某一状态的即时回报,但为了能更有远见的评估当前这个状态的效用,我们通常会计算包含从该时刻起一直到最后一个时刻,这个状态之后所有可能的转移到的后续状态所引起的回报总值 G t G_t
G t = R t + 1 + γ R t + 2 + . . . = k = 0 γ k R t + k + 1 G_t = R_{t+1} + \gamma R_{t+2} + ... = \sum_{k=0}^\infty{\gamma^kR_{t+k+1}}

值函数(Value Function

上面说到在MRP问题中,我们通常会引入总回报 G G 来表示一个状态的长远回报,但由于 G G 只是计算的一个 具体sample 中的具体得分,而真实的 G G 是一个随机变量,我们是无法通过一次采样就确定其取值,因此我们引入值函数 v ( s ) v(s) 来描述状态 S t S_t 的效用,使用期望值来代替一次采样中的具体得分:
v ( s ) = E [ G t S t = s ] v(s) = E[G_t|S_t=s]
值函数可以通过贝尔曼方程(Bellman Equation)拆分为2个部分:

  • 当前状态 S t S_t 的即时回报 R t + 1 R_{t+1}

  • 衰减后的下一个状态 S t + 1 S_{t+1} 的值函数回报 γ v ( S t + 1 ) \gamma v(S_{t+1})

因此,当前状态值函数又可以表示为当前状态的既时回报加上下一个状态的值函数: v ( S t ) = R t + 1 + γ v ( S t + 1 ) v(S_t) = R_{t+1} + \gamma v(S_{t+1})

考虑到状态转移是有概率的,即有可能出现 S 1 S 2 S1 \rightarrow S2 ,也有可能出现 S 1 S 3 S1 \rightarrow S3 ,下一时刻的状态是有概率进行随机转移的,这个我们之前使用状态转移概率矩阵 P P 来描述,我们现在将其引入进来:
v ( s ) = R t + 1 + γ P v ( s ) v(s) = R_{t+1} + \gamma P v(s')
v ( 1 ) v(1) 代表状态1的值函数, R 1 R1 代表状态1的即时回报值,可以得到值函数的计算公式:
[ v ( 1 ) v ( 2 ) . . . v ( n ) ] = [ R 1 R 2 . . . R n ] + γ [ P ( 11 )    . . .    P ( 1 n ) . . . P ( n 1 )    . . .    P ( n n ) ] [ v ( 1 ) v ( 2 ) . . . v ( n ) ] \left[ \begin{matrix} v(1) \\ v(2) \\ . \\ . \\ . \\ v(n) \end{matrix} \right] = \left[ \begin{matrix} R1 \\ R2 \\ . \\ . \\ . \\ Rn \end{matrix} \right] + \gamma \left[ \begin{matrix} P(11) \ \ ... \ \ P(1n) \\ . \\ . \\ . \\ P(n1) \ \ ... \ \ P(nn) \end{matrix} \right] \left[ \begin{matrix} v(1) \\ v(2) \\ . \\ . \\ . \\ v(n) \end{matrix} \right]

3. 马尔可夫决策过程(Markov Decision Processes)

马尔可夫决策过程(MDP)是在马尔可夫回报过程(MRP)上加上“决策”这一个元素,决策我们使用 A A 来表示,代表 agent 的决策行为,因此MDP是一个5元组问题:< S , P , A , R , γ S, P, A, R, \gamma >:

  • S S \rightarrow 一个状态(state)的集合
  • P P \rightarrow 一个受行为影响的状态转移概率矩阵, P s s a = P [ S t + 1 = s S t = s , A t = a ] P_{ss'}^a = P[S_{t+1} = s'|S_t = s, A_t = a]
  • A A \rightarrow 一个有限动作集
  • R R \rightarrow 一个用于计算回报的函数, R s a = E [ R t + 1 S t = s , A t = a ] R_s^a = E[R_{t+1} | S_t = s, A_t = a]
  • γ \gamma \rightarrow 一个折扣因子,用于做未来回报计算时的衰减系数, γ ( 0 , 1 ) \gamma \in (0, 1)

策略(Policy)

策略 π \pi 是指在给定状态下,采取各种行为的一种概率分布:
π ( a s ) = P [ A t = a S t = s ] \pi(a|s) = P[A_t = a | S_t = s]
note:策略 π \pi 直接决定了 agent 的行为选择,在 MDP 问题中,策略 π \pi 只能与当前的状态相关,历史状态无法对策略起到任何影响。这是因为我们在定义 MP 问题的时候就已经定义了,下一个时刻的状态与历史状态是完全独立的(参考第一章-马尔可夫过程特性)。

给定一个MDP问题 M = < S , P , A , R , γ > M = <S, P, A, R, \gamma> ,再给定一个策略 π \pi ,产生的状态序列 S 1 , S 2 , S 3 , . . . S1, S2, S3, ... 就是一个马尔可夫过程 (MP)< S , P π S, P^{\pi} >。产生的状态-回报序列 S 1 , R 2 , S 2 , . . . S1, R2, S_2, ... 就是一个马尔可夫回报过程(MRP)< S , P π , R , γ S, P^{\pi}, R, \gamma >。

MDP问题中的值函数

在MRP问题中,我们引入过值函数来描述一个状态的好坏,但在MRP问题中是没有涉及到策略 π \pi 的,因此在MDP问题中,同一个状态在不同策略下所得到的评分也有可能不同,因此我们在评价一个状态的好坏时,还需要考虑目前所使用的策略 π \pi ,即:
V π ( s ) = E π [ G t S t = s ] V_{\pi}(s) = E_{\pi}[G_t | S_t = s]
由于在MDP问题中,引入了最为关键的元素 A A ,即 agent 的行为,那么在有些时候,我们不仅需要想要评价一个策略的好坏,同时还想要知道 agent 做出的行为的具体效用好坏,因此我们还需要一种能够描述行为 a a 效用好坏的值函数:
q π ( s , a ) = E [ G t S t = s , A t = a ] q_{\pi}(s, a) = E[G_t|S_t=s, A_t = a]
通常, q π q_\pi 称为行为值函数, V π V_\pi 称为状态值函数。在行为值函数中,一般不会单独评价一个动作的效用,而是会评价动作-状态的效用,动作的效用与状态是紧密相关的,同样的动作在不同状态下产生的效用不同,同样的状态采取不同的行为效用也会不同。

状态值函数和行为值函数之间的转换

通过贝尔曼方程(Bellman Equation),我们可以将行为值函数拆解为:当前状态下得到的即时回报 + 下一个状态的状态值函数,这样我们就建立起了 t 时刻的行为值函数和 t+1 时刻的状态值函数的关系,表达式为:
q π ( s , a ) = R s a + γ s S P s s a V ( s ) q_\pi(s, a) = R_s^a + \gamma \sum_{s'\in S} P_{ss'}^aV(s')
在同一时刻,一个状态的值函数应该等于所有可能的行为产生的行为值函数之和,即:
V π ( s ) = a A π ( a s ) q ( s , a ) V_\pi(s) = \sum_{a \in A}\pi(a|s)q(s, a)

状态值函数的求解形式

通过贝尔曼方程,我们可以把状态值函数表示为:
V π = R π + γ P π V π V_\pi = R^\pi + \gamma P^{\pi}V_{\pi}
进而可以转化为:
( I γ P π ) V π = R π V π = ( I γ P π ) 1 R π (I - \gamma P^{\pi})V_\pi = R^\pi \\ \downarrow \\ V_\pi = (I - \gamma P^{\pi})^{-1}R^\pi

(具体怎么应用这个矩阵求解的示例参见这个链接:https://www.cnblogs.com/initial-h/p/9321961.html)

最优策略的求解

在一个环境中可能存在多种策略 π \pi ,当一个策略的值函数能够大于其他所有策略时( V π ( s ) > V ( s ) V_{\pi}(s) > V_*(s) ,则说明策略 π \pi 为最优策略。最优策略可以通过最优行为值函数( q ( s , a ) q_*(s, a) )来确定,最高效用行为的概率为1,其余行为取0:
KaTeX parse error: Got function '\newline' with no arguments as argument to '\begin{array}' at position 1: \̲n̲e̲w̲l̲i̲n̲e̲
因此一旦我们有了最优的行为值函数 q ( s , a ) q_*(s, a) 我们就能找到一个最优策略 π \pi ,我们使用最优贝尔曼方程进行求解,我们知道,一个状态的值函数的最大取值应当是该策略下最优行为的行为值函数取值:
v ( s ) = m a x a q ( s , a ) v_*(s) = max_aq_*(s, a)
而行为值函数 q ( s , a ) q_*(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' \in s}P_{ss'}^av_*(s')
v ( s ) v(s') 换算成 q ( s , a ) q(s, a) 的形式,可以得到最终结果:
q ( s , a ) = R s a + γ s s P s s a m a x a q ( s , a ) q_*(s, a) = R_s^a + \gamma \sum_{s' \in s}P_{ss'}^a max_{a'}q_*(s', a')
以上我们就得到了一个递归的式子,想要计算此刻最优的行为值函数取值只需要在之后的状态 s s' 中选取具有最大效用的行为 a a' 即可。遗憾的是,贝尔曼最优方程并不是一个线性方程,我们需要使用迭代的方法进行求解,包括:值迭代、策略迭代、Q-Learning等方法,在之后的章节会着重讨论。

4. 动态规划(Planning by Dynamic Programming)

如何理解动态规划?“动态” 是指我们每次只能看到整个任务的 “一部分” ,整个任务是由若干个连续的部分组成起来的一个任务串,动态规划的核心思想就是将一个问题分解成若干个子问题再进行求解

举个例子来说:公司里面都有一定的组织架构,可能有高级经理、经理、总监、组长然后才是小开发。到了一年一度的考核季的时候,公司要挑选出三个最优秀的员工。一般高级经理会跟手下的经理说,你去把你们那边最优秀的3个人报给我,经理又跟总监说你把你们那边最优秀的人报给我,经理又跟组长说,你把你们组最优秀的三个人报给我,这个其实就动态规划的思想。将整个公司 “最优秀人员” 的问题(原问题)分解为各个部门“最优秀的人员”(子问题),最终再根据所有部门“最优秀的人员”(子问题)来进行比较推导出整个公司“最优秀的人员”(父问题)。一般来讲,动态规划问题可分为以下4个步骤来解决:

  1. 划分状态:即划分子问题,例如上面的例子,我们可以认为每个组下面、每个部门、每个中心下面最优秀的3个人,都是全公司最优秀的3个人的子问题

  2. 状态表示:即如何让计算机理解子问题。上述例子,我们可以实用f[i][3]表示第i个人,他手下最优秀的3个人是谁。

  3. 状态转移:即父问题是如何由子问题推导出来的。上述例子,每个人大Leader下面最优秀的人等于他下面的小Leader中最优秀的人中最优秀的几个。

  4. 确定边界:确定初始状态是什么?最小的子问题?最终状态又是什么。例如上述问题,最小的子问题就是每个小组长下面最优秀的人,最终状态是整个企业,初始状态为每个领导下面都没有最优名单,但是小组长下面拥有每个人的评分。

以上内容引自:沙茶敏碎碎念的动态规划入门博客

4.1 利用动态规划求解MDP问题

动态规划在MDP问题中通常用于以下两个方面:

  • 评判一个策略 π \pi 的好坏:在给定一个MDP < S , P , A , R , γ S, P, A, R, \gamma > 和一个策略 π \pi 的情况下, 计算该策略 π \pi 的评价函数 v π v_{\pi}
  • 训练出一个好的策略 π \pi_* :在一个给定的MDP < S , P , A , R , γ S, P, A, R, \gamma > 中,求解一个最优策略 π \pi_*

4.2 策略评估(Policy Evaluation)和策略迭代(Policy Iteration)

策略评估是指给定一个固定的策略 π \pi ,我们如何评判这个策略的好坏?通常我们使用贝尔曼方程的迭代法来得到求解:

  1. 首先我们随机化一个状态值函数 v 1 v_1 v 1 v_1 是一个表,其存放了当前所有状态的效用值, v 1 ( s 1 ) , v 1 ( s 2 ) , . . . v 1 ( s n ) v_1(s_1), v_1(s_2), ..., v_1(s_n)
  2. 由于一开始的 v 1 v_1 是一个随机出来的表,不能正确的评价场景中状态的正确效用,我们需要让这个表中的效用值变成在采取策略 π \pi 下的真实状态效用值,因此我们会不断更新这个表,从 v 1 v 2 . . . v π v_1 \rightarrow v_2 \rightarrow ... \rightarrow v_\pi ,最终 v π v_\pi 就是一个在策略 π \pi 下,所有状态的效用值表。

上面说到我们会不断更新 v v 表,最终更新为一个 v π v_\pi 表,但我们如何进行更新这个表中各个状态的效用值呢?我们先来看第一种方法 —— 同步backup法

  • 在第 k+1次迭代中:
    • 对于每一个状态 s S s \in S
    • 根据 v k ( s ) v_k(s') 的值来更新 v k + 1 ( s ) v_{k+1}(s) ,意思就是利用上一次迭代中的下个状态 s s' 来更新这次迭代的当前状态 s s 的效用值。

用数学公式来表示:
v k + 1 ( s ) = a A π ( a s ) ( R s a + γ s S P s s a v k ( s ) ) v_{k+1}(s) = \sum_{a\in A}\pi(a|s)(R_s^a + \gamma\sum_{s \in S}P_{ss'}^av_k(s'))
上述式子表达的意思是,在计算第 k + 1 k+1 次迭代的状态 s s 的效用值时,用当前得到的即时回报值 R s a R_s^a 再加上上一轮迭代表中的 s s' 的效用值 v k ( s ) v_k(s') ,可以简化表示为:
v k + 1 = R π + γ P π v k v^{k+1} = R^\pi + \gamma P^\pi v^k

同步backup法应用举例

一个 4x4 的方格,一共有 4 种 action(上下左右),每走一步(除了走到灰色格子内)得到的 reward 都是 -1,目标是使得 agent 学会走到左上或右下的两个灰色格子中去。我们给定一个策略 π \pi ,该策略在任意一个状态下都随机进行行为选择(即上下左右行为的概率都是0.25),一个格子代表一个state,我们如何去计算在策略 π \pi 下每一个 state 的 v v 值?

下图左边是我们的 v v 表迭代的过程,我们先随机初始化 v v 表中所有状态的取值为0,在下一次迭代中(k=1),我们通过 backup 法一次计算每一个格子的状态值,这里用格子1(第一排第二个)进行举例:由于上下左右四个行为的采取概率均等(随机选取动作),即 π ( u p ) = π ( d o w n ) = π ( l e f t ) = π ( r i g h t ) = 0.25 \pi(up|·) = \pi(down|·) = \pi(left|·) = \pi(right|·) = 0.25 ,因此根据公式 v k + 1 = R π + γ P π v k v^{k+1} = R^\pi + \gamma P^\pi v^k γ = 1 \gamma = 1 )可得 v 1 ( s 1 ) = 1 + 0.25 0 + 0.25 0 + 0.25 0 + 0.25 0 = 1 v_1(s_1) = -1 + 0.25 * 0 + 0.25 * 0 + 0.25 * 0 + 0.25 * 0 = -1 。在k=2 的迭代中时,由于向上走后会停留在原地,因此向上走后转移到的状态还是自身,同样带公式计算可得到计算结果: v 2 ( s 1 ) = 1 + 0.25 ( 1 ) + 0.25 ( 1 ) + 0.25 ( 1 ) + 0.25 0 = 1.75 1.7 v_2(s_1) = -1 + 0.25 * (-1) + 0.25 * (-1) + 0.25 * (-1) + 0.25 * 0 = -1.75 \approx -1.7

上图展示了前 3 轮迭代结果,一直迭代下去, v v 表一定会收敛(有数学公式证明,这里不做讲解),收敛后的 v v 表代表了在我们给定的策略 π \pi 下每一个状态的真实取值。此时我们不仅得到了策略 π \pi 下的状态值表,同时我们还可以根据这个 v v 表通过贪婪算法得到一个新的更优策略 π \pi' (下图右),即在一个状态下每次都选择具有最大状态值的状态作为下一个转移状态,这个新策略 π \pi' 明显优于我们一开始给定的随机选择行为的策略 π \pi (在k=3的时候最优策略就已经出现了,之后再没有变化过)。

上面的整个示例展示了 backup 法的两个功能:

  • 给定一个策略 π \pi ,评价在这个策略下各状态的好坏( v π v_\pi 表)
  • improve 策略 π \pi ,得到一个更好的策略 π \pi'

在大多数情况下,我们需要重复这两个步骤:评价一个给定策略 \rightarrow 改善这个策略得到新策略 \rightarrow 评价新策略 \rightarrow 改善新策略得到另一个新策略 \rightarrow ……,因此这是一个 **Evaluation - Improve **的迭代循环过程,这个过程我们就称之为 Policy Iteration(策略迭代)。在若干个策略迭代过程后,策略 π \pi' 会收敛到最优策略 π \pi_* ,最优策略就是我们最终的求解策略了。

note:改善策略(Improvement)的方法有许多种,上面的实例我们使用的是贪婪策略(greedy)进行的策略提升,但大多数时候贪婪策略能够取得很好的结果。

4.3 值迭代(Value Iteration)

在策略迭代的部分我们提到,我们在最开始需要给定一个策略,并对该策略进行不断的 improve,通常我们选择等概率的行为选择策略作为初始策略,那我们能不能有一种方法完全不需要一开始给定初始策略呢?其实我们可以发现,在策略迭代的方法中我们给定初始策略就是为了得到一张 v v 表,我们是根据这个 v v 表来找出最优策略的,如果我们能不依赖一个初始策略就能计算出 v v 表,那我们就能解决这个问题了,这就是值迭代法的由来。

首先我们思考,什么算是最优策略?最优策略是指不仅能在当前获取最大的行为效用值,在下一个状态应该也能取得最大的行为效用值,在之后的每一个状态都应该取得最大的行为效用值。按照这个定义,假定我们已知了一个最优策略 v v_* ,那么状态 s s 在该策略下的状态值函数 v ( s ) v_*(s) 可以分解为:
v ( s ) = a r g m a x a R s a + γ s S P s s a v ( s ) v_*(s) = argmax_aR_s^a + \gamma\sum_{s' \in S}P^a_{ss'}v_*(s')
上述式子表达了当前状态 s s 的状态值等于采取当前所有行为里有着最高效用值的行为得到的回报 + 下一个状态在最优策略下的状态值。因此,我们可以从后往前开始迭代计算了,由于终止状态 v ( s t ) v(s_t) 的得分我们可知,终止状态的前一个状态 v ( s t 1 ) v(s_{t-1}) 的值 = 采取最大效用行为得到的回报值 R s t 1 R_{s_{t-1}} + 终止状态的状态值 v ( s t ) v(s_{t}) ,再前一个状态 v ( s t 2 ) v(s_{t-2}) 的状态值 = 采取最大效用行为得到的回报值 R s t 2 R_{s_{t-2}} + 后一个状态的状态值 v ( s t 1 ) v(s_{t-1}) ,…,依次迭代就可以求出每个状态的状态值了, v v 表也就求解完成了。

Value Iteration 求解法举例

以下是一个 4x4 的方格,左上角是目标点,我们需要求出在任意一个格子到目标点的最短路径。我们把每一个格子看成是一个状态,每走一步得到的 reward 是 -1。下图表示了整个问题的求解流程:初始化所有状态值都为0,紧接着每一个格子都选择上下左右临近格子中状态值最大的那个格子,并用即时回报 -1 加上最大值邻居格子的状态值(参照上面的公式)。一直这么迭代下去,直到第 7 次的时候该表格收敛了,求到了最终的结果。有了 v v 表我们的策略就相应的出现了,对于任意一个状态选择最大状态值的邻居格子就能够最快的到达终点格子了。

值迭代的方法要求人们需要枚举出该状态 s s 之后所有可能到达的状态 s s' ,并选择出具有最高效用值的状态作为自己的后续状态;并且整个问题必须存在终点(end point),毕竟是从后向前推的思路,如果环境无法全部可知或者终点状态不存在就无法使用该方法进行问题求解了。

4.4 小结

对整个利用动态规划解决 MDP 问题的方法进行一个归纳总结:

功能 贝尔曼方程 算法
状态值估计( v v 表求解) 贝尔曼期望方程 迭代策略评估法(Iterative Policy Evaluation)
策略学习 贝尔曼期望方程 + 贪婪策略 策略迭代法(Policy Iteration)
策略学习 贝尔曼最优方程 值函数迭代法(Value Iteration)
发布了10 篇原创文章 · 获赞 3 · 访问量 987

猜你喜欢

转载自blog.csdn.net/qq_38638132/article/details/105243785