强化学习(RLAI)读书笔记第十六章Applications and Case Studies(alphago)

强化学习(RLAI)读书笔记第十六章Applications and Case Studies(alphago)

16.6 Mastering the Game of Go

古老的中国游戏围棋已经困扰着人工智能研究者们几十年了。在其他游戏里能够取得人类级别甚至超越人类级别游戏水平的算法在围棋里应用的并不是很好。

直到2016年一个DeepMind的队伍研发了一个叫做AlphaGo的程序通过将深度ANN网络,监督学习,蒙特卡洛搜索树和强化学习进行组合打破了这个障碍。根据Silver2016年的论文,AlphaGo已经明显超出人类选手。

这里讲述AlphaGo和它的一个后继程序叫做AlphaGo Zero。除了强化学习以外,AlphaGo还利用了从人类专家对局中进行学习的监督学习算法,而AlphaGo Zero只使用了强化学习算法而没有使用任何游戏规则之外的人类数据或指导。首先介绍AlphaGo的细节以方便突出AlphaGo Zero的简洁。AlphaGo Zero是一个表现更好而且更纯粹的强化学习算法。

从某种程度上,AlphaGo 和AlphaGo Zero都是TD-Gammon算法的后继者,而TD-Gammon又是Samuel的checkers player算法的继承者。这些算法都包括了与算法本身的对弈。

围棋是两个玩家的游戏。这两个玩家分别执黑子和白子交替在一个19x19的棋盘上放置己方棋子在棋盘的交叉点上。这个游戏的目标是在棋盘上占据比对方更多的位置。棋子会根据简单规则被困住。如果一方的棋子周围都被另一方的棋子围住,那么这些棋子就会被困住。这个游戏进行到双方都不愿意再放置棋子为止。其他还有一些防止无穷的循环困子的规则。困子规则如下图所示:
在这里插入图片描述
在其他游戏中获得比较强游戏水平的方法在围棋中应用的并不好。围棋的搜索空间太大,每一次的合理走法也太多。但是搜索树的规模也并不是阻碍围棋程序的重点。即使是在一个9x9的棋盘上的围棋也非常难以使用这些方法得到好的表现。专家们同意制造一个超过业余选手的围棋程序的主要阻碍在于定义一个足够好的当前局势的评估函数。一个好的评估函数会使得搜索在一个合理的深度就停止且能够产生更深的搜索也将得到的一样好但是更容易计算的结果。

回忆8.11节讲述的MCTS算法是一个决策时的规划过程而不是为了学习和存储一个全局的评估函数。就像rollout算法,它运行很多次完整的蒙特卡洛仿真过程来选择每个动作。和普通的rollout算法不一样,MCTS是一个逐渐延伸搜索树的迭代过程,搜索树的根节点代表当前环境的状态。就像之前的图8.10一样,每次迭代都需要在数据的指导下穿越整个树,这些数据和树的边缘相关。在它的基础版本里,当一次仿真到达了搜索树的边缘时,MCTS通过为树添加叶子节点的一些或所有的孩子节点来拓展这棵树。然后从叶子结点或者新添加的孩子节点开始,执行一个rollout,也就是在rollout策略的指引下选择动作,从而仿真直到结束状态。当这个rollout结束,跟被穿越的搜索树的边缘相关的数据通过backing up传回进行这次迭代的更新。MCTS继续这个过程,每次都从当前状态作为根节点开始,进行满足时间限制下尽可能多的迭代。最后,根据当前状态作为根节点的搜索树得到的值来选择一个当前的动作。这就是智能体采取的动作。随着环境转移到下一个状态,MCTS会继续重复这个过程。下一次执行搜索的根节点有可能是一个新的状态,也有可能是前一个状态的一个后继节点,这样就可以以这个后继节点作为根节点开始,抛弃掉树剩下的部分。

16.6.1 AlphaGo

AlphaGo能够变成这么强的一个主要创新在于它使用了一个全新版本的MCTS。这个MCTS根据一个深度ANN作为函数逼近的强化学习算法学习出来的策略函数和值函数作为指导。另一个重要特点是与其选择从随机的网络参数开始训练,它选择从先前的以人类专家走子数据训练的监督学习得到的网络参数开始训练。

