蒙特卡洛树搜索在围棋中的应用

  对于围棋这种指数级搜索空间中,使用蒙特卡洛树搜索MCTS能够将有限的算力集中到最有希望的子树上。

MCTS核心思想

graph LR
    A(选择\n selection) --> B(扩展\n expansion)
    B --> C(模拟\n simulation)
    C --> D(回溯\n backpropagation)
    D --> |重复多次| A

选择

  从根节点开始,根据UCB公式计算得到最大值的子节点。然后选择那个节点,不断向下搜索,知道到达底部的叶节点并等待下一步操作。

$$
UCB(child) = \overline{V_i} + c \cdot P \cdot \sqrt{\frac{\ln{N_{parent}}}{N_{child}}}

$$

  • $\overline{V_i}$:子节点的平均价值,比如围棋中的胜率
  • $P$:策略网络的先验概率
  • $N_{parent}$:父节点已经被访问的总次数
  • $N_{child}$: 子节点被访问的次数

  前一项代表这个分支的已知表现,后一项代表未来存在的可能。

扩展

  到达叶节点后,如果还没有到达终止状态。那么就需要对这个节点进行扩展,根据策略扩展出一个或多个节点,然后顺着这个新节点进入下一个状态。

模拟

  基于目前状态,用某种策略进行模拟,例如贪心策略,直到游戏结束产生结果。

回溯

  根据模拟出来的结果,从叶节点开始反向传播,更新所有节点的信息。

流程图

graph TD
    A(开始) --> B(进入当前节点)
    B --> C{当前节点是叶节点吗}
    C --> |NO|D(当前节点选择为子节点中UCB值最大的)
    C --> |YES|E{这个节点未被访问过?}
    D --> C
    E --> |YES|F(进行推演)
    E --> |NO|G(将当前节点下所有可能的新状态加入树中)
    G --> H(当前节点变成第一个子节点)
    H --> I(推演)

1785989269244

以AlphaGo Zero为例的应用

  在AlphaGo Zero中,使用价值网络直接评估叶节点来代替随机推演。这相较于传统的MCTS速度更快,使用神经网络对局面打分也能够体现对于局面的理解程度。但是其难点也就随之体现——如何找到一个有效的价值判断网络。

  假设在有一个足够强大的价值网络的情况下,模拟一次走棋的完整过程。

search_move(steps, board, color, curstep)
  └─ MCTS.search()
        for i in range(100):
            ① node, path = 选择()      # UCB 到叶节点
            ② _expand(node)            # 策略网络展开子节点
            ③ value = _evaluate(node)  # 立即评估这 1 个叶节点(1 次查询)
            ④ 回溯(path, value)        # 立即更新路径
        return _select_best()

  对于这个还可以再优化一下,利用GPU强并行的特性,将价值判断的过程优化为批量判断,这样可以进一步减少算法时间。

search_move(steps, board, color, curstep)
  └─ MCTS.search()
       for i in range(mcts_simulations):
           ① _select_leaf()    # UCB 到叶节点 + 虚拟访问
           ② _expand()         # 策略网络先验 → 子节点
           ③ 积累 pending 叶节点
           ④ 批量评估(积累够 batch 或最后一轮):
                _evaluate_batch()   # get_value_batch / 价值网络批量
                → _backprop()       # 更新路径
           ⑤ 可视化快照 + 步进(可选)
       _select_best()  # 访问次数最多 → 落子