ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

AI围棋为何难:从搜索空间到全局耦合的深度解析

AI围棋为何难:从搜索空间到全局耦合的深度解析

我最近在整理人机对战相关的系列内容,写到 AI 围棋的时候卡了很久。围棋在大众语境里的标签一向不少,“人类智慧的最后堡垒”“顶级棋手最后的尊严”这类说法到处都是,但真正让我反复琢磨的,其实是一个更朴素的问题:为什么同样是棋盘上的决策问题,国际象棋的那套 AI 做法搬到围棋上几乎使不上劲?这篇文章我想把“AI 围棋的困难”从头拆一遍。不是为了劝退,而是想把困难本身讲明白——它到底难在哪、为什么难、以及这些困难曾经怎样把整个领域逼到换了一套做事方式。如果你也对棋类 AI 感兴趣,或者好奇人工智能为什么在其他游戏里风生水起、在围棋上却走了这么多年弯路,这篇内容应该能给你一个比较完整的答案。

1. 棋盘只有 361 个点,为什么搜索空间大到难以置信

1.1 规则极简,分支因子却接近 250

先看围棋的规则。19 条横线、19 条竖线交叉出 361 个点,黑白两方轮流落子,终局时比较双方围到的地盘大小。规则条文加起来不超过几页纸,在各类棋牌游戏里算得上极简。但规则简洁从来不代表求解简单,恰恰相反,越是规则简单的棋,AI 越难找到突破口。

问题首先出在“分支因子”上。分支因子指的是每个局面平均有多少种合法落子选择。国际象棋从标准开局出发,平均每个局面大约有 30 到 35 个合法招法;中国象棋也差不多在 40 上下。而围棋呢?只要棋盘上还有空点,任何空点几乎都是合法落子点。开局阶段棋盘上有 361 个可落子的位置,即便排除掉少数完全无理的极端着法,平均分支因子也高达 200 到 250 左右。

你可能觉得,200 和 35 不也就是几倍的差距吗?但搜索树的规模是随深度指数增长的。每多思考一手棋,多出来的分支量就是乘以分支因子。国际象棋搜索到 10 层,大约是 35 的 10 次方,而围棋搜到 10 层就是 200 的 10 次方。这之间的差距不是几倍,而是几十个数量级。换句话说,就算给国际象棋 AI 和围棋 AI 同样多的计算时间,前者能轻松搜完的思路深度,后者连第一层都还没摸到边。

这里顺便解释一个初学者常有的误解:既然分支因子高,那我减少候选点行不行?比如开局只看星位、小目、三三等高价值点位,是不是就能把分支压下来?想法是对的,但执行起来很危险。因为“哪些点值得考虑”本身就是一个需要判断力的问题,而这个判断力恰恰是 AI 当时最缺的东西。为了减少搜索而做候选点筛选,等于把评估问题的难度又推回到了前面。

1.2 合法局面数足以撑爆任何穷举存储

很多文章喜欢用“状态空间”“博弈树规模”来形容棋类复杂度。这个表述听起来抽象,但落到围棋上,数字是真正震撼的。

先做一道简单的估算:19×19 棋盘有 361 个交叉点,每个交叉点可能是空、黑子、白子三种状态。那么所有可能的位置组合就是 3 的 361 次方,数量级大约在 10 的 172 次方。当然,这里面包含了大量非法局面,比如同色棋子连成一片却没气的状态、双方同时违反禁着规则的状态。把这些非法情况过滤掉之后,合法的局面总数大约还在 10 的 170 次方。

10 的 170 次方是什么概念?物理学界对可见宇宙中原子总数的主流估算大约是 10 的 78 次方到 10 的 82 次方。围棋的合法局面数比整个可见宇宙的原子总数还高出上百个数量级。至于整棵博弈树——也就是从第一手到终局的所有可能对局路径——更是高达 10 的 360 次方左右。

