阿尔法狗的前世今生

网络
围棋是什么?在计算机的眼里,她无非是一个桌面游戏。19*19的棋盘,黑白轮流走棋。一块棋没有气了,就得从棋盘上拿掉。最后无处可下了,谁占的地方大谁就赢。规则如此简单。

“阿尔法狗”为什么盯上围棋,而不是麻将?

阿尔法狗

传说尧作围棋以教丹朱,如此算来围棋就有4000多年历史了。2009年的LG杯决赛,就被善于造势的韩国人渲染为“四千年之战”。当时对局的是李世石和古力,颇有中韩围棋此消彼长的天王山之战的意思。如今李世石又站在了历史的关头,肩负着人类四千年的高傲和尊严,只是对面坐着的是谷歌的计算机棋手阿尔法狗(AlphaGo)。谷歌,古哥,莫非前定。

围棋是什么?在计算机的眼里,她无非是一个桌面游戏。19*19的棋盘,黑白轮流走棋。一块棋没有气了,就得从棋盘上拿掉。最后无处可下了,谁占的地方大谁就赢。规则如此简单。

但在人类的眼里,围棋早就超越了游戏的范畴。其中有历史,有礼仪,有美学,有人生哲理。本能寺变,淮上信至,十番棋,擂台赛,见证了多少历史;新布局,宇宙流,美学的大竹,石佛与妖刀,蕴含了多少风雅;入界宜缓,弃子争先,早成了无数人的人生信条。当计算机真的坐到自己对面时,人是五味杂陈的:我说这是人生,你却说这只是一场游戏。

在浩如烟海的人类智力游戏中,围棋不过是一粟而已,其在民间的影响力,未必能比得上麻将和扑克。相比中国寻常巷陌的麻将桌子和赌城成千上万的扑克台子,下围棋多少有点曲高和寡的意思。

那么为什么人工智能如此青睐围棋呢?为什么不是“AlphaMajo”挑战四川麻将高手,或者是“AlphaHoldem”挑战德州扑克冠军呢?其原因有三:

其一,围棋有简单的输赢规则 (explicit winning condition)。这一点非常重要,因为电脑需要对每一个决策的好坏做精确、量化的评估。把围棋下好可能需要十年,但初学者就能判断一盘下完的棋谁输谁赢。如果规则本身比较模糊,可以去想象电脑和人类比拼现代诗或者抽象派绘画,会出现什么样的结果。

其二,围棋是信息对称的,或者说是信息完整的 (perfect information)。面对棋盘,电脑和其人类对手看到的是完全一样的信息。象棋和国际象棋亦是如此。麻将、扑克和四国军棋则不同:每个玩家只能看到自己一方的信息,而必须通过对手的行为去推测他的底牌。这就不难解释,为什么久经沙场的麻将老手往往输给不按常理出牌的新手,以及为什么德州扑克里有层出不穷的骗术与心理战。信息的完整和对称,让电脑可以做绝对理性的决策:不管你为什么这么下,我只要下当前局面下最好的一手就行了。

其三,围棋广阔的搜索空间,带来的挑战和诱惑是电脑无法抗拒的。人类下象棋和国际象棋早已沦为电脑的手下败将,而围棋至少还能期待柯洁。

二,电脑学下围棋,到底有多难?

围棋究竟有多难呢?对人类棋手来说,这很难量化。聂卫平曾谦虚地表示“围棋境界高不可及,我也只能算是刚刚入门。” 职业棋手经常被问到与“围棋之神”的差距:有人说让两子,柯洁说让先,有人则认为围棋的发展接近尽头,众说不一。人类的视野总是被眼前的山挡住,等爬到山顶,才知道山外有山。

对计算机来说,这个问题就好回答得多。围棋究竟有多少种变化呢?如果对每一种变化我都能判断局面好坏,那我岂不就是每步都能走到最优的围棋之神了吗?早期的人工智能的设计者们的确是这样想的。

[[180185]]

 

设想我们玩一个Tic-Tac-Toe(圈叉棋,如上图。)的游戏:3*3的棋盘,玩家分别在空格中填入棋子,最先连成一行、一列、或一对角线者胜。如果考虑每个空格只有黑子、白子、无子三种状态,那么一共只有393 9 (3的9次方,即9个3相乘)=19,683种状态。就算考虑到落子的顺序,也不过是9! = 362,880种变化。评估不到一百万种变化的优劣,对当今的计算机来说,自然是小菜一碟。

但是这个办法用得围棋上,一下子就傻眼了,变化太多!

那么围棋的变化有多少呢?如果也考虑每个交叉点有黑子、白子、无子三个状态,那么一张围棋盘的状态是33613 361 种,除去实际不可能出现的状态,大约是1017010 170 。相比起来,国际象棋的状态数只有不到105010 50 ,这与围棋的复杂度相比较,完全可以忽略不计。如果考虑行棋的顺序,那么围棋有大概361!种变化,或者说是1076810 768 (实际上没有这么多,因为总有不能落子之处)。无论哪一个,都是天文数字,因为宇宙中可观测的原子的总数,也无非是108010 80 。

