日肥科协|KataGo分布式训练邀请

文摘   2024-09-15 00:00   上海  

本文作者@欧亚猞猁。本文仅代表作者观点,作者和KataGo研发团队没有利益往来。日肥书院学生科协持续接受同学们关于科学技术和日常生活攻略的投稿。

太长不看版:

1.打开https://github.com/lightvector/KataGo/releases

2.找到最新版本katago下载链接,下载适合您计算机且名称中有“opencl”的压缩包,通常是katago-v[最新版本号]-opencl-windows-x64.zip

3.解压

4.到https://katagotraining.org/注册账号,并到解压出的文件夹中将账号信息写入contribute_example.cfg

5.编辑contribute_example.cfg中maxSimultaneousGames需要修改的其他配置选项,看不懂的选项请保持默认

6.在命令行中切换到contribute_example.cfg所在路径,执行katago.exe contribute -config contribute_example.cfg 或 ./katago.exe contribute -config ./contribute_example.cfg。如果出错,请回到第5步,如果仍不能解决,请检查您下载的文件是否匹配当前计算机,必要时请回到第2步

7.命令行输出中没有报错信息且一段时间后出现“finished training game xxx”表示运行成功,可以在contribute_example.cfg中多尝试几个maxSimultaneousGames,找到训练最快的设置。


注意:个别版本katago.exe未经过充分测试。如果v1.15.3不能连接到服务器,且配置网络无法解决,可以到 https://github.com/lightvector/KataGo/releases/v1.14.1 下载稳定版本,其他疑似katago.exe自身出错的情况也可类似处理。如果需要其他稳定版本,修改版本号并粘贴到浏览器地址栏即可。



随着Llama3.1 405B的发布,开源社区在又一个领域证明了自己的实力,无数开发者和普通用户已经在畅想开源人工智能的未来。与此同时,在古老的围棋领域,也有一群开发者在训练开源人工智能软件KataGo,却受困于算力不足,希望大家提供算力来帮助KataGo(分布式训练)。如果您之前没有听说过KataGo,或者不确定是否要加入分布式训练,本文将为您提供答案。

如果您不了解深度学习,可以把“神经网络”换成🐱,把神经网络的参数理解为🐱工作过程中查看的数表,同一个🐱查看不同的数表时具有不同的水平,🐱的训练过程主要是在改进数表。这样理解不影响阅读本文。

KataGo简介

KataGo是Jane Street研究员lightvector(David J. Wu)发起的开源围棋人工智能软件,2019年由lightvector单独训练,并在19天内成为当时最强的围棋软件之一。2020年,KataGo开始分布式训练。

KataGo采用类似AlphaGo Zero的蒙特卡洛树搜索(MCTS)加神经网络工作流,并在AlphaGo Zero的基础上做出重大改进,训练速度提高超过50倍,还支持自定义棋盘大小和多种自定义规则,是目前棋力最强、功能最丰富的开源围棋软件。

围棋AI基本框架——MCTS加神经网络

大语言模型使用神经网络预测下一个词元的概率分布,另外,从概率分布中采样出文本的策略同样显著影响模型性能。事实上,在大语言模型开始引领深度学习潮流之前,围棋AI就已经开始使用神经网络和搜索算法相结合的架构,AlphaGo正是凭借这种架构击败了前世界围棋第一人——李世石九段。直到今天,包括KataGo在内的顶尖围棋软件仍然使用蒙特卡洛树搜索和神经网络相结合的基本架构。

2016年击败李世石的AlphaGo早期版本(AlphaGo Lee)推理过程和传统蒙特卡洛树搜索类似,区别仅在于前者用卷积神经网络替换了原本由传统方法完成的策略选择和价值(“胜率”)评估。稍后的AlphaGo Master和AlphaGo Zero版本精简了AlphaGo Lee的架构,仅保留了其中本质的部分,实力反而大幅提升,这让我们可以跳过传统蒙特卡洛树搜索围棋软件和AlphaGo Lee的实现细节,直接来到2017年的AlphaGo Zero。

在分析AlphaGo Zero的具体实现之前,我们先考虑搜索算法和神经网络结合为什么适合围棋。穷举是求解围棋最直接的思路,但计算机硬件性能远远不足以穷举,必须将要搜索的状态空间减小到硬件能承受的程度。考虑到绝大多数符合围棋规则的下法和赢棋不沾边,仅有极少的一部分下法事实上可行,计算机需要评估特定局面下我方有多大把握获胜,放弃明显不可行的分支,将大部分计算量分配给值得深入分析的分支。

对于一些较为简单的游戏,通过人工编写的规则即可评估局面并合理分配计算量,让计算机的水平超越人类顶尖选手,但围棋的局面评估更为复杂,难以精确量化,适合使用神经网络来解决。

我们先“相信”神经网络可以评估局面,输出任意局面下双方的胜率(不妨称为“直觉胜率”)和下一手棋落在各个合法位置的概率分布。为了便于理解,可以先建立这种直觉:引入神经网络后,搜索算法每次遇到新的分支(围棋中将每个分支称为一种“变化”),就调用神经网络来得知如果棋局按这种分支进行下去我方是否会占优,并综合考虑神经网络此次输出和之前在其他分支上的输出,决定是否继续深入分析这个分支。如果要深入分析,就继续采用神经网络的建议,确定这个分支下有哪些次一级分支需要分析;反之,就按一定策略找出另一个分支让神经网络评估。简而言之,搜索算法告诉神经网络哪些局面需要评估,神经网络告诉搜索算法特定局面的直觉胜率和候选的下一手棋。

AlphaGo Zero真正采用的蒙特卡洛树搜索算法和上文的描述略有区别,如下图所示。

每次走棋之前,AlphaGo Zero以当前局面为根节点构建搜索树,搜索树中每个节点代表一种局面,每条边代表一手棋,沿着搜索树向下移动对应走棋。搜索过程重复进行以下步骤:

1)从根节点开始,根据一定策略(后续会介绍)选择子树并前进一步,重复这一步骤直到叶子节点;