这串数字直接把一种经典的 AI 思路判了死刑:穷举存储。有人会天真地想,那我把所有合法局面都存进数据库,下棋时直接查表不就行了?答案是完全不行。就算把整个宇宙的原子都做成硬盘,也装不下围棋局面的零头。更关键的是,存储只是第一步,你还要在存储之上建立局面之间的胜负关系搜索,那个复杂度只会更高。所以围棋 AI 的困难从来不是一个工程优化问题,而是数学意义上、复杂度意义上的根本壁垒。

为了更直观,我把几类常见棋类游戏的状态空间做进一张表里:

棋类平均分支因子合法局面量级博弈树复杂度量级
井字棋约 4约 10 的 3 次方约 10 的 5 次方
国际象棋约 35约 10 的 46 次方约 10 的 123 次方
中国象棋约 40约 10 的 48 次方约 10 的 150 次方
围棋约 250约 10 的 170 次方约 10 的 360 次方

这张表看完,你应该能直观感受到围棋和国际象棋之间的巨大断层。国际象棋虽然状态空间也不小,但按当时的硬件水平,配合剪枝算法还有勉强一战的余地。围棋是直接跳出了人类可想象的存储极限。

1.3 没有将死:围棋缺少清晰的终局里程碑

搜索类算法有一个隐含偏好:它喜欢存在“目标节点”的问题。国际象棋里这个目标节点就是“将死”。你所有的搜索方向都可以指向一个明确的终局状态——对方的王无路可走。哪怕对方的王在棋盘上不断移动,只要它还没被将死,你仍然可以朝着削弱它防守的方向搜索。

但围棋没有这种目标。你落子的目的不是把某个目标棋子逼到绝路,而是尽可能多地围出地盘。问题在于,“围地盘”的边界在哪?终局到底在什么时候发生?这是一个高度依赖棋手判断的问题。双方认为边界已经明确、不会再发生大的战斗时,棋局就结束了。可这个“认为”恰恰是围棋里最难形式化的部分之一。

正因为缺少明确的终局里程碑,搜索算法在围棋上无从画出一条通往终点的路径。国际象棋可以倒着推:为了将死对方,我需要制造什么局面?为了制造这个局面,我需要如何调动子力?每一步搜索都有方向感。围棋里也有方向感,但方向感来自棋手对厚势、弱棋、潜力等全局要素的模糊认知,而这些东西无法像“将死”一样被精确定义成搜索的终点。于是传统搜索在围棋上的第一个困境就出现了:搜索树的规模大得离谱,而你还不知道朝哪个方向搜才算有意义的尝试。

2. 评估函数这道坎:你无法给一个围棋局面贴上数字标签

2.1 国际象棋可以给棋子打分,围棋用什么打分

博弈类 AI 的主流框架是“搜索 + 评估”。搜索负责枚举候选变化,评估函数负责在树上的每个节点回答一个问题:当前局面到底是黑好还是白好、好多少。国际象棋的 AI 之所以能用这个框架取得巨大成功,是因为它有一个天然的评估抓手——物质价值。

国际象棋的棋子有明显的等级差:后大约值 9 分、车 5 分、马和象各 3 分、兵 1 分。你吃掉对方一个车,自己和对方的物质差直接拉开 5 分,这个判断几乎是全局有效的。在此基础上再叠加上王的安全性、兵型结构、子力活动空间等修正项,一个评估函数就可以大致衡量双方优劣。

围棋没有这种天然的计分单位。棋盘开局是没有子的,所有棋子都是临时放置上去的,每一手棋只增加一个子,但也可能同时改变了周围十几个子的价值。你要怎么给一个正在形成的势力范围打分?怎么给一块只有两气、随时可能被攻杀的孤棋打分?怎么给一处还未定型但未来可成 50 目大空的模样本打分?如果你用“当前围到的目数”来打分,那你会得到一个极度短视的评估,因为厚势型局面在早期几乎不显示为真实目数,大量好处都藏在“未来潜力”里。可“未来潜力”又如何放进一个静态评估函数?

2.2 势与地:两种形态之间的动态转化

