- 原文地址:What is MCTS?
- 原文做者:cameronius
- 译文出自:掘金翻译计划
- 本文永久连接:github.com/xitu/gold-m…
- 译者:CACppuccino
- 校对者:ppp-man joyking7
蒙特卡洛树搜索(MCTS)是一种在人工智能问题中进行决策优化的方法,一般是对于那些在组合游戏中须要移动规划的部分。蒙特卡洛树搜索将随机模拟的通用性与树搜索的准确性进行告终合。html
冯·诺依曼于 1928 年提出的极小化极大理论(minimax)为以后的对抗性树搜索方法铺平了道路,而这些在计算机科学和人工智能刚刚成立的时候就成为了决策理论的根基。蒙特卡洛方法经过随机采样解决问题,随后在 20 世纪 40 年代,被做为了一种解决模糊定义问题而不适合直接树搜索的方法。Rémi Coulomb 于 2006 年将这两种方法结合,来提供一种新的方法做为围棋中的移动规划,现在称为蒙特卡洛树搜索(MCTS)。前端
近期因为它在计算机围棋上的成果和对某些难题具备解决的潜力,科研领域对于 MCTS 的研究兴趣快速上升。它的应用领域已不止于博弈,并且理论上 MCTS 能够应用于任何可以以 {状态,动做} 形式描述,经过模拟来预测结果的领域。java
最基本的 MCTS 算法自己就是简单的:根据模拟出来的结果,创建一棵节点相连的搜索树。整个过程能够被分解为以下几步:python
1.选择react
从根节点 R 开始,递归地选择最优子节点(下面会解释)直到一个叶子节点 L 为止。android
2.扩展ios
若是 L 不是终止节点(就是说,博弈还没有结束)那么就建立一个或多个子节点,并选择其中一个 C。git
3.模拟github
从 C 执行一次模拟推出(译者注:一般称为 playout 或 rollout)直到获得一个结果。算法
4.反向传播
用模拟出来的结果更新当前的移动序列。
每个节点必须包含两部分重要的信息:基于模拟所得结果的估值,和被访问的次数
在最简单和最大化利用内存的执行中,MCTS 会在每次迭代中添加一个子节点。注意,在某些状况下每次迭代增长多个子节点可能会更有益。
在树递归地向下发展时的节点的选择,是取决于该节点是否最大化了某些数量,相似于多臂老虎机问题:即玩家每回合都要选择那个可以带给他们最大化收益的老虎机。接下来的上限置信区间(Upper Confidence Bounds, UCB)公式一般会被用到:
其中 vi
是节点的估值,ni
是节点被访问的次数而 N
是它的父亲节点被访问的总次数。C
是可调的偏置参数。
UCB 公式在利用性与探索性之间提供了不错的平衡,鼓励访问不曾访问过的节点。奖励是基于随机模拟的,因此节点在变的可靠以前必须被访问必定的次数。MCTS 估值每每在开始的表现会很是不可靠,但随着足够多的时间而逐渐向可靠的估值收敛,如有无限多的时间则能够收敛至最优估值。
Kocsis 和 Szepervari (2006)首先利用 UCB 提出了一个完整的 MCTS 算法并命名为上限置信区间树(UCT)的方法。这个方法正是现在被大多数人采用于 MCTS 的实施中的算法。
UCT 能够被描述为 MCTS 的一种特殊状况,即:
MCTS 相对传统树搜索方法具备一些不错的优势。
MCTS最大的好处就在于它无需知道该博弈(或者其余问题领域)的任何战术或策略。这个算法能够无需知道任何该博弈的信息(除了可进行的动做和终止条件)。这意味着任何的 MCTS 的实现方案能够在仅仅修改一小部分后便移植到其余的博弈中,对于全部的博弈问题来讲 MCTS 的这个特性也是一种隐形的好处。
MCTS 表现出一种非对称的树增加来适应搜索空间的拓扑。算法会访问其更‘感兴趣’的节点,并将搜索空间集中于更加相关的部分。
这使得 MCTS 很适合于拥有大量影响因素的博弈中,如 19x19 大小的围棋。如此巨大的空间组合每每会使得标准的深度或广度搜索方法出现问题,但 MCTS 的适应特性意味着它会(最终)找到那些更为优秀的移动(动做)并专一于那里的搜索。
算法能够在任意时间停止并返回当前最佳的评估策略。创建的搜索树能够被抛弃或为之后的复用而保留。
算法很是易于实现,可见教程。(译者注:python 及 java 源码及相关知识点可在此找到)
MCTS 虽然只有少许缺陷,但他们能够很严重(影响树搜索的效果)。
MCTS 算法,在最基本的形式下,即便针对中等复杂度的博弈也有可能在必定时间内不可以给出很好的决策。这极可能是因为决策空间的绝对大小和关键树节点在没有被访问足够多的次数的状况下不可以给出可靠的估值的缘由。
幸运的是,算法的表现能够经过一些技巧来提高。
这里有两种方法可能有益于提高 MCTS 的实现:一个是对于特定领域,另外一个对于全部的领域。
对于特定博弈的领域知识一般会在进行模拟的阶段被开发出来,这样获得的推出或决策(playout)会与人类的选手的动做更加类似。这意味着推出的结果会变的比随机模拟更加的真实而且节点会在更少的迭代后产生真实可靠的估值。
特定的领域知识提高方法每每须要知道当前博弈已知的一些技巧,如围棋中的捕捉动做或者六贯棋中的桥指令。它们对当前博弈有巨大的提高效果,不过同时也牺牲了通用性。
领域独立提高方法有着很大的应用范围,是 MCTS 算法研究中的圣杯,也是当今不少研究所瞄准的方向。许多这样的提高被提出并与不一样层面的成功相吻合,从简单(博弈并获胜的移动/避免在推出中可能失败的移动)到复杂的节点初始化和选择方法,还有元策略。
能够经过浏览提高列表来查看 MCTS 更多提高的细节
MCTS 还是研究领域中的新的部分,有许多正在进行的研究课题。
几乎全部针对基本算法作出的提高建议都须要更多的研究。能够参考该提高列表
最简单的一个问题是,如何动态地调整搜索参数,如 UCB 中的偏置参数,来最大化算法效果,而且是否其余方面的搜索算法也能相似地被参数化呢。
有些应用适合于每次迭代扩展一个节点,而有些则适合多个。至今还没有有清晰的指导来告诉咱们哪些状况下应该使用哪一个策略,而且是否能够被自动化。
若能基于情景和节点在搜索树中的相对位置,知道一个节点要被访问了多少次以后才会变得可靠,会很是有用处。
咱们在这一方面已经针对 UCT 树会不会根据所给博弈的特定而产生另外一些特征,进行了初步的研究(Williams 2010)。有着不错的结果。
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、React、前端、后端、产品、设计 等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。