首页 > 其他分享 >蒙特卡洛树搜索学习笔记

蒙特卡洛树搜索学习笔记

时间:2024-02-01 15:47:22浏览次数:30  
标签:估价 笔记 次数 搜索 蒙特卡洛 最优 评估

目录

前言

人工智能Alphago,成为最顶尖的围棋大师,不由得让人产生探索它背后的算法的兴趣。

在搜索空间巨大的围棋问题中,Alphago是通过什么算法能在较短的时间搜索每一个局面的(近似)最优解?

Alphago使用的算法如下:

  • 蒙特卡洛树搜索
  • 残余卷积神经网络 - 用于游戏评估和移动先验概率估计的策略和价值网络
  • 用于通过自我游戏训练网络的强化学习

蒙特卡洛树搜索的适用范围

蒙特卡洛树搜索算法本质上是一种启发式搜索算法。

通过蒙特卡洛方法设计出较为准确的估价函数,使得问题在仅需迭代较少的次数就能得出(近似)最优解。

通常,在博弈问题中可以采用蒙特卡洛数搜索。

对于以下情况特别适用:

  • 搜索空间特别大

  • 采用传统方法(如:dp,贪心)直接设计出特别通用的估价函数(比如围棋)

蒙特卡洛树搜索的作用

蒙特卡洛树算法用于求当前局面如何决策是最优的。

算法有什么用要先明确。

在围棋中,每次再对手走完一步新局面产生的时候,都要重新运行蒙特卡洛树算法找出面对当前局面自己的最优解。

算法流程

前置:蒙特卡洛方法

用途:评估当前局面选取哪个决策最优

以围棋为例,难以直接用传统的dp,贪心等方法涉及出估价函数。

这时可以采用蒙特卡洛方法:

对于每个局面,随机轮流走棋,直到最后定出胜负。

在随机走大量次数的时候,取获胜次数最多的。

这时一个正确性难以保证的伪算法:

对于某个局面的某步决策,如果对方有几乎所有情况都将处于劣势,但是只要有一种情况必胜,那么这样的决策是绝对不可能采取的。

但是直接采用上面的蒙特卡洛方法恰恰容易采取这样的决策,因为这种决策胜率特别高。


流程

算法的设计思路:

类似人的下棋思维,在考虑当前步骤如何走的时候:

先根据棋感在脑中选取最可能的几步,再想对手对于自己走完这步的最可能的几种做法,

以此类推,求出自己认为对自己最有利的方法。

蒙特卡洛树采取类似的思路,用蒙特卡洛方法求估价函数的过程就是利用模拟自己走哪步,对手走哪步选出对自己最有力利的。

具体流程:

简单描述:

蒙特卡洛树搜索每次从根开始,依次进行选择,扩展,模拟,回溯四个步骤完成一次迭代。

在限定的时间或迭代次数中尽可能多的进行迭代,然后取从根开始评估次数最多的一个儿子即为求出的最优解。

将结点看成到某一步决策之后的局面,将边看成某种决策。

首先,明确每个点在每次迭代只会至多被遍历一次,每次迭代的目的是为了更新评估和胜利次数。

注意:评估次数只在每次迭代回溯时更新一条链。

对每个节点记录两个值:

\(w_v:\) v结点的胜利次数。

\(n_v:\) v结点的评估次数。

选择(算法的核心)

首先将结点分类:

  • born:从来没有被评估过。
  • active:自己之前被评估过至少一次,下一步所有可能的决策能到的点中存在born的点(从来没有被评估过的)。
  • die:自己被评估过,在下一步所有可能的决策能到的点不存在born的点(从来没被评估过的)。

从根开始如果一个结点是die,就选儿子中最优的一个,搜索下去,知道找到第一个active的点,设为u。

在u的所有儿子中,随便选一个born的点进行第二步扩展。