更麻烦的是,围棋里存在两类看似对立的要素:势与地。地是已经确定的围空,直观、可度量;势是外势、厚势,不直接产生目数,却能影响未来所有战斗。势和地之间没有固定兑换率。一块强大的外势在正确运用下可以通过攻击转化为大面积实地;一块看似辉煌的模样如果被对方成功侵消,可能最后只剩几目残空。

这种勰态性直接摧毁了“用静态数值评估局面”的简单想法。早期有大量围棋 AI 采用“当前实空 + 潜在实空”的加权和来做评估:把明显成空的地方算成确定目,把一些大场估算出潜力值。听起来合理,实践起来一团糟。因为“潜在实空”的权究竟是多少,取决于周围其他棋子的位置,取决于当前战斗的焦点,甚至取决于棋手自己对战斗倾向的偏好。你在函数里把这个权设对了 A 局面,在 B 局面就一定会错;调好了 B,C 又坏了。我见过不少业余棋手用早期围棋软件下棋,经常出现一种荒诞感:AI 在局部明明已经落后很多,但它的评估函数依然认为局面五五开,原因就是它把自己那一堆不算实的厚势按照规则惯性估算成了巨空。

2.3 厚、味道与劫材:这些概念天然抵抗数值化

学棋的时候,老师常会说“这块棋很厚”、“这步棋味道不好”、“这里留着一个劫材”。这类词在一些非棋手听来像玄学,但它们恰恰是围棋评估里最重要的信息。

我试着用大白话解释一下这些概念。厚,指的是一块棋形状完整、眼位丰富、即使被对手从多个方向进攻也能从容应对;薄,指棋形散乱、气紧、随时可能被分断或被杀。味道,指的是某个局部残留的破绽数量与可利用程度。一个棋形如果味道差,对方未来随时可以在这里制造手段,而这些手段会牵动全局的劫争与应接。劫材就更抽象了,它是指一处棋形能够被用来“找劫”的价值,不是你棋盘上任何固定位置的静态属性,而是由全盘几十处棋形的潜在损失决定的。

我很难想象早期开发者是如何试图把这些概念塞进数值评估函数的。你想给“厚”加分,加多少?加多了,就会高估模样;加少了,又低估外势的威慑力。你想给“味道”扣分,扣多少?扣多了,棋盘上有味道的地方到处都是,分数变成噪音;扣少了,它又不能反映那些真正危险的劫材潜力。把国际象棋那种“物质 + 位置修正”的成熟评估方案拿来直接套用到围棋上,结果就是:在国际象棋里行之有效的评估模式,到了围棋几乎每一个因子都找不到可靠的定义。围棋 AI 的困难,在评估这一环是最本质的。

3. 古典 AI 在围棋上的挣扎:搜索加规则的破产

3.1 搜索树方法:在国际象棋有效的套路为何失灵

我们现在说起棋类 AI,多少会觉得“下棋不是 AI 应该轻松解决的事情吗”。但那是现代深度学习带来的错觉。早年的棋类 AI 走的是“启发式搜索 + 手工知识”的传统路线,国际象棋的成功几乎让所有人都认为,只要规则定得够细、剪枝做得够好,围棋也迟早能被拿下。

真实情况是,传统搜索算法在围棋上遭遇了双重危机。第一重危机在上面已经说过:搜索规模太大。第二重危机则是评估不可靠。这两个问题叠加起来造成了一个很尴尬的局面。如果说搜索是在探路,评估是指明方向,那围棋 AI 就是一个看不见方向但还在拼命探路的人。你探得再远,其实都是在原地兜圈子。国际象棋用评估函数给每个局面打个 0 到 10 的分数,虽然不完美,但基本可信;围棋的评估函数经常是错得离谱,那么搜得越深,错误积累越严重。

当时很多研究者做过一个对比实验:让国际象棋程序和围棋程序各自向前计算一定深度,然后检查它们对局面的判断准确性。国际象棋的程序即使估算浅,排名靠前的候选着法里也总有几个是正常棋手会考虑的;围棋程序列出的候选着法经常让人哭笑不得——一些职业棋手看都不会看一眼的点,却被 AI 放在第一位。这不是编程者水平低,而是整个评估框架错了。

