在本文中,咱们将在 PyTorch 中为 Chain Reaction[2]游戏从头开始实现 DeepMind 的 AlphaZero[1]。为了使 AlphaZero 的学习过程更无效,咱们还将应用一个绝对较新的改良,称为“Playout Cap Randomization”[3],以及来自 [4] 的一些其余技术。在训练过程中,将应用并行处理来并行模仿多个游戏,还将通过一些相干的钻研论文探讨 AlphaZero 的将来倒退方向。
本文目标不是用 AlphaZero 构建最好的游戏机器人机器人(因为这须要大量的计算资源),而是构建一个像样的机器人,至多能够击败随机的 Agent,以 Chain Reaction 游戏为例理解 AlphaZero 是如何工作的。
本节首先解释 Chain Reaction 游戏是如何工作的。如果你只是想理解 AlphaZero 的工作原理,请跳过下一节间接转到 AlphaZero 局部。
Chain Reaction
首先咱们从了解 Chain Reaction 游戏开始,这是一个完满的信息游戏,通过几步之后的游戏对咱们来说看起来十分凌乱和不可预测。所以我很好奇 AlphaZero 在这游戏中训练后会有多弱小。Chain Reaction 能够在许多玩家中进行,但在本文中将局限于两个玩家。
游戏规则
让咱们从这个游戏的规定开始。有一个 M 行 N 列的棋盘,两名玩家。每个玩家都有一种指定的色彩。出于本文的目标,假如咱们有一个红色玩家和一个绿色玩家,红色玩家先走。下图显示了游戏中的一些中间状态。
游戏板(简称黑板)上有 M 行 N 列,在上图中,M=N=5。黑板上有 M *N = 25 个单元格。在游戏开始时,所有的格子都是空的。
这些红色和绿色的圆形物体在游戏中被称为球体。下图显示了咱们在游戏中能够领有的球体(1 个,2 个或 3 个,红色或绿色)。
在一次操作中,玩家点击任何空的或色彩或玩家雷同的单元格,它将减少该单元格中的球的数量。上面的动图展现了游戏中的一些动作。
在一个特定的单元格中能够包容多少个球是有限度的。一个单元格最多能够保留“该单元格的正交相邻街坊数 -1”。对于两头的单元格,这个数字是 3,对于边缘的单元格,这个数字是 2,对于角落的单元格,这个数字是 1。下图显示了 5 ×5 板中每个单元的最大球体数。
但当玩家点击一个曾经领有最多球体数量的单元格时会产生什么呢? 那个单元格的球会决裂,把它所有的球推到邻近的单元格里。上面的动图显示了不同品种的球体的宰割。
在决裂过程中,如果相邻单元格蕴含来自其余玩家的球,那么这些球的色彩将扭转为以后玩家的色彩。如下图所示。
决裂后的单元格在其四周减少了球的数量,它能够导致进一步的屡次决裂,开始决裂的连锁反应,这就是游戏名字的由来。单步操作后的连锁反应是这款游戏最终不可预测的起因。
当初咱们晓得了游戏是如何从一个状态倒退到下一个状态的,可能会有决裂; 或者在单个单元格中减少一个球体。但玩家如何获胜呢? 游戏的指标很简略,玩家必须毁灭棋盘上所有敌人的球。
游戏状态
咱们须要存储什么信息来捕获游戏的状态呢? 有两样货色——首先,一个 M × N 数组,它通知咱们棋盘上每个 M * N 格子中的球的数量和类型,其次,轮到谁“红”或“绿”。咱们能够用负数来示意红色球的数量,用正数来示意绿色球的数量。下图显示了如何示意状态的示例。
状态转换
咱们晓得了如何示意一个状态,上面要关注一个更重要的问题,在以后状态下,如何失去下一个状态。为了取得下一个状态,须要晓得玩家点击的单元格。咱们称这个单元格为事件单元格。
将在事件单元格上做一些解决,它看起来像这样。咱们将向它增加一个球体,并查看球体的数量是否超过单元格的限度。如果球的数量超过了,咱们就须要把球决裂开。
在决裂的状况下,事件单元格的每个街坊都将取得一个球体,而后咱们将解决这些街坊,依此类推。咱们察看到,咱们首先处理事件单元格,而后处理事件单元格的街坊,而后处理事件单元格街坊的街坊,依此类推。在某个级别 i 的街坊,能够以任何程序解决; 以任何程序解决第 I 级上所有街坊的最终后果都是雷同的。下图就是一个例子。
两种不同的形式解决同一级别的单元格都会失去雷同的最终状态。第 i 层的解决程序不重要的起因是,第 i 层有两种单元格,决裂的单元格和没有决裂的单元格。那些没有决裂的单元格的球数只会减少一个,不论解决程序如何。那些决裂的单元格,只会给 i + 1 级的单元格减少一个球体。也就是说,第 i 级和第 i + 1 级的单元格汇合总是不相交的,因而第 i 级所有单元格的相加之和对于第 i + 1 级的每个单元格总是雷同的。
所以实质上是在做广度优先遍历,这能够借助队列来实现状态转换。
实现简略的游戏规则
状态
实现状态示意并不简单。将棋盘信息存储为不同 numpy 数组中的球的数量和球的色彩。状态示意还包含玩家的回合。
可视化
这些代码,别离应用矩形和圆绘制网格和球体。
控制器
这里是最重要的代码段,即状态转换,即在给定以后状态和事件的状况下取得下一个状态。
有一种状况是,球继续决裂,而其余玩家的球隐没,如下图所示。
这里须要查看玩家是否在广度第一次遍历 while 循环中博得了游戏。通过跟踪红色和绿色的球体计数 (作为 myorbs 和 opporbs) 来查看它,并在循环的每次迭代中更新它们。
AlphaZero
AlphaZero 到做了什么呢
[5]是了解 AlphaZero 的一个很好的终点。人类的推理有两种思维模式——一种是慢思维模式,一种是快思维模式。疾速模式由直觉疏导,而慢速模式像传统计算机算法一样明确遵循某些规定或步骤疏导。
在 AlphaZero 中,疾速模式或直觉都是通过一个神经网络实现的,该神经网络获取棋盘状态并输入一个策略 (操作的概率分布) 和一个值(通知以后玩家给定棋盘状态有多好的分数); 慢速思维模式则通过蒙特卡罗树搜寻实现。
对于一个游戏咱们可能会有一些本人的了解(教训),晓得哪些行为更好,哪些不好。这种最后的了解能够示意为行为的概率分布。咱们会将较高的概率调配给好的口头,而较低的概率调配给坏的口头(好的口头是那些可能带给咱们胜利的口头)。如果咱们没有这样的教训,那么咱们能够从平均概率分布开始。
这个操作上的概率分布就是咱们对于给定状态的“策略”。
有一种办法能够改良这一原始政策——提前思考将来可能采取的口头。从咱们以后的状态登程,咱们能够思考本人能够下什么棋,对手能够下什么棋等等。这种状况下咱们实际上是在探讨树搜寻,这种树搜寻能够通过应用咱们最后的了解来评估两头板的状态 (获取值) 来改良,并且可能不会破费大量的工夫来摸索具备低值的节点。在实现这个树搜寻之后,将更好地理解在以后棋盘状态下玩什么,或者说咱们失去了一个改良的策略。这整个过程被称为放大,这是 AlphaZero 应用蒙特卡洛树搜寻实现的。
下一篇文章咱们将具体介绍 AlphaZero 的一个简略实现。
References
[1] Silver, D., Hubert, T., Schrittwieser, J., Antonoglou, I., Lai, M., Guez, A., Lanctot, M., Sifre, L., Kumaran, D., Graepel, T., Lillicrap, T., Simonyan, K., & Hassabis, D. (2018). A general reinforcement learning algorithm that Masters Chess, Shogi, and go through self-play. Science, 362(6419), 1140–1144. https://doi.org/10.1126/scien…
[2] https://brilliant.org/wiki/ch…
[3] Wu, D. J. [PDF] accelerating self-play learning in go: Semantic scholar. https://www.semanticscholar.o…
[4] https://medium.com/oracledevs…
[5]“How to Keep Improving When You’re Better Than Any Teacher — Iterated Distillation and Amplification.”YouTube, uploaded by Robert Miles, 3 Nov. 2019, https://www.youtube.com/watch…
[6] Anthony, T., Barber, D., & Tia, Z. Thinking fast and slow with deep learning and Tree Search. https://arxiv.org/pdf/1705.08…
https://avoid.overfit.cn/post/773f735b3f714b8a83bf3f32531510de
作者:Bentou