Reinforcement Learning笔记(2)--动态规划与蒙特卡洛方法

「学习内容总结自 udacity 深度学习课程,截图来自 udacity 课件」

动态规划

动态规划是一个相对比较简单些的内容。因为在这部分会假设智能已经知道关于该环境的所有信息,即完全了解 MDP,而不需要和环境互动后才知道。所以智能体知道该环境是如何决定下一状态以及如何决定奖励的。动态规划所要解决的问题就是智能体知道了环境的所有信息后,如何利用这些信息找出最优策略。

找到最优策略的方法大致可以表述为:

  • 先提出一个策略进行评估
  • 再根据评估值提出更好的或者一样好的策略。
策略评估 (Policy Evaluation)

策略评估就是给定一个随机策略后,要枚举出所有的状态并计算其对应的状态值和动作值。对于简单的网格例子来说,各状态的状态值很容易通过解方程组来获得。但通常来说,状态空间要大很多很多(有限的),直接通过解方程组的方法会很困难。在此种情况下,通常使用迭代方法来解方程组会比较容易。具体的算法称为(迭代)策略评估。

(迭代)策略评估就是计算随机策略对应的值函数,然后不断迭代。(迭代)策略评估分为两个步骤,即状态值 vπ 的策略评估和通过状态值 vπ 获得动作值 qπ

  • vπ 的策略评估

    • 伪代码: 《Reinforcement Learning笔记(2)--动态规划与蒙特卡洛方法》 迭代策略评估

  • 通过 vπ 获取 qπ
    此过程会借助下面这个公式:

    qπ(s,a ) = ∑ sS, rR p(s, r | s, a)(r + γvπ(s))

    • 伪代码: 《Reinforcement Learning笔记(2)--动态规划与蒙特卡洛方法》

策略改进 (Policy Improvement)

策略改进是使用策略的值函数,提出一个至少和当前策略一样好的新策略。原理是选择最大化动作值函数的动作。

  • 伪代码: 《Reinforcement Learning笔记(2)--动态规划与蒙特卡洛方法》 策略改进

策略迭代 (Policy Iteration)

策略迭代是将策略评估与策略改进两个步骤结合起来循环迭代的过程。该算法最先从对等概率开始对最优策略进行初始猜测,然后通过策略评估获取相应的值函数,接着通过策略改进提出一个更好的或者一样好的策略。重复循环策略评估和策略改进,直到策略没有任何改进的地步。

《Reinforcement Learning笔记(2)--动态规划与蒙特卡洛方法》

  • 伪代码: 《Reinforcement Learning笔记(2)--动态规划与蒙特卡洛方法》 策略迭代

截断策略评估 (Truncated Policy Evaluation)

(迭代)策略评估会根据需要应用很多次贝尔曼期望方程来更新步骤,以实现收敛,而截断策略迭代仅对整个状态空间执行固定次数的评估。因为迭代整个策略评估使其收敛到最佳效果的过程会耗费很多的时间,所以这里可以牺牲下精确度,但一样可以获得相同效果的最优策略。

  • 截断策略评估的伪代码: 《Reinforcement Learning笔记(2)--动态规划与蒙特卡洛方法》 截断策略评估

可以将这个修订后的策略评估算法应用到策略迭代的算法中,称之为截断策略迭代

  • 截断策略迭代的伪代码: 《Reinforcement Learning笔记(2)--动态规划与蒙特卡洛方法》 截断策略迭代

值迭代 (Value Iteration)

值迭代是通过不断循环策略评估和策略改进来找到最优策略,其中策略评估是在整个状态空间迭代一次后就停止。这样可以大大的简化整个过程。

  • 伪代码: 《Reinforcement Learning笔记(2)--动态规划与蒙特卡洛方法》 值迭代

蒙特卡洛方法

蒙特卡洛方法这部分,智能体是不知道环境的动态信息的,需要和环境进行一系列的互动后才了解。

预测:状态值&动作值

智能体与环境进行一系列互动的过程中,会有一系列的状态,动作和奖励。此处重点探讨阶段性任务,即智能体在时间 T 遇到最终状态时,互动结束。在任何阶段,智能体的目标都是最大化期望积累奖励

一切的问题将从预测开始。在给定一个策略后,智能体如何估算该策略的状态值和动作值?有两种方式:

  1. 离线策略方法(Off-Policy Method):用一个策略进行评估,用另一个策略来与环境进行互动。
  2. 异同策略方法(On-Policy Method):智能体通过某个策略与环境进行互动,并计算该策略的值函数。

下面也是应用异同策略方法来估算状态值和动作值:

  • 状态值
    在每个阶段中,分别计算出现某一状态(一个阶段中只出现一次)后的(折扣)回报,最后基于所有阶段取均值。该算法将状态值定义为某一状态之后的预期回报。

    我们将状态在某个阶段中的每次经历定义为该状态的经历。 – Uacity 课件

    如果在一个阶段中,一个状态出现多次,此时有两种处理方法:

    • 对所有阶段中该状态的首次经历的回报取平均值
    • 对所有阶段中该状态的所有经历之后的回报取平均值

      《Reinforcement Learning笔记(2)--动态规划与蒙特卡洛方法》 预测状态值的伪代码

  • 动作值
    在每个阶段中,先查看状态动作对的经历,然后计算每个状态动作对之后的回报,再取平均值。
    如果在一个阶段中,某一状态动作对出现多次,则处理方法与上面一样,分为只考虑首次经历和考虑所有经历。

    《Reinforcement Learning笔记(2)--动态规划与蒙特卡洛方法》 预测动作值的伪代码

