基于 Sutton《Reinforcement Learning: An Introduction》 第二版:

http://incompleteideas.net/book/the-book-2nd.html

在学习过程中原计划认真学习前七章以完成毕业设计,对前七章内容手记了笔记。但是在讨论班听了研一学姐讲的第八章感觉云里雾里,她似乎没有较深理解,所以想自己认真看一下书本,第八章学了大半感觉对于很多不同情况下讨论的优化方案感觉很有启发,所以按自己的理解记录了一下。

 

数据可以用于直接学习、训练,也可以用于生成环境模型,例如关于环境的分布模型或采样模型,并可以离线地使用这个模型继续进行学习和训练。

 

对于状态动作对,关于奖赏和后续状态的概率分布的模型,称为分布模型,而仅存储一个可能的奖赏及后续状态的,称为采样模型。
分布模型更为全面。采样模型直接将最近获得的作为模型内容,操作简单计算量小,而且更关注最新的模型信息。

 

学习通常指从和环境交互或模拟的数据中直接进行值函数更新,而规划则通常指对于已有的模型进行更新。
规划分为状态空间规划和规划空间规划。状态空间规划是对于一套状态值搜索其最优策略。规划空间规划是在规划空间中搜索(不太理解)。
可以将学习和规划结合起来,提高寻找最优策略的效率。

 

当环境可能发生改变的时候,可以使用固定的步长,甚至使用较大的步长,或者增加对于长时间未经历的状态动作对的探索(如UCB或Dyna-Q+)的思路,来适应会变化的环境,但是可能会稍微减缓后期速度。
当环境具有随机性的时候,或许可以考虑用分布模型替代采样模型(个人脑补的)。

 

规划的时候,随机选择更新可能很多时候是无效的,这会导致浪费计算资源,可以考虑给更新以优先级,即对于有较大更新量的,加入优先队列依次更新,或者对于比较关注的状态动作对加入优先队列依次更新。

 

期望更新是指对于后续可能的所有情况依概率分布加权进行更新,而采样更新则进行一次采样,用采样得到的情况进行更新。
期望更新更加全面,但是计算量也更大,约是采样更新的后续情况数倍。采样更新也可以避免模型的误差带来的问题。采样更新在短期内不断在向真实值更新,而期望更新则在进行一次扫描结束前都没有任何更新。
真实情况下,期望更新要获得用于更新的后续情况的值也需要同样大量的时间,而采样更新则能快速地更新。因此在有大量随机后续分支和较多需要解决的状态时,采样更新更有优势。

 

对于DP需要进行完整的扫描并更新,这会导致过多的计算,而更新的大多数状态实际上是无意义的,它们可能不会出现在最优策略中,甚至不会发生。可以根据某些分布采样一些状态或状态动作对来采取更新。均匀分布与DP的问题类似,会遇到很多无关状态。那么可以采取同策略分布,即根据当前策略产生状态动作轨迹,并对这些进行更新,这被称为轨迹采样。
轨迹采样在初期规划地更快,在后期则会发展缓慢。在后续分支较少的时候,轨迹采样的优势期更长、影响更明显。在状态空间较大的问题中,轨迹采样优势更明显、持续时间更长。
轨迹采样在后期的疲软很合理,因为常访问的状态几乎都更新到了真实值,此时策略不常访问的状态反而更有更新价值,所以DP的详尽扫描会更加有优势,至少在小型问题上有优势。同策略的轨迹采样对于大型问题,尤其当状态动作对在同策略分布下被访问的后继较少的情况下会有较大优势。

 

实时动态规划也就是DP的轨迹采样版本。它将DP中的详尽扫描更新更换为轨迹采样更新,或者是在轨迹采样更新时采用期望更新。它是一种异步DP的思路,拥有类似轨迹采样的优势,能够避免对于无关的状态进行大量无用的更新。它在赛道问题上比详尽扫描的DP少花接近50%的更新次数。详尽扫描的DP可以更改为每次DP扫描后进行若干次贪心情节,能大大减少找到近最优策略的更新次数,但是仍然明显多于实时动态规划。

 

规划有至少两种用法,其一是类似DP的,也就是后台规划,将所有状态或至少是大量状态都进行更新,以用于动作选择。另一种是决策时规划,在遇到一个状态后,对该状态的后续动作以及状态进行若干计算,并返回一个应当采取的动作,随后期间的后续状态的更新值可能直接舍弃。他们可以被认为是用模拟经验来生成策略、值函数,或是用模拟经验来选择当前状态的下一个动作。
在例如下棋问题这类,并不要求快速回应的任务中,下一个动作可能允许几秒或者几分钟来计算各个动作的优劣,使用决策时规划能够规划后续的很多步。而在低延迟动作选择优先的任务中,后台规划就更加有效,在后台规划得到策略猴能迅速应用于新遇到的状态。

 