3.2 模式匹配规则的早期程序,只能在入门级徘徊

深度学习方法普及之前,围棋 AI 还有个流派依靠“手工规则 + 模式匹配”。开发者们把棋理总结成成百上千条规则:靠近边角的价值更高、拆二可以关联、打入时优先考虑托退、遇到对方外势要限制其展开等。这些规则在局部定式里还算可靠,但一放到全局就漏洞百出。

原因很简单:围棋的棋理高度依赖情境。同样一步“拆二”,放在己方厚势旁边是稳健连接,放在对方厚势边上可能就是送上门让对方攻击;同样一个“点角定式”,在局部是正常应对,但如果全局其他地方有一个更大的大场,点角可能只是浪费时间。人类棋手在运用棋理时,靠的是对全局态势的理解,而不是机械地套用“拆二总不会错”这样的规则。早期围棋 AI 在规则套用时缺乏这种全局感知能力,于是经常出现背着一堆局部正确定式,却在全局布局上把棋下得支离破碎。

我看过一些早期围棋 AI 的对局记录,最直观的感受是:它每一个局部单拎出来都有模有样,但整体上就像一盘散沙。它不知道什么时候该弃子,不知道什么时候该脱先,也不知道一块厚势到底该用它去压迫还是该果断舍弃。这种系统在十几年前的真实水平,大概也就是“学过规则但没下过棋”的程度,连刚入门的业余棋手都能轻松击败它。

3.3 蒙特卡洛模拟的进步与它的天花板

事情出现转机是在“蒙特卡洛方法”被引入围棋 AI 之后。这个方法的想法非常直接:与其费尽心思设计评估函数,不如直接让程序在候选局面后面随机落子,模拟出大量完整对局,用统计胜率来评估当前局面的好坏。

这个做法有一个巨大优势:它完全不需要人工设计评估函数。理论上,只要模拟得够多,随机对局的结果就能近似反映出候选点的优劣。这比手工规则强多了,也确实让围棋 AI 的水平上了一个台阶,从入门级勉强提升到中级业余水平。

不过蒙特卡洛方法很快也撞到了天花板。第一,随机落子会让模拟结果充满噪音。围棋是高度依赖于全盘配合的游戏,随机乱下的棋根本体现不出“厚势压制”“形状效率”这类需要深度理解才能发挥作用的要素。第二,为了压过噪音,你不得不进行海量对局模拟,计算成本高得惊人。每一次新增候选点都要重新模拟几十万局,算力很快就撑不住了。第三,用蒙特卡洛方法处理劫争时尤其痛苦,因为劫争的胜负取决于全盘劫材的分布,随机模拟里劫材经常被忽略,导致评估严重失真。所以即便走到了蒙特卡洛这一步,围棋 AI 离人类高手的距离仍然非常大。“困难”二字,一直是压在围棋 AI 身上的巨石。

4. 全局纠缠才是真正的组合爆炸:局部最优从来不是真最优

4.1 征子:一枚边角的棋子能决定另一片战场的生死

讨论到前面,我们已经谈了两个层面的困难:搜索规模过大、没有可靠的评估函数。但还有一个更深层、也更容易被忽视的困难:围棋的全局耦合性。

举个例子,围棋里有一项基础技术叫“征子”。当你连续从斜线方向追杀对方棋子,对方每逃一步你就在它前进的路线上拦一步,直到把它逼到棋盘边缘无路可逃。这个追杀过程看起来是纯粹的局部直线计算,每一步都是必然应对。但征子有一个决定性的前提:逃跑方斜线上的关键交叉点上,不能有任何可以接应的棋子。这个棋子可能远在棋盘的另一角——看起来毫不相关的位置,却会彻底破坏整个追杀路线,导致被追杀方借势反打。

