蒙特卡罗树搜索(MCTS)
蒙特卡罗算法的思想可以看我这篇博客
蒙特卡罗树搜索,即 Monte Carlo tree search(MCTS)是一种启发式搜索算法。现在我们来考虑下围棋这个游戏,我们用经典的Minmax搜索会碰到两个问题:
- 每一步可能有很多中走法,这就导致搜索树太广。
- 要走很多步游戏才结束,也就是说搜索树特别深。
这时,蒙特卡罗树搜索就能发挥作用,它不遍历整个搜索树,也即找到的不是最优解,但是是一个解决该问题的方法,它可以让游戏树向最优的方向扩展。
原理
蒙特卡罗树搜索的每个循环包括下面四个步骤(看不懂没关系,我后面会结合图具体讲解):
- 选择(Selection):从根节点R开始,选择合适的子节点向下至叶子节点L(怎样选择合适的点后面再说)。
- 扩展(Expansion):除非任意一方的输赢使得游戏在L结束,否则创建一个或多个子节点并选取其中一个节点C。
- 仿真(Simulation):在从节点C开始,用随机策略进行游戏,又称为playout或者rollout。
- 反向传播(Backpropagation):把模拟的结果加到它所有的父节点上。
上图来自于维基百科,每个节点上的A/B可以理解为,该节点被访问了B次,然后黑方胜利了A次,可以对照理解它的四个步骤。所以,我们其实可以看出,它是想用选择某节点后输赢的频率来代替选择该节点后输赢的概率,也就是说我想计算走这一步后的最后赢的概率,但是因为无法穷举,就计算输赢的频率。用能观察的频率代替真实的概率。
选择方式
现在来介绍第一步怎么选择,我们肯定希望选择最具有潜力的节点,选节点有很多种方式,最经典的方式是UCB1公式,取其值较大的节点,公式具体为:
w
i
n
i
+
c
ln
t
n
i
\frac{w_i}{n_i}+c\sqrt{\frac{\ln t}{n_i}}
niwi+cnilnt
- w i w_i wi代表第 i i i次移动后取胜的次数。
- n i n_i ni代表第 i i i次移动后仿真的次数。
- c c c为探索参数—理论上等于 2 \sqrt {2} 2;在实际中通常可凭经验选择; c c c越大,越会照顾访问次数相对较少的节点。
- t t t代表仿真总次数,等于所有 n i n_i ni的和。
例如:
7/10对应的分数为:
7
10
+
c
log
21
10
≈
0.7
+
0.55
c
\frac{7}{10} + c\sqrt{\frac{\log 21}{10}}\approx0.7+0.55c
107+c10log21≈0.7+0.55c
5/8对应的分数为:
5
8
+
c
log
21
8
≈
0.625
+
0.62
c
\frac{5}{8} + c\sqrt{\frac{\log 21}{8}}\approx0.625+0.62c
85+c8log21≈0.625+0.62c
扩展
如果所选节点L能判定输赢,则该轮游戏结束,否则,创建一个或多个子节点C;
如果所选节点L不能判定输赢,如上图第2个树,选择了叶子节点3/3,然后建立一个子节点,初始状态为0/0。
仿真
到这一步原则上是采用随机策略,实际操作也可以使用一下“有经验”的策略,不过仿真需要快速完成,也即需要快速分出胜负。从上图第三个树上可以看出,最后黑方输了,然后这个节点为0/1,也即访问了一次,赢了0次。
反向传播
这一步很简单,就是将刚才的结果加到所有的父节点上。如上图所示,它的父节点访问次数都加1,黑方赢的次数都加0。
使用蒙特卡罗树做决策
当构建好一颗蒙特卡洛树以后,需要用它来做决策时,应该选择访问量最大的节点。因为我们可以试想一下,如果访问量很低的节点,就算它的胜率很高,也不可靠,因为模拟次数太少。而访问量大的点是通过UCB公式选择出的,所以它的胜率不会低,而且稳定性强。