阿尔法围棋的工作原理

http://video.dushuren123.com/lecture-11849992.mp4

袁行远
查看全部 内容介绍:
收起 内容介绍:
阿尔法围棋主要使用的是人工智能的三个比较重要的领域,即神经网络、强化学习和蒙特卡洛搜索树

 

 

阿尔法围棋主要使用的是人工智能的三个比较重要的领域,即神经网络、强化学习和蒙特卡洛搜索树。

 

 

 

大家好,我叫袁行远,是彩云天气的CEO。我们是一家专注人工智能的公司。我们的一个产品是利用人工来进行分钟级的天气预报。

 

最近阿尔法围棋非常的火,大家看见我们四千年的一个古老的中国传统的游戏,然后被谷歌的一个公司击败了。然后阿尔法围棋可以在五番棋当中击败李世石。这个阿尔法围棋程序的作者,第一作者叫做黄士杰。他是一个台湾人。之前他也从2003年的硕士论文,写围棋当中打劫的内容,到现在可能十多年,一直在做这方面的工作。

 

而我们彩云天气,也是基于人工智能的技术。所以我对此就非常的感兴趣。我写的科普的文章,目前在知乎关于原理讲解上面排在最高票,所以我就试图跟大家讲述一下阿尔法围棋的原理。

 

大家都知道中国的围棋已经有四千年的历史,它是琴棋书画四种技艺当中的一种。我们通常把它视为艺术,而且现在还有上千万的玩家在玩。我们也有很多古典的小说和各种各样的故事。但是在最近的五番棋的比赛中,阿尔法围棋竟然能够战胜世界冠军李世石九段,证明计算机围棋现在已经发展到一个相当高的高度。

 

而人工智能也取得了一个重大的突破。那么阿尔法围棋究竟是怎么工作的呢?那就让我们来一探究竟吧!阿尔法围棋的作者是在谷歌工作的一个团队,他们叫做DeepMind。DeepMind的那篇文章的共同作者之一叫黄士杰,他从2003年硕士毕业之后,就开始做这种研究。他的硕士论文就是关于计算机围棋如何打劫的一篇文章。

 

但是近些年来,从2012年以后,深度学习的神经网络为主的这种算法给了我们很大的启发。它在各种各样的领域都用得非常得多。比如说人脸识别,识别两幅图像。这幅图像是里边有猫,那幅图像里边有狗,做这样的分类。

 

所以说黄士杰,他在想这个问题的时候,他就说要不我们就来尝试一下这种深度学习的方法。因为现在比较流行,而且效果也都很好。也有模拟人的思维的形式。那么把围棋的棋盘,是一个19×19的棋盘,大家可以看见每一颗落子的概率是361分之一。

 

那么这个落子的地方,除了这个子之外,它还有这个落子是黑子还是白子,这个子是什么时候落的,然后它有没有气这一些因素再加在一起。所以我们是19×19再乘以N。然后把这个19×19×N视作一个向量,那么这个向量就是我们可以计为S。就是表征一个状态。

 

这是棋盘的一个状态,可以用一个19×19×N的向量去表示。然后根据这个状态,大家可以看作有没有点像一幅图像呢?你也可以把它看作一张照片。给定计算机一个照片,我们让它给我选择一个最佳的落子方案。比如说我们的落子方案在这里,而这个落子的方案也是。

 

如果不看棋盘上没有办法落子的那些地方,那也是19×19的可能性。所以我们的目标就是从这张类似于照片的一张棋盘上面,然后把它输入进去。然后让计算机通过一个深度神经网络给我返回一个结果。

 

那么我能够在19路×19路的棋盘当中的某一个点落子。这是我输出一个19×19维的向量,这作为我们如果要尝试去做,这个围棋的一个第一步的方向。但是我们怎么样构建这个神经网络呢?如果是让围棋,就是对围棋一点数据都没有,我们是很难进行的。

 

所以黄士杰就想到,我们何不利用现在特别流行的网上对战这种平台。有很多人都会去网上下棋。比如说我们中国国内就有QQ对战平台,原来的联众。所以它在国外有一个叫KGS的,也是一个对战平台。在那个KGS上面,它下载了人类选手对局的几百万盘棋。这些资料都可以公开地下载。

 

那拿到了人类选手的这些棋,就可以来做这个训练,让它去模拟人的输入一个,就像我们识别它是某一种动物,然后或者是某个人是什么人一样。我给它一张图像,这时这个图像是棋盘,它告诉我落子落在什么地方。

 

