(六)从零开始学人工智能-搜索:对抗搜索

对抗搜索html

文章目录java

对抗搜索算法

1 为何要学习对抗搜索?编程

2 什么是对抗搜索?网络

3 对抗搜索算法数据结构

3.1 极小极大值算法架构

3.1.1 分硬币游戏dom

3.1.2 最优路径示例机器学习

3.2 α-β剪枝ide

3.3 蒙特卡罗树搜索算法

3.3.1 蒙特卡罗方法

3.3.2 蒙特卡罗方法的基本思想

3.3.3 UCB算法基础

3.3.4 Monte-Carlo Planning

4 Alphago原理

4.1 架构

4.2 基础策略网络和加强策略网络

4.3 评价网络

4.4 蒙特卡罗树搜索

5 对抗搜索总结

声明

参考文献

1 为何要学习对抗搜索?

上文开篇咱们说了为何要学习一点算法:不求能上天飞黄腾达,但至少得知道未来干掉本身的是谁,不能走的不明不白,是不?

李开复曾经把基础课程比拟为“内功”,把新的语言、技术、标准比拟为“外功”。 成天赶时髦的人最后只懂得招式,没有功力,是不可能成为高手的。真正学懂计算机的人(不仅是“编程匠”)都对数学有至关的造诣,既能用科学家的严谨思惟来求证,也能用工程师的务实手段来解决问题——而这种思惟和手段的最佳演绎就是“算法”。

对抗搜索是一类算法的算法的总称,也是机器学习的一个分支。那咱们为何要学习对抗搜索呢?实在点,学它对咱们有什么用?能增收或撩妹不?你总得给我个理由是不!

为了回答这个问题,咱们先看一下这张图,也是AI的发展简史:

从图中能够看到,1997年Deep Blue世纪大战和2016年AlphaGo击败李世石,其中的关键技术便是对抗搜索技术。在棋类游戏里AI已经超过了人类,另外,在咱们数学部分第一讲的概述中也提到了一样的问题,AI在计算机视觉领域(如ImageNet的识别)等也是远远优于人类的。**刺激不?危机不?**那怎么办呢?

成年人别问那么多,直接干学就完了!

再举一个棋类例子:设想你在玩井字棋:

井字棋是一种在3 * 3格子上进行的连珠游戏,和五子棋相似,分别表明O和X的两个游戏者轮流在格子里留下标记(通常来讲先手者为X),任意三个标记造成一条直线,则为获胜。

正常状况下,你的目标是赢,除非...对方是个妹纸,如何轻松赢得棋局,学完这部份内容,你将赢棋把妹两不误!不说废话了,开搞吧

2 什么是对抗搜索?

老规矩,为了方便描述,咱们先介绍几个概念,有个先验印象,对抗搜索涉及几个常见概念:智能体、对抗搜索和博弈树。

智能体

智能体(agents):在信息技术尤为是人工智能和计算机领域,能够看做是可以经过传感器感知其环境,并借助于执行器做用于该环境的任何事物。以人类为例,咱们是经过人类自身的五个感官(传感器)来感知环境的,而后咱们对其进行思考,继而使用咱们的身体部位(执行器)去执行操做。相似地,机器智能体经过咱们向其提供的传感器来感知环境(能够是相机、麦克风、红外探测器),而后进行一些计算(思考),继而使用各类各样的电机/执行器来执行操做。如今,你应该清楚在你周围的世界充满了各类智能体,如你的手机、真空清洁器、智能冰箱、恒温器、相机,甚至你本身。

对抗搜索

对抗搜索也称为博弈搜索,在人工智能领域能够定义为:有完整信息的、肯定性的、轮流行动的、两个游戏者的零和游戏(如象棋)。

游戏:意味着处理互动状况,互动意味着有玩家会参与进来(一个或多个);

肯定性的:表示在任什么时候间点上,玩家之间都有有限的互动;

轮流行动的:表示玩家按照必定顺序进行游戏,轮流出招;

零和游戏:意味着游戏双方有着相反的目标,换句话说:在游戏的任何终结状态下,全部玩家得到的总和等于零,有时这样的游戏也被称为严格竞争博弈;

