蒙地卡罗搜索树MCTS

虽然说AlphaGO名堂更大一点,但它的后代AlphaZero其实更简单好理解一些,而且也更强大一些。所以本专栏主要介绍AlphaZero为主。

我们在上一篇学习了MCTS的直觉和UCB方法,现在我们重新整理MCTS算法。

如果对MCTS的直觉还不是很了解,可以看上篇专栏:

张斯俊:蒙地卡罗搜索树MCTS的直觉[AlphaZero理论篇之二]​zhuanlan.zhihu.com

MCTS分为3步,我们逐步来看。

  1. select, 选择动作,选择动作就要用到我们刚才说的UCB。
  2. expand, 扩展节点。
  3. update, update就是之前我们讲到的,把胜负的评价返回给每一次的动作。

为了大家能够更加了解这一过程,我们把一些数据结构画出来。我们来做一个过程的演示。

假设,当前MCTS如图:

MCTS中的每个节点,表示一个动作。同时记录以下一些信息。

  • n: 表示该节点被访问次数。我们会从根节点出发,进行多次的尝试。每次尝试会经过的节点,n将会加1
  • P:动作对应的概率,可以理解为策略。
  • U:记录UCB上限
  • Q: 该节点价值

关于nPUQ的意义,我们可以先放一下,后面会有更详细的说明。

需要说明的是,根节点其实也是一个包含n,P,U,Q信息的节点,不过我们并不关心根节点,因为我们想知道的是,我们应该选哪个动作。

现在我们开始流程:

  • Select(选择):从根节点,选择1个动作执行,直到叶子节点。如图,这次执行路径由红色线条表示。

那动作选择的理由是什么呢?就是UCB。不过AlphaZero在UCB的基础上做出了修改。

我们直接给出alphazero中用的UCB计算公式:Max(Q+U),其中U的公式:

我们选择最大的U+Q值的动作,然后执行。状态将会随之变化,进入新状态。

  • Expand(扩展):到了叶子节点,如果还没到最终状态,我们开始扩展。
  • 我们需要先确定,我们当前能够执行的动作有哪些。
  • 用神经网络进行预估,需要预估两个值:
    • 当前叶子节点的价值(leaf_value)
    • 从这个叶子节点扩展出去的新叶子,他们的P值。
  • 把这些动作都对应到一个MCTS节点。在实做上,我们会用字典结构进行对应。

如图,在扩展后,这棵树将会多一层。

  • update(更新):

在更新的时候,我们会回溯更新,也就是从当前叶子节点,一直回到根节点。

更新的内容包括两个:

  • 沿途经过的节点路径,次数加1。
  • 我们在expand的时候,用神经网络预估了叶子节点A的价值(leaf-value),用来更新沿途节点的Q值。更新方式用增量更新即可,因为我们已经会记录经过的次数了。

这里需要更详细说明一下原理:

我们假设叶子节点A,表示玩家甲,面对状态S2的动作(图中绿框部分)。并预估了叶子价值。叶子价值越大,表示这个动作对甲越有利,甲也越应该选择A动作。

还记得我们在MCTS的直觉那一小节提到的内容吗?这个动作对甲越有利,对手已就应该降低达到S2局面的概率,也就是说,应该减少上手的动作的价值(图中绿框部分)。

所以,我们要针对不同的双方的动作的执行顺序进行更新。叶子节点的玩家的所有动作,都应该正向更新leaf-value。他的对手应该反向更新leaf-value。

我们下一次进行select,会同样会以Max(Q+U)作为选择的依据。现在我们对Q进行修改。下一次select就可能会执行其他路径。当执行次数足够多,就会达到一个平衡状态——你没能占我的便宜,我也没能占你的便宜。我们说这样就达到了一个纳什均衡

最终,我们会选择,经过次数最多的那个动作作为我们真正选择的标准。注意:这里不是Max(Q+U)。也就是说,我们最终选择,是基于纳什均衡的选择。

相关公式的理解

我们说完MCTS的流程,现在回来再看一下这关键的公式,我们先看这部分:

公式中,N'表示父节点被访问次数,N表示当前节点被访问次数。这部分就充满了UCB的思想了。为了方便讨论,我们先给这部分起个名字UCB系数

我们举个例子,某父节点下有两个子节点A1和A2,被访问次数分别是N1和N2。

由树结构我们知道,如果我们访问过一个节点,那么我们肯定也访问过他的父节点。所以我们可以知道N1 + N2 = N'

当某个子节点被访问次数越来愈多,例如,N1越来越大,父节点被访问次数和N1的差距将会越来越小,UCB系数也会越来越小。

但相应的,它的兄弟节点是不变的,但父节点被访问次数多了。所以他们的UCB系数将会越来越大。

一边系数是越来越小,但兄弟节点的系数将会越来愈大。当访问次数足够多的时候,也会尝试进行探索性行为。

这就是这个公式中UCB的意义。

回到AlphaZero

现在我们来关心公式中的另外一部分:P和Q。

我们之前说过,P可以理解为策略,Q可以理解为行为的价值。

