您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

蒙特卡洛树搜索入门教程

时间:2020-07-19 15:01:21  来源:  作者:

本文是对 Monte Carlo Tree Search – beginners guide 这篇文章的文章大体翻译,以及对其代码的解释。

1 引言

蒙特卡洛树搜索在2006年被Rémi Coulom第一次提出,应用于Crazy Stone的围棋游戏。

  • Efficient Selectivity and Backup Operators in Monte-Carlo Tree Search

蒙特卡洛树搜索大概的思想就是给定一个游戏状态,去选择一个最佳的策略/动作。

1.1 有限双人零和序贯博弈

蒙特卡洛树搜索实际上是一个应用非常广泛的博弈框架,这里我们将其应用于 有限双人序贯零和博弈 问题中。像围棋、象棋、Tic-Tac-Toe都是有限双人序贯零和博弈游戏。

1.2 怎样去表示一个游戏?

我们采用 博弈树 (Game Tree)来表示一个游戏:每个结点都代表一个 状态 (state),从一个 结点 (node)移动一步,将会到达它的 子节点 (children node)。子节点的个数叫作 分支因子 (branching factor)。 根节点 (Root node)表示初始状态(initial state)。 终止节点 (terminal nodes)没有子节点了。

在 tic-tac-toe 游戏中表示如下图所示:

「详细原理」蒙特卡洛树搜索入门教程

 

  • 每次都是从 初始状态 、树的 根结点 开始。在 tic-tac-toe 游戏里面初始状态就是一张空的棋盘。
  • 从一个节点转移到另一个节点叫作一个 move 。
  • 分支因子 (branching factor), tic-tac-toe 中树越深,分支因子也越少,也就是 children node 的数量越少。
  • 游戏结束表示 终止节点 。
  • 从根节点到终止节点一次表示一个单个游戏 playout 。

你不需要关系你是怎么来到这个 node ,只需要做好之后的事情就好了。

1.3 最佳策略是什么?minimax和alpha-beta剪枝

我们希望找到的就是 最佳策略 ( the most promising next move )。如果你知道对手的策略那你可以争对这个策略求解,但是大多数情况下是不知道对手的策略的,所以我们需要用 minimax 的方法,假设你的对手是非常机智的,每次他都会采取最佳策略。

假设A与B博弈,A期望最大化自己的收益,因为是零和博弈,所以B期望A的收益最小,Minimax算法可描述为如下形式:

  • 和 是玩家 和 的效益函数。
  • move 表示从当前状态 和采取的动作 转移到下一个状态。
  • eval 评估最终的游戏分数。
  • 是最终的游戏状态。

简单地说,就是给定一个状态 期望找到一个动作 在对手最小化你的奖励的同时找到一个最大化自己的奖励。

Minimax 算法最大的弱点 就是需要扩展整棵树,对于高分支因子的游戏,像围棋、象棋这种,算法就很难处理。

对于上述问题的一种解决方法就是扩展树结构到一定的阈值深度( expand our game tree only up to certain threshold depth d )。因此我们需要一个评估函数,评估 非终止节点 。这对于我们人类来说依据当前棋势判断谁输谁赢是很容易做到的。计算机的解决方法可以参考原文中的:

  • Chess position evaluation with convolutional neural network in Julia

另一种解决树扩展太大的方法就是 alpha-beta剪枝算法 。它会避免一些分支的展开,它最好的结果就是与minimax算法效果相同,因为它减少了搜索空间。

2 蒙特卡洛树搜索(MCTS)基本概念

蒙特卡洛通过多次模拟仿真,预测出最佳策略。最核心的东西就是搜索。搜索是对整棵博弈树的组合遍历,单次的遍历是从根结点开始,到一个未完全展开的节点(a node that is not full expanded)。未完全展开的意思就是它至少有一个孩子节点未被访问,或者称作未被探索过。当遇到未被完全展开过的节点,选择它的一个未被访问的childre node做根结点,进行一次模拟(a single playout/simulation)。仿真的结果反向传播(propagated back)用于更新当前树的根结点,并更新博弈树节点的统计信息。当整棵博弈树搜索结束后,就相当于拿到了这颗博弈树的策略。