关于零和,也能够这样来理解:本身的幸福是创建在他人的痛苦之上的,两者的大小彻底相等,于是双方都想尽一切办法以实现“损人利己”。零和博弈的结果是一方吃掉另外一方,一方的所得正是另外一方的所失,整个社会的利益并不会所以而增长一分。

例以下井字棋,一个游戏者赢了+1,则另外一个必定输了-1,总和等于零。

博弈树

考虑两个游戏者:MIN和MAX,MAX先行,而后两人轮流出招,直到游戏结束。在游戏最后,给优胜者积分,给失败者罚分。

游戏能够形式地定义成含有下列组成部分的一类搜索问题:

初始状态,包含棋盘局面和肯定该哪一个游戏者出招。

后继状态,返回(move,state)对(两项分别为招数、状态)的一个列表,其中每一对表示一个合法的招数和其结果状态。

终止测试,测试判断游戏是否结束,游戏结束的状态称为终止状态。

效用(收益)函数,效用函数(又称为目标函数或者收益函数),对终止状态给出一个数值。在井字棋中,结果是赢、输或平,分别赋予数值+一、-1或0。有些游戏有更多的可能结果,例如双陆棋的收益范围从-192到+192。

每方的初始状态和合法招数定义了游戏的博弈树。上图给出了井字棋的部分博弈树。在初始状态,MIN有9个可能的走法。游戏交替执行,MAX下X,MIN下O,直到咱们到达了树的叶节点对应的终止状态,也就是说一方的三个棋子连成一条直线或者全部棋位都填满了。叶节点上的数字指示了这个终止状态对于MAX来讲的效用值;值越高被认为对MAX越有利,而对MIN则越不利。因此MAX的任务是利用搜索树(特别是终止状态的效用值)来肯定最佳的招数,即求解终止状态为+1的招数。

3 对抗搜索算法

上节提到的#字棋游戏,咱们能够大概画出它的博弈树:

至于为何须要这棵树我相信你很容易想到,计算机最擅长什么?没错,就是机械式穷举,试想一下,当你走了一步后,计算机准备执行下一步,它就会考虑全部能走的状况,而后他会再穷举你接下来的步骤而后再继续加深...不过回过头来想一下你就会发现这种方法更适用于一些棋盘比较小得如上面的#字棋,这样计算机只须要不多的搜索深度,就能选择最佳方案,所以一个设计优秀的#字棋AI基本上你是赢不了的,除非你也有同他那样的穷举能力,那么输赢就要取决于谁先走了。

有了这样一棵博弈树以后,有没什么方法找到最优解呢?咱们介绍三种常见算法: 极小极大值算法、α-β剪枝、 蒙特卡罗树搜索算法。

3.1 极小极大值算法

本节咱们以例子形式展开介绍极小极大算法。

3.1.1 分硬币游戏

虽然就算是井字棋这样的简单游戏,可是想要画出它的整个博弈树对咱们而言也太复杂了,因此咱们将转而讨论一个更简单的游戏:分硬币游戏。

假设咱们已经有一个评价每种决策的收益的估值函数。对于极大层节点,若是咱们知道了它的每一步决策的收益值,那么它老是会选择收益最大的那个决策,做为它的节点的收益值;反过来,对于极小层节点,它老是会选择收益最小的(对我方收益最小,就是对方收益最大)那个决策。

游戏规则是:一堆硬币,双方轮流将它分红大小不能相等的两堆,而后下一我的挑选任意一堆继续分下去,双方交替游戏,直到其中一我的没法继续分下去,则对方得到胜利。

假设咱们刚开始有一堆7枚硬币,轮到我方先分。我须要找到我当前应该怎么样分这堆硬币。或者说,须要找到当前可以得到最优收益的决策,咱们经过构造出一棵极大极小树来作到。

首先,咱们穷举全部的可能的状态。用矩形表明轮到我方作决策的极大层节点,用圆形表明轮到对方作决策的极小层节点,列举出全部的状态:

注意,到这里咱们尚未进行估值 ,所以这还不算是极大极小树。下面咱们来设计这个游戏的估值函数,很简单,若是当前局面,咱们已经赢了,那么收益为+1,若是咱们输掉了,那么收益为-1,这个游戏没有平局,因此只可能有这两种收益值。

刚开始估值的时候,咱们还位于根节点,咱们对于整棵树是一无所知的,就像下面这样:

咱们想要得到根节点的估值,须要对根节点的子节点进行遍历,首先对第一个子节点进行遍历,发现仍是不能判断它的值,继续遍历(上节课提到的深度优先)它的子节点,直到到达叶子节点:到了叶子节点,咱们能够对它进行估值了,由于此时是极小层,须要对手进行决策,可是对手已经没法再继续分下去了。因此,它的收益值为+1:这样得到了第一个叶子节点的估值,因为它的父节点只有惟一一个子节点,所以父节点的收益值也只能是+1,而后能够一直回溯上去,直到到达红色的节点:此时,咱们不能直接给红色节点赋值了,由于它还有别的子节点,咱们继续遍历它的子节点:遍历到又一个叶子节点,发现它的收益是-1(我方失败),再回溯回去:如今咱们又回到了红色节点,如今它的全部子节点的收益值都已经得到了。注意,这个节点是一个**极大层节点**。咱们说过,极大层节点老是会选择收益最大的子节点,它的子节点一个是+1一个是-1,所以,它的值应该是最大的那个+1。咱们继续按照深度优先的顺序遍历:到这里,当前红色的节点是一个**极小层节点**,它老是选择收益最小的决策,所以它的收益值是-1。 接下来,咱们继续按照这个思路进行遍历,中间的过程我就省略了,最后的结果以下所示:

到这里,咱们的极大极小树已经构建完成了。

咱们发现,当前的根节点的收益值竟然是-1,也就是说,只要对方够聪明,咱们不管如何都没法取胜。

这就很绝望了,可是仔细想一想,咱们假设的前提是,对方是聪明绝顶,不犯错误的高手。

咱们知道不管如何都会失败,那可不能够赌对方会犯错呢。

这样一想,其实3种必败的决策仍是有必定的优劣性的。好比,最右边那个子节点,它的全部子树跟子树的子树收益都是-1,也就是说,对方就算乱下,咱们都必输;而中间跟左边那个子节点,若是对手下错了,还有一必定概率可以通往+1的叶子节点的。所以,左边两个决策要比最右边的决策要相对好那么一点儿。所以,在发现咱们已经必败的时候,依然可以在决策中作一个取舍,选择败得不明显的那种决策。

3.1.2 最优路径示例

设想有两个选手,橙色节点是MAX,蓝色节点是MIN,每人轮流移动一步,MAX先开始:

第一步:MAX选手根据DFS深度优先,生成整个博弈树,根据效用函数UTILITY获得全部叶子节点值,以下图,A是初始节点。

第二步:从叶子节点向上回溯,D节点是MAX节点,选择最大值4,同理获得同一层节点的值。第三步:递归上一层,该层为MIN节点,选择孩子节点的最小值,B节点为4,C节点为-3。第四步:再递归到上一层,是根节点A,选择孩子节点最大值4。**所以对于MAX选手而言,最优路径为绿色路径,取得最大值为4。**

扩展:复杂度分析

博弈树中,分支因子(branching factor)是每一个结点下的子结点数。若是各个结点分支因子不一样,则能够计算平均分支因子。例如,在国际象棋中,如把一步合法走法算做一个“结点”,那么平均分支因子据信约为35。这表示棋手每一步走棋平均有大约35种合法走法,一盘棋通常每一个游戏者走50步,那么搜索树大约有35^100个节点。

如图,b是分支因子数,d是游戏者走的步数之和。

3.2 α-β剪枝

上一小节咱们介绍了极大极小树,对于分硬币这样相对简单的游戏,它仍是可以用得上的。可是呢,它必须得穷举出全部的状态。再从终结状态开始,计算每一个节点的估值,最后才能得到当前最优的决策。

