MCTS与Latent Planning
一句话定位
MCTS(蒙特卡洛树搜索)通过在潜在状态空间中进行前瞻性规划,将无模型的探索与基于模型的推理相结合,是AlphaZero和MuZero等系统的核心决策引擎。
前置依赖
- MCTS基础理论 (2006): Rémi Coulom提出的完整蒙特卡洛树搜索框架
- UCT算法 (2006): Kocsis和Szepesvári将UCB公式引入MCTS
- AlphaZero (2018): 将MCTS与深度神经网络结合的自适应搜索
- MuZero (2020): 在潜在空间进行MCTS的隐式世界模型方法
- UCB (Upper Confidence Bound): 多臂老虎机中的探索-利用平衡理论
核心思想
MCTS的核心思想是:通过增量式采样和自适应展开,在有限计算预算下逼近最优决策。
传统动态规划方法(如DP、Value Iteration)需要完整环境模型或所有状态转移概率。MCTS通过以下机制克服这些限制:
- 样本代替枚举: 不遍历所有状态,而是通过模拟采样估计
- 自适应树结构: 高价值区域获得更多搜索资源
- UCB平衡探索利用: 理论保证收敛到最优策略
- 潜在空间规划: 在抽象表征空间而非真实环境中搜索
数学推导
1. MCTS基础框架
MCTS算法核心是迭代执行四个步骤(一个模拟循环):
while within computational budget:
1. SELECTION: 从根节点选择最优子节点
2. EXPANSION: 添加新子节点到树中
3. SIMULATION: 从新节点进行随机展开
4. BACKUP: 沿路径反向传播回报
2. UCB公式推导
对于节点
其中:
是动作价值的经验均值 是父节点访问总数 是该动作被选择次数 是探索常数
2.1 UCB的理论基础
Chernoff界给出 Hoeffding不等式的概率边界:
由此推导出UCB的置信上界:
当奖励有界
3. 树搜索的Backup机制
设从节点
这是增量式均值更新,计算高效。
对于多臂老虎机,问题被正确解决。但对于序贯决策,我们需要考虑折扣因子。
4. 折扣累积回报
对于 MDP
定义价值函数:
贝尔曼方程:
5. 坦南特舒尔曼树 (Tanent-Schmidhuber Tree)
MuZero使用的MCTS变体,关键改进是截断模拟(Truncated Rollout):
标准MCTS:
Selection → Expansion → Simulation → Backup
(展开整个游戏) (从新节点 rollout到终止状态)
MuZero MCTS:
Selection → Expansion(仅1步) → Prediction → Backup
(展开1步,用学习模型估计价值而非继续模拟)
5.1 坦南特舒尔曼树的数学表示
设当前隐藏状态为
选择阶段:
其中探索项:
动态函数前向:
评估阶段:
备份阶段:
其中模拟回报:
6. 潜在规划的数学基础
潜在规划的核心是抽象空间中的MDP:
设学习到的状态空间为
规划问题转化为:
这个框架的优势:
- 潜在空间维度通常远低于原始观察空间
- 转移函数可以是确定性的(简化规划)
- 忽略无关视觉细节,聚焦任务相关特征
7. 树搜索与值估计的结合
AlphaZero/MuZero的创新在于用神经网络估计先验概率和价值:
损失函数:
其中
8. 搜索策略的PAC-Bayes分析
PAC (Probably Approximately Correct) 框架下,MCTS可以被解释为紧缩先验权重的过程:
定义搜索树的边缘策略:
MCTS的理论保证:
这意味着随着模拟次数增加,搜索策略收敛到最优策略。
MCTS算法变种
1. 基本MCTS (Original Coulom)
- 完全随机模拟 (Pure Monte Carlo)
- 无剪枝、无启发式
- 简单但低效
2. UCT (Upper Confidence Bounds for Trees)
- 使用UCB1进行选择
- 理论保证渐近最优
- 标准工业实现
3. AMAF (All Moves As First)
- 反事实评价未选动作
- 加速小状态空间学习
- 也称GRUE或RAVE
4. AlphaZero风格的MCTS
- 神经网络提供先验
- 并行模拟(数百个同时进行)
- 截断模拟 + 价值估计
- DPWI (Depthwise Parallel Wrap-In)
推理/Planning过程详解
Planning循环
输入: 初始观察 o_0
输出: 动作序列 (a_0, a_1, ..., a_T)
for t = 0 to T:
# 1. 编码当前观察
h_t = f(o_t)
# 2. 运行MCTS
for sim = 1 to N:
h = h_t # 复制根状态
for depth = 0 to MAX_DEPTH:
if h 是叶节点:
# 扩展
for a in actions:
h' = g(h, a)
r = h(h, a)
(π, V) = φ(h')
创建节点
break
else:
a = UCB选择(h)
h = g(h, a)
# 备份
更新路径上所有节点的价值
# 3. 选择根节点动作
a_t = argmax_a N(h_t, a)
# 4. 执行动作
o_t = env.step(a_t)
树重用 (Tree Reuse)
推理时复用部分计算的关键:
- 执行动作
后,获取对应子节点 - 将
作为新根节点 - 保留其子树结构,只移除其他兄弟节点
- 节省约50%计算量
与MuZero的关系
MuZero是MCTS在隐式世界模型框架下的实现:
| 组件 | 传统MCTS | MuZero |
|---|---|---|
| 状态空间 | 枚举所有真实状态 | 潜在抽象状态 |
| 转移模型 | 规则模拟器 | 学习到的 |
| 先验知识 | 均匀分布 | 神经网络 |
| 价值估计 | 随机模拟到终止 | 神经网络 |
| 展开深度 | 到终止状态 | 1步 + 估计 |
优点与局限
优点
- 无需精确模型: 通过采样近似,无需枚举所有转移
- 渐进最优: UCB保证收敛到最优策略
- 可解释性强: 搜索树可视化决策依据
- 并行友好: 各模拟相互独立,易于并行化
- 灵活先验: 可嵌入领域知识作为先验
局限
- 计算密集: 需要足够模拟次数才能可靠
- 维度灾难: 状态空间大时,搜索效率下降
- 部分可观测性: 标准MCTS假设完美信息
- 长视界困难: 折扣因子导致远期信号弱
可复现实现要点
核心数据结构
class MCTSNode:
def __init__(self, prior=0.0):
self.visit_count = 0
self.value_sum = 0.0
self.prior = prior # 神经网络先验
self.hidden_state = None
self.children = {} # action -> MCTSNode
self.reward = 0.0
self.value = 0.0UCB选择实现
def ucb_score(self, parent_visits):
exploitation = self.value_sum / max(1, self.visit_count)
exploration = (self.prior *
math.sqrt(parent_visits) /
(1 + self.visit_count))
return exploitation + self.exploration_constant * exploration并行MCTS实现
def parallel_mcts(root, num_simulations, num_workers):
with ThreadPoolExecutor(num_workers) as executor:
futures = [executor.submit(simulate, root)
for _ in range(num_simulations)]
for future in futures:
future.result()章节摘要
MCTS是现代AI规划系统的核心算法,通过UCB平衡探索与利用,在搜索树中渐进收敛到最优策略。坦南特舒尔曼树的引入使得在抽象潜在空间中进行规划成为可能,为MuZero等系统提供了”学习+规划”的框架。本章详细推导了UCB公式、价值备份方程,以及MCTS与神经网络结合的数学原理,为理解MuZero和后续章节奠定基础。
关键词
- MCTS, 蒙特卡洛树搜索, UCB公式, 探索-利用平衡
- 坦南特舒尔曼树, 截断模拟, 价值备份, 潜在规划
- PAC-Bayes, 树搜索, AlphaZero, UCT算法