我们再理解一下以下几个关键概念:

  • 怎么解释 展开 或 未完全展开 (not fully unexpanded)的博弈树节点?
  • 搜索过程中的 遍历 (traverse down)是什么?子节点如何选择?
  • 什么是 模拟仿真 (simulation)?
  • 什么是 反向传播 (backpropagation)?
  • 扩展的树节点中反向传播、更新哪些统计( statistics )信息?
  • 怎么依据策略(博弈树)选择动作?

2.1 模拟/Simulation/Playout

Playout/simulation是与游戏交互的一个过程,从当前节点移动到终止节点。在simulation过程中move的选择基于rollout policy function:

Rollout Policy也被称作快速走子策略,基于一个状态 选择一个动作 。为了让这个策略能够simulation快,一般选用随机分布(uniform random)。如下图所示

「详细原理」蒙特卡洛树搜索入门教程

 

2.1.1 Alpha Zero中的Playout/Simulation

在AlphaGo Zero里面DeepMind‘s直接用一个CNN残差网络输出position evaluation和moves probability。

2.2 博弈树节点的扩展-全扩展、访问节点

一个节点如果被访问过了,意味着某个某个simulation是以它为起点的。如果一个节点的所有子节点都被访问过了,那这个节点就称为是完全扩展的,否则就是未完全扩展的。如下图对比所示:

「详细原理」蒙特卡洛树搜索入门教程

 

在实际过程中,一开始根节点的所有子节点都未被访问,从中选一个,第一次simulation就开始了。

Simulation过程中rollout policy选择子节点是不被考虑为这个子节点被访问过了, 只有Simulation开始的节点被标记为访问过的 。

2.3 反向传播Simulation结果

从一个近期访问过的节点(有时候也叫做叶结点(left node))做Simulation,当他Simulation完成之后,得出来的结果就需要反向传播回当前博弈树的根结点,Simulation开始的那个节点被标记为访问过了。

「详细原理」蒙特卡洛树搜索入门教程

 

反向传播是从叶结点(simulation 开始的那个节点)到根结点。在这条路径上所有的节点统计信息都会被计算更新。

2.4 Nodes’ statistics

拿到simulation的结果主要更新两个量:所有的simulation reward 和所有节点 (包括simulation开始的那个节点)的访问次数 。

  • - 表示一个节点 的 simulation reward和 ,最简单形式的就是所有考虑的节点的模拟结果之和。
  • - 表示节点的另一个属性,表示这个节点在反向传播路径中的次数(也表示它有多少次参与了total simulation reward)的计算。

2.5 遍历博弈树

搜索开始时,没有被访问过的节点将会首先被选中,然后simulation,结果反向传播给根结点,之后根节点就可以被认为是全展开的。

为了选出我们路径上的下一个节点来开始下一次模拟,我们需要考虑 的所有子节点 , , , 和其本身节点 的信息,如下图所示:

「详细原理」蒙特卡洛树搜索入门教程

 

当前的状态被标记为蓝色,上图它是全展开的,因此它被访问过了并且存储了节点的统计信息:总的仿真回报和访问次数,它的子节点也具备这些信息。这些值组成了我们最后一个部分:树的置信度上界(Upper Confidence Bound Applied to Trees,UCT)。

2.6 置信度上界

UCT是蒙特卡罗树搜索中的一个核心函数,用来选择下一个节点进行遍历:

蒙特卡洛树搜索的过程中选UCT最大的那个遍历。

UCT 中第一部分是 ,也被称作 exploitation component ,可以看作是子节点 的胜率估计(总收益/总次数=平均每次的收益)。

看起来这一项已经有足够说服力,因为只要选择胜率高的下一步即可,但是为什么不能只用这一个成分呢?这是因为这种贪婪方式的搜索会很快导致游戏结束,这往往会导致搜索不充分,错过最优解。因此UCT中的第二项称为exploration component。这个成分更倾向于那些未被探索的节点( 较小)。在蒙特卡洛树搜索过程中第二项的取值趋势大概如下图所示,随着迭代次数的增加其值也下降:

「详细原理」蒙特卡洛树搜索入门教程

 

参数

用于平衡MCTS中的exploitation和exploration。

2.6.1 UCT in Alpha Go and Alpha Zero

在AlphaGo Lee和Alpha Zero算法里面,UCT公式如下:

是来自策略网络的move先验概率,策略网络是从状态得到move分布的函数,目的是为了提升探索的效率。

当游戏视角发生变化的时候exploitation component 也会发生变化。

2.6.2 Alpha Go和Alpha Zero中的策略网络

