首页 > 代码库 > 看完这些,你就算得上既了解围棋又了解alphago了

看完这些,你就算得上既了解围棋又了解alphago了

首先,我们要祝贺小李下出第78手的“神之一手”,这一手堪称前无古人后无来者,尤其是结合了阿尔法狗自暴自弃的表现。小李说过他的失败并不是人类的失败,同样,小李的胜利也只是属于他一人的胜利。

 

然而人类在围棋领域会不会最终被机器所击败这一问题,在旧摩尔定律失效的情况下还不应急着下定论,看完这篇文章后有助于形成你自己的观点。

 

 

技术分享

 

首先我们看到这张图。有人一定会觉得奇怪了:为什么左边的是英国国旗呢?Google难道不是美国的公司吗?

原因很简单,alphago是英国的deepmind公司研发的。2014年1月,Google斥资4亿美元收购了它。

 

而左边这位代alphago行棋者,并非什么“根本不懂围棋的人”,此人叫Aja Huang,台大毕业,为此次Nature论文的作者之一,弈城Deepmind账号的实际主人,业余6段。

 

技术分享


 (Aja Huang在linkedin的个人资料)

 

 

此次比赛/测试使用的alphago也并非之前谣传的四十几个cpu的单机版,而是包括170个GPU和1200个标准CPU的分布式计算版。这可以从Aja Huang本人发的帖子得到证实,此贴同时也澄清了Google并未与李世石签下不能打劫的协议。

 

说到打劫,不排除有人还不知道何为打劫。简单地说,打劫,是指黑白双方都把对方的棋子围住,这种局面下,如果轮白下,可以吃掉一个黑子;如果轮黑下,同样可以吃掉一个白子。因为如此往复就形成循环无解,所以围棋禁止“同形重复”。根据规则规定“提”一子后,对方在可以回提的情况下不能马上回提,要先在别处下一着,待对方应一手之后再回“提”。

 

技术分享

 

如图,如果此局面是C7处黑子落下吃掉A点白子形成的,那么轮到白棋就不能马上下A点吃回,需要先在别处另一下一手。

打劫看似简单,然而多处劫争的出现会构成非常复杂的局面,这也是围棋的一大魅力。

 

事实证明,强如alphago也未能妥善地处理复杂劫争,这其实是蒙特卡洛搜索树的共有缺陷。

 

什么是蒙特卡洛搜索树呢?Alphago主要用到了两大模型——深度卷积神经网络(DCNN)和蒙特卡洛搜索树(MCTS),有兴趣的读者可以看一下Google最近发表在nature的论文http://wenku.baidu.com/link?url=XCdKkvuEjT8PzPyPjT-B_ebBSRsldt6wYSabeiisF3TXXryri2W3c8LnxRBQixQmK8mYCVa8vVVlMJ4vbIlJ2NVC3CLPHZMEehq4_Arflg3

 

在科普alphago的算法之前,我们先要对传统棋类(例如中国象棋、国际象棋)的博弈树搜索法有一定的了解。

有人误以为1997年击败人类最强国际象棋棋手的深蓝用的是穷举法。

这显然是不成立的。其实ai下棋和人类下棋的方式有很大的相似之处。人类棋手要知道当前局面下自己做出哪步选择是最优的,就需要假设自己下了这步,再站在对方的角度思考对方的最佳应对方式,再假设对方下了那一步回到自己这一方思考自己的最佳应对……如此循环,进行一次次递归。通常把每搜索一步(双方各走一步为一回合)说成思考了一层,职业棋手和先进的ai每步思考20层以上颇为常见。

 

技术分享

 

(国际象棋搜索树,这个图其实不太对,为了画得方便把每一步都剪枝成只剩一种情况了,其实多个分支都要长出新的分支)

然而问题来了,电脑/人类所要搜索的局面数是指数增长的!假如每一步局面都有m总走法,那么思考一层只需评估这m总局面,思考2层需要经过m+m*m个局面的计算,思考三层需要m+m*m+m^3种局面,思考n层就约为m^n个局面!!!因此,无论是人类还是电脑,在下棋的时候都会进行剪枝操作——把一些看起来明显不靠谱的走法舍弃掉,并且随着搜索层数的增加舍弃得越多。

