由于AlphaGo算法比较复杂,所以将分为两部分进行介绍:
预测篇
训练篇
之前我们说过AlphaGo算法是基于蒙特卡洛树搜索(MCTS)以及神经网络的一个算法,在之前的教程中我们已经完整的介绍并实现了蒙特卡洛树搜索算法以及五子棋。
我们这次教程的目的就是:假设已经有了一个训练好的AlphaGo算法的神经网络,MCTS是如何利用这个神经网络的输出进行预测的。这次代码的链接在文章的最后,可以使用这个代码和AlphaGo Style的MCTS下三子棋。
AlphaGo神经网络的接口
AlphaGo神经网络的接口十分简单,当前对局的棋盘board作为神经网络的输入,它会输出p和v。p是一个数组,p[move]代表采用move作为落子的概率。v是一个[-1,1]中的实数,代表着当前局面的胜率,1代表胜利,-1代表失败。
由于我们假设自己有一个已经训练好的神经网络,那么我们就用下面的代码假装一下。在假装的代码中,我们和原本的MCTS一样,使用双方随机落子来预测胜率v,然后每一个落子方式的概率p将会是相同的。根据这样“简单”的神经网络,现在的算法表现应该与原本的MCTS算法相同。
p,v=NN(board)
AlphaGo Style的MCTS算法:
原本的MCTS算法主要由四部分组成:
选择 Selection:从根节点 R 开始,递归选择最优的子节点(根据UCB)直到达到叶子节点 L。
扩展 Expansion:如果 L 不是一个终止节点(也就是,不会导致博弈游戏终止)那么就创建一个或者更多的字子节点,选择其中一个 C(创建子节点)。
模拟 Simulation:从 C 开始运行一个模拟的输出,直到博弈游戏结束。
反向传播 Backpropagation:用模拟的结果输出更新当前行动序列。
在AlphaGo Style的MCTS算法与原本的MCTS算法主要有两点不同:
原本的MCTS的第三步simulation的主要目的是估计当前游戏的胜率,由于在AlphaGo中这个胜率会由神经网络v输出,所以这一步会被省略。
神经网络的计算开销十分巨大,在原本的MCTS的Expansion中每次会根据一个落子方式创建一个新节点,而在AlphaGo的MCTS算法中,会根据全部的可能落子方式创建多个节点。
MCTS算法与AlphaGo Style的MCTS算法之间的git diff 如下:
图片的详细内容可以从下面网址查看:https://github.com/cmusjtuliuyuan/AlphaGoZero/commit/6e451d400fd0405d60e337a8b7824d9304f34082
本次代码可以从下面的位置下载:
领取专属 10元无门槛券
私享最新 技术干货