在 AlphaGo 算法里,有两个policy网络:

  • SL Policy Network :基于人类数据的监督学习所得的网络。
  • RL Policy Network :基于强化学习自我博弈改进SL Policy Network。

Interestingly – in Deepmind’s Monte Carlo Tree Search variant – SL Policy Network output is chosen for prior move probability estimation as it performs better in practice (authors suggest that human-based data is richer in exploratory moves). What is the purpose of the RL Policy Network then? The stronger RL Policy Network is used to generate 30 mln positions dataset for Value Network training (the one used for game state evaluation)

在Alpha Zero里面只有一个网络 ,它不仅是值网络还是策略网络。 It is trained entirely via self-play starting from random initialization. There is a number of networks trained in parallel and the best one is chosen for training data generation every checkpoint after evaluation against best current neural network.

2.7 终止MCTS

我们应该什么时候结束MCTS过程?如果你开始玩,那么你的“思考时间”可能是有限的(“thinking time” is probably limited),计算能力也是有限的(computational capacity has its boundaries, too)。因此最保险的做法是在你资源允许的情况下尽可能全展开遍历搜索。

当MSCT程序结束时,最佳的移动通常是访问次数最多的那个节点。因为在多次访问的情况下,评估它的 值必须很高。

「详细原理」蒙特卡洛树搜索入门教程

 

当你使用蒙特卡洛树搜索选择了一个动作,在对手眼里,你的这个选择将会变成状态的一部分。反过来对你也是一样的,当对手选择了一个状态之后,你的蒙特卡洛树搜索就可以开始工作了。利用之前的统计信息直接搜索就可以得出结果了。

3 MCTS总结

def monte_carlo_tree_search(root):
    while resources_left(time, computational power):
        leaf = traverse(root) # leaf = unvisited node 
        simulation_result = rollout(leaf)
        backpropagate(leaf, simulation_result)
    return best_child(root)

def traverse(node):
    while fully_expanded(node):
        node = best_uct(node)
    return pick_univisted(node.children) or node # in case no children are present / node is terminal 

def rollout(node):
    while non_terminal(node):
        node = rollout_policy(node)
    return result(node) 

def rollout_policy(node):
    return pick_random(node.children)

def backpropagate(node, result):
   if is_root(node) return 
   node.stats = update_stats(node, result) 
   backpropagate(node.parent)

def best_child(node):
    pick child with highest number of visits


Tags:蒙特卡洛树   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
本文是对 Monte Carlo Tree Search – beginners guide 这篇文章的文章大体翻译,以及对其代码的解释。1 引言蒙特卡洛树搜索在2006年被Rémi Coulom第一次提出,应...【详细内容】
2020-07-19  Tags: 蒙特卡洛树  点击:(327)  评论:(0)  加入收藏
▌简易百科推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Java技术那些事    Tags:时间轮   点击:(1)  评论:(0)  加入收藏
博雯 发自 凹非寺量子位 报道 | 公众号 QbitAI在炼丹过程中,为了减少训练所需资源,MLer有时会将大型复杂的大模型“蒸馏”为较小的模型,同时还要保证与压缩前相当的结果。这就...【详细内容】
2021-12-24  量子位    Tags:蒸馏法   点击:(11)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  老师明明可以靠颜值    Tags:算法   点击:(7)  评论:(0)  加入收藏
1. 基本概念希尔排序又叫递减增量排序算法,它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的;希尔排序是一种不稳定的排序算法...【详细内容】
2021-12-22  青石野草    Tags:希尔排序   点击:(6)  评论:(0)  加入收藏
ROP是一种技巧,我们对execve函数进行拼凑来进行system /bin/sh。栈迁移的特征是溢出0x10个字符,在本次getshell中,还碰到了如何利用printf函数来进行canary的泄露。ROP+栈迁移...【详细内容】
2021-12-15  星云博创    Tags:栈迁移   点击:(22)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15    晓掌柜丶韶华  Tags:排序算法   点击:(16)  评论:(0)  加入收藏
在了解golang的map之前,我们需要了解哈希这个概念。哈希表,又称散列表(Hash table),是根据键(key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算出一个键值的函数,将...【详细内容】
2021-12-07  一棵梧桐木    Tags:哈希表   点击:(14)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯·奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  小心程序猿QAQ    Tags:雪花算法   点击:(24)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  华章科技    Tags:排序算法   点击:(40)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  有AI野心的电工和码农    Tags: KMP算法   点击:(36)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条