2)使用神经网络,根据此节点对应的棋局状态给出直觉胜率(utility或action value,“直觉胜率”不是标准翻译)和下一手棋落在各个位置的概率(是向量,又叫“先验概率”),并在此节点下方添加表示可行下一手的新节点;

3)回溯本次搜索的路径并更新这条路径上所有节点的“搜索后‘胜率’”(后续会介绍)。

每次重复上述步骤称为一次模拟(simulation或playout或visit),当计算时间或模拟次数达到上限后,AlphaGo Zero根据各个合法下一手的搜索次数和下法多样性相关的超参数选择下一手棋,优先选择访问次数最多的位置作为下一手棋。

继续相信神经网络,考虑1)中选择子树的策略。搜索下一手棋落在c处后续变化的“优先程度”PUCT符合如下公式:

其中c和c’表示当前局面下可能的下一手棋(在搜索树中就是当前节点下的子树);V是节点的“搜索后‘胜率’”(要行棋一方的胜率,双方的后续下法分别位于搜索树的奇数和偶数层),当c是叶子节点时,V就是神经网络直接输出的直觉胜率,否则V是c节点再下一层节点的V按搜索次数加权后的平均值,为了描述围棋的零和特性,V可以在-1到1之间取值,并在访问表示对方回合的节点时用-V替换V(替对方选择对我方不利的策略),这和将胜率作为V的直观解释不矛盾;是可调的系数,在2020年的KataGo论文中是1.1;P是当前局面的下一手棋为c的先验概率,可以由神经网络直接输出,为了鼓励AI探索新策略,也可以将神经网络输出加上噪音后作为P;N是访问次数。当上式右手边只有第一项时,搜索算法优先搜索较为“可行”的下一手,排除明显不行的下法,当上式右手边仅有第二项时,搜索算法使N(c)和P(c)成正比。随着总搜索次数的增大,右手边第二项通常减小,这表明搜索算法在刚开始搜索这个节点时倾向于根据神经网络的直觉选择下一手,后来逐渐倾向于深入分析在先前的搜索中评价高的下一手。

在相信神经网络的前提下,我们已经大致了解了AlphaGo Zero的工作流程,现在考虑神经网络。AlphaGo Zero神经网络仅以棋子位置作为输入,不输入人工特征,神经网络主干部分是带有残差连接的卷积神经网络,最后用两个输出头分别输出P和V,后续章节介绍的辅助训练目标也通过在原有主干上增加输出头实现(如果您不了解深度学习,可以把输入和输出之间的部分看作🐱)。用2024年的标准来评价,这个神经网络的结构并无特别之处,难点在于训练。

为了不被人类高手的思路锁死上限,AlphaGo Zero不使用人类棋谱,仅进行自对弈训练,这要求训练程序根据AlphaGo Zero自对弈的棋谱提供符合PUCT中P和V含义的监督信息(告诉神经网络正确答案是什么,神经网络让自己的输出向正确的方向调整,从而达到学习的效果)。AlphaGo Zero的神经网络输出的V使用本局自对弈结果(黑胜或白胜)作为监督信息,P使用模拟结束时各个合法下一手模拟次数的分布作为监督信息。

V的监督信息不难理解,用单局结果代替真正的胜率,增加局数可以控制误差。P的监督信息并不直观,并且似乎在用神经网络的输出作为自身训练的监督信息,“左脚踩右脚上天”。既然AlphaGo Zero能够成功训练,P的监督信息当然是可以解释的,事实上,要纠正神经网络输出的P,仅需找一个更强的棋手来指出正确的下一手,而神经网络结合MCTS多次模拟后的棋力当然强于神经网络单次分析当前局面后靠直觉走棋,用搜索后的信息来监督神经网络可以改进对当前局面的直觉,改进后的神经网络结合MCTS又比原来的神经网络结合MCTS更强,可以进一步提供更准确的监督信息,如此迭代即可不断提升棋力。

最后还需要指出,“搜索后‘胜率’”不是模拟中获胜的比例。从AlphaGo Zero的工作流程不难看出,直觉胜率是神经网络评估当前局面的一种指标,并不必然代表以当前局面为起点进行大量对局后我方获胜的比例,这一指标在AlphaGo 和KataGo的论文中称为action value或utility,强调它影响当前分支在搜索算法中的优先级。“胜率”这种直观解释源于AlphaGo训练过程中以自对弈胜负作为监督信号,在训练过程中这样的直观解释不会引起误解,因为V的监督信息就是终局时的结果,但在推理中,搜索深度不必达到终局,搜索结束后的胜率只是这步棋后续变化直觉胜率的加权平均,不是获胜次数占总模拟次数的比例。可以证明,如果双方都采用最优对策,每种局面只能是黑方必胜、白方必胜(部分规则中再加上必和棋)之一,没有不确定性,连续(浮点型)胜率指标只是算力不足以穷举围棋状态空间时必要的妥协。

AlphaGo Zero论文发布后,新的围棋AI通常被认为借鉴了这篇论文。

KataGo的诞生

在AlphaGo Zero发布的2017年,KataGo主要开发者lightvector刚开始了解深度学习的原理并训练神经网络,此时距离KataGo开始训练仅剩两年。

2019年,AlphaGo Zero的开源围复制品Leeza Zero、ELF OpenGo(和Llama一样出自Facebook/Meta)后劲不足,商用的绝艺、星阵围棋已经进入正向循环,为了给围棋界提供最强大的开源软件,lightvector开始训练KataGo。

在KataGo之前,训练类似AlphaGo Zero的软件需要大量算力。AlphaGo Zero训练过程花费了5000个TPU数天机时,相当于单个TPU运行41年,其开源复制品ELF OpenGo花费的算力相当于单个V100 GPU运行超过70年。AlphaGo Zero已经是顶尖团队合力炼成的精品,靠一己之力做出重大改进并非易事,但KataGo既无先发优势也无算力支撑,lightvector仅有一个选择,就是用算法之长补算力之短,大幅降低训练开销。