或许有人说,围棋之神也不一定每手都算到底吧,往后推算个三五十步差不多了。好,序盘的时候(按60手以内)推算50步大概有超过1012010 120 种变化。10步?102410 24 。就算只推5步也有超过2?10122 ? 10 12 种变化。就算评价一种变化只需一个纳秒(这当然是不可能的),那么下这一手也要40分钟。何况对计算机来说有更严肃的问题:不走到底我怎么知道谁好谁坏?

看起来太难了!那么棋盘小一点会不会简单一点呢?答案是肯定的。在13*13的棋盘上,变化的个数降低到了1030410 304 。9*9的棋盘上则只有1012010 120 。张栩自创的四路棋,变化数只有101310 13 ,而状态数更降低到了几千万个:仍然很多,但对计算机来说完全可以处理。

好了,现在我们知道围棋之神和宇宙之神大概是同一位。她既然能洞悉棋盘上所有的变化,大概也熟悉宇宙中所有的原子。AlphaGo真的能穷尽每一个变化吗?没关系,就算能也并不恐怖。我们明天就把棋盘扩大到21路,那就算全宇宙的原子都变成AlphaGo也不行了。

三,早期的计算机围棋靠人教套路

计算机当然不是围棋之神。你可以把他想象成一个天赋异禀的少年,想要挑战武林高手。他内功极强,动作极快,但不会招数(想想刚刚学会九阳神功的张君宝或者张无忌),他如何才能战胜招法娴熟的武林高手呢?

由于对天文数字般的围棋变化的恐惧,最早的计算机围棋,选择了模仿人类的方式。你会我不会,但你走哪、我就走哪总会吧。这也是被专业棋手戏称为“背棋谱”的方式。小飞挂角,应以小飞。你逼住,我就跳,你跳,我就跟着跳,被人走得多的总是好的。大量的围棋知识如定式(布局的套路)、手筋(局部战斗的妙招)等,就这样从棋谱中提炼出来,然后被程序员以规则的方式告诉电脑。然后,电脑在实战中按部就班跟着走。著名国产围棋软件“手谈”的早期版本,就是走的这个路子。

这样的算法的棋力当然与规则库的完备程度相关,但基本上是相当低下的。见一招流星飞堕,便会应以一招花开见佛,这充其量是林平之他爹的水平。这种背定式的算法,实战稍微变化一下,小飞挂变成大飞挂,跳着走变成飞着走,电脑就立刻感到面目全非,找不到北。

当然,程序员也有对策:他们在“死记硬背”之上,逐渐加入了许多模糊匹配的尝试。在实战中见到略有不同的场面下,也可以走出下一手。这可以看成一定程度上的举一反三。当然,在差之毫厘、谬以千里的中盘战斗里,这样的模糊匹配很难奏效。

“背棋谱”的算法,还有一个重大缺陷,就是这些规则绝大多数都限于窄小的局部,而对全局棋子的协同则毫无章法。早期的围棋程序,最怕“征子”,即是这个缺陷的典型体现。

既然背棋谱的下法缺陷如此明显,为什么还是计算机围棋的程序员们的第一感呢?从计算机的角度讲,背棋谱极大地缩小了选择的空间。挂角除了小飞、跳、夹、尖顶、靠出,大概也没有多少应法了吧。这样值得考虑的选择就变得很少,大大减轻了电脑的计算强度。

四,计算机围棋的另一做法是评估局势

那么有人会问,既然缩减选择范围不靠谱,咱们能缩减变化的深度吗?

这是一个相当有趣的想法。如果每一招棋都只管当下、不想后招,那么每下一步不就只需要考虑最多三百来个变化了吗?假设我们可以判断每招棋放在棋盘上之后局面的好坏,那么选最好的一步下不就行了吗?这的确很诱人!可是当一盘棋只下了寥寥几十步的时候,真的可以判断局面的好坏吗?伟大的围棋之神,真的可以计算每颗棋子的效用吗?

早期的计算机围棋,的确在此做了很多有趣的尝试。一些人在背棋谱,另一些人则在评估局势,评估局势的人甚至开始得更早。

这很好理解:往后推一步也不是终局,推十步也不是终局,那么只要我能精确评估局面的好坏,那么推多少步都能用得上。怎么做呢?分而治之吧!围棋不是谁围的地盘(目数)大谁赢吗?那假设棋盘上的每颗棋子都能折算成目,把它们加起来不就可以判断局势好坏了吗?从50年前(那时计算机的水平可以想象),就有人开始做这样的尝试。

具体的做法不一,但大致想法都差不多:离我方棋子越近的空点,越容易是我的,离对方棋子越近的点,越容易是对方的;活子,死子,和半死不活的子则分开考虑。据说第一个围棋程序诞生于1968年,其主要思想就是通过计算每一个棋子的“影响力”来评估局面,可惜其论文现在已经找不到。另一篇发表在1981年的文章笔者倒是读了,基本的做法还是计算“气”(与棋子相邻的空位)的多少,选择最大化己方的气,最小化对方的气的下法。(因为气的多少关系到棋子的死活,也就是生存能力)

在1990年代的“手谈”软件里,其作者曾经把每个活子的影响力设置为:“对其相邻位置为4,斜位(小尖)为3,单关和小飞位为2,稍远为1。” 在子效累加的基础上,设计者们又陆续加入了不少改进,以修正单子、相邻的棋子和成块的棋子的价值。