人,如果你是一个人,你是一个比如QQ游戏大厅的玩家,你会落在什么地方?这是神经网络比较流行的一个方法。然后很容易就能够得到一个函数。我们把它叫做  P_human。这个  P_human的输入,就是刚才那个集聚状态。它的输出是一个A,它的这个A也是19×19的,就是模拟人类落子的概率。

 

那么这个成功率有多少呢?他后来试了一下,在这些棋局当中,它大概能够做到54%的准确。就是我给定一个棋局,然后它模拟出来的这个走子的方案。有54%和人类选手是一样的。

 

这个方法有了以后,我们就可以设计一个程序,那么就可以开始和真正的人类选手对弈了。当你走下一个子,通过这个程序得到一个落子的方案,通过这样的方式的棋力怎么样呢?其实这个棋力不是特别强,它能够到达业余大概在KGS上,大概在业余六段的水平。

 

这是一个什么水平呢?其实可以想见。其实KGS上面的那些玩家,是九段棋手的也非常得少。就是大部分都是我们这样的普通人。那他们的平均水平,大概也就在两三段那样子。所以它还是能比平均水平好。

 

但是和目前最强的人工智能程序,比如说之前最强的人工智能程序,比如说zenpatch这些程序相比,神经网络这套方法,其实并不能够比之前的传统方法做得更好。

 

那么黄士杰他们很自然地就想到,既然我现在用这样的方法还达不到传统方法的好,没有传统方法棋力强,那我就学习一下吧。于是他们就想,我们去看一看传统方法是怎么落子的,传统方法用的一个叫做蒙特卡洛搜索树的方法,简称叫MCTS。

 

这个方法是干什么呢?其实它非常得大智若愚。我们还是假设有一个棋盘,我们回到刚才那个棋盘吧。刚才那个棋盘,它是19×19路的,那我是一个人工智能的程序。我现在不会下围棋,那么我要走一个子,那怎么走子呢?我就随便走一个子,我随机落一个地儿。我现在在大脑当中,假设对手也在走子,那对手也走了一个。我假设他也不会下围棋,OK,那他也是抛硬币,掷了个骰子,然后随便走了一步。

 

之后我们两个人,就在大脑当中大家都抛硬币。然后这个棋盘就全部都走满。最后走完之后呢,总会得到一个结果。比如说这个棋局我赢了。虽然是两个,可以想象两个2B青年,然后他们一直抛硬币掷骰子下棋。

 

然后下完了以后,但是这个最后还能得到一个结果,比如说如果他赢了的话,我就给这个棋局的这个位置加一分。我觉得这个位置好像还不错,刚才我随便走也能赢。然后第二次他又开始,我再抛一次硬币。

 

在第二次抛硬币的时候,我刚才不是一无所知嘛,所有的地方概率都一样的。那这个时候我对这个地方的概率,就增加一点,这个地方概率就可能是2,其他地方概率是1。那我对这个棋盘的了解,就不是完全一无所知。但是知道得很少。

 

我又抛了个硬币,假设我又抛到了这个地方,那如果这个地儿,我们按照对手也是调整了策略以后继续走子,那么走出来结果之后,这个棋局如果它一直都能赢的话,那这个位置必然是一个好位置,它就能够浮现出来。

 

如果某一个位置它的效果不好,那它的胜率就会降低。所以这个看似特别傻的方法,最后它可以涌现出一种方案。你可以想象是最开始是一个平坦的,就像一个平面,然后随着你自己模拟的次数多,那它这个好的走子的方案,就会不断地涌现出来。就是你可以看作是一座山峰。

 

得到用蒙特卡洛搜索树的这样的一种程序,它模拟了之后,就是全部模拟完毕以后,那他们最后模拟出了一个最好的方案。就是比如说它自己跟自己对弈10万盘棋,最后就会得到一个棋局的概率。就是我觉得哪个更好。

 

模拟完毕之后,这时候它再在棋盘上走出它的一步,走出这一步的时候,它其实已经在大脑当中自我对弈了很多很多盘。这种方法有两个特别重要的地方值得注意。第一个地方是,它并没有像以前的象棋软件一样给你规定一个车值5分,一个兵值1分。

 

然后这样的一种人工设计一个盘面的这种规矩。而是通过围棋自己的规则,然后涌现出来。就是涌现出来一个方法。你可以想象在自然界当中,你可以把这每一种走子的策略,每一个棋盘的位置想象成自然界当中的某一种生物。然后围棋的这个规则,就是大自然的弱肉强食的规律。

 