lightvector约有业余3段水平,在业余爱好者中也不算高手,不过研发围棋软件不需要顶尖的人工下棋水平,甚至不需要对神经网络结构进行大量特殊优化(奇技淫巧),重要的是如何驱动神经网络、在神经网络两端连接什么东西。在这个问题上,业余选手lightvector的直觉超越了职业围棋高手和许多深度学习专家,他在KataGo中做出了以下重要改进。

通用改进

这些改进可以迁移到围棋之外,对所有基本架构类似AlphaGo Zero(MCTS加神经网络)的软件都可能有效。

模拟量随机化(Playout Cap Randomization)

前文已经介绍过,训练程序需要靠自对弈生成P和V的监督信息。P的训练需要搜索算法和神经网络共同提供比纯神经网络输出更好的下一手,用人类棋手的思维来理解,就是通过深入计算发现直觉注意不到的好棋,并把好棋变成自己新的直觉,这种训练需要深度的搜索,每步棋应该有较大的模拟量,但局数不用那么多。与P的训练相反,V的训练只能使用对局结果,每局棋只产生1比特(胜、负)监督信息,且带有噪音,训练局数足够多才能获得足够的监督信息并减少随机噪音,但只要双方实力相当且不太差,双方的失误可以互相抵消,即使每步棋计算量小一些,也不会造成系统性胜率偏差。

如果围棋软件背靠大公司,可以每步棋都用较大的模拟量,再训练较多局数,但KataGo没有堆算力的资本,必须使用更本质的解决方案,也就是随机模拟量。

KataGo训练过程中,自对弈仅在少量手数产生P的监督信息,这些手数采用高模拟量,其余手数使用低模拟量以增加单位计算量完成的对局数,改善V的训练。实际操作中,训练P的手数占总手数的几分之一,每手棋模拟量约为其余手数的6倍,这意味着KataGo训练程序可以在固定计算量下将局数(V的训练量)增加数倍,同时保证大部分计算量仍用于P的训练。

强制模拟和策略目标修剪(Forced Playouts and Policy Target Pruning)

训练神经网络的P输出需要发现不易察觉的好棋,也就是P较小但搜索后发现V较高的下法,但搜索算法还需要应对大部分没有隐蔽好棋的局面,只能优先搜索P较大的下法,这当然不利于训练。

AlphaGo Zero通过在神经网络输出的P上加噪音来引入随机性,鼓励搜索算法尝试反直觉下法。lightvector注意到,即使引入了噪音,反直觉下法经过少量搜索后往往V还不高,容易被搜索算法放弃。为了避免搜索算法放弃未充分搜索的反直觉下法,lightvector让KataGo的搜索算法一旦发现新下法,就强制搜索一定次数,这就是强制模拟(forced playout)。P的训练需要以搜索次数的分布作为监督信息,为了避免强制模拟干扰搜索次数分布,训练P之前需要在各个可能下一手的搜索次数中减去强制搜索次数,这就是策略目标修剪(policy target pruning)。

如果反直觉的下一手棋确实不是好棋,经过强制搜索和策略目标修剪后,它的真实搜索次数仍然几乎为0,相当于搜索算法从未尝试过这种下法;反之,这手棋经过强制搜索后V已经升高到足以吸引搜索算法继续搜索,不会在搜索不足(V尚未升高)时就被放弃。

全局池化(Global Pooling)

神经网络的策略输出有时需要考虑全局信息,例如整个棋盘上双方的劫材数量决定我方下一手能否开劫(如果您不会下围棋,忽略这些术语不影响阅读下文)。另一个例子是局面的整体优劣决定我方后续下法的激进程度,如果我方局势不利,应该搅乱局面,以期乱中翻盘,反之,如果我方局势占优,应该简化局面,减少对方趁乱取胜的机会。

KataGo之前的围棋软件并未“显式”考虑全局信息,KataGo首次在围棋软件的神经网络中加入全局池化模块。介绍KataGo的神经网络结构不是本文的主要目标,此处不再展开。

辅助策略目标(Auxiliary Policy Targets)

人类高手考虑己方的下一手时往往也会考虑对方的应对。实验表明,虽然类似AlphaGo Zero的围棋软件已经远超人类顶尖高手,这一思路仍能提高水平。辅助策略目标是这一思路的具体实现,表现为在神经网络的输出中增加表示对方应手的项,并在损失函数中也加入对应的项,以提供更多监督信息。神经网络的辅助策略目标输出仅在训练过程中使用,可以加快训练速度,使给定计算量训练出的神经网络P和V输出更准确,推理过程靠更准确的P和V间接获益。

辅助策略目标也早于KataGo出现,KataGo首次将其用于基本架构类似AlphaGo Zero(MCTS加神经网络)的围棋人工智能软件。

围棋专用改进

前述4种改进可以迁移到围棋之外,对所有基本架构类似AlphaGo Zero的软件都可能有效。KataGo中还有以下专用于围棋的改进。

辅助领地和得分目标(Auxiliary Ownership and Score Targets)

前文介绍过,AlphaGo Zero中神经网络输出的直觉胜率V采用自对弈胜负作为监督信息,每局棋仅能给V的训练提供1比特监督信息。用1比特来表示棋局结束时的状态显然是不够的,因为围棋盘上有19*19=361个交叉点,每个交叉点被我方或对方占据都可以提供信息,胜负仅能衡量一方占据的交叉点总数是否达到获胜阈值,不能反映占据交叉点的具体数量和分布。

根据以上分析,AlphaGo Zero没有充分利用终局时的棋盘状态作为监督信息,仅用了胜负这1比特信息(因此本文将神经网络直接输出的V译为“直觉胜率”)。KataGo将我方占据的交叉点总数(score,其实是总数减去获胜阈值)和每个交叉点被哪一方占据(ownership)也作为监督信息。

围棋专用的人工特征(Game-specific Features)

这部分内容需要大致了解围棋规则才能理解,且与主题关系不大,不再介绍。

上述改进奠定了KataGo的基本技术路线,将训练速度加快了大约50倍。在lightvector单独运行的早期训练中,KataGo仅在27个V100 GPU上从零开始训练了19天(相当于单个V100 GPU训练1.4年),就超越了ELF OpenGo相当于单个V100 GPU运行超过70年的训练效果,成为最强的开源围棋软件。实验表明,以上所有改进都能加快训练速度,单独去除一个改进和使用所有改进相比,达到相同水平需要1.25至1.65倍不等的训练开销。