这样的做法棋力如何呢?似乎还是很糟糕。即便结合了一些人工智能的搜索算法,1990年代计算机围棋的冠军大概只是业余高手让14-16子的水平。如果说“背棋谱”算法是打完一套少林长拳,又重新打起;那这种静态局面评估法,有点像所谓的“乱劈风”刀法:没有后招,看哪好砍就砍哪,砍到哪算哪。值得一提的是,虽然棋力不逮,静态局面评估作为中后盘的快速形势分析手段,倒是深受围棋爱好者喜欢。笔者在新浪围棋下棋的时候,经常使用其提供的形势分析工具来点目(数自己的空有多少)。在职业棋手孟泰龄的网络自战解说中,我们惊讶地发现泰哥原来有时也会用这个工具。

整个二十世纪,计算机围棋都处于背棋谱和形势评估交相辉映的时代。设计者们加入了许多启发式算法以计算征子,识别打劫,模糊匹配,优化官子。可是计算机的棋力却如走进了漫漫黑夜,一直上不去。

这导致围棋高手们对计算机的水平有着根深蒂固的轻视:直到阿尔法狗与李世石决战之前,罗洗河还认为自己可以轻松让AlphaGo四子。的确,如果一个学了三十年棋的人,还只能和业余高手下让子棋,他的围棋生涯恐怕早就被判了死刑吧。

当然,在笔者看来,这种背棋谱和静态形势评估的计算机围棋,是远远称不上“人工智能”的。早期的设计者们播下了种子,这颗种子在黑夜里,在石头下慢慢生根发芽。它在等待掀开石头的一天,距这一天还有很多年。

五,搜索:从走迷宫去领悟下棋秘籍

计算机围棋的种子在石头下缓缓成长。让我们暂且按下不表,荡开一笔去看看真正的人工智能的研究者们在做些什么。他们绝大多数没有接触过围棋,他们从小的目标是打败国际象棋的人类棋王。

和东方人从小就接触大棋盘不同,西方人的童年是从圈叉棋到国际象棋的过程。我们已经说过,圈叉棋的变化不到百万,国象的变化看上去似乎也不多。因此西方的研究者一上来,心里想的就是穷举法。

穷举也得有顺序。从威尼斯出发,条条大路通罗马。威尼斯是开局,罗马是终局,我们把通向罗马的过程叫做搜索。搜索在人工智能的兵器谱上稳居第一位。1990年代以后由于互联网的兴起和人工智能的低谷,人们提到搜索的时候,首先想到的往往变成了Google和百度。我问问题,电脑告诉我答案。

别忘了,搜索的本义,是寻找罗马的过程而非罗马本身!

人类对搜索可不陌生。不就是走迷宫吗?在曼哈顿的每一个路口都有4个选择,不管选哪一个,到下一个路口又有另外4个选择在等你,直到你走出了迷宫或者穷尽了所有的选择。

从数学上讲,我们把迷宫的开始叫做“根”,每一个路口叫做“结点”,路口的每一个路叫做“分支”,每一个无路可走的状态叫做“叶”,那么走迷宫所有的变化就成了一棵“树”。搜索的过程,就是按照某个顺序遍历这棵树,直到找到出口的叶子或者找遍所有的叶子。

这多么像围棋!从空白的棋盘开始,每一步的选择都带来数十成百的分支,每一个终局都是一片叶子,而每一盘赢棋都是罗马。

找到迷宫的出口或者找到罗马可不难,只要在走过的路口做记号,一直靠左或者右走就行了(在计算机算法里,这叫做深度优先搜索,它可以保证无遗漏地遍历一棵树)。难的是,到了罗马还赶得上吃顿热的。这可就难了,因此我们必须要放弃一些分支,放弃寻找大多数叶子。在有限的时间和选择里,我们还能找到罗马吗?

无数人工智能的先驱,前仆后继地研究这个问题,其中包括著名的Dijkstra先生,他的算法能让人找到威尼斯到罗马的最短路径(当然,找到这条路径的代价并不比深度优先的搜索低)。

计算机比人类擅长走迷宫,它可以自由地在已经发现的路口间跳跃(类似于机器猫的传送门)。这使得它可以每个路口都试一下再决定下一步,即是所谓的广度优先搜索。搜索算法中名满江湖的A星算法(A* Search, 最佳优先搜索的一种),即是兼备了广度优先搜索和最短路径搜索之长。它在每一个路口派出探子,回报下一个路口有多远、是哪里。它再综合当前路径的长度和对下一个路口离终点的距离的估计,来决定下一步怎么走。行军数天到离长安几百里外的陇右,似乎当然不如花十天出子午谷直逼长安城下。

这样的算法大大降低了搜索最优路径的复杂度。但是,估计威尼斯到罗马的距离容易,估计中盘到赢棋的距离,还是很难啊!

