之前讲到强化学习可以用马尔科夫决策过程来描述,通常情况下,马尔科夫需要知道  {S A P R γ},γ是衰减因子,那为什么还需要蒙特卡罗呢?

首先什么是蒙特卡罗?

蒙特卡罗实际上是一座赌城的名字,蒙特卡罗方法是冯 诺依曼 用这座赌城的名字起的。

蒙特卡罗方法的主要思想是:当求解的问题是某随机事件出现的概率,或者某随机变量的期望时,可以采用多次采样,以该事件出现的频率来估计其概率,以该变量的均值来估计其期望。并以此来代替问题的解。

那么为什么要用蒙特卡罗方法?

在真实的场景中,我们经常没法确定状态转移概率P,或者根本就是完全随机,那么我们就无法计算该状态的价值函数,但是依然要解决这类问题,怎么办?

一个可行的思路是:虽然没有状态转移概率,但是这个概率是存在的,或者说通过一个动作一定能够使该状态转换到另一个状态,那么我们可以重复试验很多次,然后求该状态每次试验的价值平均,这就是蒙特卡罗思想。

下面来具体看看蒙特卡罗的数学描述

1.首先蒙特卡罗问题的使用条件{S A γ} , 在控制问题中还需要ε,无需状态转移概率P , 和即时奖励R(这个可以有) , 当然有 π(pai)是 策略评估,预测问题,无π  是策略优化,控制问题。

2.蒙特卡罗是通过试验来计算价值函数的,根据贝尔曼方程,vπ(s)=Eπ(Rt+1+γRt+22Rt+3+...|St=s) ,  需要知道整个回合episode的奖赏R , 而且有些情况下不到最后是没有奖赏的,如下棋,完了才有输赢,故蒙特卡罗需要生成整个回合。即每次试验要从起点到终点。

当然起点和终点不一定是固定的,根据具体规则来确定,如下棋,起点不一定就是开局,也可以从中间某步开始,比如街边老头摆的棋阵,再如走迷宫,可以有多个入口,多个出口,只要从大家公认的起点到终点,就算走出迷宫 。

3.理论上完整序列越多,学习效果越好

仔细思考下,会发现如下几个问题

1. 在走迷宫时,可能经常会出现在同一个位置,绕来绕去,这相当于某个状态在整个回合中多次出现, 也有可能某个状态在整个回合中没有出现,那么这种情况如何处理呢?下面会讲到 。

2.生成完整序列 S1,A1,R2, | S2,A2,R|...St,At,Rt+1 |,...St-1,At-1,RT, | ST , 最终状态没有动作和奖励,然后根据贝尔曼方程把 R 加起来,但是这里的 R 明明应该是动作价值函数,为什么 可以用来求平均状态价值?

解答:

首先,状态价值函数 vπ(s)=∑aAπ(a|s)qπ(s,a) ,动作价值函数的加权和;

其次,在我们生成完整序列时,在某状态下是根据我们未知(控制)或已知(预测)的策略来选择动作,从而转换到下一个状态,那么重复多次试验,在该状态转换到下一个状态的既定事实是符合 π 的,

如在s时的策略 1/3 选a , 2/3 选b, 那我们重复3次试验,最后的结果应该是 1次 s a s', 2次 s b s'', 然后把这些动作价值函数加起来, q1+q2+q2 = 1/3 q1 + 2/3q= π * q 

而且, 需要搞清楚一点是:

策略评估求的是状态价值函数,因为策略已定,就是看这种策略下的价值大小,

而策略评价求的是动作价值函数,因为目的是找策略,就是看每个状态下不同动作的价值大小

下面我们来看看蒙特卡罗方法解决策略评估问题,顺便解决上个问题1

1 输入 {S A R γ π}, 初始化价值表 和 状态计数表

2.循环  生成完整序列 S1,A1,R2, | S2,A2,R|...St,At,Rt+1 |,...St-1,At-1,RT, | ST   

