AlphaGo学习笔记(一)------蒙特卡洛(一)

蒙特卡洛

注:本人在初学阶段,根据所读的文献并查阅资料有了自己的理解,难免有一些理解错误之处,希望大家不吝赐教,批评指正 :)
一.蒙特卡洛模拟
蒙特卡洛模拟是一种简单的基于模拟的搜索算法,用于从根状态s0评估候选招法。也就是每在一个盘面下,采用快速走子策略(rollout policy),随机落子,将所有的可能都全部模拟出来,不必考虑这招棋的能对自己产生多大利益,因为围棋本身也很难构造局面评估函数,而且计算机也根本不能知道某一步棋的好坏,干脆把所有的盘面全都模拟出来,然后在这每一盘面下,走出每招棋都会因此产生很多个结果,这些结果就可以算出一个胜率,这似乎就可以代表这招棋的优劣,下出这招棋,假如会产生100个结果,其中有90盘都是赢,10盘是输,那下出这招棋的胜率就是90%。在这里插入图片描述
二.传统算法中的极大极小搜索
在搜索树中,每次轮到黑棋走时,走对黑棋最有利的;轮到白棋走时,走对黑棋最不利的。由于围棋没有局面评估函数,只有依靠蒙特卡洛模拟来判断某步棋的好坏,因此也只有在叶子节点时才会计算评分,在树的中间层,对于计算机来说暂时是无法知道哪一个节点是最有利的。
因此极大极小搜索适合象棋,但不适合围棋。
如下图所示,B1的平均值为49%,B2的平均值为55%。看似黑方应该选择B2,但实际上,如果白方的水平足够高的话,那么白方必定会选择W4,而此时黑方的胜率只有45%。究其原因,似乎黑方还是应该选择48%的B1。
本人虽然不精通围棋,但是对中国象棋颇有研究,中国象棋有句话是"中局无二手"也就是说只有一招棋是正招,其他的都应该是骗招,只要对方应对得当,骗招都会失效并使骗招方落入下风。这似乎也迎合了这一想法。但是如果应对不得当,就能取得比正招更大的收益。也是印证了收益与风险并存。
AlphaGo学习笔记(一)------蒙特卡洛(一)_第1张图片
极大极小搜索算法应用于围棋的弊端:主要是搜索树太广和棋盘太大,每一方在每一步都有很多着法可选。其次很难评估胜率(没有局面评估函数)。除非把搜索树走到终局,这意味着要走够三百多步(因为对于电脑来说,甚至很难判断何时才是双方都同意的终局,所以只能傻傻地填子,一直到双方都真的没地方可以走为止;而象棋大概需要20-40回合就结束了)。简单地说,搜索树也需要特别深。

三. 蒙特卡洛搜索树:
蒙特卡洛树搜索的意义在于部分解决了上述两个问题:它可以给出一个局面评估,虽然不准,但比没有强。这就部分解决了第二个问题。根据它的设计,搜索树会较好地自动集中到“更值得搜索的变化”(注意,也不一定准)。如果发现一个不错的着法,蒙特卡洛树搜索会较快地把它看到很深,可以说它结合了广度优先搜索和深度优先搜索,类似于启发式搜索。这就部分解决了第一个问题。
蒙特卡洛搜索树步骤如下所示
AlphaGo学习笔记(一)------蒙特卡洛(一)_第2张图片

  1. 选择:从根节点往下走,每次都采用Upper Confidence Bounds(UCB)- 节点评估函数选一个“最值得评估的子节点”直到来到一个“存在未扩展的子节点”的节点,如图中的 3/3 节点。 “存在未扩展的子节点” 指这个局面存在未走过的后续着法,也就是指叶节点。
    Upper Confidence Bounds(UCB) 节点评估函数
    AlphaGo学习笔记(一)------蒙特卡洛(一)_第3张图片

其中 x 是节点的当前胜率估计(注意,如前所述,要考虑当前是黑棋走还是白棋走!),N 是节点的访问次数。C 是一个常数。C 越大就越偏向于广度搜索,C 越小就越偏向于深度搜索。注意对于原始的 UCT 有一个理论最优的 C 值,但由于我们的目标并不是最小化“遗憾”,因此需要根据实际情况调参。C的值与Exploration and Exploitation(开发与利用)相关。
例如对于7/10这个节点,x = 0.7,Nparent = 21 ,Nchild = 10

  1. 拓展:给这个节点加上一个 0/0 子节点,对应之前所说的“未扩展的子节点”,就是还没有试过的一个着法。
  2. 模拟:从上面这个没有试过的着法开始,用快速走子策略(Rollout policy)走到底,得到一个胜负结果。按照普遍的观点,快速走子策略适合选择一个棋力很弱但走子很快的策略。因为如果这个策略走得慢(比如用 AlphaGo 的策略网络走棋),虽然棋力会更强,结果会更准确,但由于耗时多了,在单位时间内的模拟次数就少了,所以不一定会棋力更强,有可能会更弱。这也是为什么我们一般只模拟一次,因为如果模拟多次,虽然更准确,但更慢。
  3. 回溯:把模拟的结果加到它的所有父节点上。例如第三步模拟的结果是 0/1(代表黑棋失败),那么就把这个节点的所有父节点加上 0/1。
  4. 蒙特卡洛树搜索和蒙特卡洛方法的区别
    如果用蒙特卡洛方法做上一百万次模拟,b1和b2的胜率仍然会固定在49%和55%,不会进步,永远错误。所以它的结果存在偏差当然,也有方差。
    而蒙特卡洛树搜索在一段时间模拟后,b1和b2的胜率就会向48%和45%收敛,从而给出正确的答案。所以它的结果不存在偏差(Bias),只存在方差(Variance)。但是,对于复杂的局面,它仍然有可能长期陷入陷阱,直到很久之后才开始收敛到正确答案