广义策略迭代

广义的策略迭代是指不像动态规划里面的策略评估,截断策略评估,值评估一样会对评估周期或者收敛接近程度进行限制。即广义的策略迭代不对策略评估周期次数和收敛接近程度进行限制。

控制:增量均值

在蒙特卡洛控制算法中,会以广义策略迭代为依据。前面预测状态值和动作值的时候,会在所有阶段结束后取均值。这样会在策略改进之前,耗费很多的时间在策略评估问题上。也许在每次预测之后,都进行策略改进步骤会更合理些。

  • 具体的做法是:
  1. 初始预测值函数为 0 并有一个起始策略;
  2. 再使用该策略去生成一个阶段并更新值函数;
  3. 然后使用该值函数去改进策略。

改进策略之后再使用该策略重复步骤2,3。以此循环,得到最优策略。

为了有效的完成这一过程,需要更改策略评估的算法。不再是在所有阶段结束之后更新评估值,而是在每次经历之后更新评估值。下图所示就是增量均值的概念。

《Reinforcement Learning笔记(2)--动态规划与蒙特卡洛方法》

伪代码:
《Reinforcement Learning笔记(2)--动态规划与蒙特卡洛方法》

控制:策略评估与策略改进
  • 策略评估
    前面的增量均值算法侧重于一个状态动作对并经历多次的情况,在每次经历之后更新估值。所以对应的结果也是单个状态动作对的值函数逼近结果。对其稍作修改,可以不断估算很多状态动作对的值。将更改后的算法作为新的评估步骤,就是完整的策略评估过程。

  • 策略改进
    动态规划中的更新策略是通过最大化动作值函数获得的,这种方法称为贪婪策略。在蒙特卡洛方法中仍然使用贪婪策略的话,会使智能体很容易掉入眼前的陷阱中,而忽略其他最大化奖励的可能。所以要修改算法,使得智能体能够探究每种策略背后最大化奖励的可能。

    这时候更好的方法是采用随机性策略,随机策略中以高概率选择贪婪策略,低概率选择某个非贪婪策略,即不再始终采用贪婪策略。该算法称为ϵ 贪婪策略。ϵ 的范围为 [0,1]。

    • 概率为 1- ϵ 时,智能体选择贪婪动作。
    • 概率为 ϵ 时,智能体从一组潜在(非贪婪和贪婪)动作中均匀地随机选择一个动作。 《Reinforcement Learning笔记(2)--动态规划与蒙特卡洛方法》 Epsilon 贪婪策略

《Reinforcement Learning笔记(2)--动态规划与蒙特卡洛方法》 策略迭代算法

探索 vs 利用

「此部分摘自 udacity 课程中的总结部分」
所有强化学习智能体都面临探索-利用困境,即智能体必须在根据当前信息采取最优动作(利用)和需要获取信息以做出更好的判断(探索)之间找到平衡。
为了使 MC 控制收敛于最优策略,必须满足有限状态下的无限探索贪婪算法 (GLIE) 条件:

  • 所有状态动作对 s, a(对于所有 s∈S 和 a∈A(s))被经历无穷次,以及
  • 策略收敛于相对于动作值函数估值 Q 来说是贪婪策略的策略。

    《Reinforcement Learning笔记(2)--动态规划与蒙特卡洛方法》 GLIE 算法伪代码

控制:常量 α

在前面提到的算法中,策略评估中最后的更新步骤如下图所示,其中(GtQ(St,At))可以看作是最近取样的回报与对应的状态动作对之间的误差,也可以看作是实际回报与期望回报之间的误差。把其即为 δt,当 δt > 0时,表示实际回报大于期望回报,就需要增加 Q(St,At);当 δt < 0时,表示实际回报小于期望回报,就需要减小 Q(St,At)。目前增大或减小的幅度都取决于系数 1/N(St,At),即取决于已经历过的状态动作对的数量。

《Reinforcement Learning笔记(2)--动态规划与蒙特卡洛方法》

对于前面的时间点来说,经历的状态动作对数量少,1/
N(
St,
At) 就会比较大,即变化的幅度大。而对于后面的时间点来说,经历的状态动作对数量多,1/
N(
St,
At) 就会比较小,即变化的幅度小。时间点越到后面,相应的变化就会越小。这样会造成后面获得的回报比前面不受重视。所以要改变算法,用 α 代替 1/
N(
St,
At) ,确保后面获得的回报比之前受重视。这样,智能体将最信任最新的回报。

对于 α 的设置:

  • 如果 α=0,则智能体始终不会更新动作值函数估算。
  • 如果 α=1,则每个状态动作对的最终值估算始终等于智能体(访问该对后)最后体验的回报。

所以,应该始终将 α 的值设为大于 0 并小于等于 1 之间的数字。但也不要将 α 的值设为太接近 1。因为非常大的值可能会导致算法无法收敛于最优策略 。也尽量不要将 α 的值设得太小,因为可能会导致智能体的学习速度太慢。

《Reinforcement Learning笔记(2)--动态规划与蒙特卡洛方法》 更新后的算法

    原文作者:caoqi95
    原文地址: https://www.jianshu.com/p/1835317e5886
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