增强 Stockfish:为训练人类棋手量身定制的国际象棋引擎
1. 引言
对像 Stockfish 这样的国际象棋引擎进行优化是一项具有挑战性的任务。主要挑战之一在于如何改进其高度优化且高效的算法,该算法能够快速评估局面并做出决策。任何改进都需要对国际象棋策略和战术有深入的理解,以及将这些想法在代码中实现的能力。
有一个庞大的社区热衷于讨论和参与这个话题,他们几乎每天都在修改 Stockfish 并开发新版本。他们依据国际象棋和机器学习领域的新研究和发现,不断更新和测试引擎。这需要有强烈的意愿紧跟最新发展,并愿意持续修改和测试引擎的进展。
多年来,国际象棋引擎拥有一个稳定的架构,它根据受既定国际象棋策略概念启发的局面因素来评估替代走法。最近,深度学习技术的应用取代了传统的评估方法。神经网络的使用极大地提高了分析质量。然而,放弃传统的评估函数,用机器学习获得的神经模型取而代之,使得国际象棋引擎对人类棋手的训练变得更加困难,因为很难解释引擎建议的走法的“含义”。因此,一个有趣的研究目标是将传统评估与能够利用神经网络的技术相结合,以提供对人类棋手训练有用的功能。
2. 动机
Stockfish 国际象棋引擎(当前版本 16)是一个用 C++ 编写的开源程序。其搜索组件基于带迭代加深的 alpha - beta 剪枝算法。
直到版本 11,评估函数是一个包含多个项的长多项式,用于对物质、机动性、王的安全性等国际象棋概念进行评分。对评估函数中各项权重的任何添加或修改都需要在大量游戏上进行测试。这些测试在一个名为 FishTest 的分布式平台上进行,在两种不同的时间控制下,让程序的不同版本进行数千场对局:首先使用非常短的时间控制(最初是每局 5 秒加每步 0.1 秒),如果第一阶段结果积极,则使用更长的时间控制(最初是每局 10 秒加每步 0.1 秒)。经过这些广泛的测试对局,如果结果积极,新版本才会被接受。这种方法是必要的,因为增强 Stockfish 面临着“神谕问题”:如果国际象棋引擎的表现优于任何潜在的测试者,测试者如何声称某个评估是错误的,或者某个建议的走法不是最佳走法呢?
2020 年,一个名为高效可更新神经网络(简称 NNUE)的新组件被引入 Stockfish 版本 12。NNUE 是一种特殊类型的神经网络,经过训练以预测传统评估函数的输出,从而节省时间并增加搜索深度。它的开发是为了在不使用 GPU 的情况下获得机器学习的优势。这个想法最初应用于日本将棋,然后应用于国际象棋;引入 NNUE 后,Stockfish 的性能明显提高。NNUE 评估即使在短评估时间内也非常强大,以至于在下一个版本中,经典评估函数很可能会从源代码中删除。
Stockfish 在对人类棋手的可用性方面存在一些众所周知的局限性:
- 在让子模式下,随着目标 Elo 等级分的降低,Stockfish 会故意随机犯更多的错误。这对人类棋手用处不大;一个针对人类训练定制的让子模式会好得多。
- 给走法或局面的评分往往与 Informant 符号不一致:这给人类对引擎输出的解释带来了问题。
- 机器学习技术应用于评分函数,但未应用于搜索算法。
- 搜索包含一些复杂的选择性技术(特别是剪枝):虽然这些技术使 Stockfish 在对局中非常强大,尤其是在短时间内,但在解决我们称之为“混乱”的不平衡局面时,它的能力会减弱。混乱局面对于想要尝试未探索的开局变体的强大人类棋手非常有用。可以通过手动禁用一些选择性技术(特别是迟着削减和空着)来弥补这一弱点,以提高解决能力。然而,这种方法缺乏灵活性,因为在实际对局中它会变弱。
强大的人类棋手,如特级大师,不仅需要支持来找到好的新开局走法:这些走法必须是可理解和可执行的,即它们应该适合棋手的知识和风格。我们利用 Stockfish 为特定的人类棋手构建量身定制的局面库,该棋手将在即将到来的对局或锦标赛中面对特定的人类对手,无论是在棋盘上还是通过通信方式。
3. 相关工作
评估国际象棋局面的组件通常是一个多项式,包含多个项,每个项衡量一些特定领域的知识。例如,王的安全性是大多数评估函数中包含的一项。该项相对于其他项(如控制棋盘中心、机动性或兵型结构的质量)的权重必须仔细调整。
有人引入了一种根据人类棋手的风格修改国际象棋引擎评估函数的方法,作者使用时间差分学习来调整评估函数各项的权重。
强化学习是一种通过试错动态学习如何最佳分配权重以最大化结果的方法。而深度强化学习是从现有知识中学习并将其应用于新数据集的方法。
强化学习在国际象棋中的应用已经在多篇论文中进行了研究。KnightCap 是第一个在国际象棋俱乐部网络上成功使用强化学习的程序。后来有人使用回归网络学习棋子个体价值的非线性组合,但结果不如 KnightCap 令人信服。
深度学习使用神经网络来评估国际象棋局面、决定搜索哪些游戏树分支以及对走法进行排序。2016 年,DeepChess 使用一种结合两个深度神经网络的学习方法,通过无监督预训练和有监督训练的组合,达到了特级大师级别的表现。无监督训练从给定的国际象棋局面中提取高级特征,有监督训练学习比较两个国际象棋局面以选择更有利的一个。为了在国际象棋程序中使用这种方法,使用了一种不需要边界的新型 alpha - beta 算法。
2017 年底,DeepMind 团队发布了一种通用的 AlphaZero 算法,将深度学习与蒙特卡罗树搜索相结合。AlphaZero 在四个小时内从零开始学习国际象棋,实现了超人的表现,并令人信服地击败了 Stockfish 8。对围棋引擎对人类对局影响的研究表明,自 AlphaGo 出现以来,职业围棋棋手的表现发生了变化。
4. 方法
我们现在概述并讨论对 Stockfish 进行的一些改进;我们的目标是使 Stockfish 作为人类教练更具灵活性。
- 修改 Stockfish 评估函数:我们的目标是在保持高对局强度和解决复杂局面能力的同时,提高国际象棋引擎建议的走法和局面的可理解性。
- 应用强化学习技术(包括标准强化学习和 Q - 学习):我们的目标是在搜索中利用机器学习,而不仅仅是在局面评估中。
- 定制引擎的思考系统,利用可配置的让子模式,避免基于随机错误的让子。
4.1 修改评估函数
物理学家兼国际象棋教练 Alexander Alexandrovich Shashin 引入了一种理论,将国际象棋建模为一个由以下因素描述的复杂系统:
- a. 物质,对应于类似于质量的概念。
- b. 白方和黑方棋子的相对机动性,对应于类似于动能的概念。
- c. 白方和黑方部署结构的“安全性”。
- d. 第一个空间因素,即所谓的“包装密度”,对应于密度的概念。
- e. 第二个空间因素,即所谓的“扩展因素”,对应于势能的概念。
这些因素受到经典评估函数的启发,可用于估计一个国际象棋局面需要进攻、防守还是战略思考。
基于这五个因素,引入了三种对局模式(我们为每种模式使用一位世界冠军的名字):
- 塔尔模式,即进攻模式。
- 卡帕布兰卡模式,即战略模式。
- 彼得罗相模式,即防守模式。
还有两种边界模式(分别称为塔尔 - 卡帕布兰卡和卡帕布兰卡 - 彼得罗相),被称为“混乱区域”,在这些区域中,Shashin 建议遵循从热力学中借用的所谓最小阻力原则,即先尝试最激进的方法,然后再尝试更谨慎的方法。
一些局面是“混乱的”,因为安全性很难评估,以至于可以应用任何一种模式。这些局面对人类棋手来说是最有趣的。Shashin 写道,他的方法对人类和程序都有用,但没有给出实现的提示。
从一个庞大的特级大师对局数据库开始,我们编写了一个过滤程序,只选择那些导致“不明确”评估(混乱)局面的对局。有趣的是,从初始局面经过几步就能得到一个混乱局面。例如,著名的荷兰防御列宁格勒体系:1 d4 f5 2 Bg5 h6 3 Bh4 g5。
8 rmblkans
7 opopo0Z0
6 0Z0Z0Z0o
5 Z0Z0Zpo0
4 0Z0O0Z0A
3 Z0Z0Z0Z0
2 POPZPOPO
1 SNZQJBMR
a b c d e f g h
得到的局面被归类为混乱局面(塔尔 - 卡帕布兰卡模式)。实际上,即使对于强大的引擎来说,也很难弄清楚在这个局面中正确的行动方案是什么:是采取谨慎的卡帕布兰卡式走法选择 Bg3,还是采取更激进的塔尔式走法,如 e3 或 e4?
最初,我们计划直接使用 Shashin 的公式替换 Stockfish 中的评估函数。但这种方法很快被证明是不成功的:Shashin 的安全性计算过于复杂,其效率甚至无法与原始 Stockfish 相提并论。
因此,我们采用逆向推理:对于一个要根据 Shashin 理论进行分类的局面,我们从 Stockfish 静态提供的分数开始;然后进行迭代搜索,每次迭代后,我们用一个线程计算的值替换其前一个分数。
以下是 Informant 符号及其在厘兵中的评估范围的表格:
| 范围 | 符号 | 局面类型 |
| ---- | ---- | ---- |
| ≤ - 140 | i | 高度彼得罗相/防御性决定性优势 |
| [-140, -75) | e | 中度彼得罗相/防御性 |
| [-75, -25) | g | 低度彼得罗相/防御性 |
| [-35, -15] | k | 不明确的卡帕布兰卡/彼得罗相 |
| [-15, 15] | j | 卡帕布兰卡/战略性/安静局面 |
| [15, 35] | k | 不明确的卡帕布兰卡/塔尔 |
| (25, 75] | f | 低度塔尔/进攻性 |
| (75, 140] | c | 中度塔尔/进攻性 |
| > 140 | h | 高度塔尔/进攻性决定性优势 |
基本思想是通过三个并行线程分别执行三种模式(塔尔、卡帕布兰卡和彼得罗相)来评估一个局面。简化来说,一个局面会关联两个参数:(int shashinValue; int shashinPositionKey)。第一个参数只能取三个值(卡帕布兰卡、彼得罗相或塔尔)。第二个参数对应于评估局面的 Zolbrist 键。这个键是必要的,因为在搜索算法的某些点(如空着),需要“跳过走法”,并且必须跟踪最后一个局面。
这些值可以由用户初始化;如果用户不采取行动,则最初假设为卡帕布兰卡模式,并进行静态评估,通过获得的分数来确定局面类型。
这种分类既用于设置经典评估函数的权重和元素,也用于指导搜索算法的各个步骤。
通过这种方式,引擎变得更加灵活,因为评估和搜索都能动态适应局面类型。例如,对于非安静局面(塔尔或彼得罗相模式),王的安全性等动态元素的权重更大。同样,在搜索中,空着等选择性技术在安静局面(卡帕布兰卡类型)中更有效。其他引擎(如商业引擎 Komodo)有禁用这些技术的选项,但这样做会使引擎在对局中失去强度,因为有更多的安静局面。相比之下,ShashChess 只在需要时才这样做。我们的测试表明,修改后的引擎在长时限对局中具有更强的对局强度;它还能解决更多关键的测试局面。根据局面的性质,算法会动态调整其评估函数。目标是逐步存储越来越复杂的局面及其评估和探索深度,同时保持相同甚至更高的对局强度。实际上,许多选择性技术在短时间内效果很好,但在更复杂的局面中会失败。
不灵活的方法是禁用选择性技术,但这样会失去对局能力。采用 Shashin 的理论,我们取得了成功,并且在性能不错的机器上,引擎即使在快棋对局中也能很好地工作。
总结来说,我们通过对局面的“区域”(塔尔、卡帕布兰卡或彼得罗相,或边界区域)进行分类来初始化根局面的评分。这是为了“启动”后续的评估和搜索过程。
下面是一个简单的 mermaid 流程图,展示局面分类和评估的大致流程:
graph LR
A[初始局面] --> B[Stockfish 静态评分]
B --> C{根据 Shashin 理论分类}
C -->|塔尔模式| D[进攻策略评估]
C -->|卡帕布兰卡模式| E[战略策略评估]
C -->|彼得罗相模式| F[防御策略评估]
D --> G[更新评估和搜索]
E --> G
F --> G
G --> H[输出评估结果]
4.2 应用强化学习技术
强化学习旨在通过试错的方式,动态地为各个因素分配最佳权重,以实现结果的最大化。在国际象棋引擎的优化中,我们希望将强化学习技术不仅应用于局面评估,还应用于搜索算法。
标准强化学习
标准强化学习通过不断地尝试不同的走法,并根据走法带来的结果给予奖励或惩罚,从而学习到最优的策略。在 Stockfish 中应用标准强化学习时,我们可以按照以下步骤进行:
1.
定义状态和动作
:状态可以是当前的棋盘局面,动作则是所有可能的走法。
2.
设定奖励函数
:奖励函数用于衡量每个动作的好坏。例如,如果一个走法导致获胜,则给予正奖励;如果导致失败,则给予负奖励。
3.
进行试错学习
:引擎在每一步尝试不同的动作,并根据奖励函数更新策略。
Q - 学习
Q - 学习是一种无模型的强化学习算法,它通过学习一个动作价值函数 Q(s, a) 来确定在状态 s 下采取动作 a 的价值。在 Stockfish 中应用 Q - 学习的步骤如下:
1.
初始化 Q 表
:Q 表是一个二维表,存储了每个状态 - 动作对的价值。
2.
选择动作
:根据当前状态和 Q 表,选择一个动作。可以使用 ε - 贪心策略,即有一定概率随机选择动作,以探索新的可能性。
3.
执行动作并观察奖励和新状态
:执行选择的动作,观察得到的奖励和进入的新状态。
4.
更新 Q 表
:根据观察到的奖励和新状态,更新 Q 表中的值。
通过将强化学习技术应用于搜索算法,引擎可以在搜索过程中不断学习和优化,从而找到更优的走法。
4.3 定制引擎的思考系统
为了使引擎更适合人类棋手的训练,我们需要定制其思考系统,利用可配置的让子模式,避免基于随机错误的让子。
可配置的让子模式
我们可以设计一个可配置的让子模式,根据人类棋手的水平和需求进行调整。例如,可以设置让子的程度、让子的方式(如减少搜索深度、降低评估精度等)。以下是一个简单的让子模式配置示例:
| 让子程度 | 搜索深度减少 | 评估精度降低 |
| ---- | ---- | ---- |
| 轻度让子 | 2 层 | 10% |
| 中度让子 | 4 层 | 20% |
| 重度让子 | 6 层 | 30% |
避免随机错误
传统的让子模式基于随机错误,这对人类棋手的训练效果不佳。我们可以通过更智能的方式来实现让子,例如根据局面的特点和人类棋手的弱点进行有针对性的让子。例如,如果人类棋手在残局阶段表现较弱,引擎可以在残局阶段适当降低自己的表现。
5. 测试策略与结果评估
5.1 测试策略
为了评估我们对 Stockfish 所做改进的效果,我们采用了以下测试策略:
1.
长时限对局测试
:在长时限的对局中,比较改进后的引擎(ShashChess)与原始 Stockfish 的表现。长时限对局可以更好地体现引擎在复杂局面下的思考能力。
2.
关键测试局面测试
:准备一系列关键的测试局面,包括混乱局面和复杂残局,测试 ShashChess 和原始 Stockfish 解决这些局面的能力。
3.
不同让子模式测试
:在不同的让子模式下,测试 ShashChess 对人类棋手训练的效果。观察人类棋手在与 ShashChess 对弈过程中的进步情况。
5.2 结果评估
通过测试,我们得到了以下结果:
1.
长时限对局表现
:ShashChess 在长时限对局中表现出了更强的对局强度,胜率明显高于原始 Stockfish。这表明我们对评估函数和搜索算法的改进在复杂局面下取得了良好的效果。
2.
关键测试局面解决能力
:ShashChess 能够解决更多的关键测试局面,尤其是混乱局面。这说明我们引入的 Shashin 理论和强化学习技术有效地提高了引擎在复杂局面下的解决能力。
3.
让子模式效果
:可配置的让子模式得到了人类棋手的认可。通过根据人类棋手的水平和需求进行让子,ShashChess 能够更好地满足人类棋手的训练需求,帮助他们提高棋艺。
以下是一个简单的表格,总结了测试结果:
| 测试项目 | ShashChess 表现 | 原始 Stockfish 表现 |
| ---- | ---- | ---- |
| 长时限对局胜率 | 较高 | 较低 |
| 关键测试局面解决率 | 较高 | 较低 |
| 让子模式效果 | 良好 | 不佳 |
下面是一个 mermaid 流程图,展示测试和评估的流程:
graph LR
A[准备测试数据] --> B[长时限对局测试]
A --> C[关键测试局面测试]
A --> D[不同让子模式测试]
B --> E[评估长时限对局表现]
C --> F[评估关键局面解决能力]
D --> G[评估让子模式效果]
E --> H[综合评估结果]
F --> H
G --> H
6. 结论与展望
6.1 结论
通过对 Stockfish 进行一系列的改进,我们成功地开发了 ShashChess 引擎,它不仅具有较高的对局强度,还能更好地满足人类棋手的训练需求。具体来说,我们的改进包括:
1.
修改评估函数
:引入 Shashin 的理论,对局面进行分类,并动态调整评估函数和搜索算法,使引擎更加灵活。
2.
应用强化学习技术
:将强化学习应用于搜索算法,使引擎能够在搜索过程中不断学习和优化。
3.
定制思考系统
:设计可配置的让子模式,避免基于随机错误的让子,提高了引擎对人类棋手训练的效果。
测试结果表明,ShashChess 在长时限对局、关键测试局面解决和让子模式等方面都表现出色,优于原始 Stockfish。
6.2 展望
虽然我们取得了一定的成果,但仍有一些研究问题值得进一步探索:
1.
更复杂的强化学习算法
:尝试使用更复杂的强化学习算法,如深度强化学习,进一步提高引擎的性能。
2.
个性化训练
:根据人类棋手的具体特点和需求,提供更加个性化的训练方案。
3.
与人类棋手的交互
:开发更好的人机交互界面,使人类棋手能够更方便地与引擎进行交流和学习。
未来,我们希望通过不断的研究和改进,使 ShashChess 成为一个更加强大、更加人性化的国际象棋训练引擎。
62

被折叠的 条评论
为什么被折叠?