极小极大值算法对博弈树执行了一个完整的深度优先探索,问题是必须检査的游戏状态的数目随着招数的数量指数级增加,好比即便是最简单的“井”字棋,它的第一步有9种决策,而后对面有9*8=72种决策,…,最后一层的决策个数达到了 9! = 362880 种。如此简单的游戏,在不作特殊处理的时候,都有几十万种决策(固然这个量级计算机仍是可以hold住的)。它的棋盘大小仅仅是3 X 3,五子棋是15 X 15,围棋是19 X 19,想要穷举出全部决策,几乎是不可能的。

所以,咱们不可以像上一章那样,每次都穷举出全部的结果,再去慢慢找最优决策。随着树的深度的增长,咱们的节点个数是指数级上升的。这种状况下咱们不得不搜索到必定程度,就中止继续往下搜索。

当咱们停下来之后,这个时候,因为咱们游戏尚未结束,咱们如何判断当前的结果的好坏?

咱们须要设计一个评价函数(Evaluation function)对于当前局面进行评分。这个评价函数如何设计?主要是根据不一样的游戏,还有人类的平常经验来判断。

我当时设计五子棋AI的时候,就人为的设计了一个评价当前局面的分数的函数。好比已经有5个子连成一线了,它就是最高分;若是有4个子连成一线,它就是次高分;还有双3,…。这样咱们就能根据局面,得到一个得分。固然,当对面调用这个评价函数的时候,得到的分数前面要取一个负号。由于对手的最高分,就是咱们的最低分。

有了评价函数,咱们就能够随时终止咱们的搜索了。由于对于任何局面,咱们都可以给出一个收益得分 。咱们能够限定咱们的搜索的深度,随时结束搜索。

可是咱们的搜索空间仍然很是庞大。由于最开始的几层,可作的决策是至关多的。

好比五子棋,第一步就有225种下法。而对手对应就有225_224=50,400种决策;再往下一层,就有225_224*223=11,239,200种。这才第三层,就已经快爆炸了。

通常五子棋的高手都能想到后面五六步,甚至十几步。想要与之对抗,咱们必须得想办法减小咱们的搜索数量,增长咱们的搜索深度,这样咱们的AI才能看得更远的将来,想得更多,这样棋力才会变强。

在这里,咱们借用剪枝技术消除搜索树的很大一部分,应用到一棵标准的极小极大值树上,它剪裁掉那些不可能影响最后决策的分支,仍然能够返回和极小极大值算法一样的结果。

咱们先来理解一下,怎么样的搜索是没有必要的,假设咱们限定了搜索深度为3,咱们从头开始搜索,以下:

咱们从根节点往下搜,直到第一个叶子节点:

此时,到达了第一个深度为3的节点,此时咱们调用估值函数,假设咱们得到它的收益为3,如今咱们回头来看它的父节点:

因为,这个父亲节点是MIN节点,咱们知道,它老是会选择子节点中最小值。如今,子节点已经出现了一个值为3。

如今仔细想一想,若是咱们继续得到它的子节点的收益,为一个比3要大的值,假设为12好了。那么当前的父节点,必然不会选择这个12,而会去选择3。所以,这个父亲节点的收益,不管如何,都不会超过3,那么它的取值范围,咱们能够认为是:(-∞,3]。也就是说,咱们的子节点,其实更新了它的父节点的收益的一个上界值,如图:

到这里,咱们其实并无进行剪枝,只是找到了一个父节点的上界值(β值),咱们仍是得继续搜索它的子节点:假如咱们搜索到了12,咱们依然试图更新父节点的上界值(β值),可是由于比3要大,更新失败了,继续搜索下一个,直到搜索完全部的固然父节点的全部子节点:当它全部的子节点都被搜索完之后,咱们其实能够知道当前节点的收益就是3了。这个时候咱们能够修改它的下界为3,收益为3。

注意这个时候,其实跟以前的极大极小树的搜索过程没有区别,咱们并无进行任何的剪枝。接下来继续搜索:

咱们肯定了当前节点收益为3,再去看它的父节点,即根节点。根节点本来的收益值范围是(-∞,+∞)。如今咱们找到了一个子节点收益是3。

