项目概览¶
这是什么¶
这是一个围绕 15x15 棋盘构建的自博弈与 MCTS 实验系统。棋盘形式看起来像围棋,但规则被刻意简化,用来降低规则复杂度,把主要精力集中在搜索、训练、记录和恢复流程上。
如果你完全没接触过这类项目,可以把它理解成一条重复执行的流水线:
- 程序根据当前模型能力自己下棋。
- 每一步和每一盘结果都会被保存。
- 这些保存下来的棋局再被拿去训练模型。
- 训练后的新模型继续参与下一轮下棋。
为什么需要这种项目¶
如果目标是验证长期训练闭环,最怕的是两种问题:
- 规则复杂到很难确认实现边界。
- 训练跑了很久,但留下的数据不足以解释发生了什么。
这个项目的做法是先把规则收敛成一个确定、可测试、可序列化的版本,再把自博弈、模型训练、checkpoint 和指标落盘接起来。这样即使训练中断,也还能从保存的数据继续往前走。
本项目里有哪些核心部件¶
简化规则¶
它是什么: 一个 Go-like 的落子与提子系统,支持黑白轮流、落空点、pass、自杀手判定、提子和重复局面保护。
为什么需要: MCTS 和 self-play 必须建立在稳定的状态转移上。规则如果摇摆,训练数据就没有统一意义。
在本项目里怎么用: 规则只在 Rust engine 中实现,Python 不复制第二套规则逻辑。
输入输出是什么:
- 输入:当前棋盘状态、轮到谁走、候选行动。
- 输出:合法性判断、落子后的新局面、提子结果、终局原因和分数相关字段。
怎样判断结果是否正常:
- 非法落子必须被拒绝。
- 连续两次 pass 后必须终局。
- 同一局内的历史重复局面必须被拒绝。
- 提子和得分记录必须能落到棋谱里。
如果你对 pass 这个词不熟,这里它的意思是“这一手选择不落子,直接把行动权交给对方”。
MCTS¶
它是什么: Monte Carlo Tree Search,用来在当前局面上分配搜索预算,选择更值得扩展的行动。
更白一点说,它像是在真正落子前,先把几种可能的下法多试几遍,再决定更值得走哪一步。
为什么需要: 项目不是随机下棋实验。它需要一个能把模型输出和局面搜索接起来的决策过程。
在本项目里怎么用: Rust 侧负责节点结构、选择、扩展和回传,模型推理由 Python 提供。
输入输出是什么:
- 输入:当前局面、合法行动、模型给出的 policy/value。
- 输出:某一步的搜索统计结果,以及最终选择的行动。
怎样判断结果是否正常:
- 搜索过程不能产生违反规则的行动。
- 节点扩展和回传后,访问次数与价值统计应持续增长。
- self-play 最终能从这些决策走到合法终局。
训练闭环¶
它是什么: 把 self-play 生成的数据重新喂给模型训练,再用新模型继续 self-play 的循环。
为什么需要: 如果只有棋局生成,没有后续训练,就无法验证模型是否真的从数据中学到东西。
在本项目里怎么用: Python 训练入口负责读取保存的对局数据、构造 batch、更新 residual CNN、保存 checkpoint,并把结果反馈给后续自博弈。
输入输出是什么:
- 输入:棋谱记录、配置、上一个 checkpoint、训练设备信息。
- 输出:更新后的模型参数、checkpoint、metrics、下一轮可用的推理能力。
怎样判断结果是否正常:
- 训练过程能持续写出 checkpoint 和 metrics。
- 中断后可以恢复,而不是从头开始。
- 训练设备切换只改变硬件使用,不改变模型主线。
这里的 metrics 可以先理解成“训练过程里的数字记录”,比如训练到了第几步、loss 怎么变、用了多少 worker。这些数字不是装饰,它们决定你后面能不能判断训练到底在正常推进,还是早就跑偏了。
这个项目明确不做什么¶
- 不实现完整标准围棋裁判。
- 不做职业棋力承诺。
- 不为演示效果牺牲数据完整性。
- 不让 Python 和 Rust 各自维护一套规则。