文章简介:
AlphaGo围棋击败世界冠军,王者荣耀AI战胜职业选手......我们对世界充满好奇,总想一探究竟,想知道这些AI算法是如何拥有高超智能。然而,AI算法博大精深,多数资料都是以专业角度来说明问题,晦涩难懂。例如AlphaGo围棋就会涉及蒙特卡洛树搜索、强化学习、深度卷积网络……,这些概念会让非专业人士一头雾水。对于游戏从业者,无论是游戏的内容还是开发流程,AI的发展必然给游戏行业带来影响,接触AI势在必行。
本文的目的在于:让缺乏专业背景知识的读者也能够直观理解AI博弈的原理,至少能从感官上了解AlphaGo如何击败世界冠军,AI如何打败王者荣耀职业选手。
作为入门级的文章,不会详细说明技术细节。力图通过通俗易懂的语言和图示解释原理,可用于在游戏开发的技能之外拓展视野。
文中提及的井字棋、五子棋、象棋、围棋、Dota 2、王者荣耀的AI有很多共通之处,AI所要做的事情都是根据当前的局面去输出它需要做多动作。不同的是,不同游戏的规模不一样。例如井字棋的棋盘是3x3,象棋是9x10,棋盘越大,实现它的AI越困难。本文的行文思路在于,先从简单棋类的AI说起,再沿着技术发展到步伐,再一步步改进算法,以适应规模越来越大的游戏。
适合读者:
1、对AI技术感兴趣的开发者
2、有志于开拓视野开发者
3、考虑加入AI元素但还不确定可行性的开发者
你将获得:
1、直观理解蒙特卡洛树搜索算法
2、直观理解AlphaGo原理
3、直观理解强化学习的概念
本小节选自文章第三节:围棋规模太大,运用概率思维,AI如何在围棋上和人类斗智斗勇?且看下文。
围棋规模太大,运用概率思维
使用启发式搜索和剪枝算法,AI得以在象棋上战胜人类顶尖棋手。不过对于更复杂的围棋,AI却差强人意,连业余选手都打不过。从1997年AI在国际象棋战胜人类顶尖棋手,到2016年战胜人类围棋世界冠军,中间隔了19年。
围棋AI比象棋AI难得多,有几方面的原因:
其一,围棋平均每步有250种走法,比起象棋的40种多出几倍,这使在可接受的时间内搜索层数很少(按照上一节的数值10^10,可以搜索4层);另外,一局围棋平均要走150步,比起象棋的95步多。需要的步数更多,能搜索的层数却更少,棋力就会变弱。
其二,围棋局面变化多端,不像象棋依靠计算剩余棋子的价值就能大概判断局面好坏。围棋局面评估大多基于“势力图”,如下图(左)表示的是一颗棋子的势力范围,距离它近的地方势力大,距离远的地方势力小(如图中数字从10逐渐下降到1)。综合所有棋子即可计算玩家局面好坏,如下图(右)展示的是从黑棋的角度看,棋盘某些点的势力值,综合所有点的势力值即得到局面评分。不过相比象棋,这样的评分规则很不精准。
在介绍打败围棋世界冠军的AlphaGo之前,我们先关注一个阶段性成果,2006年Rémi Coulom(雷米·科隆,法国人)设计的围棋程序CrazyStone,能够和业余选手抗衡。
Rémi Coulom
既然很难通过“势力图”去评估局面好坏,那就转为“采样”的思路。如下图(左)所示,从某一个局面开始,让AI随机下棋,直到胜利或者失败。只要下的次数够多,就可以统计从该局面下棋的胜率(下图右),胜率越高,棋局的估值也就越高。有理论证明,只要采样的次数足够多,局面评估的值会趋近于真实值。
这种方法称为蒙特卡洛方法(也称统计模拟方法),通过概率统计来估算数值。蒙特卡洛是欧洲一个著名的赌城,因为统计模拟方法用到了随机采样,也有赌博的韵味,所以以该城市来命名。
不过,随机下棋本身的计算量就挺大,还是以10^10的算力来计算,假设随机下一盘棋相当于遍历10000个局面(100步,每步考虑100种情况,相当于耗费10^4的算力),再假设粗略评估一个局面需要下1000盘,那么粗略评估一个局面就需要耗费10^7的算力。换句话说,只能评估1000个局面,还不够做2层搜索(250*250>1000)。
不做深度搜索的下棋过程如下所示,假设当前处在棋局A,它有B-G共6总可能的走子方法。对于每一种走子后的局面,随机下棋1000局,得出每个局面的胜率(图中绿色文字标注的30/1000、50/1000等数值)。随后,选择最有利的局面(图中F)下棋。
算法思想虽不复杂,不过下1000盘的评估量太少,得到的结果并不精确。理论证明,采样的次数越多,评估的值就越准确。既然总的算力有限,那就要想办法更合理地分配采样次数。
原理一: 给分值高的局面分配更多的次数,会更准。如下图所示,假设算力可以支撑3000盘模拟棋,局面A有3种可能的走法。先给每一种走法分配200盘,根据这两百盘得出的胜率(图中左下绿色标注的100/200、50/200、10/200)去分配另外的2400盘,胜率高的分配多一些,胜率少的分配少一些(图中中间1800、900、300表示各局面最终分配的次数)。因为价值高的局面更有可能被选择,给它分配更多的次数可以让它算的更准,这样一来,采用“价值高分配更多次数”的评估方法,会得到比“平均分配”(下图右边绿色文字标注的1000、1000、1000)得到更准的结果。
原理二: 越是后面的局面,评估越准。如下图所示,左图是下了很长时间的棋局,右图是开始不久的棋局,假如都模拟1000次,左图的评估准确度会大于右图。这很直观,越到后面,棋局态势就越明晰。同时,由于快要分出胜负,模拟棋局所需的走子次数更少,计算量少就意味着可以模拟更多次数。
根据这一原理,可以这么认为:如果把某一个节点展开,就算模拟同样的次数,也会比单独的模拟准。如下图所示,假设局面A有B和C两种可能的走法,依然假设算力可以支撑3000盘模拟棋。那么分别对局面A、B、C做1000次模拟,然后相加所得到胜率(下图左),会比单独对局面A做3000次模拟(下图右)更准。因为越后面的局面越准,显然B、C的评估准确度会相对于A准确。下图中,用绿色字体a、b、c表示对局面A、B、C分别模拟1000次后胜利的次数,d表示对局面A模拟3000次后胜率的次数,对于左图,最终胜率由(a+b+c)/3000计算。
综合原理一和原理二,Rémi Coulom等先驱使用如下的方法来编写围棋AI,这种方法也被称为“蒙特卡洛树搜索”。如下图所示,假如当前处于局面A,轮到AI下棋,先列举出A的所有可能走法(图中步骤1)。假如它有B和C两种走法,而后分别对子局面做评估,例如每个局面模拟下1000盘,得到胜率分别为400/1000和300/1000,然后根据评估值选择其中一个局面,评估值越高,选中对概率越大(图中步骤2,选择了局面C),而后再对所选中的局面(图中局面C)做拓展。假设局面C有两种可能的走法,分别走向局面D和E,对D和E也分别模拟1000盘,得到(对于AI的)胜率为800/1000和100/1000。
在评估完D和E后,可以更新C的评估值(如下图,步骤3),使它更准确,下图中蓝色字体1200/3000表示局面C的新评估值,由原先C的评估值、D和E的评估值叠加而成。
如此往复,根据已得到的评估值来选取子局面。若遇到尚未扩展的局面时,则扩展它的子局面。最终程序会走出如下图所示的路径,估值高的节点会评估更多次数(原理一),有些路径会走的很深(原理二)。在走出约1000条路径后(可接受时间内大概可以计算千次,当然,更多更好),看看局面B和局面C哪个评估值更高,然后下棋。
2006年以后,棋力较强的围棋AI都采样蒙特卡洛方法,并且达到了业余弱5段的水平。
至于业余弱5段是什么水平,可以参考下图。下图展示了围棋各段位水平,职业九段最强,业余5段可以算中等水平吧。
1997到2006年间,中间隔了近10年。不得不感慨,人类科技发展有时候也不是很快,群星闪耀的年代总是少数。围棋的下一次突破在2015年,那又是一个十年。