根节点是一个MAX节点,跟以前相反,子节点的收益值3,能够用来更新的是根节点的下界(α值)。至于为何,能够类比一下以前的。咱们如今已经有搜索到一个3,若是咱们之后搜索到比3小的值,那么根节点在取最大值的时候,确定会选择更大的3,而不是其余值。所以最优解的下界就是3,不会再更小了。

咱们带着根节点的取值区间[3, +∞)继续往下搜索,把这个区间赋给下一个子节点:

往下继续深度优先遍历,访问它的第一个子节点。此时到达设定的深度3,咱们调用评价函数,假设评价函数返回值为2:敲黑板,重点来了。

咱们知道,当前子节点是一个收益为2的MAX节点。MAX节点能够更新父节点的上界。所以,父亲节点的上界,被修改为了2。 这里就出现了一个矛盾的区间[3,2],以下图:

观察当前的节点,它的收益值的取值区间是[3,2]。这明显是不合理的,收益不可能下界是3,同时上界又是2。咱们能够作出判断,这个节点不管如何都不多是最优解。

因为这个区间已经产生了矛盾,咱们能够直接给当前节点判死刑,跳过剩下全部的子节点了:

上面的操做叫作α-β剪枝!

能够这样理解,收益值的可行区间一旦变成矛盾的,说明当前节点必然不会是得到最优的决策,那么咱们能够直接跳过这个节点,无论它还有多少个子节点没有被搜索。

Tips: 若是你以为我上面一段颇有道理,能够忽略这部份内容。

若是你是一个严谨的怀疑论者,内心不踏实,请继续看下去下面的证实过程。

咱们就来仔细分析讨论一下,假如咱们接着往下搜索会发生什么:

剩下的值无非就两种状况,咱们全都来讨论一遍:

第一种,搜索到比2小的值,好比1:

那么它的父亲节点是个MIN节点,会选择比2更小的1,假设最后中间的节点收益就是这个1,再看根节点:因为根节点是MAX节点,所以,即便找到了收益更小的1,根节点并不会选择它,而是选择更大的值为3的左边那个节点。

第二种状况,搜索到比2大的值,好比5:

它并不能代替2,因此中间节点的收益仍是2。在根MAX节点作取舍的时候,依然仍是会选择更大的左边的那个3的节点。

所以,咱们能够放心地说,当发现收益值的区间产生矛盾的时候,咱们当前的节点不管再怎么继续搜索,也不可能出现最优解了。这下能够放心跳过了。

证实完!

在这个例子里面,咱们已经给中间那个点判了死刑,直接跳过它剩下的2个子节点,转到了右边那个节点。

老规矩,把父亲节点的可行区间传递给当前子节点,继续往下深度优先遍历:到了叶子节点,调用估值函数,假设这回返回的收益是14:因为14是MAX层,试图更新父节点的上界。没有产生矛盾区间,继续往下搜。假设下一个搜索到的是1:更新上界,产生矛盾区间,中止继续搜索。到这里咱们遍历了根节点的全部可能子节点,能够作出最终判断,根节点的收益最终值为3,以及获得最优的路径:经过维护一个收益的可行区间,在搜索的过程当中进行剪枝操做,就是所谓的α-β剪枝。

因为α-β剪枝剪掉的点,都是必然不多是最优解的节点,所以咱们永远不会错过最优解。同时,因为及时的剪枝操做,咱们大大地减小了须要搜索的节点数量,节省下来的算力就能进行更多更深层次的搜索。

这就是传说中的博弈树跟α-β剪枝的原理了。

α-β剪枝能够用于树的任何深度,并且不少状况下能够剪裁整个子树,而不是仅剪裁叶节点。通常原则是:考虑在树中某处的节点n,游戏者能够选择移动到该节点。若是游戏者在n的父节点或者更上层的任何选择点有一个更好的选择m,那么在实际的游戏中就永远不会到达n。因此一旦咱们发现关于n的足够信息(经过检査它的某些后代),可以获得上述结论,咱们就能够剪裁它。

