spdc-elm.github.io
➜~/blogs/newton-chess-rl-4
← back to blogs

牛顿棋RL 4: 初代AI棋圣的诞生

本文的 AI 一般指训练的下牛顿棋的这个神经网络,而 LLM 则指大家比较熟悉的大语言模型,也是平常经常说的 AI,比如 GPT-5.6-luna,GLM-5.3-flash 之类的模型

这个模型是 8-26 训出来的,我的网页上也可以体验。而看前天图文帖也知道,我已经在实战中让它跟真人对弈过几十场,AI 执先手的情况下,至今都未尝一败。能将它打到平局的人也屈指可数。就更不用说后手了。所以我感觉,已经可以封为初代棋圣了~

实战中的AI

是什么神奇的方式,让 AI 从先手孱弱的偏科生突破瓶颈,成为棋圣呢?答案是:

Gumbel + AlphaZero

让 LLM 借鉴前人经验的时候,查到了 2022 年 ICLR 的一篇论文:

Danihelka et al., Policy Improvement by Planning with Gumbel,ICLR 2022
https://arxiv.org/abs/2104.06303

论文解决的核心问题:

在动作空间较大、搜索预算有限时,传统 MCTS/AlphaZero 的 policy improvement 过程不够高效。

其实就是每轮 AI 在计算下一步的时候想多远,是用 sims 的数量衡量的(详见 牛顿棋RL 1:强化学习靠左脚踩右脚,真的可以上天? )。而这篇论文的思路可以在较少 sims 的情况下让 AI 的 policy 网络能力提升更快。policy 网络负责预测下一步走哪里,所以也可以比较粗浅地理解为,用更少的 sims(更少的算力、更快的时间)来提升模型棋力。

PUCT 的问题

先简单复习一下 牛顿棋RL 1:强化学习靠左脚踩右脚,真的可以上天? ,有这么两个性质:

  1. PUCT 指导的 MCTS 搜索中,根据 PUCT 公式,搜索最开始的阶段,往什么方向去搜索很大程度由网络的 policy 预测决定。
  2. AI 的policy network 的学习目标(称为 policy target)是 MCTS 搜索中节点的访问次数的分布。

这两个性质却分别可能带来两个问题:

第一,可能产生一种偏见:网络更喜欢走某一步-> 一开始优先搜索这一步 -> 这一步消耗更多搜索预算 sims ->它的访问次数更高 -> 被认为更值得选择。

第二,假如某个动作很不巧,我们没有访问到,那么在访问次数分布中直接认为该动作价值是 0(Policy target 直接认为这个动作没有价值)。

理想状态下,假如我们进行足够多的 sims,那么这两个问题其实都不算太大,因为 PUCT 的公式有探索纠正项(鼓励探索未知步骤),也有价值项(Q,以往探索给这一步估计的平均 value ),足够多的探索的时候,一开始的偏见大概率会被慢慢纠正,PUCT 较为可靠。然后基本上也能保证可能的下一步都被探索到。

之前 PUCT 方案训练时,sims 数真的够了吗?

之前 AI 训练时,glm-5.3-flash 给我选了个 sims 数为 96,我也不知道为啥。但是这个思考深度真的够吗?这样 MCTS 搜索出来给出的网络足够可靠吗?

我让 AI 做了个实验,看把搜索预算(sims)增加,得到的访问次数的分布变化如何(尤其是看,搜索给出的最有可能的下一手会不会变)。结果发现,96 次搜索在相当一部分局面上仍然无法稳定确定第一动作,继续增加搜索次数(sims)很可能改变我们对局面价值的判断。一直增加到 384~512sims 才渐渐稳定下来,但仍有一定波动。

这说明,其实原先训练的 sims 数可能远远不够。那刚才的两个问题就冒出来了:

  1. 先验自我强化(初始偏见可能真的有不小影响):网络更喜欢走某一步-> 一开始优先搜索这一步 -> 这一步在搜索前期消耗更多本就不充分的 sims 。 然而 sims 不够了,搜索提前停止了,所以这些网络偏好的步骤的访问次数更容易偏高,被认为更值得选择。
  2. 在 sims 不足情况下,有些可能有价值的下一步并没有被探索到,在 policy target 中直接价值归零。

所以模型棋力提升得慢,是因为它 policy network学习的目标——MCTS 经过 96sims 搜索出来的访问次数分布——具有以上的严重问题。好比学生对着一本答案有问题的练习册学习,自然困难重重,进步缓慢。

增加 sims 数可以缓解上述两个问题,然而,训练时间也就会大致按照比例相应增加,所以训起来一样也很慢。

所以,要么因为搜索不充分,policy 网络学习的目标答案本身有很大问题,进步缓慢;要么因为搜索深度高,每轮要花更久的时间,学起来时间长。一言以蔽之,PUCT 进步确实比较慢。

而 Policy Improvement by Planning with Gumbel,正好就是这个困局的解药。它的设计,能够解决前面提到的两个问题,从而,在动作空间较大、搜索预算(sims)较小的情况下让 AI 的 policy 网络能力提升更高效。

它是怎么做到的呢?

1. 初始动作候选集

Gumbel 在最初选动作的时候,不完全听网络 policy prior 给出的分数,而是给每个动作的“分数”加上一个随机量(符合 Gumbel 分布的一个随机量),然后排序选出总分最高的前 m 个动作,组成候选集。

