「学习内容总结自 udacity 深度学习课程,截图来自 udacity 课件」
动态规划是一个相对比较简单些的内容。因为在这部分会假设智能已经知道关于该环境的所有信息,即完全了解 MDP,而不需要和环境互动后才知道。所以智能体知道该环境是如何决定下一状态以及如何决定奖励的。动态规划所要解决的问题就是智能体知道了环境的所有信息后,如何利用这些信息找出最优策略。
找到最优策略的方法大致可以表述为:
策略评估就是给定一个随机策略后,要枚举出所有的状态并计算其对应的状态值和动作值。对于简单的网格例子来说,各状态的状态值很容易通过解方程组来获得。但通常来说,状态空间要大很多很多(有限的),直接通过解方程组的方法会很困难。在此种情况下,通常使用迭代方法来解方程组会比较容易。具体的算法称为(迭代)策略评估。
(迭代)策略评估就是计算随机策略对应的值函数,然后不断迭代。(迭代)策略评估分为两个步骤,即状态值 vπ 的策略评估和通过状态值 vπ 获得动作值 qπ 。
迭代策略评估
策略改进是使用策略的值函数,提出一个至少和当前策略一样好的新策略。原理是选择最大化动作值函数的动作。
策略改进
策略迭代是将策略评估与策略改进两个步骤结合起来循环迭代的过程。该算法最先从对等概率开始对最优策略进行初始猜测,然后通过策略评估获取相应的值函数,接着通过策略改进提出一个更好的或者一样好的策略。重复循环策略评估和策略改进,直到策略没有任何改进的地步。
策略迭代
(迭代)策略评估会根据需要应用很多次贝尔曼期望方程来更新步骤,以实现收敛,而截断策略迭代仅对整个状态空间执行固定次数的评估。因为迭代整个策略评估使其收敛到最佳效果的过程会耗费很多的时间,所以这里可以牺牲下精确度,但一样可以获得相同效果的最优策略。
截断策略评估
可以将这个修订后的策略评估算法应用到策略迭代的算法中,称之为截断策略迭代。
截断策略迭代
值迭代是通过不断循环策略评估和策略改进来找到最优策略,其中策略评估是在整个状态空间迭代一次后就停止。这样可以大大的简化整个过程。
值迭代
蒙特卡洛方法这部分,智能体是不知道环境的动态信息的,需要和环境进行一系列的互动后才了解。
智能体与环境进行一系列互动的过程中,会有一系列的状态,动作和奖励。此处重点探讨阶段性任务,即智能体在时间 T 遇到最终状态时,互动结束。在任何阶段,智能体的目标都是最大化期望积累奖励。
一切的问题将从预测开始。在给定一个策略后,智能体如何估算该策略的状态值和动作值?有两种方式:
下面也是应用异同策略方法来估算状态值和动作值:
预测状态值的伪代码
预测动作值的伪代码
广义的策略迭代是指不像动态规划里面的策略评估,截断策略评估,值评估一样会对评估周期或者收敛接近程度进行限制。即广义的策略迭代不对策略评估周期次数和收敛接近程度进行限制。
在蒙特卡洛控制算法中,会以广义策略迭代为依据。前面预测状态值和动作值的时候,会在所有阶段结束后取均值。这样会在策略改进之前,耗费很多的时间在策略评估问题上。也许在每次预测之后,都进行策略改进步骤会更合理些。
改进策略之后再使用该策略重复步骤2,3。以此循环,得到最优策略。
为了有效的完成这一过程,需要更改策略评估的算法。不再是在所有阶段结束之后更新评估值,而是在每次经历之后更新评估值。下图所示就是增量均值的概念。
伪代码:
Epsilon 贪婪策略
策略迭代算法
「此部分摘自 udacity 课程中的总结部分」 所有强化学习智能体都面临探索-利用困境,即智能体必须在根据当前信息采取最优动作(利用)和需要获取信息以做出更好的判断(探索)之间找到平衡。 为了使 MC 控制收敛于最优策略,必须满足有限状态下的无限探索贪婪算法 (GLIE) 条件:
GLIE 算法伪代码
在前面提到的算法中,策略评估中最后的更新步骤如下图所示,其中(Gt -Q(St,At))可以看作是最近取样的回报与对应的状态动作对之间的误差,也可以看作是实际回报与期望回报之间的误差。把其即为 δt,当 δt > 0时,表示实际回报大于期望回报,就需要增加 Q(St,At);当 δt < 0时,表示实际回报小于期望回报,就需要减小 Q(St,At)。目前增大或减小的幅度都取决于系数 1/N(St,At),即取决于已经历过的状态动作对的数量。
对于前面的时间点来说,经历的状态动作对数量少,1/N(St,At) 就会比较大,即变化的幅度大。而对于后面的时间点来说,经历的状态动作对数量多,1/N(St,At) 就会比较小,即变化的幅度小。时间点越到后面,相应的变化就会越小。这样会造成后面获得的回报比前面不受重视。所以要改变算法,用 α 代替 1/N(St,At) ,确保后面获得的回报比之前受重视。这样,智能体将最信任最新的回报。
对于 α 的设置:
所以,应该始终将 α 的值设为大于 0 并小于等于 1 之间的数字。但也不要将 α 的值设为太接近 1。因为非常大的值可能会导致算法无法收敛于最优策略 。也尽量不要将 α 的值设得太小,因为可能会导致智能体的学习速度太慢。
更新后的算法