记住极小极大搜索是深度优先的,因此任什么时候候咱们不得不考虑树中一条单一路径上的节点。α-β剪枝的名称就是从下面两个描述这条路径上任何地方的回传值界限的参数得来的: α = 到目前为止咱们在路径上的任意选择点发现的MAX的最佳(即极大值)选择 β = 到目前为止咱们在路径上的任意选择点发现的M1N的最佳(即极小值)选择 α-β搜索不断更新a和β的值,而且当某个节点的值分別比目前的MAX的α或者MIN的β值更差的时候剪裁这个节点剩下的分支(即终止递归调用)。

扩展:

完整算法

复杂度分析

3.3 蒙特卡罗树搜索算法

下棋其实就是一个马尔科夫决策过程(MDP),即根据当前的棋面状态,肯定下一步的该怎么走。

那么,该下哪一步才能确保后续赢棋的几率比较大呢?最容易想到的就是前述的一些方法:枚举后续的每一种走法,而后计算每一步赢棋的几率,选择几率最高的走,以下图所示:

可是,对于围棋而言,状态空间实在是太大了,没办法枚举:这种时候就是靠蒙特卡洛树搜索了。它的方法也很是简单,那就是“没病走两步”:* 在当前状态的基础上,选择一个备选动做/状态; * 从备选动做/状态开始,“走两步”,不须要枚举后续全部状态,只须要以必定的策略一直模拟到游戏结束为止; * 计算此次采样的回报; * 重复几回,将几回回报平均,得到该备选动做/状态的价值。换个通俗点的说法,就是用**频率估计几率**。只要采样的样本数越多,频率越接近几率。

3.3.1 蒙特卡罗方法

蒙特卡罗方法(Monte Carlo method)也称统计模拟方法,是1940年代中期因为科学技术的发展和电子计算机的发明,而提出的一种以几率统计理论为指导的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决不少计算问题的方法。

蒙特卡罗方法于20世纪40年代美国在第二次世界大战中研制原子弹的“曼哈顿计划”计划的成员S.M.乌拉姆和J.冯·诺伊曼首先提出。数学家冯·诺伊曼用驰名世界的赌城–摩纳哥的Monte Carlo来命名这种方法,为它蒙上了一层神秘色彩。在这以前,蒙特卡罗方法就已经存在。1777年,法国数学家布丰(Georges Louis Leclere de Buffon,1707—1788)提出用投针实验的方法求圆周率π,这被认为是蒙特卡罗方法的起源。

3.3.2 蒙特卡罗方法的基本思想

当所求解问题是某种随机事件出现的几率,或者是某个随机变量的指望值时,经过某种“实验”的方法,以这种事件出现的频率估计这一随机事件的几率,或者获得这个随机变量的某些数字特征,并将其做为问题的解。

计算Pi

能够认为投针实验,在正方形内,投入必定数量的针,计算落入圆内针的数量与总共数量比值,从而计算Pi。

蒙特卡罗求定积分

蒙特卡洛方法的一个重要应用就是求定积分。来看下面的一个例子

当咱们在[a,b]之间随机取一点x时,它对应的函数值就是f(x)。接下来咱们就能够用f(x) * (b - a)来粗略估计曲线下方的面积,也就是咱们须要求的积分值,固然这种估计(或近似)是很是粗略的。

3.3.3 UCB算法基础

若是博弈树很是庞大,按照极小极大值算法和α-β剪枝,那么对抗搜索的时间效率是十分低下的。蒙特卡罗树搜索算法就是优化博弈树搜索的算法。

下面先介绍UCB算法,这是MCTS的经典实现UCT(Upper Confidence bounds for Trees)里面用到的算法。公式以下:

其中v'表示当前树节点,v表示父节点,Q表示这个树节点的累计quality值,N表示这个树节点的visit次数,C是一个常量参数(能够控制exploitation和exploration权重)。 这个公式的意思是,对每个节点求一个值用于后面的选择,这个值有两部分组成,左边是这个节点的平均收益值(越高表示这个节点指望收益好,越值得选择,用于exploitation),右边的变量是这个父节点的总访问次数除以子节点的访问次数(若是子节点访问次数越少则值越大,越值得选择,用户exploration),所以使用这个公式是能够兼顾探索和利用的。

3.3.4 Monte-Carlo Planning

蒙特卡罗树搜索(Monte Carlo Tree Search)是一种基于树数据结构、能权衡探索与利用、在搜索空间巨大仍然比较有效的的搜索算法。主要包括Selection、Expansion、Simulation和Backpropagation四个阶段。

1) Selection

在树中找到一个最好的值得探索的节点,通常策略是先选择未被探索的子节点,若是都探索过就选择UCB值最大的子节点。

2) Expansion

在前面选中的子节点中走一步建立一个新的子节点,通常策略是随机自行一个操做而且这个操做不能与前面的子节点重复。

3) Simulation

在前面新Expansion出来的节点开始模拟游戏,直到到达游戏结束状态,这样能够收到到这个expansion出来的节点的得分是多少。

4) Backpropagation

把前面expansion出来的节点得分反馈到前面全部父节点中,更新这些节点的quality value和visit times,方便后面计算UCB值。

经过不断地模拟获得大部分节点的UCB值,而后下次模拟的时候根据UCB值有策略得选择值得exploitation和exploration的节点继续模拟,在搜索空间巨大而且计算能力有限的状况下,这种启发式搜索能更集中地、更大几率找到一些更好的节点。

下面是论文的伪代码实现:

其中TREE_POLICY就是实现了Selection和和Expansion两个阶段,DEFAULT_POLICY实现了Simulation阶段,BACKUP实现了Backpropagation阶段,基本思路和前面介绍的同样。

简单理解,蒙特卡罗树搜索算法是一种模拟启发算法,根据UCB算法选择一个节点扩展,而后应用蒙特卡罗模拟方法计算叶子节点得分,向上传播,循环往复。

4 Alphago原理

4.1 架构

在架构上,AlphaGo能够说是拥有两个大脑,两个神经网络结构几乎相同的两个独立网络:策略网络与评价网络,这两个网络基本上是个13层的卷积神经网络所构成,卷积核大小为5 * 5,因此基本上与存取固定长宽像素的图像识别神经网络同样,只不过咱们将矩阵的输入值换成了棋盘上各个坐标点的落子情况。

4.2 基础策略网络和加强策略网络

第一个大脑是策略网络,基本上就是一个单纯的监督式学习,用来判断对手最可能的落子位置。他的作法是大量的输入这个世界上职业棋手的棋谱,用来预测对手最有可能的落子位置。在这个网络中,彻底不用去思考赢这件事,只须要可以预测对手的落子便可。目前AlphaGo预测对手落子位置的正确率是57%(这是刊登在Nature文章时的数据,如今想必更高了)。那各位可能认为AlphaGo的弱点是否应该就在策略网络,一方面是预测准确率不高,再者是若是下了以前他没看过的棋局是否是就有机会能够赢过他。惋惜并非,由于AlphaGo的策略网络有作了两个层面加强。

第一个层面是利用了名为加强策略网络(reinforced-learning (RL) policynetwork)的技术,他先使用部分样本训练出一个基础版本的策略网络,以及使用完整样本创建出来的进阶版策略网络,而后让两个网络对弈,后者进阶版策略网络等因而站在基础版前的高手,所以可让基础网络能够快速的熟悉到高手可能落子的位置数据,进而又产生一个加强版,这个加强版又变成原有进阶版的高手,以此循环修正,就能够不断的提高对于对手(高手)落子的预测,RL网络80%赢了基础版本的策略网络。

第二个层面则是如今的策略网络再也不须要在19 * 19的方格中找出最可能落子位置,改良过的策略网络能够先经过卷积核排除掉一些区域不去进行计算,而后再根据剩余区域找出最可能位置,虽然这可能下降AlphaGo策略网络的威力,可是这种机制却能让AlphaGo计算速度提高1000倍以上。也正由于AlphaGo一直是根据总体局势来猜想对手的可能落子选择,也所以人类耍的当心机像是刻意下几步但愿扰乱计算机的落子位置,其实都是没有意义的。

4.3 评价网络