象棋的局面评估相比围棋非常简单,只需要对子力(不同阶段赋予不同子不同的分值,比如中国象棋车9分炮4.5分)进行求和,并且对各子的有效步数(比如一个车走过去再走回同一个位置就损失了有效步数)、可活动范围、牵制情况、是否有难看棋形(比如窝心马),作一个可用数学函数描述的加权运算,这个局面评估函数的制定其实和软件设计者本人的棋力有关,但事实证明,这种看似简单的局面评估方式在象棋中完全够用了,甚至许多职业棋手都学习、研究了象棋软件的算法,例如曾经教我中象的陈老师(特级大师)就常常提醒我走子顺序(许多软件认为)的重要性。

 

然而这样的算法在围棋中确遇到了瓶颈,甚至完全行不通了。第一个原因是围棋的变化更为复杂,如果不考虑局面是否成立,围棋总局面数为3^361种(每个位置有黑、白、空三种状态)。

但根据围棋规则,不是所有位置都可合法落子,在围棋术语中没有气的位置就不能落子。那么排除掉这些不合法的棋局后总共还剩多少种呢?

普林斯顿的研究人员如今完成了这一壮举,他们给出的19x19格围棋的精确合法棋局数:208168199381979984699478633344862770286522453884530548425639456820927419612738015378525648451698519643907259916015628128546089888314427129715319317557736620397247064840935

我们给它多分几行:
2081681993819799846
9947863334486277028
6522453884530548425
6394568209274196127
3801537852564845169
8519643907259916015
6281285460898883144
2712971531931755773
6620397247064840935

一共171位数!!约等于2.08x10^170。

想看计算合法局面数的开源代码的点这里:http://science.slashdot.org/story/16/01/24/1428246/finally-calculated-all-the-legal-positions-in-a-19x19-game-of-go

如果乐意的话你也可以自己算一遍,不过研究人员推荐使用15TB硬盘空间、8-16核处理器及192GB内存的服务器,运行时间则需要几个月。

第二个原因便是,围棋的局面难以用简单的数学函数进行量化计算,人类棋手经过千百年的发展,形成了各种各样的定式、棋理,并通过一次次的对弈形成了一种看不见摸不着,但又真实存在在棋手大脑中的——棋感。

而深度卷积神经网络恰恰让机器拥有棋感成为了可能。什么是深度卷积神经网络呢?我们需要把这个词拆成两部分:深度/卷积神经网络。

卷积神经网络是一种近年发展起来的人工神经网络,人工神经网络是一种根据生物神经元工作原理所创建的巧妙模型,由大量的节点(或称神经元)之间相互联接构成。每个节点代表一种特定的输出函数,称为激励函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重。人工神经网络可以进行监督学习或非监督学习,不断修正神经元之前的权重,训练好之后可以解决各类实际问题:例如复杂函数拟合、人脸识别等等传统算法难以解决的需要“模糊逻辑”的问题。

传统的人工神经网络层数较少,例如最简单的bp神经网络只有一层隐藏层,每一层所有神经元均与前一层所有神经元相连。然而人们发现,遇到较为复杂或抽象的问题时,训练难度变得非常大甚至完全没有成功的可能。

人们发现人脑在认知外界时经历了一层一层逐步抽象的过程,深度神经网络的通常有十层以上,尽管深度学习是早在数十年前就有的概念,但由于它训练难度随着层数增加会剧烈增大一直不被人们重视,近年来,卷积神经网络和深度学习横空出世,这是因为有更合理的训练方式被提出了。

通俗地说,卷积神经网络实现了对图像(矩阵)的局部感知,它源于:20世纪60年代,Hubel和Wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经元时发现其独特的网络结构可以有效地降低反馈神经网络的复杂性。

例如ai要识别一张图片里有没有猫,通过不断的训练,卷积神经网络会提取出诸如尖尖的耳角、有弧度的眼角等特征,并在这些特征基础上不断抽象,最终得出“这是一只猫”的结论。其实这和人类视觉的实现过程是相近的,只是我们无法感知到每看到一幅图像,我们体内那么多的神经细胞已经辛劳地工作了那么多。

 

技术分享


(图为应用于人脸识别的多层卷积神经网络)

 

同理,卷积神经网络运用于围棋的效果也非常好,因为ai可以通过庞大样本数量的学习,最终能从19*19的输入矩阵抽象出人类的厚薄、打入、飞、跳等等概念,事实证明alphago做到了。

