乐于分享
好东西不私藏

国际象棋 AI 让你一个后,你能赢吗?

国际象棋 AI 让你一个后,你能赢吗?

在上一篇文章中,我们介绍了 Stockfish 的基本原理。

简单来说,Stockfish 像一位极其严谨、速度惊人的计算大师:它会在棋盘上展开庞大的搜索树,利用 Alpha-Beta 剪枝、局面评估、走法排序、置换表、残局库等方法,在有限时间内尽可能找到最优走法。

但 2017 年,DeepMind 提出了另一种完全不同的路线:AlphaZero

它不是从人类大师棋谱中模仿,也不是依赖大量人工设计的局面特征,而是从零开始,只知道规则,然后通过不断和自己对弈逐渐学会如何下棋。DeepMind 的论文中明确指出,AlphaZero 在国际象棋、将棋和围棋中都采用了同一种通用强化学习算法,并且除了游戏规则之外,不使用额外领域知识。

论文:Mastering Chess and Shogi by Self-Play with a General Reinforcement Learning Algorithm


传统引擎:先搜索,再评估

传统引擎大致做两件事:

第一,搜索未来的变化

从当前局面出发,它会尝试不同走法,继续推演对方回应,再继续推演自己的下一步,就像展开一棵巨大的“走法树”。

第二,评估叶子局面

由于不可能一直算到将死,所以引擎会在某个深度停下来,对当前局面打分。以前这类评估函数依赖大量人工设计特征,比如子力价值、王安全、兵型、空间、机动性等;现代 Stockfish 使用 NNUE 神经网络评估,但整体搜索框架仍然延续 Alpha-Beta 搜索传统。


AlphaZero:先形成直觉,再重点搜索

AlphaZero 的核心由两个部分组成:

第一部分:神经网络

这个神经网络输入当前棋盘局面,输出:

  1. Policy 策略头:告诉程序“哪些走法看起来更有希望”;
  2. Value 价值头:告诉程序“这个局面对当前一方大概是好是坏”。

第二部分:蒙特卡洛树搜索MCTS

MCTS 会从当前局面出发,一次次模拟未来变化。但它不是像 Alpha-Beta 那样追求极大极小值,而是根据神经网络给出的先验概率和局面价值,逐渐把搜索集中到更有希望的分支上。

最后,AlphaZero 不一定选择神经网络一开始最喜欢的走法,而是选择在搜索过程中被访问次数最多、综合表现最好的走法。


AlphaZero 是怎么从零开始学会下棋的?

AlphaZero 的训练过程可以分成四步

第一步:随机初始化

一开始,神经网络的参数是随机的。这时 AlphaZero 完全不会下棋。它对局面的判断、对走法的偏好,都很混乱。

就像一个刚知道规则的新手,只知道马走日、象走斜线、王不能被将军,但完全不知道什么是中心、王翼进攻、弃子补偿、弱格和残局转换。

第二步:自己和自己下棋

AlphaZero 让当前版本的自己和自己对弈。

每一步棋,它不是直接随便走,而是先用 MCTS 搜索。搜索过程中,神经网络会提供直觉,MCTS 会提供修正。

这就像一个新手虽然棋感很差,但每一步都允许自己认真分析很多可能性。虽然一开始分析也不准,但总比完全随机要好一点。

第三步:从结果中学习

一盘棋结束后,结果只有三种:

赢:+1和:0输:-1

AlphaZero 会回头看这盘棋中的每个局面,调整神经网络:

如果当时它判断“这个局面很好”,但最后输了,那说明判断错了,要修正。

如果 MCTS 搜索后认为某个走法更可靠,而神经网络一开始没看好它,那说明神经网络的策略也要修正。

第四步:不断循环

新的神经网络变强一点后,再用它继续自我对弈。

然后再学习,再对弈,再学习。

当前棋力 → 自我对弈 → 搜索改进 → 学习结果 → 棋力提升 → 更强的自我对弈

这就是 AlphaZero 的核心飞轮。


Leela Chess Zero:开源世界的 AlphaZero 路线

AlphaZero 本身并没有作为公开引擎发布。普通棋友无法下载一个官方 AlphaZero,然后在电脑上直接运行。

但开源社区很快开始尝试复现 AlphaZero 的思想,其中最著名的项目就是:Leela Chess Zero,简称 Lc0

https://lczero.org/

https://github.com/glinscott/leela-chess

它大致沿用了 AlphaZero 的核心思想:

  1. 使用神经网络评估局面;
  2. 使用策略输出指导搜索;
  3. 使用 MCTS/PUCT 进行选择;
  4. 通过大量训练形成棋力;
  5. 由社区共同开发、训练和改进。

与 Stockfish 相比,Lc0 通常更依赖 GPU,因为较大的神经网络评估更适合在 GPU 上并行计算。你可以像使用 Stockfish 一样,把 Lc0 接入常见国际象棋 GUI 中,然后让它分析棋局或进行引擎对局。


在 Lichess 上和 Leela 对弈

棋友们也可以直接在 Lichess 上挑战 Leela 相关机器人。

Lichess 上有一个全强度机器人账号:@LeelaChess

https://lichess.org/@/LeelaChess

它接受 UltraBullet、Bullet、Blitz 和 Rapid 等时间控制的挑战。

当然,完整强度的 Leela 对普通棋友来说可能太强了。

所以可以挑战一些“让子”版本:@LeelaKnightOdds(Leela少马)、@LeelaRookOdds(Leela少车)、@LeelaQueenOdds(Leela少后)、@LeelaQueenForKnight(Leela少后、人类少马)等等

此外,还可以在@LeelaPieceOdds选择包含后、马、象、车等的不同让子组合

超强引擎让你一个后,你真的能赢吗?快去挑战吧!