和ELF OpenGo对比还不足以直观显示KataGo的训练效率,事实上,KataGo在通用硬件上的训练效率已经不亚于人脑。lightvector 2019年训练KataGo使用的V100 GPU峰值功率约为人脑的十几倍,如果以能耗作为训练量指标,KataGo超越ELF OpenGo时(此时比较对象已经不是人类顶尖高手)的训练量大约相当于人脑连续训练20年或以普通作息训练五六十年,这种训练量是人类尚可企及的。即使仅用一台较高端的游戏本从头训练KataGo,也能在几个月内达到甚至超过人类顶尖高手的水平。

KataGo仍有明显漏洞

超越ELF OpenGo后,KataGo已经是最强的开源围棋软件,击败人类顶尖高手更不在话下,即使此后KataGo不再更新,其贡献也是不可磨灭的。然而,在追求围棋真理的道路上,KataGo仅仅比人类高手多走出了一小步,距离最优解还极其遥远,在极端的例子中甚至会出现业余棋手也能识别和避免的失误。

开始于2022年的一项研究表明,即使KataGo使用较高模拟量,仍可能被低水平策略击败。这项研究中的低水平策略无法击败有一定水平的人类爱好者,但可以将棋局导入KataGo的神经网络和搜索算法均不能正确处理的局面,引导KataGo出现人类可以轻易避免的严重失误并输掉比赛。

上图来自低水平策略击败KataGo的一局棋(您不需要会下围棋),其中Victim就是KataGo,对抗者(Adversary)是利用KataGo漏洞取胜的低水平围棋软件。KataGo刚刚落下了图中带圈的白色棋子,这手棋是人类能识别的严重失误,此后KataGo再无机会。值得注意的是,KataGo的失误并非偶然,对抗者击败KataGo靠的是高概率触发KataGo的低水平失误(至少对人类高手来说是“低水平”失误),也就是欺骗策略,而不靠更高的“正常下棋”水平。这局棋中KataGo使用的神经网络(b40c256-s11840935168)和模拟次数在“正常”棋局中水平超过人类顶尖高手,而对抗者的配置无法对抗人类职业选手,甚至不敌有一定水平的业余爱好者,但对KataGo的这一配置胜率超过90%。

本文的上一部分中提到过,KataGo在2019年开始训练并很快成为最强的开源围棋软件,一个很自然的问题是,为什么能够稳定击败KataGo的策略在3年中从未被高水平围棋软件和人类棋手发现,也没在自对弈训练中被KataGo的神经网络自行发现,直到2022年的研究中才暴露呢?一种可能的原因是,KataGo的这个漏洞很隐蔽,需要攻击者陷入几乎必败的劣势(至少面对人类高手时几乎必败)才能触发,2022年开始的研究使用了足够先进方法才发现它。

对抗策略

对抗者的策略充满想象力,而且确实能赢KataGo,看起来似乎采用了全新的技术路线,但事实并不是这样。它大量借鉴了KataGo中的技术,也结合了神经网络和搜索算法(对抗蒙特卡洛树搜索),几乎可以看作面向特定对手的小KataGo。

为了达成研究目标,也就是使用低水平的策略触发KataGo的漏洞,击败KataGo的软件采用对抗蒙特卡洛树搜索(Adversarial MCTS, A-MCTS),这种方法借鉴了KataGoMCTS的思路,但实现方法略有不同,如下图所示。

图中带V的圆圈表示受害者victim(KataGo)搜索的局面,和PUCT中的直觉胜率(value)没有关系;带A圆圈表示对抗者adversary(击败KataGo的软件)搜索的局面。最左边的树状结构对应KataGo(victim)的MCTS过程,中间和右边的树状结构对应对抗者的搜索过程。

对抗者的搜索树中有来自KataGo的节点,这是因为它拥有KataGo的一个副本,搜索到轮自己下的局面时用自己的神经网络来评估局面并用类似PUCT的方法采样下一手,搜索到轮KataGo下的局面时则使用自己的KataGo副本,以便知道“KataGo将如何应对我的招法”。在评估各个合法下一手的“可下程度”时,对抗者仅使用搜索树中自己的节点(带A的圆圈)和到达终局的KataGo节点(带V的圆圈且这个圆圈表示的棋局状态已到达终局),这种选择可以避免对抗者学得像KataGo,让它在KataGo自评为优势的局面仍能坚持认为其实自己(对抗者)占优,并寻找KataGo没发现的走法。(如果你按照对手的意见下棋,对手会主动输给你吗?)

对抗者的神经网络结构不需要有明显创新,但必须在训练前随机初始化,不能用KataGo的神经网络作为初值,这同样是因为此研究的目标是用低水平策略击败KataGo,而不是用训练时间更长的KataGo版本击败原先的版本。随机初始化存在明显问题,就是起始阶段根本不可能战胜正常配置的KataGo,胜率为0,神经网络学不出合理的直觉胜率,进步缓慢,从而继续输。这项研究中的解决方法是从简单的学起,训练起始阶段给KataGo使用较差的神经网络和极少的模拟量,当对抗者胜率较高时再逐渐将对手换成神经网络更好或模拟量更高的KataGo配置。另外,对抗神经网络也使用KataGo的技术(本文“KataGo的诞生”部分)加速了训练过程,例如即使对抗者在训练初期几乎赢不了,也能借助辅助领地和得分目标学到知识。

在对抗者在搜索过程中使用KataGo副本似乎胜之不武,这种质疑可以从至少两个角度来回应。首先,对抗者每步棋的模拟量远小于KataGo。其次,人类棋手可以学会对抗训练发现的策略,并靠纯人工下棋击败ELF OpenGo等其他围棋软件,这个过程显然不需要ELF OpenGo的副本。

KataGo出错原因

注意:这部分内容包含我的猜测,未必符合事实。

