强化学习(十八) 基于模拟的搜索与蒙特卡罗树搜索(MCTS)

    在强化学习(十七) 基于模型的强化学习与Dyna算法框架中,咱们讨论基于模型的强化学习方法的基本思路,以及集合基于模型与不基于模型的强化学习框架Dyna。本文咱们讨论另外一种很是流行的集合基于模型与不基于模型的强化学习方法:基于模拟的搜索(Simulation Based Search)。html

    本篇主要参考了UCL强化学习课程的第八讲,第九讲部分。算法

1. 基于模拟的搜索概述

    什么是基于模拟的搜索呢?固然主要是两个点:一个是模拟,一个是搜索。模拟咱们在上一篇也讨论过,就是基于强化学习模型进行采样,获得样本数据。可是这是数据不是基于和环境交互得到的真实数据,因此是“模拟”。对于搜索,则是为了利用模拟的样本结果来帮咱们计算到底应该采用什么样的动做,以实现咱们的长期受益最大化。网络

    那么为何要进行基于模拟的搜索呢?在这以前咱们先看看最简单的前向搜索(forward search)。前向搜索算法从当前咱们考虑的状态节点$S_t$开始考虑,怎么考虑呢?对该状态节点全部可能的动做进行扩展,创建一颗以$S_t$为根节点的搜索树,这个搜索树也是一个MDP,只是它是以当前状态为根节点,而不是以起始状态为根节点,因此也叫作sub-MDP。咱们求解这个sub-MDP问题,而后获得$S_t$状态最应该采用的动做$A_t$。前向搜索的sub-MDP以下图:app

    前向搜索创建了一个sub-MDP来求解,这很精确,并且这在状态动做数量都不多的时候没有问题,可是只要稍微状态动做数量多一点,每一个状态的选择就都特别慢了,所以不太实用,此时基于模拟的搜索就是一种比较好的折衷。框架

2. 简单蒙特卡罗搜索

    首先咱们看看基于模拟的搜索中比较简单的一种方法:简单蒙特卡罗搜索。ide

    简单蒙特卡罗搜索基于一个强化学习模型$M_v$和一个模拟策略$\pi$.在此基础上,对于当前咱们要选择动做的状态$S_t$, 对每个可能采样的动做$a \in A$,都进行$K$轮采样,这样每一个动做$a$都会获得K组经历完整的状态序列(episode)。即:$$\{S_t,a, R_{t+1}^k,S_{t+1}^k,A_{t+1}^k,......S_T^k\}_{k=1}^K \sim M_v,\pi$$函数

    如今对于每一个$(S_t,a)$组合,咱们能够基于蒙特卡罗法来计算其动做价值函数并选择最优的动做了。$$Q(S_t,a) = \frac{1}{K}\sum\limits_{k=1}^KG_t$$$$a_t =\arg\max_{a \in A}Q(S_t,a)$$post

     简单蒙特卡罗搜索和起前向搜索比起来,对于状态动做数量的处理能力上了一个数量级,能够处理中等规模的问题。可是假如咱们的状态动做数量达到很是大的量级,好比围棋的级别,那么简单蒙特卡罗搜索也太慢了。同时,因为使用蒙特卡罗法计算其动做价值函数,模拟采样获得的一些中间状态和对应行为的价值就被忽略了,这部分数据能不能利用起来呢?学习

     下面咱们看看蒙特卡罗树搜索(Monte-Carlo Tree Search,如下简称MCTS)怎么优化这个问题的解决方案。优化

3. MCTS的原理

    MCTS摒弃了简单蒙特卡罗搜索里面对当前状态$S_t$每一个动做都要进行K次模拟采样的作法,而是总共对当前状态$S_t$进行K次采样,这样采样到的动做只是动做全集$A$中的一部分。这样作大大下降了采样的数量和采样后的搜索计算。固然,代价是可能动做全集中的不少动做都没有采样到,可能错失好的动做选择,这是一个算法设计上的折衷。

    在MCTS中,基于一个强化学习模型$M_v$和一个模拟策略$\pi$,当前状态$S_t$对应的完整的状态序列(episode)是这样的:$$\{S_t,A_t^k, R_{t+1}^k,S_{t+1}^k,A_{t+1}^k,......S_T^k\}_{k=1}^K \sim M_v,\pi$$

    采样完毕后,咱们能够基于采样的结果构建一颗MCTS的搜索树,而后近似计算$Q(s_t,a)$和最大$Q(s_t,a)$对应的动做。$$Q(S_t,a) = \frac{1}{K}\sum\limits_{k=1}^K\sum\limits_{u=t}^T1(S_{uk}=S_t, A_{uk} =a)G_u$$$$a_t =\arg\max_{a \in A}Q(S_t,a)$$    

    MCTS搜索的策略分为两个阶段:第一个是树内策略(tree policy):为当模拟采样获得的状态存在于当前的MCTS时使用的策略。树内策略可使$\epsilon-$贪婪策略,随着模拟的进行策略能够获得持续改善,还可使用上限置信区间算法UCT,这在棋类游戏中很广泛;第二个是默认策略(default policy):若是当前状态不在MCTS内,使用默认策略来完成整个状态序列的采样,并把当前状态归入到搜索树中。默认策略可使随机策略或基于目标价值函数的策略。

    这里讲到的是最经典的强化学习终MCTS的用户,每一步都有延时奖励,可是在棋类之类的零和问题中,中间状态是没有明确奖励的,咱们只有在棋下完后知道输赢了才能对前面的动做进行状态奖励,对于这类问题咱们的MCTS须要作一些结构上的细化。