当我们忽略UCB系数的时候,我们需要Max(Q+U),相当于:Max ( Q + C * P ), 其中C是一个超参数。

于是从这个公式我们可以这样理解(当然这只是我个人理解。)

通过我们之前对强化学习的理解,Q和策略通常是一致的。因为越有价值的动作,证明它未来获得的奖励越多,所以我们的策略需要更倾向使用这个动作。

AlphaZero可能觉得,如果让学习策略同时学习动作的Q值,学习将更有效率。所以AlphaZero的网络是一个双引擎学习网络。

这样我们就可以理解参数C,是策略和动作Q价值的换算单位。它把Q值和策略联系了起来,我们可以把它称为效用

现在我们可以开始理解AlphaZero的网络了。

正如我们之前说的AlphaZero的网络是一个双引擎学习网络。它既要学动作价值Q,也要学策略

所以网络会吃入一个状态,输出Q值,也输出叶子节点的所有动作的策略P值

注意:网络只用在MCTS扩展叶子节点(expand)之前。一旦expand出来之后,就没网络什么事了。

这里可能要多说一句,有的同学可能不明白,为什么AlphaZero需要网络呢?就MCTS不好吗?按上面说的,纯MCTS就能达到纳什均衡的效果呀。

是的,其实AlphaZero的核心真不是网络,是MCTS。网络的作用是辅助MCTS。

或者说,用网络去保存(或者拟合)MCTS中,每个动作节点的Q和P。这就有点像我们在学DQN的时候,就是用网络去保存Qtable里面的Q值一样。只不过在AlphaZero里,我们的神经网络不是去保存一个表格,而是保存一棵树而已。

纯MCTS在开始使用的时候,会使用平均策略和相等的Q值代替网络的估值。当经过一段时间后(如果MCTS树不是很大的话),纯MCTS的确也能够达到纳什均衡状态。但当我们有一个网络去保存之前学到的Q和P作为叶子初始化,MCTS自然更快地学习到嘛。

所以,当我们在玩一种比较简单的游戏,例如井字棋,这种状态空间较少的游戏,MCTS也能很快达到均衡状态,网络感觉上是没什么用的。但在围棋这种状态树特别深特别宽的棋类,网络的优势就体现出来了。

我在实战中用过AlphaZero算法玩一种类似21点的游戏,并尝试用纯MCTS和AlphaZero进行对战。 在同样模拟步数的情况下,当MCTS运算步数足够多能够探索到树的所有空间时候,AlphaZero和MCTS的胜率相当。但当步数比较少,AlphaZero的优势就很明显了。

说回网络,根据我们之前学到的知识,我们知道网络的学习要设定好目标。AlphaZero是双引擎的网络,就需要两种目标。

  • Q的目标:动作价值的目标很简单。因为最终胜利和失败会产生结果z,也就是对胜利和失败者的reward。我们让Q向z更新。
  • P的目标:P的目标不是去靠近MCTS节点中的P值,因为P值在回溯的时候是不会变化的。但我们之前讲过,MCTS某条路径被访问次数越多,越接近纳什均衡的策略,越应该被我们采用。所以我们策略的目标是把输出的策略向最多访问次数的动作靠近。

总结

AlphaZero牵涉到的知识点比较多,但最终还是以MCTS作为核心,网络辅助。

我们先说MCTS

  1. MCTS的直觉: 我们说MCTS的任务就是找纳什均衡。找的方式是不断进行游戏,然后根据输赢反馈这一路上的动作是否合适。胜利一方提高所有的行为的效用,而失败方减少动作效用。最终就能达到一种均衡的状态。

2. MCTS的建立:

  • select 以Max(Q+U)作为依据选择动作,直到叶子节点。
  • expand 把叶子节点扩展
  • update 把一路上的节点访问次数+1 更新节点的Q值

3. AlphaZero用的UCB公式:

这部分就是UCB的意味,大家可以对照原来置信区间上界来细品。

当AlphaZero select的时候,我们会用Max(U+Q)。我们可以把U+Q看成

Q + C * P

其中Q是动作价值,P是策略,C是一个参数,起到一个接通动作和策略之间的桥梁纽带作用。

4. AlphaZero的网络是一个双引擎网络,既学习价值Q,也学习策略P。

Q的更新目标很简单,因为MCTS最终会不断调整。所以我们只需要把输出的Q向经过MCTS修改后的Q靠近即可。

MCTS到达平衡状态后,某个选择将会特别多,所以我们把策略向这个动作靠近即可。

AlphaZero的思路并不复杂,用一句话来说,就是用深度神经网络辅助MCTS找到均衡点。但其中的细节特别多。

如果对实做的同学有兴趣,请留意下一实战篇。