在围棋技术的角度,上述研究发现的策略只是一类欺骗性招法,KataGo的后续版本增加针对性训练之后已经可以避免这类欺骗。但对深度学习领域来说,上述研究暴露了现有技术路线的局限性,通过类似数据增强的方法(增加针对这种欺骗策略的训练)修复个别漏洞未必能从根本上克服这种局限性。

我们通常相信神经网络和搜索算法结合后稳健性显著优于纯神经网络,即使对抗程序击败了使用低模拟量的KataGo,后者似乎也不必重新训练,仅需在推理时提高计算量即可抵抗攻击。这种观点很符合直觉。在“正常”棋局中,KataGo的水平随着模拟量增加而提高,如果不进行MCTS,仅使用神经网络输出,KataGo最新的神经网络约有普通职业选手的水平,而当MCTS的模拟量足够大时,KataGo远超人类高手。如果KataGo应对欺骗策略的水平也随着模拟量增加而提高,我们可以期待,即使不更新KataGo的神经网络,单纯增加模拟量也能击败欺骗策略。

进一步实验挑战了这种符合直觉的认知。实验表明,当KataGo使用前述研究中的神经网络时,即使让KataGo每手棋模拟1000万次,对抗者的配置不变,KataGo的胜率仍然不足30%。每手棋1000万次的模拟量是极其巨大的,如果在中低端个人电脑上使用这个配置,即使不限制时间,搜索程序也可能受限于内存不足,在崩溃之前无法下出哪怕一手棋。继续加大模拟量也不太可能解决问题,因为根据过去的经验,其他条件相同时水平通常和模拟量的对数有线性关系,如果模拟量从几千增加到1000万都不足以带来质变,那么从1000万增加到1亿的效果只能是说微乎其微。

KataGo使用低模拟量时不敌欺骗策略表明它的神经网络不能处理特定局面,这种现象并未超出经典的认知,神经网络确实可能处理不好没见过的东西,非战之罪。使用极高模拟量时仍然不敌,表明某些局面中神经网络和搜索算法同时失效,而且欺骗策略有很大把握把棋局引向这类局面,这种现象值得警惕,因为MCTS的重要作用之一就是在神经网络直觉不准的局面维持下棋水平。

为了解释MCTS失效的原因,我们可以对失效局面下的模拟量进行可视化。2024年5月首次发布的KataGo b28神经网络已经可以在真实对局中抵抗前述研究中的欺骗策略,从头开始对局无法从“正常下棋”导向触发漏洞的局面,但在假设的局面上开始搜索仍能发现一些迹象。给定如下图所示的局面(您不需要会下围棋):

这个局面几乎不可能在真实对局中出现。稍有水平的业余爱好者很容易看出,黑方所有棋子已经无法避免被从棋盘上移除,白方将占有整个棋盘。如果您不会下围棋,仅需要知道棋子落在交叉点上,每个棋子至多和上下左右4个空交叉点或棋子相邻,而不像扫雷游戏中那样至多和8个格子相邻,单色棋子组成的连通分支不和空交叉点相邻时会被从棋盘上移除。图中黑色大块的拓扑结构等价于“日”,在有入门水平的人类爱好者眼中,这个“日”的状态可以用3个非负整数表示,即外表面相邻的未被棋子占据的交叉点数量(34),第一个内圈表面相邻的未被棋子占据的交叉点数量(68),第二个内圈表面相邻的未被棋子占据的交叉点数量(4),三个圈表面相邻的交叉点是3个等价类。如果让人类执白棋将黑棋外表面的交叉点填满,由于人类知道这些交叉点都是等价的,不用考虑填满这些点的顺序,仅需每次填1个重复34次,可能的路线只有一种。那么KataGo如何处理这种棋形呢?除模拟量外的超参数保持默认,让KataGo搜索到我的电脑内存耗尽为止,如下图所示。

注意:上述局面几乎不可能在真实棋局中出现,在这种局面上判断错误不会影响KataGo的水平。

上图是给定局面下KataGo的搜索结果,KataGo认为此时黑方占优,这是错误的。越绿的圆圈在KataGo眼中越可行,圆圈下方的数字表示模拟次数。可以看出,KataGo将计算量均匀分布到多个合法的下一手,每个等价类中的所有合法下一手对KataGo来说是完全不同的。我们可以猜测,如果让KataGo执白棋将黑棋外表面的交叉点填满,那么第1次需要在34个点中选择一个,第2次需要在剩下的33个点中选一个……总共有34的阶乘种可能的路线,不可能遍历。

即使搜索过程不能穷举填满这些点的所有路线,神经网络的直觉仍有可能帮助搜索算法快速跳过填满这些点的过程,到达这34个点被填满后的局面。如果白棋每在黑棋外圈放一个子,神经网络输出的白方直觉胜率就提高一些,那么PUCT会引导搜索算法优先向深度而不是宽度上投入计算,很快到达一种黑棋外圈34个点都被填满的局面,两个内圈也会被类似的搜索过程填满(较小的内圈比外圈复杂一些,本文不讨论如何下围棋),最后搜索算法会发现黑棋相邻的交叉点都被填满,黑子被从棋盘上移除,白方获胜,那么搜索起点上的这个局面也是白棋占优。

在这个局面中,KataGo的神经网络和搜索算法很可能都出现了问题,才导致判断错误。我们很容易想到一种符合直觉但不一定可靠的猜测:KataGo的神经网络没见过这种局面,没发现此时白棋占优;搜索算法试图在把双方的后续下法摆在棋盘上再让神经网络做直觉判断,但相似的下法实在太多,每种下法摆上去之后神经网络的直觉胜率都没什么变化,没发现哪种下法应该多摆一些手数,每种下法只摆少数几手棋也不足以让神经网络发现白棋占优,最后KataGo搜索了几十万种后续局面,但几乎都是向宽度方向搜索,始终没有到达神经网络的直觉能正确判断的局面。