所以棋手在判断一步棋能不能“征”时,不只是盯着局部棋盘,而是要在脑海里扫过整盘棋的每一个角落,寻找是否有任何一颗棋子会成为逃跑方的援兵。我在自己做围棋 AI 相关的数据实验时也碰到过这种情况:一个模型在局部判断“可以吃”,只要棋盘远端加一个无关棋子,整条追杀线就作废了。而这种细微关联遍布在整个棋盘上。一个局部思路再正确,也可能因为全局任何一个位置的因素而完全反转。这种全盘耦合,让任何试图把围棋拆成独立子问题、逐个求解的策略都面临巨大的组合爆炸风险。

4.2 劫争背后的劫材池:需要盘算全盘的价值总量

再看看劫争。劫争是围棋里一种特殊的反复提子规则造成的纠缠局面。棋盘上出现劫争时,双方不能立刻提回同一位置,必须在别处下一手棋,等待对手应棋之后,才有机会把劫提回来。这“别处的一手”就是“找劫材”,意思是你在别处制造一个足够大的威胁,逼对方不得不应,然后你趁这个机会回头打赢劫。

那么问题来了:你全盘到底有多少个“足够大的劫材”?每一个劫材的价值多大?对方如果不应这个劫材,你能不能靠这个位置反杀或占大便宜?要回答这些问题,你必须对全盘所有棋形进行一次价值排序。这已经不是一个局部问题,而是一个全局资源的统计算账。在 AI 的实现里,这种全盘劫材统计很难用简单的搜索完成,因为你每找一个劫材,就等于启动了另一条完全不同的搜索分支;如果劫材又引发了新的劫材交换,整个搜索树就会以指数级别扩张。

我见过一些使用现代方法训练的围棋 AI,在普通局面下应对出色,但一旦进入复杂的劫争阶段,胜率曲线会出现明显的摆动,甚至出现前后矛盾的评价:一会儿觉得这一方大优,一会儿觉得那一方大劣。原因就是在劫争这个高度依赖全盘统筹的领域,评估函数需要同时评估几十个分布在棋盘各处的劫材剩余价值。这个问题没有彻底解决,只是被庞大的网络参数暂时压住了。

4.3 每一步落子都在重新定义所有棋子的价值

真正的围棋老手有一句话我印象很深:“你在棋盘任何地方下一手棋,等于给全世界所有棋子都重新标了一次价。”这句话初听夸张,细想是事实。你在上边压一手,可能让左下角原本活得很舒服的一块棋变薄了;你在中腹飞一些,可能让右边原本有机会成空的地方多了味道;你随便在某个欠点拍一手,原本以后不是特别重要的劫材位置就变得重要了。

这种“落子即重估”的特性,让围棋 AI 的任何静态快照式评估都显得先天不足。国际象棋里,你布置一个兵链,它的价值是相对稳定的,周围棋子的价值不会因为你在远端走了一步而瞬间改变。围棋完全相反。每一步棋都会牵动全局的势力消长、劫材增减、厚薄转换。如果你用一套基于当前局面的数值模型来评估,它比变化本身滞后了半拍。

这也是为什么后来深度学习价值网络能够突飞猛进的一个重要原因:它不再是机械地计算当前静态要素,而是试图通过大量对局学习“整个局面的动态潜力”。但即便如此,它也只是把“全局耦合”带来的组合爆炸问题从搜索端转移到了学习端。问题本身没有消失,它只是从“搜索树的规模”变成了“需要多少训练数据才能覆盖足够多的耦合模式”。

4.4 为什么通用生成式模型也难下围棋

这几年生成式模型火起来以后,身边不少朋友开玩笑说,以后让大模型学了棋谱不就能下棋了吗?实际上这条路远没有想象中顺利。围棋的全局耦合让任何基于“语言理解”的模式都容易出问题:模型可以记住大量定式和局部手筋,但它并不知道这步棋放在当前全盘态势里是否成立。棋手之间交流时会说“这里要脱先”“那里要弃子”,这些判断依赖的是“全盘价值的整体排序”,而不是从棋谱文本里学到的局部序列规律。