等一等,我们似乎忘记了一件重要的事情。迷宫是一个人走,棋是两个人下的呀。不能预测对手的下法,怎么能找到自己最优的下法呢?在把搜索应用到棋类游戏的探索中,人工智能的先驱们发明了“极小化极大算法”(minmax algorithm)。听起来是不是很拗口?其实不难理解,在寻找下一步棋的时候,我们优先选择下在不管对方怎么应,我们都不会太坏的地方(而不是下在,如果对方应错了就占大便宜,应对了可能反而吃大亏的地方)。研究者们又设计了纷繁复杂的算法来进一步缩小搜索空间,以让计算机能在更有效的分支上搜索得更深,而不把时间花在一看就不行的废棋上。这其中一个相当重要的算法叫做Alpha-Beta剪枝。前文提到的1990年代的计算机围棋冠军即是用它来配合局面评估。Alpha-Beta, Alpha-Bet,Alpha-Go,前世今生,情何以堪!

有了这些搜索算法在手,计算机在圈叉棋上战胜(或者打平)小朋友们早就不在话下了。可当人工智能的研究者们把眼光投向国际象棋的时候,却发现它的搜索空间意外的大,似乎怎么剪枝也搜不到底。

当时的人们也没有一个好的方法能准确估计非叶结点局势的好坏(如果子力多就好,那摆象棋残局的骗子们就都下岗了)。搞计算机围棋的一看,你象棋都搜不到底,我围棋就更别想了。于是计算机围棋又在黑暗中度过了二十年,直到一个英雄的出现。

六,深蓝带来的启示

1996年2月10日,一个叫“深蓝”的电脑挑战国际象棋棋王卡斯帕罗夫。让所有人跌破眼镜,它居然赢了第一局,之后两和三负。深蓝是IBM设计。双方约定一年后再战。1997年5月,双方再下六局,“深蓝”一胜五和战胜棋王。这是人工智能载入史册的里程碑事件。

值得一提的是,输棋之后的卡斯帕罗夫认为深蓝表现出的智能和创造性不可思议,必有人类棋手在背后操刀。这次谷歌显然早有准备:高调的营销,让几乎所有的人类顶尖高手都现身讲棋,从而杜绝了“机箱里躲着柯洁”的猜测。

“深蓝”为什么赢?除了摩尔定律带来的计算力的显著提高,深蓝的算法似乎也没有什么稀奇。Minmax搜索, Alpha-Beta剪枝, 为什么一夜之间武功就变得如此厉害?

当深蓝揭开神秘面纱,人们发现,深蓝算法中的秘密其实不外乎两点:局势评估和往前看。老熟人了,不是吗?深蓝的局势评估考虑了棋子的重要性(皇后是9,小兵是1,车取其中),每个棋子的影响范围(又很耳熟?),王的安全系数,以及先手 (tempo)。这个评估并非静态的,而是要往前穷举数步棋中的所有变化,再对所有可能导致的局面进行估计(相传与卡斯帕罗夫下的时候,深蓝往前推了12步)。这有多难呢?粗略以每一步棋有100种下法而计(每个兵最多2-3种下法,每个马最多8种下法,每个车14种,去掉不能下的地方,以此类推),12步也就是102410 24 种变化。用上alpha-beta的剪枝和IBM强大的并行运算能力,完全可以处理!

深蓝的成功,让人类第一次正视人工智能的强大潜力。让我们看看深蓝带给计算机围棋的前所未有的启示与契机。一方面,深蓝的成功宣告国际象棋已经是被解决的问题,这让许多人工智能的研究者们把目光投向了下一个挑战:围棋。另一方面,计算机围棋的设计者们从深蓝身上惊讶地领悟到了两点:其一,并没有多少专业知识,貌似蛮力的穷举搜索竟能如此有效;其二,精确的局势评估如此重要,但静态的评估似乎并不足取。从现在开始,背棋谱不再是出路,而局势评估将以动态的搜索为基础!

2006年,一个叫做《疯狂的石头》的黑色幽默电影席卷中国。同年,一个同名(Crazy Stone)的计算机围棋程序悄悄地在计算机奥运会上夺得9*9围棋的冠军。翌年,它在计算机奥运会上蝉联9*9冠军并夺得19*19比赛的亚军。再下一年,疯石在对真正的职业棋手(青叶熏四段)的授八子局中获胜,同年年底又赢了授七子局。5年后(2013年),疯石在对石田芳夫九段的授四子棋中取胜。第二年,同样授四子,疯石取胜棋力更强的依田纪基,其在围棋界的影响力达到顶峰。

无独有偶,2010年之后网上出现了一个叫Zen(禅)的计算机棋手,在KGS(一个著名的围棋服务器)上慢慢升到5段。笔者当时经常在KGS下棋,也曾和Zen互有胜负。可是不久就只能眼睁睁看着它的棋力超过自己,扬长而去。2012年,Zen也在授四子局中击败了专业九段:深受大家喜爱的武宫正树。

从此计算机围棋进入了一个新的时代,一个不断带给大家惊喜的时代。可我们不禁想问两件事:第一,“疯石”的出现离“深蓝”也有十年过去了,这十年计算机都在做些什么?第二,为什么这一切总是和“石头”有关?

七,一株奇异的树——蒙特卡洛树