你在走子的这个过程当中,这些走法它在不断地相互竞争,在相互竞争的结果就是它能够弱肉强食,能够适应变化的这种走法。它就能够不断地,就是越来越多地涌现出来。这个方法越好,我越会投入计算力去模拟它。这是第一个特点。就是它没有人工设计。

 

第二个非常非常重要的特点,就是它在走子的时候,是无缝计算的。就是它在对方走子,对方行棋的时候,自己也可以计算。因为掷骰子的这个过程,它是在对这个局面进行评估。在这个局面进行评估的时候,即使对方走了某一步,我其实只要看着这个,就是我很有可能之,就已经想到了你可能走这一步。

 

所以我之前的这种思考还是有用的。这和人类选手的思考方式非常得接近。之前一直以为计算机是你走一步,计算机开始想。其实现在不是了。就是不管你走不走,计算机都一直在想。它是一个连续思考的过程。只是你走了以后,它这个分支就被减少了,其他分支不看了。只看刚才你走的这个分支。

 

所以这是一种非常大智若愚的方法。那么很自然的,这是黄士杰的老师,在2006年的时候发表的文章讲到的这个方法。很自然地就想到我能不能继承和发扬这种方法呢?怎么发扬呢?他也很自然地想到,我们刚才不是得到了一个  P_human嘛!

 

这个是给定一个棋局,我可以输出人类,可能会落子落在哪里的一个概率,一个概率分布。我就可以不用最开始随机掷骰子这种方法,我用人类的这种掷骰子的,人类的这种落子的这种概率来掷这个骰子,就是我替换掉了。原来的这种随机地搜索,我变成了一个非常有针对性的搜索。

 

那么这种方法和蒙特卡洛合体,岂不是就会做得非常得完美。但是理想是丰满的,但现实是骨感的。这种方法是不能成立的。原因是因为计算这个  P_human模拟人类落子的时候,速度太慢了。因为它需要0.3毫秒,你需要模拟10万盘对局的话,时间上无法接受。

 

所以无奈之下,只好再做一点优化。于是黄士杰写了一个叫  P_humanFast的程序,就是我们把这个过程加快。我们刚才不是19×19围的向量,然后有一个神经网络。

 

那个神经网络,它里面有12层的内容能够模拟人类的这种走子,准确度大概55%那么我用  P_humanFast我做一个简单的神经网络,我用1层来做,我的准确度大概是20%。这个20%的准确度,虽然非常低,但是这个  P_humanFast,可以运算得非常快。

 

于是这个程序就变成了,我先用  P_human去搜索就是我从最开始的状态,我往下去搜索,然后搜索到某一步的时候,我下面就开始使用  P_humanFast。那就解决了时间算得太慢的问题。

 

终于这样做了以后,黄士杰的程序击败了世界上所有的电脑围棋程序。算是一个不小的成功。但是还是没有办法和职业选手相比。那怎么样和职业选手相比呢?同年也是去年一月份的时候,《Nature》上面发表了一篇文章,也是黄士杰的同事,在DeepMind工作的同事发表的关于如何用计算机来打游戏。类似于我们那个《魂斗罗》、《超级玛丽》这样的游戏。

 

这篇文章上面讲到,我们应该使用一种叫强化学习的方法。所以说它除了刚才的神经网络和蒙特卡洛搜索树,还有一个强化学习,就在思考我们的第三个方案。强化学习能够带来一些什么好的东西。

 

强化学习是个什么玩意儿呢?如果你把自己当做打游戏的人,你和一个东西进行交互,我们把那个东西叫做环境。那这个环境,你对环境的观察只是这个环境的一部分。所以这个环境是每一个时刻可以给出一个状态。然后针对这个状态,你这个agent可以给出一个反馈。这个反馈我们把它叫做action。

 

根据最后,这个游戏打到最后,它总有一个赢或者输,那么我们把一个输和赢,计为一个最后的result。也是游戏最终的总得分。强化学习的方案就是,我需要给定一,每一个状态下的action,我做了这个action之后,我最终的总得分是多少?这样我就做出了一个非常好的预估。

 

就是比如说我在打《魂斗罗》,这个时候我要躲子弹,我如果不躲我就死了。那我要躲的话,我得分会比较高。我有可能可以打完。这篇文章当时非常得成功。

 