为什么败者树的访问外存次数要比胜者树少_为什么说蒙地卡罗搜索树MCTS是AlphaZero的核心?[AlphaZero理论篇之三]...相关推荐

  1. 3层b+树索引访问磁盘次数_【112期】面试官:为什么选择B+树作为数据库索引结构?谈谈你的理解

    本文同步Java知音社区,专注于Java 阶段汇总集合:++小Flag实现,一百期面试题汇总++ 背景 首先,来谈谈B树.为什么要使用B树?我们需要明白以下两个事实: [事实1] 不同容量的存储器,访 ...

  2. 3层b+树索引访问磁盘次数_从B+树到LSM树,及LSM树在HBase中的应用

    点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多资源 大数据技术与架构点击右侧关注,大数据开发领域最强公众号! 暴走大数据点击右侧关注,暴走大数据! 前 ...

  3. 3层b+树索引访问磁盘次数_深入理解MySQL索引底层实现原理丨技术干货

    一.索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构. 我们知道,数据库查询是数据库的最主要功能之 ...

  4. 胜者树与败者树, 多路平衡归并外部排序

    胜者树与败者树   胜者树和败者树都是完全二叉树,是树形选择排序的一种变型.每个叶子结点相当于一个选手,每个中间结点相当于一场比赛,每一层相当于一轮比赛. 不同的是,胜者树的中间结点记录的是胜者的标号 ...

  5. 胜者树和败者树 - qianye0905 - 博客园

    胜者树和败者树 - qianye0905 - 博客园 胜者树和败者树 胜者树和败者树都是完全二叉树,是树形选择排序的一种变型.每个叶子结点相当于一个选手,每个中间结点相当于一场比赛,每一层相当于一轮比 ...

  6. PHP结合Redis来限制用户或者IP某个时间段内访问的次数

    $redis = new Redis(); $redis->connect('127.0.0.1', 6379); //获取客户端真实ip地址 function get_real_ip(){ s ...

  7. linux扁平化设备树,如何从Linux驱动程序访问和调试FDT / DTS设备树(seg-fault)

    我编写了一个Linux内核模块,作为基于Freescale P2020RDB的定制板的FPGA驱动程序.驱动程序包含多个#defines来指定各种地址,大小,总线宽度等.我想从驱动程序中访问板的扁平化 ...

  8. b树与b+树的区别_Linux内核-数据结构系列(B树、B-树、B+树)的区别

    一.B树 (二叉搜索树) B 树可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点. 根节点至少有两个子节点 每个节点有M-1个key,并且以升序排列 位于M-1和M key的子节点 ...

  9. 高度为5的3阶b树含有的关键字个数_B-树和B+树的应用:数据搜索和数据库索引...

    B-树 1 .B-树定义:有序数组+平衡多叉树 B-树是一种平衡的多路查找树,它在文件系统中很有用. 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树: ⑴树中每个结点至多有m 棵子树 ...

  10. 种树:二叉树、二叉搜索树、AVL树、红黑树、哈夫曼树、B树、树与森林

    虽然今天不是植树节,但是我今天想种树. 文章目录 树,什么是树? 二叉树 定义 二叉树的创建 二叉树的前中后序遍历 前序遍历: 中序遍历 后序遍历 已知前序.中序遍历结果,还原二叉树 已知后序.中序遍 ...

最新文章

  1. 用Anko和Kotlin实现Android上的对话框和警告提示(KAD 24)
  2. 如果有人问你关系数据库的工作原理,叫他看这篇文章How does a relational database work
  3. [转载]通过Arcgis Server向MXD中添加图层
  4. 腾讯云全面更新数据智能服务全景图!
  5. 手把手教你用ECharts画饼图和环形图
  6. RDP协议详细解析(四)
  7. 【图像处理】【去模糊】图像去模糊的原理
  8. 【免费分享】收集整理的117套各类微信小程序模板源码分享
  9. android 10 多开,多开分身安卓10版
  10. Redis常用密令以及使用java连接操作redis
  11. 阿里云Docker仓库
  12. iOS_21团购_拼音搜索
  13. 浏览器有网微信没网络连接服务器,电脑可以登陆微信但是浏览器无法联网是怎么回事儿...
  14. 间断点怎么求?——6个例子来详细解析较难的间断点的求法
  15. 使用Python API实现TRT版BN/hswish/Silu等算子
  16. 号外:八百呼的录音话机现场“教学”管理企业
  17. java程序的可移植性
  18. 【小游戏】Unity游戏愤怒的足球(小鸟)
  19. 最简单直白的Linux入门介绍+VMware虚拟机搭建服务器
  20. OpenVINO 2021r2 C++ 超分辨率重建 Waifu2x

热门文章

  1. 旅游大数据:从投资决策到分析工作的常态化
  2. IHttpHandler给图片加水印
  3. hdu2369 Broken Keyboard(类似dfs)
  4. 各种隐藏WebShell、创建、删除畸形目录、特殊文件名的方法
  5. Gmail priority inbox帮助你减少工作量
  6. 径向误差、偏心误差和薄棱镜误差
  7. 【CVPR2005】梯度方向直方图(Histogram of Oriented Gradients,简称HOG)
  8. sar —— Linux 上最为全面的系统性能分析工具之一
  9. python随机生成6位数验证码
  10. [转载]从MyEclipse到IntelliJ IDEA-让你摆脱鼠标,全键盘操作