根据这个例子,我们可以进一步猜测,集齐以下条件时KataGo有很大概率出现严重失误。首先是神经网络不能正确判断的局面,由于自对弈训练局数和围棋的所有可能变化数量相比几乎可忽略,神经网络在某些奇怪的局面上判断不准确是很正常的。其次是可搜索的宽度大,例如将N个等价的交叉点全部填满,如果神经网络没看出来填了一部分之后直觉胜率会变化,且搜索算法将不同的填满顺序当成不同的搜索路线,那么有可能将计算量花费在填充这些点的不同顺序上,注意力涣散,没注意到N个交叉点全填满之后的棋局状态。还有一个条件是棋局推进少数几手棋后神经网络仍不能正确判断,在这种情况下,神经网络不知道的东西也无法通过搜索算法来得知。

我主观认为对抗研究中欺骗策略击败KataGo的局面集齐了以上三点,KataGo的新版本可能靠类似数据增强的方法改善了神经网络,但我认为搜索算法的不足仍然没有从根本上解决,KataGo未来遇到更加奇形怪状的欺骗策略时未必总能取胜。

继续改进KataGo的意义

随着多模态大模型的发展,达到甚至超过人类水平的智能体似乎不再遥不可及,我们试图理解这种水平的智能体,但运行超过人类水平的多模态大模型需要承担极高的成本和风险。

围棋给我们提供了思考这类问题的极简模型。围棋刚好复杂到不会被基于确定规则的搜索方法破解,能在一定程度上检验程序的“智能”程度;同时又没有复杂到无法用计算机低成本求解,资源有限的个人或小团队也能训练超越人类顶尖高手的围棋软件。更重要的是,围棋领域有KataGo这种强大的开源软件,它的水平远远超过人类顶尖高手,并能为后来的研究提供前置知识,例如前述研究中不仅将KataGo作为对手,也在训练欺骗策略时使用了KataGo加速训练的技术。

在这项研究之前,我们很难想象,在围棋这个信息完全透明、没有随机性的游戏中,结合了MCTS和神经网络、水平远超人类顶尖高手的KataGo,输给了对人类高手来说并不高明的欺骗策略。KataGo不但输了,而且输掉的方式让人难以置信,它应对这种欺骗策略的表现甚至远不如人类业余爱好者。

如果我们只关心如何下围棋,那么这种研究未必有太大意义,因为击败KataGo的策略对正常下棋几乎没有帮助。但这项研究的影响并不局限于围棋,它揭示了一种容易被忽视的可能性,即现有技术路线创造的超人类水平智能体仍会出现对人类来说极为低级的失误。在当前的深度学习的浪潮中,我们相信数据驱动方法可以大力出奇迹,就像KataGo不必理解人类围棋理论就能在“正常”对局中轻易击败人类高手,但KataGo的失利表明,一些对人类来说显然的思考方式,例如发现多个可能的下一手等价并避免重复搜索,对数据驱动的系统来说仍是困难但必要的。

如果KataGo能从根本上解决这类问题,使得对人类来说较为简单的问题对智能体来说一定同样简单,那么我们得到的将远远不只是一个更擅长下棋的软件。一些大语言模型研究人员已经注意到,语言模型除了神经网络自身的“scaling law”之外,在采样次数上可能也存在scaling law,这表明在较高的抽象层次上,神经网络和搜索算法结合有可能是解决多种复杂问题的通用思路。围棋软件较早走上神经网络和搜索算法结合的道路并超越了人类水平,此后才有机会显示超人类水平智能体被低水平策略击败的可能性,我们没有理由相信其他领域的人工智能软件不会采用神经网络和搜索算法结合的基本框架超过人类水平,并在一定场景中出现远低于人类水平的失误。如果KataGo能做出不依赖围棋特殊性质的改进,这些改进当然有希望迁移到围棋之外,用于其他采用类似结构的软件。

KataGo需要您的帮助

启动KataGo分布式训练之前,lightvector曾在采访中提及自己创造并开源KataGo的原因:

如果您只是尝试训练出更强大的围棋程序,但不愿分享任何内容或方法,那么也许只会稍微拔高围棋AI的峰顶,却无法助力其他在围棋或其他游戏项目上想要构建自己AI的少数研究人员或开发人员,或者帮助在更广泛的领域开展AI研究。

“If you only try to develop even stronger Go programs but you never publish anything or explain your methods, then maybe you will improve slightly the level of Go AI, but you won't help other smaller researchers or developers who want to build their own AIs for Go or other games, or to experiment with AI research in broader areas.”

随着采访的推进,他进一步表示:

如果有人直接套用了KataGo,或拿走已公开的算法技术或代码为之所用,并在其基础上进一步解决新问题或超越KataGo本身——那就是一种成功。我唯一的愿望是人们对借用KataGo的行为能够大方、诚实——不论是对其进行少量修改的克隆,还是将其用作新研究的基石。开发KataGo的目的从来都不是击败人类、冠绝AI或是赢得胜利。我不在乎它是永远赢棋还是最顶尖AI,这无所谓。相反,KataGo是希望让大家一起做到更好。

“If anyone wants to take KataGo's ideas, or its published algorithm techniques, or its code directly, and build upon them further to solve new problems or surpass KataGo itself - then that is a success. My only wish is for people to be friendly and honest about when they use KataGo - whether they clone it with only minor modifications, or whether they use it as simply the foundation for genuine new training and original research. When developing KataGo, the goal has never been about trying to beat other people, or to be the best, or to win. I don't care if it wins or is the top bot, that doesn't matter. Instead KataGo's purpose is to make it possible for everyone to do better together.”

如果不开源,KataGo只是一个围棋软件,至多比其他围棋软件棋力更强一些,而开源之后,KataGo将成为很多后续工作的基础,启发围棋之外的研究,增加人类的智慧。

虽然KataGo的目标不只是围棋,但仍需要围棋来验证新技术。当训练程序改进后,新的版本需要表现出更快的学习速度才能进入KataGo主线,而当神经网络结构改变后,则需要从头训练并超越上一个神经网络结构到达过的最高水平才能进入主线。由于KataGo只是lightvector的业余项目,得不到充足的资金和算力支持,lightvector在2020年底启动了分布式训练,志愿者可以在自己的电脑上运行训练程序来贡献算力。