受到这个的启发,黄士杰也就想,那我也做一个估值函数吧?我不需要在这里面把所有的步骤都走完,我走到某一个阶段的时候,我就直接预估我这盘棋会赢还是会输。那么就有点类似于刚才的这个评价函数。

 

但是这时候又遇到一个问题,要训练这个评价函数,需要更多的棋局。原来我们模拟落子的时候,我们可以把每一个落子的方案都走出来。但是现在的这个局面评价函数的话,它其实每一盘棋只能得到一个最终的结果。所以可以供训练的样本集就比原来少了很多。

 

所以为了解决这个问题那好,样本集不是不够嘛,之前QQ游戏大厅,大家这么多人下了10年,一共只下了这么几百万盘棋。那我们就自己跟自己下吧,创造出新的棋局。这就是我们的  P_human。

 

它所对应的这个强化学习的部分,你想两个,刚才两个模拟人类走子的这个神经网络,它自己可以跟自己对弈。然后自己对弈可以创造出新的棋局。它不是用300万盘棋来做的训练吗?那我自己跟自己再下300万盘棋。

 

我下了300万盘棋之后,我可能自己手上就有600万盘棋的训练数据了。我势必就应该比原来更聪明。我用600万盘棋的棋局去训练我,然后就得到一个叫  P_human1的函数,我们把它叫  P_human1。在  P_human1以后,我再用  P_human1和  P_human1对弈,这样我就能够再多出300万盘棋来。我就可以得到900万盘棋。

 

针对这900万盘棋再去训练,我是不是棋艺就会越来越高呢?当我重复这个次数很多次以后,比如说30次,那我的胜率是不是真的变高了呢?通过这个实验来看,如果我们和最开始的  P_human来对比的话,它的胜率能够达到70%。证明我们通过自我对弈进行学习出来的程序,确实是能够提高棋力的。

 

同时我们在这个对弈的过程当中,也创造出了更多的棋局。那么我们拿到这个  P_human,我们把原来这个训练30次的程序命名一个新的名字叫  P_humanPlus。我们用这个  P_humanPlus来下棋,是不是就会来替代刚才的那个  P_human?是不是就会做得更好呢?

 

然而这次又失败了,为什么呢?因为  P_humanPlus的招数非常得集中。在我们人类落子的时候,有好多个选点,但是这种计算机,因为强化学习以后,它的落子的选点就变得非常少,非常单一。如果你非常单一的,那势必发挥不了。蒙特卡洛搜索树的优点,因为它需要更多的棋局才能够展现出来,才能够搜索到更多的可能的情况。

 

但是这个事情黄士杰他也想到了。为了解决这个问题,那你既然走得这么死板,蒙特卡洛搜索树发挥不出你的作用,那好,那我就不用你了。我就用  P_human。我先用  P_human在这里走上L步,我大脑当中模拟的。我用  P_human来模拟这个情况,走上L步。

 

然后我现在不是需要计算一个局面的状态吗?之前走子都特别的。就是招法太单一。那好它就在L步以后,在这个L+1步随机掷了一次骰子。就是在局面上,任何位置都有可能下一个棋。然后下了那盘棋之后。然后再来看这个,再用  P_humanPlus把剩下的走完。这个  P_humanPlus是我们这个强化学习出来的这样一个网络。

 

把这个棋走完,通过把中间的这一盘棋最后走完,我知道我赢了还是输了。那把这中间的这一盘棋的情况和最后的结果对应起来,就能够得到一。这个就是最后那盘棋。然后这是最后那个结果。那么我们就可以直接得到一个叫做局面评估函数。

 

比如说你看到黑棋已经很多盘子,棋下完了,那很有可能局面就大势已去。我们通过这样的方式就可以试图去构造出这样一个局面评估函数。在这里需要插播一句的地方是,从刚才这个分析上,我们可以很明显地看出自我对弈的强化学习的部分。它练招比较死板,它所能够想到的局面数是不够的。

 

所以说我们才有了这样一个随机走的地方。这个练招的局面数不够的这样一个问题,昨天的第四盘棋当中,得到了非常重要的体现。当李世石下出成绩的时候,显然那个步骤,不在这个搜索树的当中。无论是  P_human程序,还是  P_humanPlus都没有考虑到,有可能会下出这样的棋。

 

同时它的这个随机搜索的内容,也没有考虑到随机抛的那个硬币。也没有抛在78手的位置。所以那个神之一手对它造成了很大的影响。

 