启发式搜索是将当前状态作为树根,对其后续状态进行树形搜索,传统方法中对于叶子节点的值使用其近似值函数,然后从叶子更新回到树根的当前状态,更新过程使用期望更新。更新终止于当前状态相邻的状态动作对节点,有最优当前值的节点被选择,更新值则被舍弃。传统启发式搜索使用人为设置的近似值并且一般不随时间改进,所以无需储存过程中的更新值,不过我们此处值函数会不断更新,所以可以考虑储存过程中的更新值。
通常在搜索时,若有完美的模型,但没有完美的动作值函数时,更深的搜索会获得更好的策略,如果搜索直到情节结束,那么决策一定是最优的,如果搜索深度能使折扣因子足够小,那么相应的动作选择会是接近最优的。但是更深的搜索也会带来更大的计算量,以及更长的决策时间。
在使用启发式搜索时,因为大量的计算量,更加重要的是将计算聚焦于当前状态以及即将发生的后继状态和动作,而不是所有可能的情况。同时从存储的角度,启发式搜索也不需要存储所有状态,而是从当前状态开始的若干可能状态。将存储和计算资源聚焦于当前决策可能是启发式搜索高效的原因。
启发式搜索中,更新的分布也可以以相似的方式改变为聚焦于当前状态和它可能的后续。即或许可以按照如同深度优先启发式搜索相同的顺序进行大量分布的一步更新。因此,搜索深度加深获得的性能改进不是因为使用多步更新等原因,而是由于聚焦于当前状态下的状态和动作的更新。通过对于候选动作投入大量相关的计算,决策时规划能产生更好的决策。

 

展开算法(Rollout Algorithm)是一种决策时规划,是从当前状态开始基于蒙特卡罗控制以模拟出情节轨迹,通过对于每个可能动作开始按照给定策略模拟的若干模拟轨迹进行平均来评估这个动作的值。当所有动作的评估都认为足够精确了,那么评估最好的那个动作或动作之一就会被选择,然后获得下一个状态,并重复上述过程。
展开算法并不对最优动作值函数或者是策略动作值函数做评估,它只根据展开策略对当前状态的所有动作值进行评估,评估值被用于决策,随即舍弃这些值。展开算法不需要对所有状态动作对进行采样,也不需要状态空间或状态动作空间的近似函数,所以它很容易实施。
虽然展开算法是比较高效的,甚至有些情况完全随机的展开策略都能获得较好的效果。不过大部分情况下,更好的展开算法可能意味着更多的计算时间,常常需要在两者之间权衡。
平衡展开算法效果和时间的方法:并行地运行若干蒙特卡罗实验;截断模拟轨迹并用存储的评估函数来矫正(如多步TD);或检测蒙特卡罗模拟并删去不够好的分支以及一些很接近当前最好的分支,或许采取它们并不会有实质上的变化,不过这样也许会使并行复杂化。

 

蒙特卡罗树搜索(MCTS)在展开算法的基础上增加了对一些积累的值评估的存储,以在蒙特卡罗模拟时更好地获得高奖赏的轨迹。
MCTS也是在决策时为遇到的状态选择一个动作,并重复这个过程,但它通过拓展先前模拟时获得的较高评估值的状态,来连续致力于多个从当前状态开始的模拟。它不需要在一次次动作选择之间维持近似值函数或策略,不过在许多实现中也会维持被选动作的值。
MCTS在上一轮决策结束后,会保留其使用的带有动作值的决策树,在下一轮决策时,会保留当前状态在树中的分支,并抛弃树的其他部分。这样便于在决策时可以更多致力于一些之前评估较好的动作,并且可以将存储空间主要分配给当前状态相关的任务上。
MCTS的迭代分四个部分,选择、扩展、模拟、回滚,首先以当前状态对应的节点为树根,在已有的树中执行树策略(可以为ε贪心或UCB等具有探索性的策略)进行分支选择,直到选择到代表动作的叶子节点。在某些情况下(根据不同应用实现不同)在某些迭代中,在被选择的动作叶子节点上拓展新的状态节点,以及其对应的动作。从某个被选择的动作叶子节点开始,执行模拟,一般使用展开算法进行模拟,获得情节轨迹。最后回滚,对于模拟得到的回报,用其更新树中经历的动作节点,对于树外的部分则直接舍弃。