从“疯石”开始,这个时代可以被称为“蒙特卡洛时代”。当代的计算机棋手,不约而同地采用了一种叫做“蒙特卡洛树”的搜索算法(Monte-Carlo Tree Search),直到AlphaGo也不例外。它是什么独门绝学?

深蓝带来的启示之一,是寻找精确的形势评估函数,而这个函数必须是动态的,必须要考虑到数步乃至数十步之后的局面。

这思路并非没人想过。可是相比国际象棋,它有唯一的取胜目标——杀老王,围棋的局势判断或许更为主观。什么是势?什么是厚?什么是薄?势与地如何换算?大局观究竟是什么?这些大概是围棋永恒的问题。就连顶尖棋手也常常判断不清。看顶尖高手的比赛最有趣,总是韩国解说觉得韩国人好,中国解说觉得中国人好。一边说是弃子,一边说是被吃…… 计算机可不喜欢横看成岭侧成峰,它需要做理性和客观的决断。

那么围棋中有什么是绝对客观的呢?我们之前说过,只有终局的胜负。可那些代表终局的叶子在围棋的搜索树上似乎遥不可及。那么,能否不穷举所有的叶子,也能判断一个枝头的局势呢?这个想法让人精神一振。如果一棵枝头有10片叶子,8片是赢,两片是输,我们一定要找到输赢最大的一片才能判断这个枝头的好坏吗?如果这棵枝头有100片叶子,我们难道一定要看遍所有的叶子才能判断优劣吗?

喜爱统计的朋友们已经乐出了声:要想知道添加剂是否超标,当然不需要打开所有的罐头。抽样就行了嘛!假设对每手棋我们都能抽样调查它所导致的终局,大概不需要理解地、势、厚、薄也可以做形势判断了吧?

如何抽样?随机既简单又靠谱。一步新着法好坏不明时,职业棋手往往提倡实战解决。计算机也一样,只是并非找两个高手下一盘,而是找两个不懂棋的小朋友下一千盘罢了。随机下一千盘棋,对电脑来说花费几何?以毫秒计吧!

这不就好办了吗!从现在起,每一个局面我都可以客观地估计好坏了,同时我并不需要遍历整个搜索树(所以请不要再叫我穷举法!)。真是这样简单吗?我可不信。难道从第一手右上星位开始,随机模拟一千盘棋,发现白胜501盘,就说明黑1是败招吗?很可惜,随机抽样得到的结果是一个统计上的期望,而并非实际上的“最优”。它需要遵从统计之神的规律。第一手黑1对应的局面有多少呢?天文数字。胜负是怎样分布的呢?不知道。那么一千盘,一万盘棋,对于这样的统计分析来讲,只是个微不足道的样本,很难得出有实际意义的结论。

没关系,样本不够可以多下,反正是随机棋不费电。具体下多少盘呢?当然越多越好,但咱们不妨算到读秒的时限为止。像这样在确定时间内完成的随机算法,就叫做蒙特卡洛。说起来,这个名词来自摩纳哥著名的赌场胜地蒙特卡洛,因为这样的算法往往被用来计算赌博胜率的问题。既然有蒙特卡洛,那有没有拉斯维加斯呢?当然有,我们暂且不表。“国际象棋之神”深蓝用过的搜索算法,现在一样能用:只要把局面评估换成蒙特卡洛就行了(用模拟对局的最终胜率而不是评分值,来评价当前局面的好坏)。这就是所谓的“蒙特卡洛树搜索”。

这法子听起来相当靠谱。那为什么直到10年之后,蒙特卡洛才开始在江湖流传呢?

这是因为蒙特卡洛也有明显的缺陷。由于其随机性,蒙特卡洛不能保证答案的正确,而只能保证在一定的概率下不犯错。这个概率边界由什么决定呢?当然和随机模拟的次数有关。

这就又回到了当初的难题:因为围棋之树实在太大,每个结点模拟次数多,时间不够用;少,答案又不精确。这个矛盾耽误了蒙特卡洛围棋整整十年。

八,“多臂老虎机”的闪亮登场

“疯石”提供了解决矛盾的一个好思路。说起来并不难:看上去不错的分支,咱们就多模拟几盘,让它的评估更精确。看上去不怎么样的,咱们就少下几盘。实在不怎么靠谱的,这个分支咱们根本就不看。这样虽然搜索空间巨大,实际搜索的树则变得很小。

可是有人会问,这会不会导致疯石在“一棵树上吊死”呢?它如果守着一个看上去不错的分支,一根筋地往下找呢?

这个问题的确存在,而且它在人工智能领域相当有名,被称为“探索与利用的矛盾” (exploration vs. exploitation)。用地质学家(或者星际争霸玩家)的话来说更有意思,大概是勘探和开发的平衡吧:过多地开发当前的油田,减少了勘探到更富的油田的机会,而过多的勘探则让开发的效率变低。

这很让人困扰。不过,这个问题有一个优美的解决方案。

既然身在蒙特卡洛,我们还是用赌场的方式解决赌场的事情吧!玩老虎机的赌客们往往有这样的苦恼:老虎机有的吐币容易、有的难。现在我玩的这个还算不错。可一直玩下去吧,又总觉得隔壁的没准会更出币;换到隔壁去吧,又怕我一走,这儿就出个大的。