我也留意过一些用 Transformer 架构直接生成围棋着法的社区项目,效果很好的一些案例,大多是在定式阶段或者局部死活题上。一旦进入没有标准模板的开放布局,模型就开始迷茫,下出一些从局部看“像人下的棋”、但从全局看缺乏连贯性的招法。说白了,围棋的“难”不只是数据量不够,而是它的正确决策无法脱离全局语境孤立存在,这对所有依靠输入输出映射的模型都构成了根本挑战。

5. 深度时代:困难没有消失,只是换了藏身之处

5.1 价值网络本质上还是在做评估,只是换了一种暴力近似

现阶段的围棋 AI 已经比古典时代强了太多,但把话说明白一点:它没有真正消除“评估难题”,只是用高容量神经网络把评估难题改造成了一个大规模学习任务。你不再需要手写“厚势值几目”的规则,而是让网络在几百万局对弈里自己学会“什么样的局面有未来潜力”以及“什么样的局面只是一时虚势”。

这当然是一个巨大的进步。但你要意识到,价值网络本身仍然是一个近似的静态映射。它接收一个局面,输出一个胜率数字;这个数字的背后,依然是对“厚、味道、劫材、潜力”这些要素的综合评判,只是参数变成了数百万个浮点数而已。围棋的困难并没有消失,它只是被压缩进了训练数据和网络权重里。

5.2 我观察到的一些失败模式:胜率模型也会“误判厚势”

我在实际接触一些自对弈训练的围棋模型时,见过不少很有意思的失败模式。最典型的一种是“过度自信型厚势”:模型在某个中盘局面下把胜率标得很高,因为它认为己方拥有一块巨大的外势,但它没有注意到这块外势的关键点已经被对方预先埋下了两颗可以破坏结构的棋子。等对方真正出手时,外势瞬间变成薄棋,胜率又急剧下降。这种反复体现在同一个模型上,本质上就是它在训练中把“外势大”和“形势好”过度关联了。

另一个常见的失败模式出现在劫争阶段。模型倾向于在它“见过更多类似局面”的中盘阶段走出强硬动作,但进入劫争一打起来,它往往会连续选择一些无关痛痒的劣质劫材,导致大劫失败。这其实还是全盘劫材统筹能力不足。这些现象说明,即使有了这么强大的神经网络,围棋全局组合爆炸形成的评估困难依然会在特定情境下重新浮出水面。

5.3 围棋剩下的困难:可解释性、泛化能力与意义

如果要我现在总结围棋 AI 还剩下什么困难,我不会说“它还不能赢人类高手”——在很多衡量标准上它已经做到了。真正的困难在另外三个方向。

第一是可解释性。当前的模型可以告诉你“这个局面胜率 78%”,但解释不了为什么。它不能告诉你这 78% 里有多少来自厚势、多少来自劫材优势、多少来自对方棋形的味道不好。人类棋手复盘时可以指出“这里过于贪空”“那里应该保留劫材”,但模型不能。

第二是泛化能力。一个在常规规则下训练出来的围棋 AI,如果改变贴目规则、甚至把棋盘改成 21 路,它往往需要重新训练很久才能适应。它掌握的围棋知识是跟特定棋盘大小、特定规则高度耦合的,迁移能力远不如人类棋手。

第三是意义层面。围棋 AI 能算出胜率最高的点,但它不知道“为什么这一步重要”。当棋局不再单纯以胜负为标准,而要考虑棋型的优雅、避免争议的劫争、照顾对手的势力范围时,它就更难以给出令人满意的回答。

这些困难不会因为模型的参数量继续变大而凭空消失。它们指向一个更底层的命题:围棋 AI 要从“能够获胜”走向“能够解释全局结构”,还需要跨过一条很长的路。

我在整理这个系列内容时,最深的体会是:围棋的“困难”不是一个可以被简单克服的技术障碍,它像一面镜子,照出了搜索式 AI、规则式 AI、统计式 AI 各自的边界。每个阶段看似解决了旧的困难,其实只是把困难推到了新的形式里。也许这正是围棋作为人工智能试验场最迷人的地方——它逼着研究者想清楚,自己到底是在“搜索答案”,还是在“理解问题”。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进