蒙特卡洛树搜索(MCTS)日记1

1.蒙特卡洛树搜索是什么

        自2006年两篇MCTS论文的发布[1,2],人们认识到MCTS在棋类博弈游戏的巨大前景。特别是2016年谷歌推出的AlphaGo击败世界冠军李世石,引发人们对ai的巨大热情。而AlphaGo是采用了神经学习与MCTS结合的框架,造就了这个产物。

        monte carlo tree search(MCTS)是将蒙特卡洛模拟与树搜索结合起来的算法,是应用于树表示的解空间中寻找决策的算法。MCTS的思路是:

第一步,根据先验知识设定的价值评估函数(可能没有),选择出当前决策树还能拓展孩子的最大价值节点。初始化时,价值为0;

第二步,为选出的最大节点添加一个孩子(这一步思路很简单,但如果你要写代码就知道多麻烦了);

第三步,从该孩子表示的状态进行模拟推演直到游戏结束;

第四步,将游戏输赢的信息反馈回孩子及其所有直系祖先。

2.MCTS四阶段详谈

        2.1 选择阶段:

此阶段需要根据价值公式选出最大节点,显然这个价值公式,是MCTS算法的关键。2006年kocisis等人根据UCB提出了UCT公式(Upper Confidence Bound Apply To Tree),这一经典式子可以说是发展至今。严格的说,价值公式评估的是动作(边)而不是状态(节点),但对于不需要精通MCTS的人来说,动作和状态可以认为是一一对应的,即节点等同于边。接下来我会给出关于状态和动作的价值公式,初学者只需理解一个即可。

S=\overline{S}+C\frac{\sqrt{lnN}}{N_{s}}

        其中,S(state)表示节点价值,\overline{S}表示该节点之前多次模拟的平均价值(比如可以是模拟赢的次数除以模拟次数),N是该节点的双亲节点的模拟次数,N_{s}是该节点的模拟次数(刚拓展的节点初始为0),C是一个超参数起到调节探索和利用的作用。

        其中a表示动作,A(s)是在状态s下的所有可用动作的集合,Q(s,a)是动作a在状态s下运行至今的平均价值,N(s)是状态s至今的被访问次数,N(s,a)是动作a在状态s下的被访问次数。常数C控制探索和利用的平衡。

        上图节点里,分子表示赢的次数,分母表示模拟次数,箭头旁的是根据UCT求出的值,其中C取根号2。

        2.2 拓展阶段:

        此阶段需要对选出的最大节点添加孩子,这要求选出的节点还可以添加孩子,即未完全拓展的节点。在一般的MCTS(不与其他方法结合)下添加孩子,只需从满足实际情况的多个动作中随机选一个即可。比如节点A可以拓展十个孩子,但目前只有一个,拓展A时只需从剩余9个随机选择即可。

        2.3 模拟阶段:

        这个阶段可以说是MCTS的精髓,不论是MCTS与其他方法结合产生的威力,还是相比以前方法的突破,关键在于这个阶段。不妨将此阶段,MCTS模拟游戏进行的策略叫模拟策略(不是官方术语),最初的MCTS使用的模拟策略是服从均匀分布的随机模拟。比如从节点A开始模拟,节点的可能策略有a,b,c。那么节点A选择a的概率是三分之一,选择a后生成的新节点选择a的概率也是三分之一。模拟过程的每个节点都采用统一的模拟策略——选择a/b/c的概率都是三分之一。

        最后根据模拟对局的胜负判断节点A的好坏,这种根据多次随机试验逼近现实的思想即蒙特卡洛思想,起源于统计物理学,用来估计难以计算的积分。接下来,我会提出我仍在思考的问题抛砖引玉:

        1. 如果决策树的宽度是较大的(一个节点可以有很多孩子),那么均匀的从多个孩子做出选择,是否浪费了时间在一些坏的动作上?由此引发的思考是,模拟策略可不可以动态调整,或者根据先验知识,建立一个不均匀的概率分布来加快模拟效率?

        2. 如果决策树的深度很大,是否每次模拟都要进行到树的叶子才能算完成呢?如果加入了时间或者深度限制,那么如何评估此次模拟的“胜负”?比如模拟围棋,模拟到分出胜负的前几步,此时用什么指标表示此次模拟的胜负;如果模拟必须要分出胜负,有没有加快模拟的方法,或者说减少内存消耗的方法?毕竟模拟深度很大的话,对内存来说也是一个挑战。

        2.4 反馈阶段:

        根据模拟信息,将相应评价传回开始模拟的节点,及其所有直系祖先(他父亲,他爷爷,他太爷爷等)。比如模拟对局赢了,就把表示赢的数据传回去。设节点A模拟了10次,赢了6次,那么节点A的信息里有模拟次数:10,胜场:6,平均价值:0.6(设平均价值=胜场除以总场数)。