4. 上限置信区间算法UCT

    在讨论棋类游戏的MCTS搜索以前,咱们先熟悉下上限置信区间算法(Upper Confidence Bound Applied to Trees, 如下简称UCT)。它是一种策略算法,咱们以前最经常使用的是$\epsilon-$贪婪策略。可是在棋类问题中,UCT更常使用。

    在棋类游戏中,常常有这样的问题,咱们发如今某种棋的状态下,有2个可选动做,第一个动做历史棋局中是0胜1负,第二个动做历史棋局中是8胜10负,那么咱们应该选择哪一个动做好呢?若是按$\epsilon-$贪婪策略,则第二个动做很是容易被选择到。可是其实虽然第一个动做胜利0%,可是极可能是由于这个动做的历史棋局少,数据不够致使的,极可能该动做也是一个不错的动做。那么咱们如何在最优策略和探索度达到一个选择平衡呢?$\epsilon-$贪婪策略能够用,可是UCT是一个更不错的选择。

    UCT首先计算每个可选动做节点对应的分数,这个分数考虑了历史最优策略和探索度吗,一个经常使用的公式以下:$$\text{score = }\ \frac{w_i}{n_i}+c\sqrt{\frac{\ln N_i}{n_i}}$$

    其中,$w_i$ 是 i 节点的胜利次数,$n_i$ 是i节点的模拟次数,$N_i$是全部模拟次数,c 是探索常数,理论值为$\sqrt{2}$,可根据经验调整,c 越大就越偏向于广度搜索,c 越小就越偏向于深度搜索。最后咱们选择分数最高的动做节点。

    好比对于下面的棋局,对于根节点来讲,有3个选择,第一个选择7胜3负,第二个选择5胜3负,第三个选择0胜3负。

    若是咱们取c=10,则第一个节点的分数为:$$score(7,10) =7/10 + C \cdot \sqrt{\frac{\log(21)}{10}}  \approx 6.2 $$

    第二个节点的分数为:$$score(5,8) = 5/8 + C \cdot \sqrt{\frac{\log(21)}{8}}  \approx 6.8 $$

    第三个节点的分数为:$$score(0,3) = 0/3 + C \cdot \sqrt{\frac{\log(21)}{3}}  \approx 10 $$

    可见,因为咱们把探索率c设置的比较大,第三个节点是被UCT选中要执行的动做节点。固然若是咱们把c设置的比较小的话,第一个或者第二个可能就变成最大的分数了。

5. 棋类游戏MCTS搜索

    在像中国象棋,围棋这样的零和问题中,一个动做只有在棋局结束才能拿到真正的奖励,所以咱们对MCTS的搜索步骤和树结构上须要根据问题的不一样作一些细化。

    对于MCTS的树结构,若是是最简单的方法,只须要在节点上保存状态对应的历史胜负记录。在每条边上保存采样的动做。这样MCTS的搜索须要走4步,以下图(图来自维基百科):

    第一步是选择(Selection):这一步会从根节点开始,每次都选一个“最值得搜索的子节点”,通常使用UCT选择分数最高的节点,直到来到一个“存在未扩展的子节点”的节点,如图中的 3/3 节点。之因此叫作“存在未扩展的子节点”,是由于这个局面存在未走过的后续着法,也就是MCTS中没有后续的动做能够参考了。这时咱们进入第二步。

    第二步是扩展(Expansion),在这个搜索到的存在未扩展的子节点,加上一个0/0的子节点,表示没有历史记录参考。这时咱们进入第三步。

    第三步是仿真(simulation),从上面这个没有试过的着法开始,用一个简单策略好比快速走子策略(Rollout policy)走到底,获得一个胜负结果。快速走子策略通常适合选择走子很快可能不是很精确的策略。由于若是这个策略走得慢,结果虽然会更准确,但因为耗时多了,在单位时间内的模拟次数就少了,因此不必定会棋力更强,有可能会更弱。这也是为何咱们通常只模拟一次,由于若是模拟屡次,虽然更准确,但更慢。

    第四步是回溯(backpropagation), 将咱们最后获得的胜负结果回溯加到MCTS树结构上。注意除了以前的MCTS树要回溯外,新加入的节点也要加上一次胜负历史记录,如上图最右边所示。

    以上就是MCTS搜索的整个过程。这4步通常是通用的,可是MCTS树结构上保存的内容而通常根据要解决的问题和建模的复杂度而不一样。

6. MCTS小结

    MCTS经过采样创建MCTS搜索树,并基于4大步骤选择,扩展,仿真和回溯来持续优化树内的策略,进而能够帮助对状态下的动做进行选择,很是适合状态数,动做数海量的强化学习问题。好比AlphaGo和AlphaGo Zero都重度使用了MCTS搜索,咱们在下一篇讨论AlphaGo Zero如何结合MCTS和神经网络来求解围棋强化学习问题。

 

(欢迎转载,转载请注明出处。欢迎沟通交流: liujianping-ok@163.com)    

相关文章
相关标签/搜索