下面再来聊聊什么是蒙特卡洛搜索树,其实这只是名字听起来厉害罢了。蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。在围棋中,其实就是在某一种分支情况的基础上双方随机落子直到终盘分出胜负,从而把本来的np难题转换为了多项式时间问题。这不是乱下吗?怎么可能正确判断形式呢?其实,对每一分支的情况,程序都进行了成千上万次模拟,最终计算双方这一变化的总体胜率。例如共模拟10000盘,有6000盘最终结果是黑棋获胜的,那么黑棋胜率就是60%。

事实证明,alphago通过深度卷积神经网络选择几种可能的落子并进行胜率估值,再对各种可能的下法进行蒙特卡洛树搜索,结合两种方式得到的局面评估值非常准确(至少有人类顶尖高手水准),之前人们认为虚无缥缈的“大局观”,也在机器身上得到了很好的展现。

 

问题又来了,alphago既然那么厉害,怎么还会输呢???!!!

 

首先我们看deepmind的官方说法

 

技术分享

 

 

 

alphago在79手的时候它的价值神经网络错误地认为自己的胜率约为70%!

原来还是神经网络的锅啊。目前有三种可能:一是它的训练量不足,神经元之间的权重还有很大的提升空间,这需要进一步训练;二是它已经过拟合了,大量的左右互搏(自我对局)可能类型过于单一,使得alphago的局势判断能力变得有局限这样的话麻烦就大了,也许需要调出历史版本重新训练;三是卷积神经网络模型本身的问题,这样的话问题就更大了,但也不是没有可能,毕竟人脑有上百亿个神经细胞,也许只有数千个神经元的卷积神经网络是远远不够阐释围棋所有规律的,而且Google那篇论文中也提到尝试过另一种人工神经网络——循环神经网络(RNN),并发现它的效果远远不如DCNN,可见现存的人工神经网络未必都能解决围棋问题,只是目前看起来DCNN表现得不错罢了。

 

即使DCNN模型本身没有问题,alphago的棋感极有可能收敛于和人类顶尖棋手相近的水平。我判断的依据是alphago学习的都是人类的棋谱,而进行自我对局并非像和李世石比赛那样一两分钟下一步的完整思考,只是根据神经网络“凭感觉”自己摆棋,极有可能人类一生中仅仅千万盘的对局形成的棋感加上前人基础上形成的围棋理论体系并不比alphago从每天100万盘对局学习到的东西逊色。

 

此外,蒙特卡洛树搜索对复杂劫争问题的处理的确是目前各类围棋ai的共同缺陷,这一点如果得不到优化会大大限制围棋ai水平。

 

至于明天李世石究竟能不能再下到alphago的死穴,或者李世石究竟能不能再胜一局,依我看这很难说。不过据我推断,和alphago下棋的最佳策略就是:

把它当成一个棋力很高的人类棋手,因为它已经拥有了和人类类似的棋感来进行局面评估和选择落子点,也和人类一样会进行博弈、搜索,可以说和人类棋手本质上采用相同下棋策略的。

不同之处是alphago不会犯错。

什么是犯错呢?对alphago而言,严格按照程序执行就叫不犯错,即使那第79手的价值神经网络评估错误了,它也没有犯错,只能说它棋感还不够好罢了。

因此有些人认为故意下臭棋就能误导ai,出奇制胜,只能说图样图森破,如果对手是真人可能真的会被乱下棋逼疯,而ai只会下它认为最优的(就是最终获胜概率最大的,70%概率赢1目会被看作比69%概率赢20目更优的)。

幸运的是,目前无论是alphago还是人类远远达不到“围棋上帝”的水准,如果说象棋是上帝出了100道题那么深蓝可以答出95道,加里·卡斯帕罗夫能答出90道;而围棋就是上帝出了10000道题,alphago和人类顶尖棋手只能答出90道左右,个人希望看到在若干年内ai和人类能在围棋方面共同提高,人类在ai的帮助下加深了对围棋本质的理解,ai也随着硬件升级、算法优化、不断的训练逐渐增强。

 

最后再来提一提机器故意输的阴谋论,依我看这个当成段子看看就好了,真的信的人就……目前alphago还远远没有达到拥有自我意识的程度,唯一有点接近于人类思维的也就是用到的选定落子和评估局面的人工神经网络了吧,但在当前生物学对人脑研究有什么重大突破之前,现在用到的人工神经网络只能提供一种玄之又玄的n维输入到m维输出的映射,也许实现某种小虫子的非条件反射有可能,能真正思考是绝对不可能的(然而现在谁又能定义什么是“思考”呢?)。

 

看完这些,你就算得上既了解围棋又了解alphago了