• 蒙特卡罗法 (Monte Carlo Methods)


    在很多应用场景中,马尔可夫决策过程的状态转移概率 (p(s^ {prime}|s,a)) 和奖励函数 (rleft( {s,a,s^{prime}} ight)) 都是未知的。这种情况一般需要智能体与环境交互,然后收集一些样本,然后再根据这些样本来求解最优策略,这种基于采样的学习方法称为模型无关的强化学习 ([1]).

    1 蒙特卡罗预测 (Monte Carlo Prediction)

    1.1 蒙特卡罗状态值函数估计

    蒙特卡罗法通过对若干个完整的状态序列(episode)采样以获取大量的经验数据,从而来估计真实的状态值函数 ({v_pi }left( s ight)).

    在马尔可夫决策过程中对状态值函数 ({v_pi }left( s ight)) 的定义为:

    [egin{aligned} v_{pi}(s) &= mathbb{E}_{pi}(G_t|S_t=s ) \ &= mathbb{E}_{pi}(r_{t+1} + gamma r_{t+2} + gamma^2r_{t+3}+...|S_t=s) end{aligned} ag{1-1} ]

    即它等于所有该状态收获的期望,而蒙特卡罗做的事是在计算值函数时,用经验平均代替随机变量的期望。比如我们在一次 episode 中,状态 (s) 出现后得到的收获为:

    [G_t =r_{t+1} + gamma r_{t+2} + gamma^2r_{t+3}+... gamma^{T-t-1}r_{T} ag{1-2} ]

    有了一次 episode 就可以有多次,所以状态值函数 ({v_pi }left( s ight)) 为:

    [v_{pi}(s) approx average(G_t), s.t. S_t=s ag{1-3} ]

    现在有个问题是:状态 (s) 可能在一个 episode 中出现不止一次,从下图中就可以看出来。图中每一行都是当前策略下的一个独立的 episode.

    这种情况有两种处理的方式,分别为:

    • First-visit MC method:只把第一次出现该状态 (s) 后产生的 return (G_t) 记录下来,用于估计 ({v_pi }left( s ight))
    • Every-visit MC method:把所有出现该状态 (s) 后的 return 都记录下来,用来进行估计 ({v_pi }left( s ight))

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

    图中是用第一种方法计算的 return,所以 (R_1(s)=1-2+0+1-3+5=2). 最后得到的 ({v_pi }left( s ight)) 为:

    [{v_pi }left( s ight) = frac{1}{N}sumlimits_{i = 1}^N {{R_i}left( s ight)} = frac{1}{4}left( {2 + 1 - 5 + 4} ight) = 0.5 ag{1-4} ]

    很明显生成的 episode 越多,对状态值函数 ({v_pi }left( s ight)) 的估计就越准确,具体的算法流程为([2])

    First-visit MC prediction

    1.2 蒙特卡罗动作值函数估计

    我们在使用动态规划方法进行策略改进时,是假设环境状态转移概率 (p(s^ {prime}|s,a)) 是已知的,这样我们才能评判下一步采取什么 action 会更好。但是现在我们并不知道 (p(s^ {prime}|s,a)),也就没办法按以前的方法进行策略改进。

    [egin{split}pi^{prime}(s)&=argmax_{mathbf{a}}q_{pi}(s,a)\ &=argmax_{mathbf{a}}sum_{s^{prime}}p(s^{prime}mid s,a)left[r(s,a,s^{prime})+gammaupsilon_{pi}(s^{prime}) ight]end{split} ag{1-5} ]

    所以我们不如用相同的办法直接对动作值函数 ({Q^pi }left( {s,a} ight)) 进行估计:

    [{Q^pi }left( {s,a} ight) = frac{1}{N}sumlimits_{n = 1}^N {Gleft( { au _{{s_t} = s,{a_t} = a}^{left( n ight)}} ight)} ag{1-6} ]

    ( au^{(n)}) 也就是第 (n) 个轨迹,也就是第 (n) 个 episode.

    2 Monte Carlo Control

    蒙特卡罗控制(Monte Carlo Control) 首要的问题就是如何估计最优策略,我们需要产生无数的 episode 才能保证收敛到最优结果。无数的 episode 和大量的迭代导致计算量巨大,效率非常低。主要有两种办法解决这个问题:

    1. 虽说理论上必须有无限个 episode 来估计 ({Q^pi }left( {s,a} ight)),实际上我们是做不到的,我们只能尽力多产生点 episode,尽可能去接近这个收敛值。我们可以设定一个误差,两次估计的值小于这个误差,差不多就行了。
    2. 在策略提升前放弃完全的策略评估,采用 episode by episode 的方式进行优化。即先用当前策略生成一个 episode,然后根据这个 episode 进行动作值函数的更新,同时更新策略,并利用更新后的策略继续生成后续的 episode。

    2.1 Monte Carlo with Exploring Starts

    然而我们需要考虑一个严重的问题:在所有样本片段集合中,很多 state-action 对并不出现,比如当我在一个确定的 policy下,有可能某个 state 下只出现有限的几个对应的 actions,其他的 actions 都基本不出现。这样我们根本没有 returns 去 average,怎么能估计到某些 ({Q^pi }left( {s,a} ight)) 呢?

    比如在下五子棋,机器如果使用greedy的方法的话,从直观上来看下的每一步棋都对当前很有利。但是一些高手,看似下了一步很不相关的棋,但是从长远来看可能是一个战略上的布局,这个不相关的棋从长远来看收益可能更大,只不过我们永远不会去走那一步棋。

    为了保证策略迭代对于所有行为值有效,我们必须保证持续的探索。一种解决的方法是在状态序列开始时,每个状态行为对被选到的概率都不为 0,这种方法称为探索初值假定(exploring starts)

    下面给出 Monte Carlo with Exploring Starts 算法流程:

    Monte Carlo with Exploring Starts

    2.3 On-Policy 蒙特卡罗控制

    Exploring start 这个方案在模拟产生 episodes 也许可行,但是在从真实经验中学习时就不可行了,因为我们无法控制 start point。

    On-policy Monte Carlo Control 为了避免初始状态假定而引入了随机策略。也就是在决策的时候以一定的概率选择那些不是最大回报的行为值。这样提供了探索的可能性,保证了所有状态能被访问到。On-policy Monto Carlo 控制方法的大体思想还是 GPI,但是没有探索初值假定的条件。

    On-policy first-visit MC control
    > 记录一下疑问:这每一轮实验使用的是一个新的策略$pi$产生的,而这轮实验在某个状态$(s,a)$所带来的回报$G$又加入到$Return(s,a)$去求了平均,那最后这个$Q(s,a)$岂不是由多个策略共同生成的结果? 还是说这个$Return(s,a)$在每轮进行完会清空呢?

    2.4 Off-Policy 蒙特卡罗控制

    一个更直截了当的方法是 off-policy:使用两个策略,一个策略用来学习最优策略,另一个则更具探索性地用来产生行为。 用来学习的策略我们称之为 目标策略 ,另一个用来生成行为的称作行为策略。

    Off-policy Monte Carlo Control

    3 小结

    蒙特卡罗法提供了一个替代的策略评估过程。蒙特卡罗法简单地对于从状态开始的 return 取均值,而不是用模型去算每个状态的值。蒙特卡罗法区别于 DP 方法主要在两方面:

    • 蒙特卡罗法基于采样经验,所以没有模型也可以学习
    • 蒙特卡罗法不是 bootstrap 的,因为蒙特卡罗法不基于其他状态的值估计来更新值估计

    4 参考资料

    1. 神经网络与深度学习-邱锡鹏
    2. 强化学习博客-Dou Jiang
    3. 神经网络与强化学习-知乎专栏
    4. 机器学习笔记-知乎专栏
    5. 某喵的强化学习
  • 相关阅读:
    为 DropDownList 选项添加背景或样式
    杂七杂八——Name与x:Name的关系
    原创Godaddy帐户取消信用卡或PayPla绑定,防止无端扣费[图文教程]
    dota中名词解释
    在 JavaScript 中如何创建多行字符串(JavaScript Multiline String)
    HDU 4035 Maze(概率DP)
    获取想要得到的风格设计属性描述————Resources.Theme类函数public TypedArray obtainStyledAttributes()
    Android 异步更新UI —— Handler 【复杂的数据操作另起新线程然后在当前UI线程更新结果】
    超链接中文乱码问题
    java中的final变量
  • 原文地址:https://www.cnblogs.com/MayeZhang/p/12787723.html
Copyright © 2020-2023  润新知