DeepMind把AlphaGo对于基础MCTS算法的改进版本叫做异步策略和值MCTS,或者叫APV-MCTS。它通过上面描述的基础MCTS进行选择动作,但是有一些改变在于它拓展搜索树边缘和评估动作边的方式。和基础的MCTS不同,基础版本是使用存下来的动作值从叶子结点开始来选择一个没有探索的边,而AlphaGo中实现的APV-MCTS算法是根据一个13层的深度卷积ANN来提供的概率来选择边从而延伸搜索树的。这个网络叫做SL-policy network,通过一个大概三千万次人类专家的移动数据训练的预测网络。(SL-policy应该就是在搜索树中选择采取的动作,应该是之前第八章中讲MCTS里讲的 tree policy)

之后依然和基础MCTS不同。基础版本的MCTS通过从新添加的节点开始的rollout的反馈来评估新添加的节点。而APV-MCTS里评估这个新加入的节点有两种方式:一个是通过rollout的反馈,还有一个是通过强化学习方法预先学出来的值函数 v θ v_{\theta} 。如果s表示的是新添加的节点,那么它的值就是: v ( s ) = ( 1 η ) v θ ( s ) + η G v(s) = (1-\eta)v_{\theta}(s)+\eta G ,其中G是rollout的反馈值, η \eta 是表示组合起这两种值的一个系数。在AlphaGo里这些值都从一个值函数网络得到。这个值函数是另一个13层深度卷积网络来构成的,输出是对每个棋盘状态的估计值,而它的训练过程下面有描述。APV-MCTS算法里的rollout过程是两个都使用rollout policy的程序进行的仿真模拟。这个rollout policy是一个简单的之前用监督学习训练好的线性网络。在rollout的执行过程中,算法计算穿过搜索树中每条边的数量。从根节点开始,被访问最多次的动作边对应的动作被选为下一步实际将要执行的动作。

值函数网络和SL-policy网络具有相同的结构,不过只有一个值作为输出而不是SL-policy那样输出对应每一个合理动作的概率。理想状况下值函数网络可以输出对应棋盘状态的最适合的估计值,并且有可能是使用和TD-Gammon里使用的相同的神经网络加TD( λ \lambda )的形式来表示。但是实际上DeepMind选择了一种另外的方式来为类似围棋这样复杂的游戏提供更多保证。他们把值函数网络的训练分为两个部分。第一部分里,他们先创造了一个目前他们可以用强化学习得到的最优的策略RL policy网络。这个网络和SL policy的结构也是一样的。它被用SL policy的使用监督学习学来的最终参数来初始化,之后使用policy gradient的方法进行在SL policy基础上的改进。第二步是使用用RL policy进行自我对弈产生的数据通过蒙特卡洛策略估计的方法来对值函数网络进行训练。

下图表示的是AlphaGo中用到的网络以及训练他们的叫做“AlphaGo pipiline”的步骤流程。这些网络都是在实时游戏之前训练,在实时游戏时保持固定。
在这里插入图片描述
下面是AlphaGo网络训练时候的一些细节。SL policy和RL policy用到的是和Atari游戏里一样的DQN网络,不过它们有13个卷积层以及最后一层对应着19x19棋盘上对应每一个点的softmax输出作为概率。网络的输入是一个19x19x48大小的图片形式的堆栈。其中棋盘上的每个点都使用了48位二进制或者整数形式的特征。比如,对于每个点来说,可以有一个特征是表示这个点是被本方占据还是对手占据或是没有棋子。这样就表达出棋盘的原始表示。其它的特征可以是基于围棋的规则,比如周围的点有没有被占据,周围有多少空的位置,把棋子放在这个点会吃掉对方几个子等等他们认为围棋中比较重要的特征。

训练SL policy大概在一个分布式的50个处理器上使用随机梯度下降法训练了3周。这个网络达到了57%的准确率,超过了当时已知最好的44.4%。训练RL policy网络是通过将当前策略与随机选一个同一个学习算法以往版本的策略作为对手进行仿真对局的结果来进行策略梯度强化学习的。从以往的策略里随机选择作为对手会防止当前策略过拟合。奖励信号设置为胜利得到+1,输了-1,否则0。这些模拟对局都是直接使用RL policy而没有使用MCTS进行选择动作。通过在50个处理器上并行模拟,DeepMind可以一天训练一百万局游戏。最后 测试最终的RL policy时,RL policy可以对SL policy保持80%的胜率,对战一个每次移动都搜索100000局游戏的MCTS围棋程序保持85%的胜率。

