《强化学习Sutton》读书笔记(七)——列表法的计划与学习(Planning and Learning with Tabular Methods)

此为第八章 Planning and Learning with Tabular Methods

在上述章节中,我们已经看到了DP是基于模型 (Model-Based) 的,而MC和TD是模型无关的 (Model-Free) 。基于模型的方法中,Planning(下文定义这个词)是最主要的一步;而对于模型无关的问题,Learning是最核心的步骤。Planning和Learning有很多异同点。比如最大的相同之处就在于它们都需要通过通过回溯的方法,计算值函数,再得到策略。

模型和计划

模型就是 p ( s , r | s , a ) ,这是之前已经提到过的。如果 p ( s , r | s , a ) 有依概率分布的一组非零值,那么这样的模型被称为分布式模型 (Distribution Model) ;否则,如果是确定性的,那么模型被称为采样式模型 (Sample Model) 。(无论哪种)模型都可以被用来仿真 (Simulate) 得到经验。

Planning是以模型为输入,通过和environment交互,得到或提升策略的计算过程。注意它和Learning的不同主要在于输入,Learning的输入是一系列真实实验的experience,而Planning则是模型,再通过模型得到仿真的experience。所以Planning的流程是:

Planning的过程

这也可以看到,其实对于策略生成或提升部分,Planning和Learning其实是几乎一样的,我们可以用Learning的算法替换掉Planning中最重要的值函数更新步骤。我们以一个随机采样的单步列表法Q-planning算法伪代码为例:

随机采样单步列表法Q-planning伪代码

可以看到,除了通过一个model(而非交互)得到下一状态外,Planning和Learning没有什么区别。

Dyna:综合Planning,Acting和Learning

Planning要求以模型为输入,那么如果模型未知,手头只有experience怎么办呢?我们就必须通过这些experience生成模型。考虑到时间代价,我们不可能一次性地生成模型再Planning,必须随着experience的增加,动态地更新模型。因此,对于给定的experience,我们就有两种方式来得到值函数(或者说策略,因为从值函数可以快速得到策略),一是直接Learning(也称为直接法),二是先猜测模型,再Planning(也称为间接法),如下图所示:

两种得到最优策略的方法

这两种方式各有优劣。间接法通常可以在experience数量有限的情况下更加充分地利用它们,得到更好的策略;直接法更加简单,而且间接法有可能模型本身有偏差。它们两者谁更优是一个没有定论的问题。

Dyna是一种把它们综合起来的方法。它的思路如下图所示:

Dyna图示

可以看到,真实实验的experience一方面直接由Learning得到值函数或策略,另一方面生成了模型,再由模型大量产生仿真的experience,通过Planning得到值函数或策略。实际上,很多时候Planning和Learning的算法是一致的,所以实际上就是通过模型增加了experience数量,然后对它们一起Learning/Planning。

比如我们以Dyna-Q算法为例。它的伪代码如下:

Dyna-Q伪代码

可以看到,(a)-(c)步就是按照当前策略得到采样,(d)步就是非常正常的Learning算法,(e)步是这里的重点,它采取了采样式的模型思路,因此认为最后一次产生的 S R 就是模型 ( S , A ) 对应得到的结果,即 p ( S , R | S , A ) = 1 ,所以直接把这个结果存下来作为模型;(f)步就是在(e)步的模型基础上,仿真 n 次得到 n 个新的结果,用Planning的算法(在此例子中和Learning完全相同)用来再次改进值函数。

我们先来看一个使用Dyna-Q的例子,这是一个普通的走迷宫,不使用Planning,使用Planning走5步和使用Planning走50步的结果如下所示:

不同次数的Planning的对比

结果初看令人震惊。不使用Planning需25个episode收敛,而5步和50步的Planning则分别只使用了5个和3个episode就收敛了。不过我个人认为,实际上没有这么大的差距,比如50步的Planning实际上每个episode的时间要比没有Planning的长很多。不过无论如何,为何Planning可以减少episode的数量呢?书本中对比了没有Planning一步后的策略图和50步Planning一步后的策略图,如下所示:

有无Planning的对比

在没有Planning的方法中,对于第一个episode,由于除G的位置其他位置的Q都是随机的,R都是0,所以episode除了最后一步,其他步骤对值函数都没有帮助;对于第二个episode,只有G和G的上一步的R或者Q是不随机的,所以又多了一步;……以此类推,几乎每个episode都只能多出一个新的有效的Q。在Planning50步的方法中,对于第一个episode,一样,除了G以外其他位置的Q和R都是没有用的,所以,只有最后一步的Q得到了有效的更新;但是,对于第二个episode,由于第一个episode记录下了模型,虽然对于S附近的模型可能仍比较乱,但对于G附近的模型,已经不太乱了(因为最终成功地走到了G),因此这部分模型帮助第二个episode中,G附近的行为快速地实现了有效的价值提升;这部分G附近的行为价值提升了,又进一步地促进距离G更远的行为价值提升,所以它们快速传播开,仅通过一个episode就能完成很大区域的策略制定。因此,虽然每个episode中Planning大大增加了时间,但考虑到它节省了没有Planning时每个episode大量浪费前面步骤的现象,因此总时间不一定会更长。但它是否一定能节省时间,我还不太明白。

