MuGo 源码逐行解读:从特征提取到蒙特卡洛树搜索
MuGo 是一个模仿 AlphaGo 的极简 Go(围棋)引擎,使用 Python 实现。本文将深入剖析 MuGo 的核心技术架构,从棋盘特征提取到蒙特卡洛树搜索(MCTS)的完整实现流程,帮助开发者理解 AI 围棋引擎的基本工作原理。
核心功能概述
MuGo 复刻了 AlphaGo 的核心逻辑,主要包含三大模块:
- 特征提取系统:将围棋棋盘状态转化为神经网络可理解的特征平面
- 策略网络:预测落子概率分布的神经网络模型
- 蒙特卡洛树搜索:结合策略网络进行高效搜索的决策系统
项目结构清晰,核心代码集中在以下文件:
- features.py:棋盘特征提取实现
- strategies.py:MCTS 和各类玩家策略
- policy.py:策略网络定义
- main.py:训练和推理入口
特征提取:将棋盘转化为数字信号
围棋 AI 的第一步是将复杂的棋盘状态转化为计算机可处理的数字特征。MuGo 采用了与 AlphaGo 类似的多平面特征表示方法,定义在 features.py 中。
核心特征平面
MuGo 提取的特征按重要性排序包括:
- 棋子颜色特征(3 个平面)
- 当前玩家棋子、对手棋子和空位的位置分布
- 实现于 stone_color_feature 函数,通过独热编码区分三种状态
- 常量平面(1 个平面)
- 全 1 矩阵,帮助神经网络感知棋盘边界
- 关键代码:ones_feature 函数返回全 1 数组
- 气数特征(8 个平面)
- 表示每个交叉点的气数(棋子的自由点数)
- 通过 liberty_feature 函数实现,使用 make_onehot 进行独热编码
- 最近落子特征(8 个平面)
- 记录最近 8 步的落子位置
- 实现于 recent_move_feature,使用时间衰减的方式编码历史信息
- 捕获大小特征(8 个平面)
- 预测落子后可捕获的对方棋子数量
- 通过 would_capture_feature 计算潜在捕获收益
特征提取流程
特征提取的核心函数是 extract_features,它将上述特征平面串联成一个高维数组:
def extract_features(position, features=DEFAULT_FEATURES):
return np.concatenate([feature(position) for feature in features], axis=2)
这段代码将多个特征平面在深度维度上拼接,形成形状为 (19, 19, N) 的输入张量(其中 N 为特征平面总数),作为策略网络的输入。
蒙特卡洛树搜索:AI 决策的核心引擎
MuGo 的决策系统基于蒙特卡洛树搜索(MCTS),完整实现位于 strategies.py。MCTS 通过模拟大量可能的棋局来评估落子质量,主要包含四个步骤:选择、扩展、评估和回溯。
MCTS 节点结构
MCTS 的基本单元是 MCTSNode 类,每个节点包含:

