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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_45552760/article/details/102745721

1 前言

什么是对抗搜索,对抗搜索和人工智能AI有什么关系呢?我们先了解下AI的发展历史:
图1-1

图1-1

从图1-1中可以看到,Deep Blue世纪大战和AlphaGo击败李世石,其中就用到了对抗搜索技术。实际上对抗搜索是机器学习中的一个分支。

设想你在玩游戏,如井字棋:

图1-2

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

在这里插入图片描述

图1-3

你的目标是赢,有哪些技巧可以帮助你赢,这将是对抗搜索研究的问题。

2 基本概念

对抗搜索会涉及几个常见概念:智能体、对抗搜索定义和博弈树。

2.1 智能体

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

2.2 对抗搜索

ad_1.png

图2-1

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

  • 游戏:意味着处理互动情况,互动意味着有玩家会参与进来(一个或多个);
  • 确定性的:表示在任何时间点上,玩家之间都有有限的互动;
  • 轮流行动的:表示玩家按照一定顺序进行游戏,轮流出招;
  • 零和游戏:意味着游戏双方有着相反的目标,换句话说:在游戏的任何终结状态下,所有玩家获得的总和等于零,有时这样的游戏也被称为严格竞争博弈;

在这里插入图片描述

图2-2

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

2.3 博弈树

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

在这里插入图片描述

图2-3

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

  • 初始状态,包含棋盘局面和确定该哪个游戏者出招。
  • 后继状态,返回(move,state)对(两项分别为招数、状态)的一个列表,其中每一对表示一个合法的招数和其结果状态。
  • 终止测试,测试判断游戏是否结束,游戏结束的状态称为终止状态。
  • 效用函数,效用函数(又称为目标函数或者收益函数),对终止状态给出一个数值。在井字棋中,结果是赢、输或平,分别赋予数值+1、-1或0。有些游戏有更多的可能结果,例如双陆棋的收益范围从-192到+192。

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

3 对抗搜索算法

给定一颗博弈树,有没什么方法找到最优解?我们介绍三种常见对抗搜索算法: 极小极大值算法、α-β剪枝、 蒙特卡罗树搜索算法。

3.1 极小极大值算法

由于井字棋这样简单的游戏,画出它的整个博弈树对我们而言也太复杂了,所以我们将转而讨论一个更简单的游戏,如图3-1-1中所示。

在根节点MAX的可能招数被标为a1、a2和a3。对于a1,MIN可能的对策有b1、b2和b3,依此类推。这个特别的游戏在MAX和MIN各走完一步后结束。这个游戏终止状态的效用值范围从2到14。
j2.png

图3-1-1

给定一棵博弈树,最优策略可以通过检查每个节点的极小极大值来决定,这里我们记为MINIMAX-VALUE(n)。假设在某一步以后两个游戏者都按照最优策略进行,那么这一个节点的极小极大值就是对应状态的效用值(对于MAX)。显然对于终止状态,极小极大值就是它的效用值。此外,已知一个选择,MAX将优先选择移动到一个有极大值的状态,而MIN选择移动到有极小值的状态。所以我们得到如下公式:

在这里插入图片描述

图3-1-2

我们在图3-1-1中的博弈树上运用这些定义。在最底层的终止节点已经标有它们的效用值。

在这里插入图片描述

图3-1-3

mx2.png

图3-1-4

在这里插入图片描述

图3-1-5

在这里插入图片描述

图3-1-6

极小极大值算法从当前状态计算极小极大决策。它使用了简单的递归算法,计算每个后继的极小极大值,直接实现定义公式。递归算法自上而下一直前进到树的叶节点,然后随着递归回溯,通过树把极小极大值回传。例如,在图3-1-4中,算法先递归到三个底层的叶节点,对它们调用UTILITY函数发现它们的值分别是3、12和8。然后它取三个值中的最小值3作为回传值返回给父亲节点,类似的过程持续到根节点。

在这里插入图片描述

图3-1-7

极小极大值算法假设了MIN也按最优招数行动,可以最大化MAX的最坏情况结果。如果MIN没有按最优招数行动怎么办?显而易见MAX可以做得更好。

3.1.1 极小极大值算法例子

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

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

图3-1-8

第二步:从叶子节点向上回溯,D节点是MAX节点,选择最大值4,同理得到同一层节点的值。

图3-1-9

第三步:递归上一层,该层为MIN节点,选择孩子节点的最小值,B节点为4,C节点为-3。

图3-1-10

第四步:再递归到上一层,是根节点A,选择孩子节点最大值4。因此对于MAX选手而言,最优路径为绿色路径,取得最大值为4。

图3-1-11

3.1.2 复杂度分析

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

在这里插入图片描述

图3-1-12

如图3-1-12所示,b是分支因子数,d是游戏者走的步数之和。

3.2 α-β剪枝

极小极大值算法对博弈树执行了一个完整的深度优先探索,问题是必须检査的游戏状态的数目随着招数的数量指数级增长,是否有办法优化,有可能不需要遍历博弈树中每一个节点就可以计算出正确的极小极大值策略。

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

重新考虑图3-1-1的两层博弈树。让我们再次全面观察最优决策的计算过程,这一次仔细注意过程中在每个节点我们所知道的信息。下图显示了每一步的解释。

图3-2-1
图3-2-2
图3-2-3
图3-2-4
图3-2-5
图3-2-6
图3-2-7
图3-2-8
图3-2-9
图3-2-10
图3-2-11
图3-2-12
图3-2-13