当模型错误的时候

在上一节的例子中,(估计出来的)模型的改变比较温和,尤其在第二个episode之后,模型几乎总是能被填上正确(符合最佳策略)的值。但这不是常态。模型是可能出错的,比如环境本身随机性很强,因此只有很少的样本被观察到;比如值函数是使用函数估计的(这是以后的内容),而估计函数不够合理;再比如环境是不断变化的,而新的最佳行为还未被观测到。当模型出错时,Planning可能会算出一个局部最优的策略。

有的时候,局部最优的策略能够很快检测到模型的误差,从而重新探索找到最优解。这种情况往往发生在环境变化导致了最优策略变差的情况下,因为这样原策略会发现自己行不通了,从而去寻找更好的方案。以一个走迷宫的例子来说明:

环境改变的例子1

在这个例子中,1000个时间片内,Dyna-Q+(下文介绍)和Dyna-Q都趋向于(平行的)直线,表示它们已经找到了(相同的,在这里也是最佳的)收敛的策略;1000个时间片后,环境发生了变化,原来最佳的策略突然不可行了,所以两种方法都陷入了一定的困境(曲线斜率几乎为0),但也同时开始探索,所以最终它们都找到了新的最佳策略。

在这种情况下,算法能感受到环境变化并重新发现最优解。然而,如果环境变化产生了新的最佳策略,而以前的策略也仍然可行,那么这时就很难重新收敛到新策略了。以另一个走迷宫的例子来说明:

环境改变的例子2

3000个时间片后,Dyna-Q没有感受到环境的变化,继续开发原来的策略。这又回到了最初的explore/exploit的这一强化学习永恒矛盾中。Dyna-Q+之所以能够发现新的策略,因为它在算法中经验性地增加了探索。Dyna-Q+认为,如果我们长期没有经过某个状态,那么这个状态的模型发生变化的可能性就越大。因此,为了激励对这些长期没有采纳的行为,Dyna-Q+为它们增加了奖励,即在原奖励的基础上提升 κ τ ,其中 κ 为系数, τ 为连续未访问的次数。通过这样的方式增加了探索的代价,但也在需要探索的时候带来了明显的收益。

带优先级的扫描

在第二节中对比没有Planning和50步Planning时,不难注意到50步Planning中其实也浪费了不少了步数。在第一个episode中,只有最后一步的Q得到更新;在第二个episode中,必须要先更新倒数第二步的Q,再倒数第三步,……以此类推,才能得到如上图的结果。否则,如果运气不好,每次Planning总是在更新那些无法更新的状态,那么50步Planning的方法将退化为没有Planning的方法。这启示我们应该优先更新那些停止状态附近的状态,或者更广泛地说,那些得到更新的状态的上一步状态。

用带优先级的扫描改进Dyna-Q,得到如下的伪代码:

带优先级的Dyna-Q伪代码

在伪代码中, P 表示更新的幅度,当 P 小于阈值 θ 时,就不执行循环了(因为PQueue为空),无谓的Planning被取消,退化成了没有Planning的方法;当 P 大于阈值时,则从 ( S , A ) 出发向前回溯,将它们加入到PQueue中,再循环从PQueue中取出状态进行更新。带优先级的Dyna-Q大大提升了效率,它和普通Dyna-Q相比如下:

带优先级的Dyna-Q和不带优先级的Dyna-Q对比

按期望更新和按采样更新

在前面的章节中,我们提出了很多不同的值函数更新算法,它们主要可以从三个维度进行分类,第一,状态值函数还是行为值函数;第二,最优策略还是随机策略;第三,基于期望更新还是基于采样更新。前两个维度可以让我们把更新对象分成四类: v π , v , q π , q 。再加上最后一个维度,我们可以一共分出八类的更新方法,如下图所示(有一种方法不存在):

三个维度七中更新方法回溯图

Planning的方法可以和任意一种方法做结合,比如之前的Dyna-Q是和基于采样的 q 做结合。

在之前介绍基于采样的更新方法时,我们把基于采样方法视为基于期望方法的替代品,因为当模型缺失时,基于期望的方法是不可能的。这隐含着一种基于采样方法不如基于期望方法的感觉。这是对的吗?基于期望的方法当然可以避免一些采样带来的偏差,但同时也意味着巨大的计算量。如果每个状态的后继状态只有1个,那么采样法和期望法是一致的;如果每个状态的后继有多个,比如平均 b 个(定义 b 分支系数 (Branching Factor) ),那么期望法由于需要累加求期望,因此复杂度是采样法的 b 倍。因此,我们可以认为做了一次期望更新,在时间上也可以做 b 次的采样更新。