志愿者提供的算力远远无法和AlphaGo使用的资源相比,但由于KataGo显著加快训练速度的改进,使用较少的资源就能有效训练。从分布式训练启动直到不久前,KataGo的实力在持续进步,期间顺便进行了应对前述欺骗策略的训练,特别是2024年5月发布b28神经网络,在搜索算法完全相同、仅替换神经网络的情况下,对之前最强的版本胜率达到80%以上。但最近KataGo训练速度明显放缓了。

上图是近期发布的KataGo神经网络参数版本,横坐标是时间,纵坐标是和其他版本比赛测得的ELO等级分(一种实力评价指标),竖线表示等级分置信区间,每种颜色系列代表同一神经网络结构持续训练产生的不同参数版本。相邻两个点之间的实际对局数接近,平均有十几万局。可以看出,7月以来的参数更新明显放慢了,发布新版本的间隔从四五天增加到10天以上。查找对局记录可以发现,近期KataGo的自对弈训练平均每天只有一万多局,而我的笔记本电脑使用RTX 4050 laptop显卡和TensorRT环境每24小时可以贡献超过500局,目前KataGo分布式训练的资源仅相当于20个我的电脑。即使KataGo的训练速度比AlphaGo快50倍,使用这么小的计算量也难以快速提升。

KataGo给围棋爱好者和开源社区提供了强大的工具,让个人和小团队可以轻易部署甚至从头训练远超人类顶尖高手的围棋软件,它使用的新技术还可以迁移到围棋之外,甚至启发了新的人工智能研究(例如前述对抗训练)。现在,KataGo仍有很大的潜力,但受限于算力不足,提升受阻,如果不能筹集到足够的算力,它将不能达到更高的水平,不能验证新的技术,不能再启发更多新的研究了。

我们不相信KataGo会止步于此,因为lightvector已经证明一位业余开发者可以在AlphaGo Zero的基础上做出本质的改进,将训练速度提高50倍,其中的许多技术可以迁移到围棋之外;因为lightvector领导的KataGo社区已经证明,靠志愿者贡献算力和代码可以让KataGo持续进步,超越AlphaGo曾经达到过的高度;甚至我也可以证明,不从事人工智能研究的志愿者可以在没有任何现实利益的情况下完成这篇文章,仅仅是为了请您加入KataGo分布式训练。现在,我们要继续证明,新的志愿者可以仅仅因为这篇文章而初步了解KataGo,并加入分布式训练,与lightvector一起创造强大的开源软件。

如果您相信最优秀的软件应该允许所有人自由运行、复制、发布、研究和改进,如果您希望KataGo不仅是最强的开源围棋软件,而且超越所有商用围棋软件,成为真正的世界最强,那么欢迎您加入KataGo分布式训练。KataGo就是这样一个允许所有人自由运行、复制、发布、研究和改进的软件,它能否成为真正的世界最强,就取决于是否得到充足的分布式训练,取决于像您这样的读者是否加入KataGo分布式训练。如果您有意愿加入,专业知识和专业的硬件并不必要,使用个人电脑上普通的显卡就能做出实质性贡献。

让我们一起再次证明开源社区能创造最优秀的软件,让我们试验一下,人类创造的围棋软件能达到什么高度!

“With the help of volunteers, we are attempting to resume training from the end of KataGo's previous official run ("g170") that ended in June 2020, and see how much further we can go.”

参与KataGo分布式训练

KataGo分布式训练简介

KataGo分布式训练由lightvector在2020年发起,主要目标是利用志愿者的电脑进行KataGo自对弈,产生改进神经网络所需的数据。分布式训练的起点是lightvector单独训练“b40c256”神经网络产生的参数,此后的训练主要由志愿者贡献。后来lightvector依次开发了“b60”、“b18”、“b28”神经网络结构,每个神经网络结构的参数随着训练过程更新,会出现一系列结构相同、参数不同的阶段性版本(checkpoint)。新的神经网络结构首先由lightvector单独训练至与前一个结构水平接近,然后由志愿者分布式训练。

在KataGo分布式训练中,志愿者的电脑并不像通常的神经网络训练那样更新参数,它的实际工作更类似通常意义上的神经网络推理。要理解这种现象,我们可以回顾本文第一部分中对AlphaGo Zero训练的描述,KataGo的训练与之类似,训练的主要难点和计算开销是找到一定局面下正确的P和V(以及AlphaGo中没有的辅助目标)作为监督信息。这里对P和V的要求是水平高于神经网络的直觉输出,以帮助神经网络改进,P和V是否由同一个神经网络结合MCTS得到并不重要,如果我们能请围棋之神给出正解,当然可以抛弃目前的训练方式。用被训练的神经网络自身结合搜索生成监督信息是因为我们请不到围棋之神,只能退而求其次,相信搜索后得到的信息比神经网络的直觉更准确。

由于训练的关键是找到正确的P和V,而不是用最新神经网络参数找到正确的P和V,而在KataGo中,神经网络结合搜索后相对于纯神经网络的提升远高于最新神经网络参数相对于稍早参数的提升,使用稍早的神经网络参数影响不大。又因为产生监督信息需要在搜索中多次运行神经网络(目前P需要1200次,V需要每手棋至少200次下完整局棋),而更新参数时不需要搜索,所以更新参数的计算量远小于产生监督信息,即使更新参数仅在lightvector的服务器上执行,几十上百个节点(志愿者的电脑)同时参与分布式训练不会给服务器造成太大压力。基于以上事实,KataGo分布式训练的最佳方式是:志愿者的电脑使用稍早的神经网络进行自对弈,不更新神经网络参数,当每一局自对弈训练对局结束后,志愿者的电脑将棋谱和监督信息发送给lightvector的服务器,lightvector的服务器利用这些数据更新神经网络参数,学习完一定局数(通常需要若干万)后得到新阶段性版本并发送给志愿者的电脑,上一部分图中的每个点就表示一个这种阶段性版本,发送阶段性版本的间隔足够完成很多局自对弈,几乎不会导致额外开销。