如何在儿子中选择最优的:(蒙特卡洛树搜索算法的核心

\[UCT(v)=w_v/n_v+c\sqrt{\ln(t)/n_v} \]

\(t:\) 总评估次数,等于当前所有die和active点的 \(n_i\) 值之和。

\(c:\)参数,一般取\(\sqrt2\)

ln在c++中直接用\(log(t)\)

调参方法:c越大,评估次数越少的结点越可能评估到。

UCT的函数图像如下,由于后半段的存在使得某些一开始没有被评估到的结点也能被照顾到:

采用\(UCT\) 函数获得估价可以基本上解存在某种胜率高但是能让对手必胜的不合法情况。(尽可能避免了蒙特卡洛方法的弊端)

一开始,评估次数较少的时候胜率对选择一个结点的影响不那么大,随着评估次数的增加,胜率的影响越来越大。

UCT函数的核心是做到搜索次数少的时候不会完全受胜率影响,某些一开始胜率不高,但是后面胜率逐渐升高的最优决策能考虑到。

扩展

找到要扩展的点就把这个点建立出来,初值:\(n_i=w_i=0\)

然后进入第三步模拟。

模拟

采用蒙特卡洛策略,依次随机决策,直到最后确定胜负。

回溯

确定胜负后从扩展时新建立的点开始依次不断向父亲更新\(n_i,w_i\)的值。

若胜利:n++,w++

若失败:w++

若平局:n+=0.5

实现上,只需要存active和die的结点。

并且判断当前局面决策哪一步最优,只需要在到达一定的迭代次数之后取当前根结点评估次数最多的儿子即可。


优化

使用估价函数选择要扩展的点,而不是完全随机

按照传统方法涉及出估价函数,优先选择更好的结点扩展,从大到小。

每次将估价函数随机打乱一下可以确保估价一样的被随机访问到。

比如:五子棋第一步直接走中间是一定不会劣势的。

适当剪枝

在一些基本上不可能出现的决策可以不进行扩展。

比如不合法的情况,或者大概率处于劣势的情况(五子棋下在角上)

拓展

alphago采用了哪些优化?

1.模拟

alphago的模拟没有采用完全随机的方式,而是基于了一些既定策略和神经网络优化。

  • 一种带有手工特征的浅层 softmax 神经网络:采用自定义快速走棋策略的标准走棋评估
  • 估值网络:基于 13 层卷积神经网络的位置评估,训练自 Alpha Go 自我对弈的三千万个不同位置(没有任何两个点来自同一场游戏)
    而 alphago zero 迈出了更远的一步,他们根本就不进行模拟,而是用一个 19 层 CNN 残差神经网络直接评估当前节点。(神经网络可以输出位置评估,得出每个位置的概率向量)
    也就是说,利用神经网络,无需模拟,直接能算出每个位置的概率,可以说是直接消除了玄学问题。

2. 选择
既然已经不是真的通过「模拟」的出赢的次数和已经评估的次数,那么我们之前通过 UCT 值的大小来向下搜索、选择一个未访问的叶子节点的方法也需要作出相应修改。
函数变为:

img

其中 \(UCT(v_i, v)\) 表示从状态(节点) \(v_i\) 转移到 v 的价值评估,\(P(v_i, v)\)​ 表示从状态 v_i 转移到 v 的概率,

或者用一个术语叫做「移动的先验概率」,这个概率是用策略网络训练出来的,基于人类游戏数据集的受监督学习。

有趣的是,在 Deepmind 的蒙特卡洛树搜索变种里,由于监督学习策略网络在实际中表现更好,因此它的结果被用来估测行动先验概率)。

那么强化学习策略网络的目的是生成 3 千万位置数据集,用于训练估值网络(估值网络就是我们上一步说的用来替代「模拟」的网络)。而在 Alphago Zero 中只有一个网络,它既是估值网络也是策略网络。

它完全通过从随机初始状态开始进行自我对弈训练。并行训练多个网络,在每个检查点,基于当前最优的神经网络,评选出最优的网络用来生成训练数据。

总结

蒙特卡洛搜索算法是一种采用蒙特卡洛方法的和UCT函数进行估价的启发式搜索算法。

采用优秀的估价函数使得在搜索空间中用较少的迭代次数就能得到(近似)最优解。

算法流程上:为了确定当前局面什么决策最优。经过多次从根开始的迭代,经过选择、扩展、模拟、回溯构建蒙特卡洛搜索树,选取访问次数最多的儿子为最优决策。

清晰记忆UCT函数的计算方法是关键。

优化方向:

  • 按额外常规的方法设计估价函数,先访问最优的而不是完全随机。(为了保证估价相同的随机进行,可以先随机打乱。)

  • 剪枝:减掉不合法和大概率不优

参考文献

蒙特卡洛树搜索最通俗入门指南 - 知乎 (zhihu.com)

蒙特卡洛树搜索 MCTS 入门_python class-CSDN博客

蒙特卡洛树搜索(MCTS)详解-CSDN博客

蒙特卡洛树搜索 - 初学者指南 int8.io

蒙特卡洛树搜索(MCTS)学习笔记 - ouuan的博客