3.在每个完整序列中计算每个状态的价值函数,然后更新v

  // 更新方法为累计均值,就是计算所有完整序列中,该状态的价值和除以该状态出现的次数N(S)

  

  // 首先理解一点

  对比马尔科夫决策过程 , vπ(s)=Eπ(Gt|St=s)=Eπ(Rt+1+γRt+22Rt+3+...|St=s)

  可以看出每个状态的价值函数等于所有该状态收获的期望,同时这个收获是通过后续的奖励与对应的衰减乘积求和得到。注意:这个时候v是真实的,真实的平均。

  那么对于蒙特卡罗法来说,如果要求某一个状态的状态价值,只需要求出所有的完整序列中该状态出现时候的收获再取平均值即可近似求解,注意:这个时候v只是估计,因为你就试验了几次,不代表全部

  Gt=Rt+1+γRt+22Rt+3+...γTt1RT

  vπ(s)≈average(Gt), s.t.St=s
 
  此时就会碰到上述问题1
  / 如果在该回合中没有出现某状态,则在该回合遍历时忽略该状态的更新
  / 如果在该回合中多次出现某状态,有两种处理方式 first visit和every visit
    // first visit :只计算第一次出现时的价值

    在给定一个策略,使用一系列完整episode评估某一个状态 s时,对于每一个episode,仅当该状态 s首次出现的时间 t列入计算:

    状态出现的次数加1:N(s) ←N(s) +1

    总的收获值更新:S(s)←S(s)+Gt

    状态 s的价值:V(s) = S(s) / N(s)

    当N(s)→∞  时,V(s) →Vπ(s)

    // every visit:每次都计算价值在给定一个策略,使用一系列完整的episode评估某一个状态 s 时,对于每一个episode,状态 s每次出现在状态转移链时,例如,一次在时刻 t1,一次在时刻 t2,则两次对应的 Gt1, Gt2都要用于计算 s对应的值。

    状态出现的次数加1:N(s) ←N(s) +1 (每次visit状态 s 都会+1)

    总的收获值更新: S(s)←S(s)+Gt (每次visit状态 s都会增加回报)

    状态s的价值: V(s) = S(s) / N(s)

    当 N(s)→∞  时, V(s) →Vπ(s)

    // 第二种方法比第一种的计算量要大一些,但是在完整的经历样本序列少的场景下会比第一种方法适用。

4.迭代,继续生成完整序列,直至指定次数,或者价值表不再更新

    
接下来我们看看蒙特卡罗方法解决策略优化问题

1 输入 {S A R γ ε}  ε 为探索率

2.循环  生成完整序列 S1,A1,R2, | S2,A2,R|...St,At,Rt+1 |,...St-1,At-1,RT, | ST  

3.在每个完整序列中计算每个s a的动作价值函数,然后更新q

4.ϵ−贪婪法 更新策略  
  ϵ−贪婪法通过设置一个较小的ϵ值,使用1−ϵ的概率贪婪地选择目前认为是最大行为价值的行为,而用ϵ 的概率随机的从所有m 个可选行为中选择行为。用公式可以表示为:

  π(a|s) = ϵ/m+1−ε  if a∗=argmaxaAQ(s,a)

   π(a|s) = ϵ/m    else

  在实际求解控制问题时,为了使算法可以收敛,一般ϵ会随着算法的迭代过程逐渐减小,并趋于0。

  这样在迭代前期,我们鼓励探索,而在后期,由于我们有了足够的探索量,开始趋于保守,以贪婪为主,使算法可以稳定收敛。这样我们可以得到一张和动态规划类似的图:

  

5.迭代,继续生成完整序列
6. 如果所有的Q(s,a)收敛,则对应的所有Q(s,a)即为最优的动作价值函数q∗。对应的策略π(a|s)即为最优策略π∗。
 
// 这是在线版本的控制算法
 
算法优化

1.累进更新平均值(incremental mean)。在上面预测问题的求解公式里,我们有一个average的公式,意味着要保存所有该状态的收获值之和最后取平均。这样浪费了太多的存储空间。

一个较好的方法是在迭代计算收获均值,即每次保存上一轮迭代得到的收获均值与次数,当计算得到当前轮的收获时,即可计算当前轮收获均值和次数。通过下面的公式就很容易理解这个过程:

  这样上面的状态价值公式就可以改写成:

  N(St)=N(St)+1
  V(St)=V(St)+1/N(St) (Gt−V(St))

  这样我们无论数据量是多还是少,算法需要的内存基本是固定的 。

2.有时候,尤其是海量数据做分布式迭代的时候,我们可能无法准确计算当前的次数N(St),这时我们可以用一个系数α来代替,即:

  V(St)=V(St)+α(Gt−V(St))

  对于动作价值函数Q(St,At),也是类似的,比如对上面最后一个式子,动作价值函数版本为:

  Q(St,At)=Q(St,At)+α(Gt−Q(St,At))
 
总结
蒙特卡罗是一个不基于模型的强化问题求解方法。
1.优点
避免动态规划求解过于复杂
可以不事先知道环境转化模型,
因此可以用于海量数据和复杂模型。
2.缺点
每次采样都需要一个完整的状态序列。
如果我们没有完整的状态序列,或者很难拿到较多的完整的状态序列,这时候蒙特卡罗法就不太好用了
 
 
 