图3-2-13中,我们可以在不评价其中两个叶节点的情况下就可以确定极小极大值决策。从另一个角度来看,可以把这个过程视为对 MINIMAX- VALUE公式的简化。令在图中的C节点的两个没有评价的后继节点的值是x和y,并且z是x和y中的最小值。根节点的值由下面公式给出:

在这里插入图片描述

图3-2-14

换句话说,根节点的值以及因此做出的极小极大值决策独立于被剪枝的叶节点x和y。

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

图3-2-15

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

图3-2-16

α-β剪枝的效率很大程度上取决于检查后继的顺序。例如,在图3-2-13中,我们根本不能剪掉D的任何后继,因为首先生成了最差的后继(从MIN的角度)。如果第三个后继先生成,那么我们就能够剪掉其它两个。所以这暗示着先尝试检査那些可能最好的后继是值得的。

3.2.2 复杂度分析

在这里插入图片描述

图3-2-17

3.3 蒙特卡罗树搜索算法

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 蒙特卡罗方法的基本思想

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

3.3.2.1 计算Pi

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

在这里插入图片描述

图3-3-1

3.3.2.2 蒙特卡罗求定积分

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

在这里插入图片描述

图3-3-2

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

在这里插入图片描述

图3-3-3

3.3.3 UCB算法基础

如果博弈树非常庞大,按照极小极大值算法和α-β剪枝,那么对抗搜索的时间效率是十分低下的。蒙特卡罗树搜索算法就是优化博弈树搜索的算法。
下面先介绍UCB算法,这是MCTS的经典实现UCT(Upper Confidence bounds for Trees)里面用到的算法。公式如下:

图3-3-4

其中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
图3-3-5

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

  1. Expansion
图3-3-6

在前面选中的子节点中走一步创建一个新的子节点,一般策略是随机自行一个操作并且这个操作不能与前面的子节点重复。

  1. Simulation
图3-3-7

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

  1. Backpropagation
图3-3-8

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

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

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

图3-3-9

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

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

4 Alphago原理

4.1 架构

在这里插入图片描述

图4-1

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

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

在这里插入图片描述

图4-2

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

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

第二个层面则是现在的策略网络不再需要在19 * 19的方格中找出最可能落子位置,改良过的策略网络可以先通过卷积核排除掉一些区域不去进行计算,然后再根据剩余区域找出最可能位置,虽然这可能降低AlphaGo策略网络的威力,但是这种机制却能让AlphaGo计算速度提升1000倍以上。也正因为AlphaGo一直是根据整体局势来猜测对手的可能落子选择,也因此人类耍的小心机像是刻意下几步希望扰乱计算机的落子位置,其实都是没有意义的。

4.3 评价网络

在这里插入图片描述

图4-3

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

当然,这里提到的胜率会跟向下预测的步数会有关,向下预测的步数越多,计算就越庞大,AlphaGo目前有能力自己判断需要展开的预测步数。但是如何能确保过去的样本能够正确反映胜率,而且不受到对弈双方实力的事前判断(可能下在某处会赢不是因为下在这该赢,而是这个人比较厉害)。

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

在这里插入图片描述

图4-4

4.4 蒙特卡罗树搜索

在这里插入图片描述

图4-5

在这里插入图片描述

图4-6
  1. 选取:首先根据目前的状态,选择几种可能的对手落子模式。
  2. 展开:根据对手的落子,展开至我们胜率最大的落子模式(我们称之为一阶蒙地卡罗树)。所以在AlphaGo的搜索树中并不会真的展开所有组合。
  3. 评估:如何评估最佳行动(AlphaGo该下在哪?),一种方式是将行动后的棋局丢到评价网络来评估胜率,第二种方式则是做更深度的蒙地卡罗树(多预测几阶可能的结果)。这两种方法所评估的结果可能截然不同,AlphaGo使用了混合系数(mixing coefficient)来将两种评估结果整合,目前在Nature刊出的混合系数是50%-50%。
  4. 倒传导:在决定我们最佳行动位置后,很快地根据这个位置向下通过策略网络评估对手可能的下一步,以及对应的搜索评估。所以AlphaGo其实最恐怖的是,李世石在思考自己该下哪里的时候,不但AlphaGo可能早就猜出了他可能下的位置,而且正利用他在思考的时间继续向下计算后面的棋路。

5 对抗搜索总结

  1. 对抗搜索的适用范围
    有完整信息的、确定性的、轮流行动的、两个游戏者的零和游戏,这时我们就可以用上对抗搜索算法。

  2. 对抗搜索的主要思想
    对抗搜索的核心思想就是dfs遍历一遍博弈树。不难想到,如果博弈树非常庞大,在不加优化的情况下,对抗搜索的时间效率是十分低下的。因此,我们就需要对对抗搜索进行一定的优化。

  3. 对抗搜索算法

    • 极小极大值算法
    • α-β剪枝
    • 蒙特卡罗树搜索算法

声明

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

参考文献

[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/mini-max-algorithm-in-ai
[5] https://www.jiqizhixin.com/articles/monte-carlo-tree-search-beginners-guide
[6] http://jeffbradberry.com/posts/2015/09/intro-to-monte-carlo-tree-search/
[7] https://blog.csdn.net/chenxiaoran666/article/details/82809890
[8] https://blog.csdn.net/bitcarmanlee/article/details/82716641
[9] https://www.cnblogs.com/yifdu25/p/8303462.html
[10] https://www.cnblogs.com/neverguveip/p/9457226.html

猜你喜欢

转载自blog.csdn.net/weixin_45552760/article/details/102745721