如果我们时间充裕,足够完成一次期望更新或 b 次采样更新,期望更新当然优于采样更新(因为没有采样偏差)。但实际问题中,我们常常没有时间进行 b 次采样更新,也没有时间进行一次期望更新。下图给出了一个采样更新和期望更新在时间和效果上的比较。

采样更新和期望更新的比较

这张图的横坐标代表采样次数(的时间),可以看到,当这个时间小于 b 次时,期望更新没有完成,因此误差一直是(单位)1;当时间大于 b 次时,期望更新完成了,因此误差一直是0。对于采样更新,在 b 等于2的时候,采样次数只可能是1或者2,因此曲线从中间的 b / 2 处开始;类似的,采样更新曲线的起点总是在 1 / b 处。可以看到,当我们的时间足够采样 b 次时,期望更新总是最优的;但对于 b 很大的情况,我们实际上可以采比 b 小的多的样本数量,也能达到类似的精度,这样就大大节省了时间。因此,对于不同问题,视其复杂程度,可以选择不同的更新方法。

按轨迹采样更新

本节我们比较两种更新的分布。第一种是古典型的采样更新,它要求扫描整个状态(或行为)空间,并在每次更新中更新每个状态(行为)的值函数。这种方法在问题规模巨大时就会遇到困难,因为我们可以接受的时间范围内,可能一次更新也无法完成。因为在一些大规模问题中,绝大多数的状态或者行为是几乎不可能或者不应该发生的(也就是说在极差的策略下才会发生),更新这些值函数对最优策略几乎没有帮助。而扫描这样的空间时我们却平等地看待它们,造成了极大的浪费。

第二种方法是基于分布进行采样。采样可以是完全随机均匀的,比如Dyna-Q,但这样就和古典型方法区别不大了。更好的方法是在一个On-Policy中,一边按照策略得到采样,另一边立刻更新,因此更新的值函数往往分布在一次采样的轨迹附近(比如在迷宫中按照一条采样的路线前进,那么只有这条路线附近的值函数被更新了),因此我们把这种方式称为经验生成 (Generating Experience) 按轨迹采样更新 (Update Trajectory Sampling)

几乎没有比基于On-Policy采样分布来更新 (On-Policy Distribution of Update) 更好的方法了。直觉上它就是有效的,比如在下棋时,我们只会研究几种最有可能的下法,而非全局随机走。在书本第二部中,随着对值函数应用函数进行估计,它将更加有用。

通过实验我们可以比较On-Policy的采样和随机采样,它们的区别是,On-Policy从固定的状态开始,然后按照 ϵ -贪心算法一路仿真下来,得到采样结果,并走一步就更新;随机采样从任意状态开始,也走一步就更新。这样,它们就仅在采样分布上不同了。它们的结果如下图所示。

On-Policy采样和均匀采样

可以看到,分支数量 b 越小,状态(或行为)空间越大,则On-Policy方法收敛越快。没有看懂出现这种现象的原因,尤其不明白为何uniform最终总是比On-Policy要大。

实时动态规划

实时动态规划 (Real-Time Dynamic Programming, RTDP) ,是一个On-Policy基于轨迹采样的值迭代动态规划法。和当初的值迭代一样,它按如下的方式进行状态值函数的更新:

v k + 1 ( s ) = max a s , r p ( s , r | s , a ) [ r + γ v k ( s ) ]

它和传统DP的不同点在于它是一个异步的算法,因此不要求一次性地更新所有的状态,而是按采样顺序更新。我们把所有的状态分为三类,第一类是可以作为起始点的起始状态 (Start State) ,第二类是在某些策略下能够到达的相关状态 (Relevant State) ,第三类是在这些策略下不能够到达的无关状态 (Irrelevant State) 。基于轨迹采样显然不能到达无关状态,它并不能求出这些无关状态的值函数,因此也不能得到全局的最佳策略;但我们只关心以起始状态出发的局部最佳策略 (Optimal Partial Policy) ,这样基于轨迹采样就能大大节省时间了。

未完成,这一章实在太长了,也还有很多问题未解决,暂时跳过剩余部分。

参考文献

《Reinforcement Learning: An Introduction (second edition)》Richard S. Sutton and Andrew G. Barto

上一篇:《强化学习Sutton》读书笔记(六)——n步Bootstrapping(n-step Bootstrapping)
下一篇:《强化学习Sutton》读书笔记(八)——近似法下的On-Policy预测(On-Policy Prediction with Approximation)

猜你喜欢

转载自blog.csdn.net/yucong96/article/details/82591646