机器学习里,有一个算法叫做“多臂老虎机”(multi-armed bandit),解决的就是这个问题。它用一个叫做UCB的策略,精确地计算哪个老虎机应该多试,哪个应该少试,并告诉赌客下一把应该去试哪一个。当这个策略应用在蒙特卡洛树上时,就成了“疯石”赖以成名的UCT算法(UCB applied to trees)。与局部焦点相关的分支多试,较远的地方则少试,但并非不试。UCT推荐的分支,我们就优先往下搜索,用蒙特卡洛模拟更多的棋局。

蒙特卡洛和多臂老虎机,这两大赌神,给电脑围棋带来一片欣欣向荣。电脑“疯石”和“禅”交相辉映,近十年里不断刷新着人们的期望,他们分先战胜专业棋手似乎指日可待。

可是行百里者半九十,差的就是这临门一脚。到了最近两年,我们发现,它们的进步速度又变缓了,就连Zen的段位也升不上去了。

大家终于知道它们又遇到了瓶颈。这也难怪,即便是蒙特卡洛,也需要走到底;即便是多臂老虎机,也需要试很多枝。计算能力仍然是瓶颈,除非能更加有效地减小搜索的宽度与深度。

可是,连赌神都搬出来了,人工智能的高手们似乎已无计可施。

可是人们忘记了,在数十年的漫漫黑夜里,有颗种子一直在生长。这一天终于到了,它将顶开石头,破茧而出。

“韦小宝,我一定会回来的。下次我再出现的时候,你一定不会认得我是谁。”

九,人类棋手的两大独门秘笈

漫漫黑夜终于过去了,我们不经意间就等到了AlphaGo。它的横空出世如此让人惊讶,以致于最初报道AlphaGo登上《Nature》的消息,在朋友圈里被不少人疑为谣言。

在我们盼望着“疯石”和“禅”能逐步逼近职业棋手棋力的时候,“阿尔发狗”一出手就咬晕了欧洲冠军,还把战书下到了另一个疯狂的石头李世石面前。它究竟有何秘密?

“疯石”和“禅”遇到的瓶颈,我们不妨换一个思路来想。我们算是知道了电脑怎样挑战人,可人凭什么可以和电脑对抗呢?再强的专业棋手,显然也没办法每秒钟算出几千种变化,他们也不会蒙特卡洛或者Alpha-Beta剪枝,那他们凭借什么能在围棋迷宫里游刃有余呢?计算能力显然是比不过的,但一定有什么是人类比计算机强的。

其实,在搜索围棋之树的过程里,人类棋手的确有独门秘笈。

人类的第一种魔法,是能够显著地降低搜索空间,在复杂开放的局面下不可思议地找到寥寥几种可行的下法。这就是所谓的棋感,对于顶尖高手而言,甚至是“第一感”。假如计算机也学会这种能力,那岂不是可以把可贵的计算资源集中在探索这少数几个分支上吗?

人类的第二种魔法在于其强大的形势判断能力,不用精确推算也能判断全盘局面的优劣。这就是所谓的“大局观”。假如计算机也具有这种能力,那岂不是不需要搜索很深也能正确地评估局势了吗?棋感和大局观难道是人类与生俱来的魔法吗?当然不是。它们其实是千百年来人类棋手智慧的结晶;它们的根基是被一张张棋谱和一代代棋手流传下来的围棋知识与经验。

这个想法非常让人兴奋:良好的棋感和大局观,一个能减小搜索宽度,一个能减小搜索深度,这不正是蒙特卡洛梦寐以求的吗!棋感和大局观从哪里来呢?小时候教我学棋的老师就一句话:多打高手的谱。想到这里,人工智能的研究者们释然了:原来答案还在棋谱啊。我们收集了数以十万计的人类棋谱,却没有好好利用它们,“惟能消敌内力,不能引而为我用,犹日取千金而复弃之于地,暴殄珍物,殊可哂也”。

历史总是像车轮一样滚动前进的。众里寻他千百度,原来那人早在灯火阑珊处。是时候把沉睡了几十年的“背棋谱”和“乱劈风”请回来了。只是这时候他们早已破茧成蝶,练就了武林秘笈,以全新的面目出现在我们面前。

这本秘笈叫做“深度学习”。

十,深度学习带来的临门一脚

“深度学习”是什么?“卷积神经网络”又是什么?听上去好科幻的名词,可我们不需要太深究。

你只要知道,深度学习是机器学习的一种,它是一台精密的流水线,整头猪从这边赶进去,香肠从那边出来就可以了。猪是棋盘,香肠是一手棋,深度学习,可以用来预测当前局面可能的下一手。猪是棋盘,香肠有好有坏,那么深度学习也可以用来判断当前局面的优劣。

那么这个流水线是如何搭建的呢?它可不是拍脑袋设计的,而是看过了数以百万的猪和它们做出的香肠之后,计算出来的。猪我们可有的是。人类高手的棋谱大概走了三千万步(三千万头猪),而电脑还可以自己养猪(自己模拟对局)。

那么这位问了,为什么是深度学习而不是其他的什么学习呢?它和背棋谱究竟有什么区别呢?

