现代国际象棋引擎在1996年的Pentium上能否击败Kasparov?
摘要
Nicholas Carlini 证明,将现代 Stockfish 移植到1996年时代的200 MHz Pentium Pro 上运行,可达到约3300 Elo,远超 Kasparov 的约2800 Elo。这表明自1996年以来1335 Elo 的涨幅中,大部分来自更好的编程(+720),而非更快的硬件——也就是说,Deep Blue 的定制超级计算机从来都不是必需的。
暂无内容
查看缓存全文
缓存时间: 2026/11/03 12:42
# 现代国际象棋引擎能否在 Pentium 上击败 1996 年的 Kasparov?
来源:https://nicholas.carlini.com/writing/2026/algorithmic-improvements-chess.html
1996年2月10日,一个计算机程序(IBM 的 Deep Blue)首次在国际象棋对弈中击败了当时的世界冠军 Garry Kasparov。Deep Blue 最终输掉了那场比赛,但在一年后的复赛中以 3.5 比 2.5 的比分成功复仇。
为了实现这一壮举,IBM 投入数百万美元的研发费用,专门为此制造了一台专用计算机。Deep Blue 本体(获胜的升级版)搭载了 30 颗 P2SC 处理器,每颗运行频率约为 120 MHz,以及(最关键的)480 个定制 VLSI 棋类协处理器,专门用于执行走子生成、局面评估等棋类特定运算。建成时,Deep Blue 是全球第 259 强的超级计算机,每秒可分析超过 2 亿个国际象棋局面。
但是,击败 Kasparov 真的需要 Deep Blue 吗?还是说,一台普通的 1996 年台式机运行一个更聪明的象棋引擎就足够了?
事实证明,我们完全可以只用商用硬件轻松击败 Kasparov,而且(几乎可以肯定)差距还不会小。我之所以知道这一点,是因为在写下这句话的时候,我的手边就放着一台 200 MHz 的 Intel Pentium Pro(恰好在 31 年前——1995年11月1日发布),配备 64MB 内存,运行着一个 Stockfish(https://stockfishchess.org/)的定制移植版本,其经典时间控制下的估计 Elo 为 3300 ± 87——远超任何人类的棋力,甚至远高于 Kasparov 略低于 2800 的 Elo。等等,还有更劲爆的!我用一块 Realtek RTL8139C 网卡把这台机器接入了互联网,你可以在下面直接跟它下棋!
正在连接 Pentium……
## 等等,什么?!怎么可能?
提高棋力有三种途径:分析**更多**着法、分析**更好**的着法、以及把着法分析得**更好**。众所周知,人类靠的是后两者:一位国际象棋特级大师在经典对局中分析的着法数量与业余棋手大致相当,但他只分析最关键的着法,并且分析质量更高。像 Stockfish(https://stockfishchess.org/)这样的象棋引擎,运行在硅芯片而非人类大脑上,在第一个方面碾压我们,每秒分析数百万个局面。而且,由于现代引擎在让 CPU 每秒处理更多局面方面并没有*太多*微优化的空间,象棋 AI 的大多数进步也往往遵循人类提升的方式——寻找更好的着法选择方法和局面分析方法。
棋力以 Elo 分数来衡量。200 Elo 的差距意味着更强的一方应该在四局中赢得三局,以此按倍数递增:400 Elo 差距对应 90% 的预期得分,1000 Elo 差距则对应 99.7% 的预期得分。在 1996 年的商用硬件上你能运行的最强象棋引擎,Elo 大约在 2300 左右。Deep Blue 的 Elo 为 2700。相比之下,现代 Stockfish 的 Elo 更接近 3700。
这就引出了一个问题:现代象棋引擎的优势中,有多少来自现代台式机*极其*快速的硬件,又有多少来自我们编写象棋引擎技术的进步?事实证明,大部分 Elo 提升(+1335 中的 +720)要归功于更好的编程,而非更好的硬件。
为了验证这一点,我做了两组实验。第一个实验使用 Crafty(https://en.wikipedia.org/wiki/Crafty),一个 1996 年的竞技引擎,其源代码现已公开。在我的 Pentium Pro 上,1996 年构建的 Crafty 11.13 版本在每步 1 秒时 Elo 为 1999 ± 90,每步 10 秒时为 2383 ± 77。在现代硬件(Ryzen 7)上,这个引擎在同样每步 1 秒的条件下 Elo 大幅跃升至 2614 ± 97。但如果我把这个引擎逐步加入我们所知的现代象棋引擎设计知识——加入 fail-soft、LMR、correction history 等现代搜索算法;加入更好的静默搜索方法;加入神经网络评估(NNUE)——那么它在 Pentium Pro 上每步 1 秒可以达到 2718 ± 34,每步 10 秒可以达到 2974 ± 74。
在第二个实验中,我走得更远:与其试图更新 Crafty,不如直接尝试让 Stockfish——当今最强的象棋引擎——在 1996 年的硬件上运行,看看表现如何。这需要一些工作,主要是重写代码使其使用 32 位算术(PPro 是一台 32 位机器)并且不超过 64MB 内存。这个简单的移植版本在每步 1 秒时 Elo 约为 2496 ± 64(每步 10 秒时为 2940 ± 76)。但我们还能做得更好!现代 Stockfish 引擎是为现代 CPU 设计的。通过对算法做一系列调整并针对 Pentium 调优,我们可以将其 Elo 提升到每步 1 秒时的 2846 ± 35、每步 10 秒时的 3109 ± 79、每步 30 秒时的 3180 ± 80。
概括上述所有内容最简洁的方式,就是让它们之间进行一场 100 局的比赛。当我这样做时,我发现运行在 1996 年 Pentium Pro 上的现代象棋引擎以 78 胜、17 平、5 负击败了运行在现代硬件上的 1996 年 Crafty 引擎。
本文其余部分将提供详细内容。
### 技术细节:硬件与操作系统
说实话,关于硬件没什么太多可说的。我买了一台二手台式 PC,配备了当时的标准硬件。(商品描述写着"复古"——感觉好老了。)这台台式机搭载 200 MHz 的 Intel Pentium Pro,连接 Intel VS440FX 主板,配备 64MB、频率为 66 MHz 的 SIMM 内存。操作系统从 1.44MB 3.5 英寸软盘启动,通过 Realtek RTL8139C 接入互联网。我还有一块 1MB 的 Trio64V+ 显卡通过 VGA 连接显示器,输入来自 PS/2 键盘——但这两样我都不怎么用,而是通过连接到我现代台式机的串口与它通信。
对于可能无法很好理解这些硬件的读者:一台 200 MHz 的 Pentium Pro 在 1995年11月首发时售价为 1,325 美元,四条 16 MB SIMM 内存大约要 2,000 美元。再加上其他外设,这台机器大概要四五千美元。所以这是一台不错的工作站,但绝非超级计算机。不过,考虑到折旧速度和硬件的指数级提升,在 1997 年第二次对局时,同一台机器大概只值一千美元了(毕竟谁会在各方面几乎全面超越的 Pentium MMX 只卖 400 美元的时候去买 Pentium Pro 呢?)
象棋引擎与互联网之间的接口是一个定制的"操作系统",其唯一职责是启动象棋引擎并将其直接连接到网卡。(在整篇文章中,当我说"我写的"时,我真正的意思是"我让一个 LLM 写的"。我使用了 Fable 5.1、Opus 5.5 和 GPT-6 的组合。)它被设计得尽可能紧凑:这个操作系统(事实上更像一个 hypervisor 之类的东西)放在一张可启动的软盘上。它的唯一职责是引导 Pentium Pro 进入 32 位保护模式,初始化网卡,并等待进一步的指令。然后我可以将任何我想要的任意"用户态"客户程序发送到它的内存中,它会启动并运行该程序。我写的象棋程序启动了一个定制的 HTTP 服务器,等待接收包含给定局面(以 FEN 字符串表示)和最大运行时间的 HTTP 请求,对每个请求运行引擎直到计时结束,然后返回响应。
### 技术细节:软件
如前所述,我(再次强调:一个语言模型)实际上修改了两个引擎。更强的那个基于经过适配以在三十年前的处理器上高效运行的 Stockfish。它在经典时间控制下的估计 Elo 为 3300[\[a\]](https://nicholas.carlini.com/writing/2026/algorithmic-improvements-chess.html#footnote1),远高于 Kasparov 的 2800 Elo,因此我们预期 Stockfish-1996 会以大约 10 盘中赢 9 盘的比分胜出。较弱的那个(只弱一点点)引擎从 Crafty 11.13 的源代码开始,通过加入我们过去三十年学到的所有关于编写更好象棋引擎的经验教训来"穿越"到现代。
### 用现代技巧更新 Crafty 11.13(1996)
我(读作:我的 LLM)着手的第一个引擎是 Crafty 11.13 的 1996 年发布版。在这个引擎上,LLM 需要做最多的工作来移植过去 30 年学到的理念。以下是按每步 1 秒或每步 10 秒评估时 Elo 提升来源的分解。[[b\]](https://nicholas.carlini.com/writing/2026/algorithmic-improvements-chess.html#footnote2)
1 s/move10 s/moveChange**1999 ± 90****2383 ± 77**Crafty 11.13,1996年12月发布,原样出厂。最初编写的 alpha-beta 引擎。它有自定义评估函数,使用 90 年代标准的搜索算法。**2063 ± 73** **(+64 ± 116)****2323 ± 75** **(−60 ± 107)**第一项改进主要是微优化。它用 `bsf`/`bsr` 指令替换了两个 64K 条目的查找表;滑动子力的攻击计算也从较旧的旋转位棋盘函数调用迁移过来。这些更改总共使引擎快了 15%,但它使用的是相同的算法。**2022 ± 73** **(−41 ± 103)****2420 ± 76** **(+97 ± 106)**接下来的改进针对搜索算法。这包括 fail-soft(返回真实分数而非截断)、futility 和 late-move pruning(跳过叶子节点附近的安静着法)、late move reduction(对较晚的着法搜索浅一层)等技术,以及按 counter-move 和 history 表来排序着法。**2224 ± 72** **(+202 ± 103)****2520 ± 74** **(+100 ± 106)**下一个更改调优了搜索和评估函数。它首先运行 SPSA,基于数千盘自我对弈来调优所有搜索常量。然后它给评估项赋予独立的中局和残局值(按剩余子力混合),并重新拟合所有评估权重(Texel tuning)。最后,评估函数引入了机动性项,奖励子力可攻击的安全格子。**2192 ± 72** **(−32 ± 102)****2565 ± 74** **(+45 ± 104)**从这里开始,评估函数被重写并替换为一个在 1100 万个自我对弈局面(由引擎自身的搜索标注)上训练的小型神经网络评估。这一步本身效果不大,但它为下一步做好了准备……**2420 ± 82** **(+228 ± 109)****2712 ± 74** **(+147 ± 104)**用更强的教师(而非自我对弈)更新刚生成的 NNUE。原则上,我本可以使用同一引擎自身作为教师,但为了节省实际耗时,我用了 Stockfish。这把耗时从约 4000 个 1996 核心年(在 1996 年完全可行——但遗憾的是我孤零零的一台台式机做不到)减少到了现代台式机上运行现代引擎仅需几天。**2630 ± 82** **(+210 ± 116)****2810 ± 75** **(+98 ± 105)**有了一个强得多的评估函数,搜索现在可以真正依赖它了。它增加了 reverse futility pruning,当评估函数认为局面已胜时提前返回。它还为评估器添加了一些性能改进(评估缓存、与 null move 共享的累加器)。这使得它可以将网络宽度扩大 6 倍。它还清理了一些代码,例如去掉 Crafty 中那些在较弱评估函数下重要但 NNUE 下不再重要的特例。**2720 ± 82** **(+90 ± 116)****2938 ± 74** **(+128 ± 105)**参数再次用 SPSA 根据新的评估函数重新调优。它还修复了一些代码中的 bug(蛮有意思的)。最后它对 NNUE 做了一些更改:增加了更多输出头并根据棋盘上的子数来选择,增加了隐藏单元,并通过更多自我对弈将训练数据翻倍。
### 将 Stockfish 17 移植到 Pentium Pro
在第二个引擎上,如上所述,我做了相反的操作。我(再次强调:我的 LLM)将 Stockfish 移植到 1996 年的硬件上运行,然后调整参数使其更适合较低的搜索深度。这里的提升因此相对温和,因为已经没有大的算法级收益了。
1 s/move10 s/moveChange**2496 ± 64****2940 ± 76**Stockfish 17 被塞进了这台机器。第一次简单的移植将 Stockfish 17 重写为 1996 年的机器版:单核、无 SIMD、无 64 位寄存器、无 C++ 标准库。它去掉了线程、残局库,用一个小得多的网络替换了 71 MB 的 NNUE。它将位棋盘重写为一对 32 位 int,并用纯整数运算评估小型 NNUE。**2590 ± 67** **(+94 ± 93)****2961 ± 74** **(+21 ± 106)**更快的累加器维护。第二个修复确保 NNUE 的运行和得到更好的更新,并提升了评估器的性能。**2752 ± 68** **(+162 ± 95)****3006 ± 74** **(+45 ± 105)**更廉价的评估函数,使用 PeSTO 混合,更改编译器标志。接下来它再次修改 NNUE,缩小其大小并调优以在 Pentium Pro 上更快运行,将评估时间减少了 3 倍。结合一些额外的优化更改,这一轮在每步 1 秒(原始速度最重要的地方)获得的提升是所有步骤中最大的,而在每步 10 秒时提升则少得多。**2780 ± 67** **(+28 ± 95)****3070 ± 72** **(+64 ± 103)**在策略上微调 NNUE。基本上重复之前的工作,但这次是在 Stockfish 上,用 Stockfish 对数百万个局面评分以重新推导 NNUE 权重。**2784 ± 65** **(+4 ± 93)****3070 ± 72** **(+0 ± 101)**SPSA 重新调优搜索,移除 PeSTO(因为 NNUE 已改进)。原版 Stockfish 假设它能以每秒数百万节点的速度运行,因此在较慢的 CPU 上有必要再用一轮 SPSA 重新调优参数。这些更改也使得 PeSTO 那一步不再必要。**2819 ± 65** **(+35 ± 92)****3074 ± 72** **(+4 ± 101)**加入 correction history,联合调优其他参数和 NNUE。下一轮带回了 Stockfish 的非兵 correction history,通过 SPSA 联合优化参数,并重新拟合 NNUE。**2846 ± 35** **(+27 ± 74)****3109 ± 79** **(+35 ± 107)**最后一步不改变任何代码
相似文章
1997年深蓝击败卡斯帕罗夫后,人们普遍担心人类国际象棋将失去意义,职业棋手将失去生计。然而,实际情况恰恰相反:人类对国际象棋的兴趣以及以国际象棋为全职职业的人数急剧增长。
反思深蓝1997年战胜卡斯帕罗夫并未损害国际象棋,反而提高了人们对国际象棋的兴趣,并产生了更多职业棋手。
Stockfish 19
Stockfish 19 宣布为开源国际象棋引擎的一个新主要版本,特点是 Elo 评分提升了多达 44 分、升级了 NNUE 架构以及扩展了平台支持。
@shawn_pana:Opus 4.7 击败了 Stockfish……Claude Code 刚学会了下棋 > 从 DOM 中解析棋盘状态 > 跟踪变化……
Anthropic 的 Opus 4.7 展示了下棋能力,击败了 Stockfish。Claude Code 能够自主解析网页中的棋盘状态,并通过浏览器交互实时走子。
DeepSeek-V4-Flash-0731:在国际象棋基准上超越 Fable-5、Sol 与 Kimi-K3
DeepSeek 发布了 V4-Flash-0731,这是一个在国际象棋基准上超越 Fable-5、Sol 和 Kimi-K3 的 AI 模型。
普林斯顿研究人员训练了一个 4B 参数的 LLM,国际象棋水平达到 2700 Elo(停止训练时仍无任何见顶迹象),并且能够准确解释自己的走法。他们表示该训练技术也可应用于其他游戏、机器人和计算机使用
普林斯顿的研究人员利用 AlphaZero 算法的自然语言类比,训练了一个 40 亿参数的 LLM,使其国际象棋水平达到 2700 Elo。通过架构与算法上的创新,该模型还能准确解释自己的每一步走法。作者表示,这项技术可推广至其他游戏、机器人以及计算机操作等领域。