值函数网络的结构是和SL以及RL policy一样的,只不过是它最后的输出层只有一个标量值。输入也是一样的,不过值函数网络的输入多了一个表示当前执白子还是黑子的二进制量。使用了蒙特卡洛策略评估(MC policy evaluation)方法来训练这个值函数网络,训练数据是RL policy进行自我对局得到的数据。为了防止用一局中的连续状态训练导致的过拟合,DeepMind构造了一个包含三千万次走子的数据集,从中随机选择出不同对局的走子过程作为训练数据。这个训练使用了五千万次minibatch,每个都包含32次从数据集中选择的走子。训练在50颗GPU上花了一周。

rollout policy是在实际对局之前使用了一个简单的监督学习的方法进行训练的线性网络,使用了一组八百万次人类走子的数据集。rollout策略网络需要快速但是相对准确地输出动作。原则上,RL policy或者SL policy应该被用来作为rollout策略,但是使用它们就需要在进行rollout仿真时进行耗时的前向传播算法,而在每次实时对局时需要进行大量的rollout仿真,因此,rollout policy采用了更简单的网络结构,它的输入特征可以比那两个策略网络的被更快的得到。使用的rollout policy大概支持AlphaGo使用的每一个进程在每秒钟产生1000次完整的模拟对局。

可能有人疑问为什么不用更好的RL policy而是在APV-MCTS的拓展阶段选择动作时使用SL policy。这两个网络是同样耗时的因为他们结构相同。实际上他们发现AlphaGo在使用SL policy时比使用RL policy时与人类对局表现得更好。他们认为这可能是因为SL policy训练过程使用了人类专家对局,更加适应人类的走法。而在训练值函数网络时情况相反,使用SL policy训练得到的值函数网络的表现没有使用RL policy训练得到的效果好。

很多方法一起合作带来了AlphaGo惊人的表现。DeepMind对比使用不同方法的AlphaGo性能来评估不同方法带来的贡献。其中 η \eta 是控制搜索树中节点估计值使用值函数网络和rollout结果的混合程度的系数。当 η = 0 \eta=0 时AlphaGo只依赖值函数网络,而它为1时只依赖rollout的评估结果。他们发现AlphaGo只使用值函数网络时比只使用rollout评估结果的效果要好,也比当时其它所有的围棋程序要好。而当 η = 0.5 \eta=0.5 得到的效果最好。这表明将值函数网络和rollout评估的结果组合起来对AlphaGo的成功非常重要。这两种方法互相补充:对比较高性能的RL policy进行评估的值函数网络在实时游戏时用起来太慢,而使用了更弱策略但是运行更快的rollouts能够在实时游戏时遇到的局势提高胜率。

总的来说,AlphaGo的成功带来了新一轮对于AI的研究热潮,特别是对于结合强化学习与神经网络的方法去解决其它领域的难题。

16.6.2 AlphaGo Zero

基于构建AlphaGo的经验,DeepMind团队有做出了AlphaGo Zero。和前一代相反,这个程序没有使用任何额外的人类对局的知识(也就是Zero的来由)。它仅仅是通过使用了简单围棋的表示进行自我对弈来进行强化学习。AlphaGo Zero实现了一个policy Iteration,也就是交替进行policy Evaluation 和policy improvement。下图是AlphaGo Zero算法的概览。
在这里插入图片描述
一个重要的不同是,AlphaGo Zero在自我对局时也使用了MCTS算法,而AlphaGo仅仅在实时游戏的时候使用了。其他的不同点是AlphaGo Zero没有使用人类设计的特征和人类对局数据,而且只用了一个深层卷积网络而且使用了更简单的MCTS。

AlphaGo Zero的MCTS更简单,因为它并没有完全仿真一个完整的对局,因此它不需要一个rollout policy。每次AlphaGo Zero迭代的MCTS都在当前搜索树的叶子节点结束,而不是完成一整局游戏的仿真。但是像AlphaGo一样,在AlphaGo Zero里每次MCTS的迭代也由一个深度卷积网络的输出来进行指导。在图中网络被表示为 f θ f_{\theta} ,其中 θ \theta 表示的是网络的参数。这个网络的输入是棋盘局势的原始表示,而他的输出分为两部分,一个是一个标量 v v 表示的是当前局势的胜率,以及一个向量 p p ,表示的是在当前局势下在每个位置放置棋子或者跳过或认输等动作的概率。

