马尔可夫决策过程(MDP)

一:介绍

  1. 马尔可夫决策过程是用来形式化地描述强化学习中的环境
  2. 其中环境是完全可以观测的
  3. 值得注意的是,大部分强化学习问题都可以看作 MDP 问题。
    简单地理解,MDP是用来描述环境的,且 agent 可以观察到环境的全部信息。也就是说是完全可以观测。所以 agent的状态会等于环境的状态,因此在MDP中会出现action这个概念。

二:马尔可夫性质

  1. 现在或未来的状态依赖于过于的状态
  2. 它可以被定义为:
    如果一个状态StS_tSt​是马尔可夫链中的一个状态,当且仅当:
    P[St+1∣St]=P[St+1∣S1,S2,...,St]P[S_{t+1}|S_t] = P[S_{t+1}|S_1, S_2, ..., S_t]P[St+1​∣St​]=P[St+1​∣S1​,S2​,...,St​]
  3. 当前状态能捕捉到过去状态的所有信息
  4. 一旦当前状态被确认,那么历史信息就可以被扔掉

状态转移矩阵

对于一个马尔可夫状态 sss和它的后继状态S′S^\primeS′, 状态转移概率可以定义为:
Pss′=P[St+1∣St=s]P_{s s^\prime} = P[S_{t+1}|S_t=s]Pss′​=P[St+1​∣St​=s]
故转移概率矩阵 PPP 可以定义为:
P=[p11...p1n.........pn1...pnn]P =\begin{bmatrix} p_{11} & ... & p_{1n} \\ ... & ... & ... \\ p_{n1} & ... & p_{nn} \end{bmatrix}\quadP=⎣⎡​p11​...pn1​​.........​p1n​...pnn​​⎦⎤​

三:马尔可夫链

  1. 马尔可夫过程是一个无记忆性的随机过程,也就是说马尔可夫过程就是一串随机的状态序列 S1,S2,...S_1, S_2, ...S1​,S2​,.... 为什么是无记忆性的呢?因为
    Pss′=P(St+1=s∣St=s)P_{ss^\prime}=P(S_{t+1}=s | S_t=s)Pss′​=P(St+1​=s∣St​=s)
    即下一状态的概率分布只能由当前状态决定,在时间序列中它前面的事件均与之无关

如上是学生的马尔可夫链,可以看出有7个节点,即有7个状态,同时每一个状态就是一个动作,现在,我们代码进行表示:

import numpy as np# 设置字典: 从状态名到索引编号
state_to_index = dict()state_to_index["C1"] = 0
state_to_index["C2"] = 1
state_to_index["C3"] = 2
state_to_index["Pass"] = 3
state_to_index["Pub"] = 4
state_to_index["FB"] = 5
state_to_index["Sleep"] = 6# 设置字典: 从编号到状态名
index_to_state = dict()for i, name in zip(state_to_index.values(), state_to_index.keys()):index_to_state[i] = name# 设置状态转移矩阵
#   C1    C2    C3   Pass  Pub  FB  Sleep
Pss = [[0.0, 0.5, 0.0, 0.0, 0.0, 0.5, 0.0],[0.0, 0.0, 0.8, 0.0, 0.0, 0.0, 0.2],[0.0, 0.0, 0.0, 0.6, 0.4, 0.0, 0.0],[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],[0.2, 0.4, 0.4, 0.0, 0.0, 0.0, 0.0],[0.1, 0.0, 0.0, 0.0, 0.0, 0.9, 0.0],[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
]
Pss = np.array(Pss)

四:马尔可夫奖励过程

我们把马尔可夫奖励过程定义为:&lt;S,P,R,γ&gt;&lt;S, P, R, \gamma&gt;<S,P,R,γ>
其中SSS是有限的状态集合, PPP是状态的转移矩阵。RRR是回报函数,它定义为:
Rs=R(Rt+1∣St=s)R_s=R(R_{t+1}|S_t = s)Rs​=R(Rt+1​∣St​=s)
值得注意的是,这是立即回报,不是累计回报。
而 γ\gammaγ 是折扣因子 γ∈[0,1]\gamma \in [0, 1]γ∈[0,1]

五: Return

  1. 我们定义 return GtG_tGt​ 是从步骤 ttt开始的累计回报:
    Gt=Rt+1+γRt+2+...=∑k=0∞γkRt+k+1G_t = R_{t+1} + \gamma R_{t+2} + ... = \sum^{\infty}_{k=0} \gamma^k R_{t+k+1}Gt​=Rt+1​+γRt+2​+...=k=0∑∞​γkRt+k+1​

下面给出Return计算方法:

代码:

# 设置每一个状态的立即回报
#   C1    C2    C3   Pass  Pub  FB  Sleep
rewards = [-2, -2, -2, 10, 1, -1, 0]# 计算 return 的函数
def compute_return(gamma=0.9, chains=None):k = 0total_value = 0for i in range(len(chains)):total_value += np.power(gamma, k) * rewards[state_to_index[chains[i]]]# print("{}:{} reward:{}".format(chains[i], state_to_index[chains[i]], rewards[state_to_index[chains[i]]]))k += 1return total_valuechain1 = ["C1", "C2", "C3", "Pass", "Sleep"]
chain2 = ["C1", "FB", "FB", "C1", "C2", "Sleep"]
chain3 = ["C1", "C2", "C3", "Pub", "C2", "C3", "Pass", "Sleep"]print(compute_return(gamma=0.5, chains=chain1))
print(compute_return(gamma=0.5, chains=chain2))
print(compute_return(gamma=0.5, chains=chain3))

运行结果

-2.25
-3.125
-3.40625

六:value function

  1. 现在定义value function v(s)v(s)v(s): 表示当前状态sss的长期回报
    v(s)=E(Gt∣St=s)v(s) = E(G_t|S_t = s)v(s)=E(Gt​∣St​=s)
    也就是说它是 return 的期望
    看看Devil给出的几个例子:

上面三个例子,是value fcuntion 的例子,先不要去纠结那些数字是怎么得到的,其实除了第一张图片我们可以确定value的值正确性外,其余两个例子我们都无法确定。因为我们并不知道变量G。

七: 贝尔曼方程

为什么要将这个方程呢?因为 根据上面介绍value的计算(即定义),计算起来比较复杂,所以我们寻求简单的解法,而贝尔曼方程的正好满足条件。
对 value 进行分解:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ v(s) &= E(G_t…

简单如下图示意:

把期望展开:
v(s)=Rs+γ∑s′∈SPss′v(s′)v(s) = R_s + \gamma \sum_{s^\prime \in S} P_{ss^\prime} v(s^\prime)v(s)=Rs​+γs′∈S∑​Pss′​v(s′)

也就是说,当前状态 sss的 value 值等于立即奖励 Rt+1R_{t+1}Rt+1​ 加上下一个时刻状态的 value 值的 γ\gammaγ 倍数

对于这个方程的实现,如果你有数值分析的基础,这个是十分容易实现的, 把贝尔曼方程写成矩阵形式,再通过迭代方法(动态规划、蒙特卡罗、时间差分法)求解
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ v(s) &= R_s +…
其实展开后就是:
$$
\begin{bmatrix}
v(1) \ \vdots \ v(n)
\end{bmatrix}

\begin{bmatrix}
R_1 \ \vdots \ R_n
\end{bmatrix} + \gamma
\begin{bmatrix}
P_{11} & \cdots &P_{1n} \
\vdots & \ddots & \vdots \
P_{1n} & \cdots & P_{nn}
\end{bmatrix}
\begin{bmatrix}
v(1) \ \vdots \ v(n)
\end{bmatrix}
$$

代码简单表示如下

def compute_value(Pss_, r, gamma=0.8):r = np.array(r).reshape((-1, 1))v = np.dot(np.linalg.inv(np.eye(7, 7) - gamma * Pss_), r)return vprint(compute_value(Pss, rewards, gamma=0.999999))

八: 马尔可夫决策过程

  1. 马尔可夫决策过程(MDP) 是马尔可夫奖励过程(MRP) 加上决策。其中所有马尔可夫状态就是环境。
  2. 定义马尔可夫决策过程: &lt;S,A,P,R,γ&gt;&lt;S, A, P, R, \gamma&gt;<S,A,P,R,γ>
  3. 其中 AAA就是动作的集合

策略 Policies

  1. 一个策略完全由 agent 的行为决定
  2. MDP 策略依赖于当前状态,而不是依赖于历史状态
  3. 每一个策略就是一个分布, 所以概率转移矩阵和当前状态的reward可以写为:

value function

value function 可以分为两个:state value function 和 action value function 。 对于前者,我们上面已经定义过, 而对于 action value function, 定义为: Qπ(s,a)=Eπ(Gt∣St=s,At=a)Q_\pi (s,a) = E_\pi (G_t | S_t = s, A_t = a)Qπ​(s,a)=Eπ​(Gt​∣St​=s,At​=a)。

同样的,我们也可以对 action-value function 应用贝尔曼方程进行分解

示意图:

九: 代码

首先,我们想建立一个 MDP 模型来模拟学生马尔可夫决策过程,那我们就必须定义好状态空间、动作空间、策略、reward 设计

状态空间

S = ['浏览手机中', '第一节课', '第二节课', '第三节课', '睡觉']

动作空间

A = ['浏览手机', '学习', '离开浏览', '去酒吧', '退出学习']

定义状态动作-奖励的字典 和 状态-状态的转移概率矩阵

R = {}  # 字典: 记录从一个状态采取一个动作后会得到的立即奖励
P = {} # 字典: 状态转移字典。记录从一个状态转移到另一个状态的概率
gamma = 1.0  # 衰减因子

对于 reward的设计,题目已经给出。现在,为了方便操作字典 P 和 R, 要用到如下几个工具:

# 现在, 构建学生马尔可夫决策过程
# 首先, 先定义一些工具类函数
def str_key(*args):new_arg = []for arg in args:if type(arg) in [tuple, list]:new_arg += [str(i) for i in arg]else:new_arg.append(str(arg))return "_".join(new_arg)def set_dict(target_dict, value, *args):target_dict[str_key(*args)] = valuedef set_prob(P, s, a, s1, p=1.0):set_dict(P, p, s, a, s1)def get_prob(P, s, a, s1):return P.get(str_key(s, a, s1), 0)def set_reward(R, s, a, r):set_dict(R, r, s, a)def get_reward(R, s, a):return R.get(str_key(s, a), 0)def display_dict(target_dict):for key in target_dict.keys():print("{}:  {:.2f}".format(key, target_dict[key]))print("")def set_value(V, s, v):set_dict(V, v, s)def get_value(V, s):return V.get(str_key(s), 0)def set_pi(Pi, s, a, p=0.5):set_dict(Pi, p, s, a)def get_pi(P1, s, a):return Pi.get(str_key(s, a), 0)

现在就设置环境:

set_prob(P, S[0], A[0], S[0])  # 浏 览 手 机 中 - 浏 览 手 机 -> 浏 览 手 机 中
set_prob(P, S[0], A[2], S[1])  # 浏 览 手 机 中 - 离 开 浏 览 -> 第 一 节 课
set_prob(P, S[1], A[0], S[0])  # 第 一 节 课 - 浏 览 手 机 -> 浏 览 手 机 中
set_prob(P, S[1], A[1], S[2])  # 第 一 节 课 - 学 习 -> 第 二 节 课
set_prob(P, S[2], A[1], S[3])  # 第 二 节 课 - 学 习 -> 第 三 节 课
set_prob(P, S[2], A[4], S[4])  # 第 二 节 课 - 退 出 学 习 -> 退 出 休 息
set_prob(P, S[3], A[1], S[4])  # 第 三 节 课 - 学 习 -> 退 出 休 息
set_prob(P, S[3], A[3], S[1], p = 0.2) # 第 三 节 课 - 泡 吧 -> 第 一 节 课
set_prob(P, S[3], A[3], S[2], p = 0.4) # 第 三 节 课 - 泡 吧 -> 第 一 节 课
set_prob(P, S[3], A[3], S[3], p = 0.4) # 第 三 节 课 - 泡 吧 -> 第 一 节 课set_reward(R, S[0], A[0], -1)  # 浏 览 手 机 中 - 浏 览 手 机 -> -1
set_reward(R, S[0], A[2], 0)
set_reward(R, S[1], A[0], -1)  # 第 一 节 课 - 浏 览 手 机 -> -1
set_reward(R, S[1], A[1], -2)  # 第 一 节 课 - 学 习 -> -2
set_reward(R, S[2], A[1], -2)  # 第 二 节 课 - 学 习 -> -2
set_reward(R, S[2], A[4], 0)
set_reward(R, S[3], A[1], 10)  # 第 三 节 课 - 学 习 -> 10
set_reward(R, S[3], A[3], +1)  # 第 三 节 课 - 泡 吧 -> -1# 浏 览 手 机 中 - 离 开 浏 览 -> 0
# 第 二 节 课 - 退 出 学 习 -> 0MDP = (S, A, R, P, gamma)print("----状 态 转 移 概 率 字 典 ( 矩 阵 ) 信 息:----")
display_dict(P)
print("----奖 励 字 典 ( 函 数 ) 信 息:----")
display_dict(R)Pi = {}
set_pi(Pi, S[0], A[0], 0.5) # 浏 览 手 机 中 - 浏 览 手 机
set_pi(Pi, S[0], A[2], 0.5) # 浏 览 手 机 中 - 离 开 浏 览
set_pi(Pi, S[1], A[0], 0.5) # 第 一 节 课 - 浏 览 手 机
set_pi(Pi, S[1], A[1], 0.5) # 第 一 节 课 - 学 习
set_pi(Pi, S[2], A[1], 0.5) # 第 二 节 课 - 学 习
set_pi(Pi, S[2], A[4], 0.5) # 第 二 节 课 - 退 出 学 习
set_pi(Pi, S[3], A[1], 0.5) # 第 三 节 课 - 学 习
set_pi(Pi, S[3], A[3], 0.5) # 第 三 节 课 - 泡 吧print("----状 态 转 移 概 率 字 典 ( 矩 阵 ) 信 息:----")
display_dict(Pi)
# 初 始 时 价 值 为 空 , 访 问 时 会 返 回0
print("----状 态 转 移 概 率 字 典 ( 矩 阵 ) 信 息:----")
V = {}
display_dict(V)

计算 q function

def compute_q(MDP, V, s, a):
#  根 据 给 定 的MDP, 价 值 函 数V, 计 算 状 态 行 为 对s,a的 价 值qsaS, A, R, P, gamma = MDPq_sa = 0for s_prime in S:q_sa += get_prob(P, s,a,s_prime) * get_value(V, s_prime)q_sa = get_reward(R, s,a) + gamma * q_sareturn q_sa

计算 v function

def compute_v(MDP, V, Pi, s):
# 给 定MDP下 依 据 某 一 策 略Pi和 当 前 状 态 价 值 函 数V计 算 某 状 态s的 价 值S, A, R, P, gamma = MDPv_s = 0for a in A:v_s += get_pi(Pi, s,a) * compute_q(MDP, V, s, a)return v_s

更新策略

# 根 据 当 前 策 略 使 用 回 溯 法 来 更 新 状 态 价 值, 本 章 不 做 要 求
def update_V(MDP, V, Pi):
# 给 定 一 个MDP和 一 个 策 略 , 更 新 该 策 略 下 的 价 值 函 数VS, _, _, _, _ = MDPV_prime = V.copy()for s in S:#set_value(V_prime, s, V_S(MDP, V_prime, Pi, s))V_prime[str_key(s)] = compute_v(MDP, V_prime, Pi, s)return V_prime# 策 略 评 估, 得 到 该 策 略 下 最 终 的 状 态 价 值。 本 章 不 做 要 求
def policy_evaluate(MDP, V, Pi, n):# 使 用n次 迭 代 计 算 来 评 估 一 个MDP在 给 定 策 略Pi下 的 状 态 价 值 , 初 始 时 价 值 为Vfor i in range(n):V = update_V(MDP, V, Pi)return V

输出

V = policy_evaluate(MDP, V, Pi, 100)
display_dict(V)
# 验证状态在某策略下的价值
v = compute_v(MDP, V, Pi, "第三节课")
print("第三节课在当前策略下的价值为:{:.2f}".format(v))

[强化学习-3] Devil 课程第二章解析+ 学生马尔可夫决策过程代码相关推荐

  1. 第3章:有限马尔可夫决策过程

    参考书籍: Reinforcement Learning An introduction 第二版 作者:Richard S. Sutton and Andrew G. Barto 以及此书的中文版&l ...

  2. 第二章 马尔可夫决策过程及表格型方法

    马尔可夫决策过程. 在介绍马尔可夫决策过程之前,先介绍它的简化版本:马尔可夫链以及马尔可夫奖励过程,通过跟这两种过程的比较,我们可以更生动地理解马尔可夫决策过程. 第二部分会介绍马尔可夫决策过程中的 ...

  3. 深度强化学习笔记(二)马尔可夫决策过程

    地址:https://datawhalechina.github.io/easy-rl/ 马尔可夫决策过程 上图介绍了在强化学习里面 agent 跟 environment 之间的交互,agent 在 ...

  4. 人工智能必备数学知识· 学习笔记 ·002【马尓可夫链,马尓可夫链奖励过程,马尔可夫决策过程】

    注:笔记 来自课程 人工智能必备数学知识 Tips①:只是记录从这个课程学到的东西,不是推广.没有安利 Tips②:本笔记主要目的是为了方便自己遗忘查阅,或过于冗长.或有所缺省.或杂乱无章,见谅 Ti ...

  5. 【EasyRL学习笔记】第二章 Markov Decision Process 马尔可夫决策过程

    文章目录 一.马尔可夫过程 1.1 马尔可夫性质 1.2 马尔可夫链 1.3 马尔可夫过程的例子 二.马尔可夫奖励过程 2.1 回报与价值函数 2.2 贝尔曼方程 2.3 计算马尔可夫奖励过程价值的迭 ...

  6. 什么是强化学习(马尔可夫决策过程)

    文章目录 什么是强化学习(马尔可夫决策过程) 1. 强化学习(概述) 2. 马尔可夫决策过程 2.1 马尔可夫假设 2.2 马尔可夫决策过程 2.3 状态值函数(state-value functio ...

  7. 强化学习蘑菇书Easy RL第二、三章学习(马尔可夫决策过程、表格型方法)

    马尔可夫决策过程概述 Markov Process(MP)通常来说是未来状态的条件概率分布仅依赖于当前的状态.在离散随机过程里,我们需要把随机变量所有可能取值的集合放到一个状态空间里,在强化学习里,我 ...

  8. Datawhale数据分析课程第二章

    Datawhale数据分析课程第二章 准备工作 数据清洗及特征处理 相关定义 缺失值观察与处理 任务一:缺失值观察 (1) 请查看每个特征缺失值个数 (2) 请查看Age, Cabin, Embark ...

  9. 动手学强化学习第三章(马尔可夫决策过程)

    文章目录 马尔可夫决策过程 1.公式总结 2.代码实践 2.1 计算序列的回报 2.2 利用贝尔曼方程的矩阵形式计算解析解 2.3 解析法计算MDP中每个状态价值 2.4 使用蒙特卡洛方法计算MDP的 ...

最新文章

  1. ABAP性能实例七例
  2. MSIL 教程(二):数组、分支、循环、使用不安全代码和如何调用Win32 API(转)...
  3. Neo4j实战 (数据库技术丛书)pdf
  4. boost::mpl模块实现count_if相关的测试程序
  5. C++longest increasing subsequence 最长递增子序列的实现之一(附完整源码)
  6. 比较两个title是否相等(差点把我送走)
  7. php email 发送,php 发送 Email
  8. 中小学教师计算机应用,关于中小学教师计算机应用教育的思考
  9. 运算符——Python
  10. VUE前端+Node后台模拟打印机Web即时打印
  11. 【每周CV论文推荐】GAN在医学图像生成与增强中的典型应用
  12. 如何在MATLAB画一个首尾相连的数据矩阵图形
  13. Win11不能玩红警吗?Win11怎么玩红警?
  14. layim之整合右键菜单
  15. iOS-Swift3富文本(UILable文本图文混排)
  16. 华为设备路由器直连路由器配置
  17. 10.8.8.8柠檬wifi网页登录_20.5.24—0元Kindle补货了!速度上车!
  18. 计算机专业论文在线教育,在线教育系统 计算机毕业论文.doc
  19. laravel 5.5 The page has expired due to inactivity. Please refresh and try again
  20. android wms布局过程,深入理解WMS

热门文章

  1. 【安装配置java环境】
  2. 谈谈百度的短视与无奈
  3. java邮件登录系统设计_基于Java web的邮件管理系统的设计与实现(含源文件).doc
  4. 警告:计算出的值未被使用warning: value computed is not used [-Wunused-value]
  5. 爬取酷狗音乐网站,上榜单前500名的歌曲名称!
  6. python面向对象试题_python面向对象程序设计-中国大学mooc-试题题目及答案
  7. StarCraft开发的荆棘之路
  8. Apple Pay 在线远程支付
  9. mysql如何查看远程用户_MySQL系列(十)--用户权限及远程访问
  10. 10 EPC与物联网