并且还有一点可以看见的是,因为它,为什么它后面会走几步棋非常得匪夷所思呢?这是因为他在训练的时候,随机抛的这一步。它在当时的那个局面不利的情况之下,它随机抛的那一步棋。很有可能能够让这个局面变得不错。

 

所以说计算机才会有这样的表现。所以在这上面看起来,虽然黄士杰想了一些办法来应对,然而这个程序,毕竟不是全能的。还是有一定的局限。但是我们收回这个话。这个局面评估函数只是阿尔法围棋的一个功能。通过刚才的这样一个方法,我们拿到了局面评估函数。通过强化学习的对弈,拿到了一个更强的模拟人的走子的方略。

 

所以现在我们已经搞定了三个东西:强化学习,蒙特卡洛搜索树,还有神经网络。我们距离阿尔法围棋只剩一步了。在蒙特卡洛搜索树当中,黄士杰想我们把局面评估函数和  P_humanFast的这个自我对弈都合一块儿,然后在每一局需我们先搜索。比如说20多步,用  P_human去搜索20多步。

 

然后后面的内容我们用0.5比例是这个局面评估函数。0.5比例是蒙特卡洛搜索树,通过这两个方面,我们就能够得到一个最后的结果。我讲得是比较的详细了。通过局面评估函数的比例和快速蒙特卡洛搜索树的比例是0.5:0.5。

 

如果它是别的比例,有人不服呢?比如说0.6到0.4。那其实证明0.5:0.5的这种比例的效果是最好的。回顾一下,通过这样的一种方式来进行蒙特卡洛搜索的程序,就叫做阿尔法围棋。我们看到它有背棋谱的方式,也有一些穷举的方式。但是它是这种的结合。

 

其实它主要使用的是神经网络,即人工智能的三个比较重要的领域,分别是神经网络、强化学习和蒙特卡洛搜索树。并不是像跟多人所想象的那样是深度学习的一个进步。它同时也包含了人工智能。在搜索的领域,在传统的人工智能上边的领域的内容也包含进来了。

 

所以黄士杰能做出现在这样的程序,还有谷歌DeepMind能做出这样的程序,不是靠的一朝一夕之功,也不是靠的某一次的灵感。它是十多年的辛勤努力和汗水的结晶才能够达到人工智能的目前的一个顶峰。这绝对是目前的巅峰之作。在让四子的情况下,可以击败所有的电脑程序,并且可以在五番棋当中战胜李世石。

 

可见阿尔法围棋,确实到达了一个很高的水平。但是它给我们带来了什么样的启示呢?人工智能的边界又在什么地方呢?从这个围棋上面来看,其实围棋是一个非常有限定性内容的话题。就是棋盘是有限的,招法也是有限的,我们在这样的限定的内容当中。计算机是很有可能能超过人类的。

 

但是去想更加开放式的问题,比如说人类要去想我们未来要向哪里发展,然后我们想要去定义一个问题,让计算机来做,这个才是真正的能力。可能是人类将来需要发展的方向。

 

有时候我们说,如果能把交通,自动驾驶,开车安全地把人从一地儿送到另一地儿,然后它的动作就是方向盘,油门这些东西。那这个问题如果被精确地定义了,并且让计算机去大量地重复训练,很有可能在驾驶上面的安全性和舒适型、速度上都可能会超过人类。

 

但是问题是在于,你得先想到你要去定义这个问题。你要让计算机去做这个事,可能才是人类最重要的一个能力。人类的能力并不是被智力所定义的。人类的能力其实是被一种好奇心和一种期望所定义的。我期盼着我要去做什么,我要探索未知的世界,这个能力目前还没有看见。

 

人工智能能够发现,因为我们面对的是一个无限广阔的宇宙。我们的人类最后将在哪里停止,这个是很难说得清的。而目前看来我们的人工智能,是助力人类去探索宇宙的一种技术。

 

希望能够用人工智能的方法和作为一个从业者来看的话,希望人工智能的这样的方法和人类的本身的好奇心和其他的情感方面的东西结合在一起。然后再去能够做得更好,能够探索世界的奥秘。这可能是我所期待的一种人工智能的发展方向。

读书人简介:

作者(译者)面对面为你讲解一本书的核心要义。
喜欢就下载APP试用吧!

读书人简介:

作者(译者)面对面为你讲解一本书的核心要义。
喜欢就下载APP试用吧!