但是AlphaGo Zero并不是直接将这些动作的概率直接应用到自我对局的动作选择中,而是把这些动作和估值 v v 一起来指导MCTS的执行。而MCTS最终会输出一个新的每个动作的概率值,在图中用 π i \pi_{i} 表示。这些策略在每次执行时会从MCTS执行的许多仿真过程中得到改进。这样做的结果是,AlphaGo Zero实际上遵循的策略是卷及网络输出 p p 进行改进之后的结果。Silver写到“因此MCTS可以被看做是一种强大的policy improvement的方式“。

下面是AlphaGo Zero更多的训练细节。这个卷积网络的输入是一个19x19x17的由17个二进制特征平面组成的图片栈。前八个特征表示的是本方棋子前8手在棋盘上占据的位置的原始表示,1表示占据,0表示没有。接下来八个特征表示的是对手棋子前8手的占据位置的表示。最后一个表示当前执黑白子,1表示黑,0表示白。因为围棋中不允许先手带来的优势,因此执先手的玩家需要进行一定的补偿。也因此当前棋盘棋子的位置表示还不是围棋的一个马尔科夫状态。这也是为什么我们需要过往的棋盘位置以及表示当前本方颜色的特征。

这个网络是一个两头的网络,意味着在起初的一些网络层之后,网络分成了两个部分,分别得到两个部分的输出。第一部分是有362个输出单元,表示的是19*19+1个放置棋子的动作和pass动作的概率。另一部分表示的是一个标量 v v ,用来评估当前局势下本方获胜的概率。这个网络在分开之前有41个卷积层,每个都使用了batch normalization,而且在每一对网络层之间进行了各层连接实现了残差网络。总之,动作概率和评估值分别由43层和44层网络计算得到。

从随机的参数开始,网络使用了随机梯度下降进行训练(以及momentum,正则化以及步长参数的逐渐减小),使用了遵从最新策略进行的最近五十万次自我对局的数据中随机采样得到的采样进行训练。还加了一些额外的噪音来鼓励网络的输出 p p 去探寻所有可能的动作。每一千次训练步之后进行一次检验,使用当前最新的参数(每次选择动作进行1600次MCTS)与当前最好的策略进行400次对局。如果新策略获胜那么它就会作为新的最好的策略。这个网络的参数被更新为使得网络得到的策略 p p 更加接近从MCTS中得到的策略,而且让评估值v更加接近使用当前最好策略从当前局势下能够获胜的概率。

DeepMind使用了3天用了490万次自我对弈进行训练。游戏时的每次动作选择都使用1600次MCTS迭代,大概每次移动需要0.4秒。每次网络的更新由一个2048个移动过程的batch组成,一共有70万个batch。之后他们和4比1击败了李世石的AlphaGo进行比赛,最终100比0战胜老版AlphaGo。

他们也和使用了监督学习的围棋程序进行比赛。这些监督学习的程序学习预测人类专家的动作。一开始时这些监督学习的程序比AlphaGo Zero表现得好,在预测人类动作上也更好,但是在AlphaGo Zero训练一天后就被打败了。这说明AlphaGo Zero已经发现了一些和人类专家不一样的移动方式。

最终的AlphaGo Zero算法的测试是使用了一个有更大网络的从随机参数开始在两千九百万次自我对弈数据上训练了40天的程序。这个版本的Elo分数是5185。他们和AlphaGo Master进行对比,AlphaGo Master和AlphaGo Zero结构一样但是使用了人类的数据和特征,Elo得分是4858。最终结果是AlphaGo Zero 89比11战胜了AlphaGo master。

AlphaGo非常有力地证明了,在简单的MCTS和使用很少的领域知识且不依赖人类经验和数据的深度神经网络的帮助下,仅仅使用强化学习就能得到超越人类的表现。我们肯定会看到在AlphaGo Zero的激励下出现其他领域相似的例子。

猜你喜欢

转载自blog.csdn.net/qq_25037903/article/details/83351801
今日推荐