最近花了一些时间思考AlphaGo的比赛,还去补了一下围棋的基本知识。虽然围棋水平还是非常低下,但是经过思考,大概搞懂了AlphaGo的行棋背后的逻辑。如果围棋方面出现错误,还望围棋高手不吝指出。
先说结论。AlphaGo的行棋风格是消除变化,避免打劫,这是AlphaGo的架构和训练方式导致的,也可以说,这是Deepmind团队精心设计的结果。而AlphaGo的弱点,在于极端复杂局面时搜索能力依然不够,不能够弥补局面评估上偶尔出现的漏洞。这一强一弱是同一个设计逻辑所导致的后果,是一个硬币的两面。因此除了堆机器提高运算能力之外,要从程序上完全消除这个弱点是比较困难的。
下面开始详解。
1. AlphaGo的系统设计和运作模式。
从AlphaGo在Nature上发表的论文来看,它的设计并不特别复杂。按Google的一贯作风,论文往往是有所保留的。尽管如此,基本架构方面应该是没有太大出入。
第一步是在网络收集大量高手在网上围棋的对局。这之后训练一个Convolutional Neural Network,也就是卷积神经网络。这个网络的用途是根据当前盘面,预测下一步会下在哪里。要注意的是,这里完全不考虑棋局之前是怎么走的,只考虑当前的局面。这个网络叫Supervised Learning Policy Network ,我们可以管它叫模仿走子网络,因为它的目的是模仿网络高手。
第二步是用reinforcement learning让这个网络自己跟自己下棋,通过这种方式进一步学习,生成一个Reinforcement Learning Policy Network 。这个我们可以管它叫自学走子网络。
如果只用这样一个走子网络来下棋,会是什么情况呢?
Facebook AI Research中围棋项目的主管田渊栋是这样描述的:
不顾大小无谓争劫,会无谓脱先,不顾局部死活,对杀出错,等等。有点像高手不经认真思考的随手棋。因为走棋网络没有价值判断功能,只是凭“直觉”在下棋
所以我们必须引入对各种棋路变化的精确计算,这个就是我们说的树搜索。树搜索有两种方法,一种是精确的最小最大搜索(minimax),一种就是AlphaGo所采用的蒙特卡罗模拟。
要理解蒙特卡罗,还得从最小最大说起。最小最大的意思就是,我下一子后,你有N种下法。在这N种里面,有一手是最优的,也就是“最大”。我在下我自己这一手的时候,要让你最优的那一手最为不利,你最大的那一手最小化。这就是最小最大的含义。注意这里最优的定义。我们要让对手的最优选择变的最差,但是这不是说让次优选择变得超过最优选择,否则次优就变成最优了。那我们就要最小化原来次优的那一手棋了。
最小最大要考虑一个最值问题,这个计算起来是比较费时间的,无法搜索太多步。这时候我们无法继续搜索,只能对找到的局面做一个评估,看看它是优还是劣。一种评价方法就是从这个局面开始完全随机走棋,统计一下最后是赢还是输。如果赢多输少就是好局面,输多赢少就是差局面。这个就是蒙特卡罗模拟。
但是由于围棋的走法太多,搜索空间过大,完全依靠蒙特卡罗的计算是不够的。对盘面的估计,必须结合蒙特卡罗和神经网络。结合方法有两个。第一个是通过模仿走子网络预测那些走法是最可能的,在蒙特卡罗模拟里面优先考虑这些走法。第二个结合处是通过自学走子网络走出的几千万盘棋局,每局里抽出一个盘面,训练了一个Value Network,我们可以叫它棋盘价值网络。Value Network直接预测在这个盘面最后是赢还是输。最终的棋盘评估,是棋盘价值网络和蒙特卡罗模拟做简单相加的结果。
具体实现还有很多细节,我们这里略过不讲。有兴趣的读者可以直接参考Nature上的论文。上面这个理解,对下文已经足够。
2. AlphaGo的弱点在哪里
经过第四局李世石导致AlphaGo崩溃的神之一手,以及其他局面下的AlphaGo的错着,我们逐渐看到了AlphaGo的弱点。
神之一手,是李世石长考四十分钟下出的一手棋,也就是下图的第78手。
在这一手之前,白棋在中路是相当不利的。第78手挖是很少有人会去考虑的一手棋,因为它看起来是送给黑棋吃的一手。但是白棋的构思是威胁78左边这一个黑子,逼迫黑棋不得不花费上下两手棋提掉第78手白子,在这一过程中,白棋已经完成对左边红框中黑棋两子的包围。这两子一断,白棋满盘皆活。黑棋在中腹的布局崩溃。
在不利的情况下,以意想不到的一手弃子瞬间扭转大局。这就是古力九段将这一步棋称为神之一手的原因。
在第五局开局阶段,AlphaGo同样在右下角出现了一个类似的问题,没有预料到黑棋叫做“大头鬼”的手筋。那么什么叫做大头鬼呢?请看下面例图。
大头鬼的要义,在于黑棋在第5手,第7手,第11手反复填入白棋内部送吃,逼迫白棋走出12,14把自己的空给填死,而黑棋趁机从外面包围白棋,最后只要黑棋在角上再下一手,中间白棋就会全部被提掉。
AlphaGo在这些情况的失误,有以下三个发生的条件:
1. 在棋局的早期,棋盘上的可下之处还很多,离棋局结束也还很遥远。AlphaGo的计算能力不足以覆盖太多的可能性。
2. 对手的一手棋,在静态局面看来是相对不太可能的下法。比如主动送吃,就是一般意义上不寻常的下法。因此模仿走子网络往往把这一手棋列为不太可能,不会让蒙特卡罗集中在这一手棋的后续发展。有了1和2两个条件,蒙特卡罗模拟就不太好用了。
3. 在棋局的早期,还很难预测最后这一局棋是谁取胜。因此棋盘价值网络也不太好用了。
我们知道,棋盘判断是棋盘价值网络和蒙特卡罗模拟结果相加得出的。这两个东西都失效了,那么整个棋盘判断也就出问题了。这就是AlphaGo在这些局面下产生错招的根本原因。
棋盘价值网络失效,很可能还有另外一个原因,来源于它的训练集。我们下面来看。
3. AlphaGo为什么喜欢简化局面避免劫争
AlphaGo有一个我一开始没有看懂的设计。那就是训练了半天的自学走子网络,其实并没有太大的用处。最后只是用来制作棋局,训练棋盘价值网络。但是如果要制作优秀的训练数据,为什么不用一个蒙特卡罗模拟去帮助这个走子网络走的更好一点呢?
我们前面说过了,这个走子网络由于缺乏搜索的能力,往往出现“不顾大小无谓争劫,会无谓脱先,不顾局部死活,对杀出错”。那么这样网络走出来的棋,往往就会在出现劫争和复杂局面时失利。然后在这样的棋局里学习出来的棋盘价值网络,就会认为劫争和复杂局面会导致输棋,从而避免这样的局面。
现在看来,DeepMind团队这样的设计,并非失误,而是煞费苦心,有意为之。通过对AlphaGo上面弱点的分析可以看到,在复杂局面里,AlphaGo的计算能力其实是不太够用的。因此从一开始就要避免复杂局面。这才是这个自学走子网络的真实意义。
需要注意的是,虽然AlphaGo喜欢避免劫争,但是不代表它完全不能应付劫争。李世石在第三局最后硬是搞出了劫争,但是于棋盘上可走的位置已经很少,只需要蒙特卡罗搜索就可以轻松应付了。在棋局的早期做劫,则AlphaGo有充分的自由来避免劫争。因此这扬长避短的策略是行之有效,难以击破的。
4. 如何击败AlphaGo
由于这个棋盘价值网络的训练数据集来源于自学走子网络,可以说它本身的训练集就是存在一定问题的。这个问题就是自学走子网络没有树搜索的辅助,很少能够下出手筋,更不太可能下出类似神之一手的棋。因此棋盘价值网络的判断从根本上就会存在一定的偏差,对手筋的判断往往失误。这个棋盘价值网络的弱点,是精心设计的结果,因此也很难轻易的弥补。但是,由于蒙特卡罗模拟的存在,很多时候可以弥补这个价值网络的不足。
如果要攻击AlphaGo的弱点,就一定要攻击它对棋盘的价值判断,要让蒙特卡罗模拟和棋盘价值网络同时失效。这就是神之一手所做到的。
作为一个围棋的门外汉,我这里提几条可能不太现实的建议:
1. 在序盘阶段,要设计意想不到的手筋。此时蒙特卡罗模拟处于很弱的阶段,手筋可以战胜棋盘价值网络。AlphaGo是不懂定式的。这是因为AlphaGo的训练模式,让它很难和定式相融合。反转越大送吃越多的手筋,AlphaGo就越难预料。
2. 要尽可能的创造存在多个复杂局部的复杂局面。由于AlphaGo不存在集中注意力在局部的机制,随时都要通盘考虑问题,因此很可能无法分配足够的计算量到每一个局部。但是要小心,因为AlphaGo一定会千方百计阻止你这么做。
3. 一旦在早期占优,一定不能松懈,因为AlphaGo到后期的蒙特卡罗会变的很恐怖。一定要把早期的优势维持到终局。
5. 结论
通过对AlphaGo的架构和弱点的分析,我们可以看到,AlphaGo不是无懈可击的,更加不是什么围棋之神。它只是DeepMind团队精心设计,扬长避短的产物。棋盘价值网络的弱点,是这个设计的必然结果。弥补这个弱点有一个办法,就是堆积运算能力,用几万台几十万台电脑来提高蒙特卡罗的运算能力。但是这么做恐怕违背DeepMind的初衷。如果从软件上进行修改,就要做大手术,不是简单能够通过自我学习完成的。人类如果精心设计战术,是完全有可能战胜AlphaGo的。