AlphaGo学习笔记(一)------蒙特卡洛(一)_第4张图片
四.快速行动价值评估(RAVE)和All-Moves-As-First:

  1. All-Moves-As-First:在电脑围棋等增量游戏中,棋步的价值通常不受棋盘上其他地方棋步的影响。即每一步棋都有它本身的价值,不会随着它何时出现而改变。(当然如果会下任何一种棋都会深有体会,这显然是不对的)
  2. 使用RAVE算法从状态s估计黑方的招法a和b的值的示例
    AlphaGo学习笔记(一)------蒙特卡洛(一)_第5张图片

从状态s执行了六次模拟,结果显示在底部的方框中。招法a会立即导致两次失败,因此蒙特卡罗估计更倾向于移动b。但是在任何后续时间出现招法a会导致五次赢三次,因此RAVE算法更倾向于移动a。

MC-RAVE:RAVE 算法学习速度很快,但它经常出错。 RAVE 的主要假设是,每一步棋都有它本身的价值,不会随着它何时出现而改变。这一假设通常是错误的。但该算法克服了这一问题,结合了RAVE 算法的快速学习以及蒙特卡罗树搜索的准确性和收敛性。
为了全面估计局面s下招法a的一个合法值,采用如下公式:
在这里插入图片描述
五.启发式先验知识(Heuristic Prior Knowledge)

  1. 启发式MCTS
    如果在仿真过程中遇到特定的很少出现的盘面s和招法a,则其蒙特卡洛值估计非常不确定且非常不可靠。此外,由于搜索树呈指数分支,因此树中的绝大多数节点是很少访问的。叶节点处的情况最少的:按照定义,每个叶节点仅被访问过一次(否则将添加一个子节点)。为了减少很少遇到的盘面的不确定性,我们将通过使用启发式评估函数H(s,a)和启发式置信度函数C(s,a)获得先验知识。当一个节点首次添加到搜索树时,它会根据启发式函数Q(s,a)= H(s,a)和N(s,a)= C(s,a)进行初始化。启发式函数的置信度是根据同等经验来衡量的:要获得与启发式值具有相似精度的蒙特卡洛值所需的模拟次数。初始化后,将使用标准的蒙特卡洛模拟照常更新值和计数。
  2. 四种启发式MC-RAVE算法思想
    1).The even-game heuristic(偶数游戏启发算法):Q even (s,a) = 0.5,假设强水平的选手之间对弈有机会遇到相同的盘面,此时的情况是旗鼓相当,一招棋并不能直接导致局面出现大的变化。
    2).The grandfather heuristic(祖父启发算法): Q (s t,a)= Q grand(s t,a)= Q(s t-2,a),假设黑方某一招法的值通常与其上上次走出该招法的值相似(当双方不会因为思考疏漏或者情绪等客观原因而造成的失误使得局面急转而下。当然计算机是不会出现这种情况的)。
    3).The handcrafted heuristic(手工制作的启发式算法): Q mogo (s,a),
    4).The local shape heuristic(局部形状试探法):(1,2我只是直译文章的意思,但还没与搞清楚什么意思,因为文章的想法和我的认知不太一样)
    六.结论
    1.计算机围棋程序通过使用基于人类对形状,图案和规则的专业知识的手工启发法来评估招法。但是,专业围棋运动员通常根据难以表达或量化的直觉来进行思考。将他们的知识精确地编码为机器可理解的规则已被证明是不可实现的。
    2.基于这些手工启发法的传统搜索算法无法应对围棋游戏中巨大的状态空间和分支因子,并且无法有效利用额外的计算时间。 这种方法导致了围棋程序充其量可以与较弱的业余水平的人水平相同。
    3.蒙特卡洛树搜索不需要知道任何人类知识即可理解局面。 取而代之的是,根据该位置上数千个自对弈的结果来思考下一招。 通过有价值的评估来优先选择下一招。 在许多模拟过程中,主要选择与成功结果相关的搜索空间来缩小搜索区域。
    4.与传统搜索算法不同,此方法在状态空间的大小和分支因子上都可以很好地扩展,并且在增加计算时间的情况下也可以很好地扩展。

你可能感兴趣的:(算法,人工智能,机器学习)