第二个大脑是评价网络。在评价网络中则是关注在目前局势的情况下,每一个落子位置的最后胜率(这也是我所谓的总体棋局),而非是短时间的攻城略地。也就是说策略网络是分类问题(对方会下在哪),评价网络是评估问题(我下在这的胜率是多少)。评价网络并非一个精确解的评价机制,由于若是要算出精确解可能会耗费极大量的计算能力,所以它只是一个近似解的网络,并且经过卷积神经网络的方式来计算出卷积核范围的平均胜率(这个作法的目的主要是要将评价函数平滑化,同时避免过分学习的问题),最终答案他会留到最后的蒙利卡罗搜索树中解决。

固然,这里提到的胜率会跟向下预测的步数会有关,向下预测的步数越多,计算就越庞大,AlphaGo目前有能力本身判断须要展开的预测步数。可是如何能确保过去的样本可以正确反映胜率,并且不受到对弈双方实力的事前判断(可能下在某处会赢不是由于下在这该赢,而是这我的比较厉害)。

所以,这个部分它们是经过两台AlphaGo对弈的方式来解决,由于两台AlphaGo的实力能够看成是相同的,那么最后的输赢必定跟原来的两人实力无关,而是跟下的位置有关。也所以评价网络并非经过这世界上已知的棋谱做为训练,由于人类对奕会受到双方实力的影响,经过两台对弈的方式,他在与欧洲棋王对弈时,所使用的训练组样本只有3000万个棋谱,可是在与李世石比赛时却已经增长到1亿。因为人类对奕动则数小时,可是AlphaGo间对弈可能就一秒完成数局,这种方式能够快速地累积出正确的评价样本。因此先前提到机器下围棋最大困难点评价机制的部分就是这样经过卷积神经网络来解决掉。

4.4 蒙特卡罗树搜索

选取:首先根据目前的状态,选择几种可能的对手落子模式。

展开:根据对手的落子,展开至咱们胜率最大的落子模式(咱们称之为一阶蒙地卡罗树)。因此在AlphaGo的搜索树中并不会真的展开全部组合。

评估:如何评估最佳行动(AlphaGo该下在哪?),一种方式是将行动后的棋局丢到评价网络来评估胜率,第二种方式则是作更深度的蒙地卡罗树(多预测几阶可能的结果)。这两种方法所评估的结果可能大相径庭,AlphaGo使用了混合系数(mixing coefficient)来将两种评估结果整合,目前在Nature刊出的混合系数是50%-50%。

倒传导:在决定咱们最佳行动位置后,很快地根据这个位置向下经过策略网络评估对手可能的下一步,以及对应的搜索评估。因此AlphaGo其实最恐怖的是,李世石在思考本身该下哪里的时候,不但AlphaGo可能早就猜出了他可能下的位置,并且正利用他在思考的时间继续向下计算后面的棋路。

5 对抗搜索总结

对抗搜索的适用范围

有完整信息的、肯定性的、轮流行动的、两个游戏者的零和游戏,这时咱们就能够用上对抗搜索算法。

对抗搜索的主要思想

对抗搜索的核心思想就是dfs遍历一遍博弈树。不难想到,若是博弈树很是庞大,在不加优化的状况下,对抗搜索的时间效率是十分低下的。所以,咱们就须要对对抗搜索进行必定的优化。

对抗搜索算法

极小极大值算法

α-β剪枝

蒙特卡罗树搜索算法

声明

本博客全部内容仅供学习,不为商用,若有侵权,请联系博主谢谢。

参考文献

[1] 斯图尔特·罗素,人工智能:一种现代的方法(第3版)[M],人民邮电出版社,2010

[2] Wu Fei,Adversarial Search–What To Do When Your “Solution” is Somebody Else’s Failure

[3] Wu Fei,Adversarial Search- Monte Carlo Tree Search selectively random sampling with simulations

[4] https://www.javatpoint.com/mi...

[5] https://www.jiqizhixin.com/ar...

[6] http://jeffbradberry.com/post...

[7] https://blog.csdn.net/chenxia...

[8] https://blog.csdn.net/bitcarm...

[9] https://www.cnblogs.com/yifdu...

[10] https://www.cnblogs.com/never...

相关文章
相关标签/搜索