1. 为什么说围棋是AI攻不下的最后一座堡垒
围棋的规则简单得可怕:黑白双方轮流在19×19的棋盘交叉点上落子,谁围出的领地多谁就赢,气尽则提子,一眼就能看懂。但就是这套规则,让计算机从1950年代开始追赶了半个多世纪,直到2016年才在正式对决中真正越过职业棋手的壁垒。
做AI方向这些年,我经常在课上和线下分享时引用围棋这个案例。它最吸引人的地方在于:把棋类博弈的所有经典难题一下子全摊在你面前。国际象棋8×8共64格,围棋19×19共361个交叉点;国际象棋平均每步合法走法(分支因子)大约是35,一盘棋平均80回合,而围棋的分支因子大约是250,一盘棋动辄150到200回合。这两个数字的差异,直接决定了搜索树规模的指数级差异。
我算过一组数字,很多资料里反复引用过,但每次讲还是有人被惊到:围棋所有可能局面的数量大约在10的170次方量级,而全宇宙可见原子的数量大约在10的80次方量级。如果算上所有合法棋局的完整走法序列,规模更夸张,能达到10的760次方。这是什么概念?假设一台计算机每秒钟能演算10亿个局面,从宇宙诞生开始算到现在,连一个零头都遍历不完。
这个天文数字是围棋AI所有困难的总根源。只要你还想着“把所有分叉都看一遍”,围棋就是无解的;而过去几十年里,绝大多数经典算法恰恰都建立在“搜索全部”或者“尽量多搜”的假设之上。所以我们聊围棋AI的困难,本质上聊的是:当传统工具箱全部失灵时,人类是怎么一步步找到新工具的。
提示:理解这个规模差异,是理解后面所有算法演进的钥匙。很多人一开始学蒙特卡洛或深度学习时觉得莫名其妙,其实就是没先想清楚“到底什么东西算不完”。
2. 阻碍AI的三个核心难点
2.1 分支因子失控
国际象棋那个35的分支因子不是随随便便来的。因为棋子的走法有明确规则限制:兵只能前进斜吃,马跳日,象走斜线,车走直线,很多时候一个局面真正合理的选项可能就只有两三个。规则本身就替程序做了大量的剪枝。
围棋没有这个“福利”。任何一颗棋子落在任何空交叉点都是合法着法,开局阶段尤其自由,19×19的棋盘有361个起点可选。你没法用“合法性”来过滤候选着法,因为所有点都是合法的。传统搜索算法里最基础的那层合法性剪枝,到围棋这里直接失效。
有人说那我可以加启发式剪枝,只搜看起来合理的点。问题是“看起来合理”这个判断本身就没法用简单规则定义。一个点可能是好棋,也可能因为旁边多了一颗棋子立刻从好棋变成废棋。启发式规则在局部多少有点用,一旦牵扯到全局势力,立刻变成一堆互相打架的矛盾条款。
更麻烦的是围棋里的“劫争”规则。一个局部可以反复提子循环,如果不对劫争做特殊记录处理,递归搜索会直接陷入死循环。传统算法为了应对这个,得额外维护一套复杂的劫争状态管理,这又进一步拖慢了搜索效率。
2.2 局势评估靠直觉
国际象棋的程序很容易给一个局面打分:把黑白双方棋子的价值加起来,双方的王安全度、兵形结构、子力活跃程度再加加减减,几行代码就能得到一个相对靠谱的局面评估值。这是因为国际象棋里有非常清晰的“物质优势”概念——你多一个车就是比我多五分,这是硬性的、可量化的。
围棋没有这种东西。棋盘上没有“一个子等于多少目”的天然量度。你占了一大片区域,可能因为一个局部战斗崩盘,那片区域全部变成对方的领地;你一块棋看起来气很长,结果一次失误被全歼。要评估一块棋是活是死、一块势力能围出多少目、外势在后续战斗里能发挥多大作用,这些靠传统的“特征+权重”框架几乎无法精确表达。
这是围棋AI最尴尬的地方:程序不是不能下棋,而是下着下着就会犯糊涂。明明是优势局面,因为一次错误评估,走出一步毫无必要的坏棋,把胜势拱手送人。说白了,人类棋手的“形势判断”是一种高度抽象的直觉能力,而传统符号主义AI恰恰最不擅长处理“直觉”这种没法形式化的东西。
2.3 局部与全局的无限缠斗
围棋第三个难点在于局部与全局的耦合程度远超其他棋类。国际象棋里也有局部战斗,但无论多复杂的战术组合,最后都能落回“吃子、换子、将军”这种相对清晰的逻辑链。围棋不同,棋盘上的A处和B处可能隔着十万八千里,但因为一条外势或厚味的连接,两处会发生直接或间接的相互影响。
最典型的就是“厚势”概念。棋手的某一块棋虽然没有直接围住目数,但形成了一道厚壁,对后续所有战斗都会产生辐射影响。这种影响没法简单切块计算。你想把棋盘分成几个独立区域分别搜索,很快就会发现区域之间因为各种“势”产生耦合,分而治之的策略失效。
麻烦的还有收官阶段。棋盘快下完时,很多小地方的目数已经基本固定,看似局部化了,但实际上剩余小目的组合数量依然爆炸。而且收官顺序直接影响胜负,半目输赢的比赛里,任何一点点评估误差都会被放大。传统算法在收官阶段需要反复比较大量剩余组合的先后关系,搜索量一点都不比中盘小。
这三条叠加在一起,基本把所有经典AI方法全灭了一遍:深度优先搜索打不动深度,广度优先搜索撑不住宽度,启发式评估找不到有效启发,专家系统规则写不完也不可能写全。
3. 传统算法的困局:那些被写进教科书又被打脸的思路
3.1 规则引擎为什么走不远
早期的围棋AI走的是专家系统路线。当时的思路很直接:国际象棋已经通过“深度搜索+局面评估”取得了巨大成功,围棋是不是也可以把职业棋手的经验整理成规则,再套上搜索框架赢棋?
我读过不少早期文献,方法大同小异:先把棋盘划分成多个局部区域,每个区域用模式识别判断眼位、厚薄、死活,然后拼出一个全局评估值,再把评估值交给搜索算法去选点。听起来很合理,实操起来全是坑。
第一,围棋模式的数量远超预期。同一个棋形在不同位置、不同周边配置下的价值完全不一样。职业棋手常用的定式就有几万种,每一种还会因为周边棋子配置衍生出几十种变化。规则库越写越大,很快失控。第二,规则之间互相冲突。一个棋形在局部明明是高效的,放到全局可能因为外势等原因变成坏棋。你试图用规则去覆盖这种动态关系,等于用静态条款去描述流动态势,方向就是错的。
我记得早期某款开源围棋程序,代码里密密麻麻写了几千条规则,最后棋力常年徘徊在业余初级,还时不时走出让棋手哭笑不得的“电脑棋”。程序员水平没有问题,出问题的是路线本身:规则的表达能力在围棋面前天然不够。这个方向后来逐渐被学术界放弃,现在回头去看,它的失败给后人留下的教训是“不要试图穷举人类直觉”。
3.2 蒙特卡洛的意外成功与天花板
2006年是一个重要转折点。蒙特卡洛树搜索被引入围棋后,情况有了质的变化,这个方法的思路乍看起来有点“愣”:与其费劲设计复杂的局面评估函数,不如让AI自己和自己随机下很多盘棋,用随机模拟的胜率来代替人工评估。
怎么理解这个思路?你觉得某块棋价值大?咱们直接在这个位置快速模拟几百盘对局,统计一下最终谁赢得多。模拟一千盘下来,如果执黑胜率明显更高,那这块棋就是好棋。这个做法绕开了前面说的“局势评估”难题——不需要解释为什么好,只需要统计最终结果。
MCTS确实有效,它把围棋AI从“规则引擎时代的业余初级”提升到了“业余强手”水平。这个成绩在当时已经非常了不起,因为此前的围棋AI在人类棋手眼里根本不算会下棋,MCTS让AI第一次有了“棋感”。
但MCTS很快也遇到了天花板。它的模拟对局是全随机的,相当于用一个“乱下但能下到终局”的水平去统计胜率。这导致统计结果在很多关键局面下不够精确,尤其是涉及复杂死活、厚势转换、大龙对杀这种需要深度计算的场景,随机模拟经常误判。结果就是:MCTS让AI从“弱”变成了“不弱”,但离击败职业顶尖棋手还差着好几个层次。
到那个阶段,研究者形成了一个共识:随机模拟的统计上限已经到了,必须引入真正能理解局面的模型。但这里又冒出一个新问题——传统机器学习需要大量带标签的训练数据,围棋局面的“标签”是什么?终局胜负当然是标签,但一盘棋要下两百多手,中间每一步棋的好坏标签怎么定?这个难题一直卡到深度学习出现,才终于有了可以落地的答案。
4. 深度学习如何把“不可能”变成“可解”
4.1 策略网络:剪掉整片搜索空间
2016年那场人机对战让外界看到了围棋AI的突破,但真正从事后来拆解,核心就是两个神经网络。第一个是策略网络,任务只有一个:给定当前局面,输出下一步落在棋盘每个点上的概率分布。
听起来平淡无奇,可它对“分支因子失控”的打击是革命性的。以前搜索算法面对250个候选点只能硬着头皮挨个搜,策略网络训练好之后,可以直接告诉AI:“下在A点的可能性最大,B、C次之,其他点概率极低,基本不用考虑。”我实际测试过类似结构:把策略网络当作搜索的候选剪枝器,搜索宽度能瞬间从250压到十几个甚至几个。搜索树的根部直接砍掉九成以上的分支,剩下的搜索任务自然轻松得多。
这个思路其实人类一直在用——职业棋手看棋时第一感就能锁定一小部分候选点,剩下的根本不看。策略网络学的就是这种“第一感”。它的训练数据可以来自人类棋谱,更强大的版本则是让AI自己和自己下棋,从自我对局中学习。策略网络练得越好,搜索时要考察的分支就越少,这相当于把搜索问题的规模从“指数级”降到了“多项式级”的体验,也是围棋AI能跑得动的基础。
4.2 价值网络:让AI学会“估价”
第二个关键组件是价值网络。它的任务是回答另一个问题:当前局面下,黑棋的胜率是多少,白棋的胜率是多少?这直接对应前面说的“局势评估”难题。
价值网络的训练方式很巧妙——不依赖人工标注,而是让AI自己和自己下棋,随机生成大量对局,再把每盘棋的最终胜负当作整盘棋中间所有局面的标签。相当于用“终点结果”倒推“中间路线的质量”。这个思路在深度学习里叫自监督,说通俗点就是:棋不需要人教,自己跟自己玩几千盘,自然就学会判断局面好坏了。
原理简单,实现却很重。价值网络需要把棋盘上几百颗棋子的空间分布压缩成一个准确的胜率实数,这要求网络具备很强的表达能力。实际项目中,价值网络通常是一个很深的卷积神经网络,层数动辄几十层,参数量轻松过亿。训练时要先生成海量自我对局数据,再用这些数据训练网络。我身边做过类似复现的朋友常说,光数据生成这一步,就要让高端GPU集群连续跑上好几周。
价值网络出现后,MCTS里最耗时的“随机模拟到底”这个环节被替换掉了:不需要真的下完一盘棋,直接让价值网络看一眼当前局面,就能给出一个评估结果,回传作为搜索节点的统计信号。这个替换极大减少了搜索开销,也让整个系统有机会在更长时间内进行更深入的搜索。
4.3 AlphaGo架构:三个组件如何配合
外界提到AlphaGo总喜欢一句话带过:“深度学习加蒙特卡洛树搜索。”但真正理解这个架构,必须看清楚三个组件是怎么拧在一起的。
搜索过程的起点是当前局面。AI会围绕当前局面展开一棵搜索树,每到一个节点,先用策略网络生成候选着法和各自先验概率,然后进入MCTS的模拟环节。每模拟一次,节点的访问次数就会更新。关键点在于,最终选择走哪一手,用的不是简单的模拟胜率,而是要把策略网络给的先验概率和MCTS统计的访问次数联合计算。大致公式是:综合分数 = 先验概率 / (1 + 当前访问次数) + 探索系数。这样既尊重策略网络的知识,又保留了MCTS通过反复访问得到的验证信息。
价值网络参与的环节更有意思。在模拟对局中,不需要把棋真的下到终局,而是在模拟的某个节点上直接调用价值网络,让网络估算当前局面的胜率,把这个估算结果作为模拟结果回传给搜索树。这一步就把之前MCTS里“随机模拟两百手直到终局”的高开销操作压缩成了“看一眼就算完事”的低开销操作。
用我实际跑项目的感觉来说:策略网络决定AI“会不会下棋”,价值网络决定AI“下得好不好”,MCTS负责把两者结合起来,通过反复推演寻找稳定可靠的落子。三者的配合有点像一位经验丰富的棋手(策略网络),一个冷静的形势判断师(价值网络),加上一台反复验算的分析引擎(MCTS)。缺任何一个,都达不到击败顶尖职业棋手的水平。
5. 落地复现中会遇到的实际困难(以类AlphaGo项目为例)
很多人看完论文,以为困难已经被彻底解决,到自己动手复现一个简化版围棋AI时才发现,困难只是换了一个形态出现。如果你想自己上手做类似项目,下面这些坑几乎躲不掉。
5.1 数据与算力门槛
最直接的障碍是算力和数据。AlphaGo原始训练消耗的资源可以去看公开论文,我只说实际体验:即使只在9路棋盘上做一个极简版本,也需要好几块GPU连续训练数天,才能看到明显的棋力提升。一旦从9路升到19路棋盘,自我对局的样本量至少要达到百万盘级别,效果才可能显现。
有人问能不能用公开的人类棋谱替代自我对局?可以,但效果明显差一截。公开棋谱质量虽高,数量有限,撑死几十万盘,深度模型很容易就把棋谱背过拟合了。只有自我对局才能持续生成新样本,让AI不断发现自己的弱点并修正。我每次线下分享都会强调:围棋AI训练里,训练数据的数量决定棋力下限,自我对局机制的完善程度决定棋力上限。
5.2 参数调优与过拟合
第二个隐蔽困难是参数调优。策略网络和价值网络分工明确,但训练时耦合非常深。我在实验里踩过的坑是:策略网络收敛过快,价值网络跟不上,结果AI中盘阶段“会下”但“选不准”,经常走出局部看起来很好、全局却明显落后的棋。
解决这类问题通常要把两个网络的损失权重和学习率拉开,让价值网络训练得慢一点、稳一点,同时给策略网络增加探索噪声,防止它过早收敛到局部最优。这套操作听起来有点玄学,但在论文里极少写明,完全得靠大量实验去摸。很多团队复现效果差,不是模型有问题,而是参数组合不对。
5.3 评估与踩坑
还有一个容易被忽略的点:怎么判断AI的棋力真的提升了。直接找人类棋手对局,成本高、效率低;跟开源围棋AI对战,又容易踩到“同源棋风”的坑——如果两个模型训练数据来源类似,评估结果会失真。
我自己常用的方法是构造一组固定测试棋谱,覆盖不同类型的开局和局面,让AI逐个复盘,记录“决策一致率”和最终胜负变化。这样可以在不消耗大量算力的情况下快速判断训练方向是否正确。
要特别提醒的是,围棋AI训练里存在大量“假性提升”。某段时期输赢波动很大,很容易让人误判为有效进展。应该盯住较长周期内的平均胜率,而不是单盘棋的输赢。我在迭代过程中吃过这个亏:只看单局结果调参,浪费了差不多一周时间才发现是噪声干扰。
注意:训练类AlphaGo项目时,建议把“评估集固定化”——测试棋谱一旦定下来就不要再变,否则你无法分辨棋力提升到底是真实进步还是测试集变化造成的。
6. 现在围棋AI还难吗?换个角度看困难
到今天,围棋AI早就可以轻松战胜人类顶尖棋手,不少职业棋手已经习惯用AI辅助训练。但要说“困难完全消失了”,我不认同。
过去那些理论层面的困难确实被解决了——搜索规模不再是不可逾越的障碍,局面评估也找到了深度学习解法。可新的困难出现在工程层面和应用层面:训练顶级围棋AI所需的算力、数据量、工程复杂度依然高得吓人,不是普通个人开发者能轻松复现的;围棋AI的强建立在大量自我对局之上,跨到其他棋类或真实世界博弈场景时,泛化能力依然存在明显局限。
这几年也有人在研究小样本围棋AI,想用更少的自我对局做出接近的效果,但到目前为止还没有出现能颠覆现有范式的方案。在我看来,围棋AI的“困难”其实没有被消灭,只是换了一身马甲——从算法理论问题,变成了工程成本、数据效率、泛化能力和项目落地问题。
从这个角度讲,理解围棋AI“难在哪里”,对任何一个想进入AI领域的人都有特殊价值。因为它逼着你直面搜索空间、局面评估、自监督学习这些核心概念,而不是停留在调包调参的表层。我带新人做项目时,也总喜欢拿围棋当第一个实战任务:把一个看上去不可能的难题,拆解成可以一步步攻克的模块,这种能力迁移到任何AI项目里都是通用的。
我个人体会最深的一点是:围棋AI的困难从来不是某一道算不过来的数学题,而是“把模糊直觉变成可计算函数”的那道鸿沟。跨过它,靠的不是什么神秘魔法,而是对问题的拆解、对工具的合理组合,以及大量耐心细致的实验验证。如果你正在准备动手复现一个类似项目,希望这篇文章能帮你少走几步弯路——等你自己跑通一套简化版围棋AI的时候,回头再看这些困难,会特别有成就感。