传统的机器学习,需要先把猪按一定规则分解成各种“特征”(颜色,重量,后腿有块疤,等等),香肠的做法则由这些特征共同决定。当只有少数几个死规则的时候,就和背棋谱区别不大了(看到后腿有疤的猪,请下小飞)。

可是“道可道,非常道”,棋感这样只可意会的东西,硬要把它写成规则和特征,既不达意也没必要。你总不能逼着古力告诉你,他想到那招“峭壁凿火”的妙手,是因为左边有个弯三,右边有个曲四吧!

深度学习则省略了这个步骤,整猪进,让机器自动去寻找这些特征和他们的组合。还记得手谈的形势估计办法“相邻加4、小尖加3”吗?深度学习找到的,可不是这样简单的加加减减(线性组合)。在理论上,它可以模拟任何的非线性函数。

好,到现在我们大概明白AlphaGo的秘诀了。它的主体仍然是蒙特卡洛树,但它巧妙地用了两个深度学习模型,一个预测下一手,一个判断形势。预测的结果,降低了搜索宽度;而形势判断,则减小了搜索深度。深度学习从人类的经验中学来了棋感与大局观,它们使蒙特卡洛如虎添翼,一扇翅膀就飞到了李世石的面前。纵横江湖15年的李石头,在另一位“古哥”的面前低下了高傲的头。

写到这里,“阿尔发狗”的前世今生就介绍得差不多了。我们要看到,这并不简单的是人工智能的胜利。

AlphaGo的成功,极大部分应该归功于谷歌的工程师们。他们有效地把复杂的算法并行化,娴熟地在CPU和GPU间转换,游刃有余地用“云计算”解决着计算力的瓶颈。

我们也要看到,除了谷歌和AlphaGo,还有很多设计者、工程师,和计算机棋手在同时努力着。“疯石”,“禅”,以及华人科学家主导的Facebook的“黑暗森林”,都在一起前行。

这是一场人类经验和电脑算法共同的狂欢,而归根结底,这是一场属于围棋的盛宴。

十一,成也蒙特卡洛,败也蒙特卡洛

写就此文的时候,AlphaGo正和李世石下着第五盘棋。前三盘几乎完胜的AlphaGo,令人惊讶地几乎短路般地输掉了第四盘。一时间众说纷纭,谣言四起。当我们了解了AlphaGo的前世今生之后,或许能对一些问题有更好的理解。知道了它的武功秘笈,人类棋手也更能针锋相对。

以下是一些我的思考,一家之言,贻笑方家。由于AlphaGo一直在暗处,Google的论文也信息有限,不少观点是笔者自己的推测。相信随着AlphaGo与更多棋手交战,它会越来越透明,而它面对的挑战也会越来越难。

AlphaGo会犯错吗?当然会。不仅序盘会,中盘会,官子也会。

因为蒙特卡洛会犯错。蒙特卡洛只能保证在一定概率下得到正确的结果,而模拟的次数越多,犯错的可能越小。

计算力永远是瓶颈,如果让电脑得以把计算资源集中在狭小的搜索空间,那么它在这里犯错的可能极小。想想第一盘的上边和第三盘的左边,局部虽然复杂,但搜索的空间却很小。狭小空间里的直线计算,人恐怕很难讨好(参见AlphaGo在第一盘右边的妙手一点)。因为算法使然,计算机围棋永远希望缩小搜索空间,因此AlphaGo不爱保留后续变化、多俗手、总是简化局面的特点,就不难理解了吧。

那人应该怎么办呢?说来简单:反其道而行之。

尽量扩大搜索空间,迫使电脑搜索更多的分支,而且每个分支也搜索得更深。当有限的计算资源不得不分配到大量的局部时,出错的可能就变大了。

当AlphaGo想断其一指的时候,我们偏偏让它十指均匀用力。

李世石第四盘第78着“挖”的一手,恰恰就是AlphaGo漏算的一手。深度学习和多臂老虎机可能并没有推荐它,也可能推荐排名靠后,导致没有深入计算;它也可能被剪掉了,不得而知。可是不管怎么样,那一手之前的局势,牵一发而动全身,全局可能的落点很多;那手棋又牵扯到潜在的劫和引征,让形势判断变得复杂,导致了搜索深度的显著增加。真是成也蒙特卡洛,败也蒙特卡洛呀!

十二,打狗棒法就是打劫!

说得容易,但那一手挖分明是可遇不可求的一步,难道还能复制吗?

其实也有更加易行的办法,那就是这几天被讨论得底朝天的“打劫”(围棋术语,即在一个关键处双方来回提子)。具体情况围棋高手和同行专家都已分析得很透彻了,简而言之,打劫能同时增加搜索的宽度和深度。

因为劫材可能散布全盘各地,多数甚至和劫的本身无关,这使得深度学习也无法准确预测如何找劫,迫使计算机做全局的搜索。

劫与劫材的不确定性,又导致局面好坏很难判断,让AlphaGo无法有效地减小搜索深度。

这里有两个有趣的地方:其一是AlphaGo不可能不会打劫,因为同样使用蒙特卡洛的“疯石”和“禅”都会,只是它打劫的能力未必比别的计算机棋手强。正因为如此,我们可以看到几盘棋AlphaGo都有明显规避打劫的倾向。试想如果柯洁对上一个棋力为不打劫13段、打劫业余5段的对手,恐怕也有办法对付吧。