3. 日记1心得

        虽然MCTS的使用至今已经近二十年了,但由于理论上没有做到定性定量的分析MCTS。目前MCTS还没有官方的、权威的定义和相关术语,之前所讨论到的也只是MCTS体系里最经典、最早的一种。它相比于已经定义了的方法来说,更像是一种技巧,利用随机试验近似目标的技巧。MCTS的四阶段也不总是泾渭分明,所以,如果你在学习MCTS时也感到有些困惑,不必担心。另外,MCTS后续会有一个更出名的使用技巧,即与神经网络的结合(AlphaGo)。日记2我会谈论,MCST的新伙伴以及新的前景。

你可能感兴趣的文献:

        [1] 朱良双,王静文,李媛.基于UCT搜索算法的点格棋博弈系统研究[J].智能计算机与应用,2021,11(02):129-131.

        下文的第三章

        Sylvain Gelly, Levente Kocsis,. The grand challenge of computer Go: Monte Carlo tree search and extensions. Commun. ACM 55, 3 (March 2012), 106–113. https://doi.org/10.1145/2093548.2093574 

参考文献:

        1. Kocsis, L., Szepesvári, C. (2006). Bandit Based Monte-Carlo Planning.  https://doi.org/10.1007/11871842_29

        2. Rémi Coulom. Efficient Selectivity and Backup Operators in Monte-Carlo Tree Search. 5th International Conference on Computer and Games, May 2006, Turin, Italy. ffinria-00116992f

        3. 蒙特卡洛树搜索(Monte Carlo Tree Search)揭秘-CSDN博客 https://blog.csdn.net/fearlesslpp/article/details/134342648

基于蒙特卡洛树搜索 (Monte Carlo Tree Search, MCTS) 算法是一种用于决策问题的启发式搜索算法。MCTS 在不完全信息和高复杂度的问题中具有很好的效果。下面将介绍 MCTS 算法的 Java 版实现。 MCTS 算法的主要流程如下: 1. 创建一个根节点,表示当前的游戏状态。 2. 重复以下步骤,直到时间或迭代次数达到上限: a. 选择最有价值的子节点。从根节点开始,递归地选择子节点,直到找到一个未完全探索的节点。 b. 扩展选择的节点。根据游戏规则,生成该节点所有的合法子节点,并将其加入到中。 c. 随机模拟选择节点的子节点。从扩展的子节点中随机选择一个,并进行模拟。直到游戏结束,得到一个模拟结果。 d. 更新选择节点和其祖先节点的价值。根据模拟结果,更新选择节点及其祖先节点的胜利次数和访问次数。 3. 选择最优的子节点作为下一步的决策。 在 MCTS 的实现中,主要涉及以下几个关键的类和方法: 1. Node 类:表示搜索的节点,包含节点的游戏状态、访问次数和胜利次数等信息。 2. Selection 方法:通过选择最有价值的子节点来进行节点的选择。 3. Expansion 方法:扩展选中的节点,生成其所有合法的子节点。 4. Simulation 方法:随机模拟选中节点的子节点进行游戏,得到模拟结果。 5. Backpropagation 方法:根据模拟结果,更新节点和其祖先节点的访问次数和胜利次数。 6. BestChild 方法:选择最优的子节点作为下一步的决策。 通过以上关键步骤和方法的结合,可以实现 MCTS 算法的 Java 版本。使用该版本,可以在不完全信息和高复杂度问题上进行决策。例如,在棋类游戏中,MCTS 算法可以从当前局面搜索出最有希望的下一步,并进行决策。 总结而言,基于蒙特卡洛树搜索 (MCTS) 算法的 Java 版实现,通过节点的选择、扩展、模拟和回溯等关键步骤,可以用于解决复杂的决策问题。这种算法在游戏、人工智能等领域具有广泛的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值