【04】蒙特卡洛树学习笔记 (sttev.com)

标签:估价,笔记,次数,搜索,蒙特卡洛,最优,评估
From: https://www.cnblogs.com/xulongkai/p/18001397

相关文章

  • 【学习笔记】二分图匹配 匈牙利(NTR)算法
    时间复杂度显然,这个算法的时间复杂度是O(一边的点数*边数)因为最坏情况就是每一个点都要把所有的边问一遍能不能匹配显然,常数极小另外可以留意一下数据范围,因为如果是稠密图(\(n=500m=2e5\)这种)就可以考虑邻接矩阵存图,方便判重边S准备以下是跑Ntr算法要用的一些东西如果题......
  • 强连通分量(SCC,Strongly Connected Components)学习笔记 & edited in 2024.01.31
    更新日志upd2024.01.31写好文章基本内容upd2024.01.31发表于洛谷upd2024.02.01同步发表于CSDNupd2024.02.01同步发表于博客园cnblogs强连通分量(SCC,StronglyConnectedComponents)定义强连通有向图(DAG)中若其中两点$x$,$y$能彼此到达(不一定是直接连边),称$x$和......
  • 回文树(回文自动机)学习笔记
    用途可以储存所有的回文串,也可用于向末尾插入新节点时动态维护最长回文串。思维过程观察可以发现,如果\(x\simi\)形成回文串,那么\(x+1\simi-1\)必须为回文串。对于任意一个已经确定是回文串的\(x+1\simi-1\)进行单次匹配,只需要比较\(s[x]\)和\(s[i]\)是否相等......
  • 学习笔记
    机器学习基础环境安装与使用库的安装miniconda3安装教程https://blog.csdn.net/HowieXue/article/details/118442904requirements.txt文件matplotlib==2.2.2numpy==1.14.2pandas==0.20.3tables==3.4.2jupyter==1.0.0各版本Anaconda的下载、安装和卸载(适用于Windows/......
  • GPU学习笔记
    GPU相比CPU更适合连续的同质的运算。原因:  GPU有更多算术运算单元(ALU)  支持多线程处理分支  wrap独占寄存器  ...单指令多数据(SIMD):每次取一条指令,应用到多个不同数据计算的计算上。单指令多线程(SIMT):会把程序分支分布到不同线程上,线程组执行每执行指令会更新掩码告......
  • 字符串算法学习笔记
    \(\text{Pt.}1\)基础一、进制哈希二、Manacher三、Trie\(\text{Pt.}2\)自动机自动机是什么?它是一个对“信息序列”进行判定的数学模型。“信息序列”可以很随意,比如一个二进制数,比如一个字符串。而“判定”也可以很随意,比如判定一个二进制数是不是奇数,判定当前字符串是......
  • 程序是怎样跑起来的第二章读书笔记
    根据本章内容知道了8位=1字节,了解了用二进制数表示计算机信息的原因。只要掌握了使用二进制数来表示信息的方法及其运算机制也就自然能够了解程序的运行机制,理解了为什么计算机处理的信息要用二进制数来表示的,近一步知道用二进制数表示计算机信息的原因。计算机内部是由IC”这种......
  • 蒻苟的第一篇学习笔记(快速排序)
    快速排序是一个非常经典也非常常用的排序算法。在平均状况下,排序n个项目需要Ο(nlogn)次比较,在最坏状况下则需要Ο(n2)次比较,但这种状况其实并不常见。快速排序是分而治之思想在排序算法上的典型应用。算法步骤:1.从数列中挑出一个元素,称为"基准"。2。设置两个"哨兵",利用......
  • 《程序是怎样跑起来的》阅读笔记 - 第一、二章
    简介:《程序是怎样跑起来的》是一本介绍计算机程序工作原理的畅销书籍。本文将对该书的前两章进行阅读笔记,主要涵盖了计算机基础知识和程序执行过程的基本原理。第一章:计算机基础知识本章主要讲解了计算机的基本组成部分以及它们之间的关系。作者通过引入一个简单的模型,描述了计......
  • 欧拉函数学习笔记
    前言本人能力有限,有错误欢迎指出。定义\(\varphi(n)\)表示的是小于等于\(n\)和\(n\)互质的数的个数。公式设\(n=\prod\limits_{i=1}^{s}p_i^{k_i}\),有\[\begin{aligned}\varphi(n)&=\prod_{i=1}^s\varphi(p_i^{k_i})\\&=\prod_{i=1}^sp_i^{k_i}-p_i^{k_i-1}\\&=\prod......