蒙特卡洛树搜索
一、基本思想
要搞清楚蒙特卡洛树搜索的基本思想首先要明白什么是蒙特卡洛树?蒙特卡洛指的就是蒙特卡洛方法,又称统计模拟方法,是通过产生随机数来解决问题的方法,例如投针方法来计算Π。树就是我们数据结构中学的树结构,注意,这里不是二叉树,每个结点有多个孩子结点。搜索就是遍历树,找到最优解。
蒙特卡洛树搜索算法是一种用于决策的启发式搜索算法,在上《人工智能基础》这门课时,接触过几个启发式搜索算法,例如A算法。启发式搜索算法最重要的就是它的代价函数,A算法的代价函数为实际距离值+启发函数值,而蒙特卡洛树搜索算法的代价函数就是UCT函数(后面会介绍)。为什么要提到我之前学过的A*算法呢?因为蒙特卡洛树搜索的基本思想和我接触的启发式搜索算法都不同,蒙特卡洛树搜索是通过大量的随机事件来逼近真实结果,而它的启发信息也是通过大量的随机模拟结果反向传播得到的。
二、算法流程
蒙特卡洛树搜索算法分为四步,分别是选择(Selection)、扩展(Expansion)、模拟(Simulate)和反向传播(Backpropagation),蒙特卡洛树搜索一个最著名的应用就是AlphaGo,下面以下井字棋为例详细介绍这四步。
如图2.1表示井字棋中蒙特卡洛树的代表含义(图来源Monte Carlo Tree Search Beginners Guide),其中每个结点表示一个游戏状态,根节点就是初始状态(initial state),即游戏刚开始,两人都没落子。父节点在一次行动(a move)后,变成子节点的一种状态,父节点与子节点的边存储了该行为,子节点代表对手操作后的状态,终止结点(terminal node)表示游戏分出胜负的状态,从父节点到终止结点的一次遍历就是一次游戏的开始到结束。
2.1 选择(Selection)
从根节点开始,根据UCT函数选择一个最有潜力(the most promising)的子结点,直到当前节点的还有可扩展的子节点(表示还没模拟过所有的对手行动),UCT函数的定义如下:
其中vi表示当前节点, v v v表示 v i v_i vi的父节点, Q ( v i ) Q(v_i) Q(vi)表示vi节点胜利的次数,