其二是打劫可以引而不发,打而不消,最好在不同的地方多造几个劫来打。你问为什么?消劫太快不就又降低搜索难度了吗?

那么AlphaGo在漏算之后,为何表现得如同“失魂落魄”呢?这当然很有可能是谷歌的算法在处理“漏算”的时候出现了瑕疵。但即便不是这样,通过算法也不难解释。

我们知道,就算深度学习可以帮助电脑评估局面,但每一个变化都评估,再好的计算能力也吃不消。就算是工作简单得多的“国际象棋之神”深蓝,也是每向深处考虑多步才评估一次局面的。如哈萨比斯自己说,到79手的时候AlphaGo还认为自己的胜率很高,又走10手之后才发现形势已非。那时已无后悔药可吃,手忙脚乱也不难理解了。

至于AlphaGo为什么无厘头地在右边二路立下呢?我的理解是这样的。还记得前文提到的minmax算法吗?计算机会优先选择不管对方怎么应,我都不会太差的招。那一手立,不管对方如何应,恐怕都不会让当前的形势变得更差吧!这样的策略应该也可以解释,为什么AlphaGo总有局面领先了就等等你的感觉。这倒是为人类棋手提供了一个思路:因为minmax算法,AlphaGo不太会走冒险和过分的棋,那么它在逆境下如何翻盘真是一个有趣的问题。至于左下那个亏到姥姥家的“挖”,笔者就真的不懂了。

十三,狗不是围棋之神,人工智能还很青涩

AlphaGo在自己左右互搏中练棋,真的能武功大进吗?这又是一个有趣的问题。

我觉得,自我对弈会有效果,但不可能不断提高棋力。

在《自然》那篇论文里可以看到,自我对弈主要是为了解决从人类棋谱中深度学习带来的过拟合的问题。从机器学习的角度看,它并不能不断提升武功。南大的周志华教授把自我对弈比作武当的梯云纵,非常妙!在空中左脚踩右脚,真能不断往上飞吗?没有外物借力,这显然是不符合物理规律的。物理没有永动机,人工智能也没有。

两个AlphaGo同钻一个牛角尖,对的更对,错的更错。

比起把有限的计算资源用来自我对弈,我更担心谷歌把它用在创造拉斯维加斯搜索树上,那可是一个真正不犯错误的家伙。

那AlphaGo究竟有没有可能,不借助与人类的对局来提升棋力呢?当然有,但那需要两个棋力极高,而且武功路数迥然不同的AlphaGo。

下过棋的人都知道,和高手下受益无穷,和低手下也许偶有收获,而和自己下嘛,只能叫做摆棋吧。我们很期待看见AlphaGo和黑暗森林的十番棋或是史无前例的百番棋。

AlphaGo带给人们无穷的兴奋,也带来了前所未有的浮躁与恐慌:

  • 人工智能会抢走我的工作吗?
  • 机器会统治人吗?
  • 人类是否自掘坟墓呢?

其实,人工智能远远没有到值得恐慌的地步。

它会抢走我们的工作吗?蒸汽机到来的时候人们恐慌过,PC到来的时候人们也恐慌过。但它们并没有“抢走”人类的工作,而只是把我们从不擅长的工作中解放出来,提高了效率,去做更擅长、更重要的事情。

想想会聊天的微软小冰,扫地的机器人,和无人驾驶的汽车。它们是我们的朋友而不是掘墓人。

它无所不能了吗?不是的,人工智能还很年轻,还有很长的路要走。君不见从深蓝到AlphaGo整整20年,时间长得让人们几乎忘记了它。

它会统治人类吗?在我能预见的将来,应该不会。要这么做,它首先得拥有创造力,可是作为一个人工智能的拥趸,我能看到的,还是漫漫长夜。

钥匙永远掌握在人类的手里。即使人工智能有了统治人类的能力,那一天来临的时候,我们至少还可以切断电源,不是吗:)

责任编辑:武晓燕 来源: 程序员之家
相关推荐

2011-08-23 09:52:31

CSS

2015-11-18 14:14:11

OPNFVNFV

2014-07-30 10:55:27

2016-12-29 18:21:01

2014-07-21 12:57:25

诺基亚微软裁员

2019-06-04 09:00:07

Jenkins X开源开发人员

2014-07-15 10:31:07

asyncawait

2012-05-18 16:54:21

FedoraFedora 17

2021-06-17 07:08:19

Tapablewebpack JavaScript

2013-05-23 16:23:42

Windows Azu微软公有云

2016-11-08 19:19:06

2016-11-03 13:33:31

2011-05-13 09:43:27

产品经理PM

2021-04-15 07:01:28

区块链分布式DLT

2015-06-11 11:10:09

对象存储云存储

2013-11-14 16:03:23

Android设计Android Des

2022-11-07 14:23:35

RPA人工智能流程自动化管理

2019-08-05 10:08:25

软件操作系统程序员

2019-04-28 09:34:06

2012-08-28 11:13:11

交换机
点赞
收藏

51CTO技术栈公众号