其实跟之前提到的,根节点加 Dirichlet 噪声有一点点类似。不过具体为什么选择 Gumbel 分布等数学细节就略过了(其实是我也还没研究清楚)

这样,既参考网络 prior,又给低 prior 动作也有进入候选集的机会。而且自然地会有:高 prior 的动作进入候选集概率更高,但低 prior 的也有机会。

2. Sequential Halving,在候选集中组织淘汰赛

Gumbel AlphaZero 不让某个动作因为“早占坑”就一直吃预算,而是组织一个淘汰赛。

例如有 m=16,一开始候选集有 16 个候选动作,总预算是 96 个 sims:16 个动作,第一轮各拿一小部分预算进行搜索 -> 根据 Q(对这些动作 evaluate 后的价值估计),淘汰掉其中的八个 -> 对剩余 8 个拿一部分预算搜索,淘汰到剩下 4 个 ->…

这样的好处是:一个动作能否继续获得预算,主要取决于它在比较中的表现,而不是仅仅取决于它一开始的 prior 或者是否早被访问。 这就缓解了传统 PUCT 刚刚提到的“先验自我强化”(问题一)。

3. 最终的“答案”也不再只看节点访问次数:completed-Q

为了解决问题二,没被访问的路线价值被直接抹去,Gumbel AlphaZero 是这么想的:

  • 对于已经被充分搜索的动作,直接使用搜索得到的平均价值 Q
  • 对于访问不足(甚至没有访问)的动作,我们使用网络的 value network 做预测来辅助估计一个 Q 出来。

当然,不可能保证 completed-Q这个价值估计就一定准确,但是它确实解决掉了 PUCT 的问题二,给出了比 PUCT 方案更加合理的价值估计。

在我们的代码实现中,比较简单地采取了如下方案:如果动作被搜索过,Q 采用搜索得到的平均价值。如果动作没被搜索过,那么就用 value 网络预测的价值。

等等,我们不是在考虑解决先手的问题吗?

的确,Gumbel 改善的是有限 sims 搜索预算下的候选动作覆盖与策略改进,让 AI 棋力成长更快,并不直接改变先手弱的问题。

不过死马当活马医,当时确实是让 AI 把 Gumbel 这套方案实现了试试看,在 8-25 那个模型的参数基础上我们继续训练。

具体训练的超参数的细节是:去掉了 牛顿棋RL 3:苦练先手的小AI 采用的强制 15 种开局的搜索方案,换上了 Gumbel 这一套方案,又训了 170 个 iter。值得一提的是,LLM 还采用了渐进 sims 增加的方案,从 sims=32 逐步增加并最终稳定在 sims=96,也就是平均预算比原来 PUCT 方案还要少。

我们来看看训练结果:

跟 8-25 那个模型对战,呈现碾压之态

8-26 新模型先后手战绩胜率
新模型先手98 胜、1 负、1 和98%
新模型后手100 胜、0 负、1 和100%

然后更关注的是,先后手偏科情况是否有改善?看 temperature=1 情况下新模型内战数据:

角色胜局概率估计
先手6030.0%
后手7939.5%
和棋6130.5%

明显先手有了进步!虽然后手仍然有些优势,但已经到了感觉可以接受的范围内,甚至有可能很大部分真的是规则本身带来的区别?Gumbel 这套方案意外地让先后手不均衡的问题也有了明显改善。

马后炮一下,我们的解释是,先手弱的可能原因是 PUCT 模式的 MCTS 搜索可能因为 sims 不足,导致先手的真正好动作没有被探索到。而 Gumbel 改善了有限的 96sims 搜索下的动作探索效率,可能让先手的一些好动作被发掘出来,从而让模型的先手也大有进步。

Gumbel 并不是针对先手的优化,它只不过是让模型更有效率地发现了 牛顿棋这个既定规则下,先手本身更好的走法。正如我之前说过的,我认为虽然这个规则对后手有利,但是原先 AI 的先手走法还没达到这个游戏本身的上限。而 Gumbel,让 AI 在更短的时间内,更快地去接近这个规则本身的上限,所以最终带来了先手的提升。

本人认为这也是信息完全透明的游戏中,强化学习有魅力的地方之一:通过一些巧妙算法的设计,能让模型很有效率地去逼近规则本身的上限。它不需要有“人的经验”,人类的天花板不是 AI 的天花板,更不是规则限制下理论上的天花板。

棋圣初成,后面的路怎么走?

把 8-26 这个版本的模型,部署到了 taptap 的游戏里实战了三四天,打了至少六七十局有效对局(基本都是 AI 打先手)。平局应该有两三次,而败局竟然从未见过。

或许也是因为牛顿棋本身还是个小众的新游戏,也没有多少大神仔细研究。所以在目前的人类棋力下,我的大模型确实已经是这小小牛顿棋圈子中的棋圣了。

它证明了在一个新棋类中,人类甚至没有多少人研究,没有什么高棋力的棋手的情况下,AI 能够以碾压人类的效率(不眠不休)更快地学出它的较优的策略。那么这次 RL 学习的试验也算是小有成功了。更重要的当然是过程中学习到的相关知识,与诸君共勉。

其实后续还有许多可能的方向,例如,将棋盘扩大,模型能力是否能够快速迁移?三人(甚至多人对战下),AI 又应当如何训练?AI 学会的策略,有没有有效的方式能教学给人类?待我好奇心再起之时,可能会继续把这个项目往前推进。如果大家有什么好的想法和方向,也可以一起讨论。

同时,欢迎来挑战我的 AI 棋圣!