强化学习3-蒙特卡罗MC的更多相关文章

  1. 强化学习(四)用蒙特卡罗法(MC)求解

    在强化学习(三)用动态规划(DP)求解中,我们讨论了用动态规划来求解强化学习预测问题和控制问题的方法.但是由于动态规划法需要在每一次回溯更新某一个状态的价值时,回溯到该状态的所有可能的后续状态.导致对 ...

  2. 【转载】 强化学习(四)用蒙特卡罗法(MC)求解

    原文地址: https://www.cnblogs.com/pinard/p/9492980.html ------------------------------------------------ ...

  3. 强化学习(十八) 基于模拟的搜索与蒙特卡罗树搜索(MCTS)

    在强化学习(十七) 基于模型的强化学习与Dyna算法框架中,我们讨论基于模型的强化学习方法的基本思路,以及集合基于模型与不基于模型的强化学习框架Dyna.本文我们讨论另一种非常流行的集合基于模型与不基 ...

  4. 【RL系列】从蒙特卡罗方法步入真正的强化学习

    蒙特卡罗方法给我的感觉是和Reinforcement Learning: An Introduction的第二章中Bandit问题的解法比较相似,两者皆是通过大量的实验然后估计每个状态动作的平均收益. ...

  5. 【强化学习RL】model-free的prediction和control —— MC,TD(λ),SARSA,Q-learning等

    本系列强化学习内容来源自对David Silver课程的学习 课程链接http://www0.cs.ucl.ac.uk/staff/D.Silver/web/Teaching.html 本文介绍了在m ...

  6. 强化学习 3—— 使用蒙特卡洛采样法(MC)解决无模型预测与控制问题

    一.问题引入 回顾上篇强化学习 2 -- 用动态规划求解 MDP我们使用策略迭代和价值迭代来求解MDP问题 1.策略迭代过程: 1.评估价值 (Evaluate) \[v_{i}(s) = \sum_ ...

  7. 【整理】强化学习与MDP

    [入门,来自wiki] 强化学习是机器学习中的一个领域,强调如何基于环境而行动,以取得最大化的预期利益.其灵感来源于心理学中的行为主义理论,即有机体如何在环境给予的奖励或惩罚的刺激下,逐步形成对刺激的 ...

  8. 强化学习之 免模型学习(model-free based learning)

    强化学习之 免模型学习(model-free based learning) ------ 蒙特卡罗强化学习 与 时序查分学习 ------ 部分节选自周志华老师的教材<机器学习> 由于现 ...

  9. 强化学习(五)用时序差分法(TD)求解

    在强化学习(四)用蒙特卡罗法(MC)求解中,我们讲到了使用蒙特卡罗法来求解强化学习问题的方法,虽然蒙特卡罗法很灵活,不需要环境的状态转化概率模型,但是它需要所有的采样序列都是经历完整的状态序列.如果我 ...

随机推荐

  1. 智能合约语言 Solidity 教程系列10 - 完全理解函数修改器

    这是Solidity教程系列文章第10篇,带大家完全理解Solidity的函数修改器. Solidity系列完整的文章列表请查看分类-Solidity. 写在前面 Solidity 是以太坊智能合约编 ...

  2. Android 如何更改一个 imageview的颜色

    xml中可以使用tint属性 tips:这里的图片必须是png格式的文件才行,不然你得到的就是一个被纯色覆盖的图 java中 使用 imageView.setColorFilter(Color.WHI ...

  3. android -------- 解决NDK开发中的 Method 'NewStringUTF' could not be resolved

    创建NDK项目时, .cpp文件中出现错误, Method 'NewStringUTF' could not be resolved 如图: 网上看了很多解决方式 项目右键->属性->c/ ...

  4. Confluence 6 为一个空间应用一个主题

    主题允许你对 Confluence 的外表和显示进行自定义.你的 Confluence 空间管理员可以到 The Atlassian Marketplace 上下载主题. 一旦一个主题被安装到 Con ...

  5. CentOS7 搭建LVS+keepalived负载均衡

    1.实验环境 4台节点 Keepalived1 + lvs1(Director1):192.168.31.4 Keepalived2 + lvs2(Director2):192.168.31.3 Re ...

  6. Oracle11g温习-第十三章:索引

    2013年4月27日 星期六 10:46 1.索引(Index)的功能:对记录进行排序,加快表的查询速度  2.索引的分类  1)B-tree 索引(默认) a.在一个大表上 b.建立在重复值比较少的 ...

  7. Git:标签管理

    1.创建标签 1.1切换需要打标签的分支 git checkout branch-name 1.2创建标签 git tag tag-name 1.3查看标签 git tag 1.4注意:打标签时默认在 ...

  8. 顺序容器----顺序容器操作,vector对象如何增长,额外的string操作,容器适配器

    一.顺序容器操作 1.向顺序容器添加元素 向顺序容器(array除外)添加元素的操作: 操作 说明 c.push_back(t) 在c的尾部创建一个值为t的元素.返回void c.emplace_ba ...

  9. laravel模型关联:

    一对一hasOne(用户-手机号) 一对多has Many(文章-评论) 一对多反向belongsTo(评论-文章) 多对多belongsToMany(用户-角色) 远层一对多hasManyThrou ...

  10. (路-莫)-Python基础一

    一,Python介绍 1,python的出生与应用 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打 ...