避免在志愿者的电脑上更新参数对KataGo分布式训练极为重要。首先,这样可以避免不同训练节点同步参数的开销,使节点不用为了接收另一节点的最新参数暂停本地的计算,也就是说,KataGo分布式训练几乎可以发挥出所有节点的全部计算性能,而不会由于节点间通信影响计算资源的利用效率。其次,如果志愿者的电脑上有合适的显卡,可以使用通常仅用于神经网络推理的TensorRT环境,此时KataGo自对弈速度显著高于使用通常的CUDNN。(如果您不知道TensorRT是什么,那么不必知道,使用OpenCL即可,之后会介绍。)

KataGo主程序、神经网络文件与图形用户界面

在本地使用KataGo下棋或分析棋局时需要KataGo主程序、神经网络文件和图形用户界面。之所以分成三个部分,是因为这每个部分的版本不用严格对应,可以自由组合,甚至不用集齐所有部分。如果仅参与分布式训练,图形用户界面不必要,神经网络文件可以由KataGo主程序自动从服务器自动下载最新版,只需要安装KataGo主程序。

KataGo主程序在64位 x86-windows计算机上通常名为katago.exe,实现了通信、解析配置文件等外围功能以及KataGo算法中除神经网络之外的部分,它在通信中使用围棋文本协议(Go Text Protocol),并不直接支持图形化输出。

神经网络文件通常名为kata1-b[]c[]-s[]-d[],保存KataGo神经网络的参数。

图形用户界面在分布式训练中通常是Katrain,下棋或分析时还可以用Sabaki等。图形用户界面将用户的鼠标操作转化为围棋文本协议传给 支持这一协议的围棋软件例如katago.exe,并将围棋软件的输出进行可视化(例如渲染出棋盘和棋子)。

使用OpenCL环境参与分布式训练

参与KataGo分布式训练的方法可以在KataGo分布式训练网站https://katagotraining.org/找到,如果您有配置环境的经验,建议使用TensorRT,作者相信您可以根据https://katagotraining.org/和英伟达官网上的CUDA、TensorRT配置方法跑通分布式训练,不再把这些公开信息复制到本文中。

如果您不擅长操作计算机,可以使用OpenCL。OpenCL是一套跨平台的并行编程标准,“标准”的具体含义是,约定了一套编程方式,不同硬件厂商分别在自己的硬件上支持这套编程方式,应用程序使用约定的编程方式时不需要考虑自己运行在那种硬件上。大部分个人电脑的显卡驱动程序已经包含了OpenCL运行环境,仅需下载KataGo主程序并提供配置文件即可开始训练。请您保持电脑联网并按如下步骤操作:

1.打开https://github.com/lightvector/KataGo/releases

2.找到最新版本katago下载链接,下载适合您计算机且名称中有“opencl”的压缩包,通常是katago-v[最新版本号]-opencl-windows-x64.zip

3.解压

4.到https://katagotraining.org/注册账号,并到解压出的文件夹中将账号信息写入contribute_example.cfg

5.编辑contribute_example.cfg中maxSimultaneousGames和需要修改的其他配置选项,看不懂的选项可以保持默认

6.在命令行中切换到contribute_example.cfg所在路径,执行katago.exe contribute -config contribute_example.cfg 或 ./katago.exe contribute -config ./contribute_example.cfg。如果出错,请回到第5步,如果仍不能解决,请检查您下载的文件是否匹配当前计算机,必要时请回到第2步。如果您不知道如何打开命令行,在Windows系统中可以按win+R,输入“cmd”点击确定,打开一个黑色框,再找到contribute_example.cfg,右键找到属性,复制“位置”后面的信息,再在黑框中输入“cd [位置]”,最后再执行katago.exe contribute -config contribute_example.cfg

7.命令行输出中没有报错信息且一段时间后出现“finished training game xxx”表示运行成功,可以在contribute_example.cfg中多尝试几个maxSimultaneousGames,找到训练最快的设置。


注意:个别版本katago.exe未经过充分测试。如果v1.15.3不能连接到服务器,且配置网络无法解决,可以到 https://github.com/lightvector/KataGo/releases/v1.14.1 下载稳定版本,其他疑似katago.exe自身出错的情况也可类似处理。如果需要其他稳定版本,修改版本号并粘贴到浏览器地址栏即可。


本文作者:@欧亚猞猁。本文仅代表作者观点,作者和KataGo研发团队没有利益往来。


参考资料

Silver, D., Huang, A., Maddison, C.et al. Mastering the game of Go with deep neural networks and tree search. Nature 529, 484–489 (2016). https://doi.org/10.1038/nature16961

Silver, D., Schrittwieser, J., Simonyan, K.et al. Mastering the game of Go without human knowledge. Nature 550, 354–359 (2017). https://doi.org/10.1038/nature24270

David J. Wu. Accelerating Self-Play Learning in Go. 2020. arXiv: 1902.10565 [cs.LG]. URL: https://arxiv.org/abs/1902.10565.

Tony T. Wang et al. Adversarial Policies Beat Superhuman Go AIs. 2023. arXiv: 2211.00241 [cs.LG]. URL: https://arxiv.org/abs/2211.00241.

David J. Wu. GTP engine and self-play learning in Go (github.com) URL:https://github.com/lightvector/KataGo

KataGo Distributed Training (katagotraining.org) URL: https://katagotraining.org/

如何看待美国业余围棋爱好者战胜顶级围棋 AI,15局胜14局?URL: https://www.zhihu.com/question/584836681/answer/2911937039?utm_campaign=shareopn&utm_medium=social&utm_psn=1805089599816601601&utm_source=wechat_session

Llama 8B搜索100次超越GPT-4o!推理+搜索即可提升性能,新「Scaling Law」诞生?URL: https://mp.weixin.qq.com/s/f_eez648S8bBvn0Bk0tfRw


【投稿须知】文刀日肥持续接受各类投稿。公众号后台发送自己的【微信号】,文刀君看到后会联系你。(文刀日肥 No.218)

菇的不行
蘑菇蘑菇,铊不会开花。 一枚复旦不入流辍学生。 我是AlphaGu,棋胖到炸裂的AlphaGo。
 最新文章