前言
最近看了AlphaGo的论文:Mastering then Game of Go with Deep Nerual Networks and Tree Search。惊异于这些人的创造力和神经网络的强大,能够把围棋这种游戏做到这种地步。写一写论文里的方法和自己的思考吧,这篇文章基本都是论文中的观点,只是以我的视角去解读,有错误的地方欢迎指出。
关于棋盘对弈游戏
还记得在大学的时候,学校举办了一个人工智能挑战赛,题目是要做一个黑白棋的AI,当时运气好得了第一,不过并没有用到很厉害的方法。主要是搜索+估值,围棋和黑白棋一样,是具有完美信息的游戏,对于某一个状态(盘面),如果所有玩家完美发挥,下一步的选择是有一个最优值的,然而,对于人来说,要计算出所有走法是不现实的,对于计算机呢?情况或许会好一点,计算的能力当然比人更强一点,但实际上,还是不能穷举所有可能。
黑白棋的棋盘只有8x8,而围棋却是19x19,这不是几倍的差距,是好几个数量级的差距了。对于围棋来说,如果使用搜索的方法,搜索树大概包括 bd 个走子,其中 b 是搜索的广度(每个状态下的合法走法),
但是呢,我们可以去简化这个过程,不是去得到一个确定的,最优的结果,而是去寻找一个尽可能好的结果,这是可能的。首先,搜索树的深度可以通过价值函数来减少,价值函数是什么呢?对于某个到达的盘面状态 s ,可以通过一个价值函数
蒙特卡洛树(MCTS)在棋盘搜索中的应用
首先说一下蒙特卡洛方法吧,这其实就是一个通过概率来求解的方法或者说思想。原理是通过大量随机样本,去了解一个系统,进而得到所要计算的值。
它非常强大和灵活,又相当简单易懂,很容易实现。对于许多问题来说,它往往是最简单的计算方法,有时甚至是唯一可行的方法。
举个,简单的例子,求圆周率 π ,就可以通过在下图的正方形区域内,随机 n 个点
知道了蒙特卡洛方法,再看蒙特卡洛树,其实就是把它移到树上罢了。它的思想也是通过进行大量的模拟(rollouts),最后想要将答案收敛到某个分支。蒙特卡洛树有四个步骤:
1. 选择(Selection):从根节点开始,不断递归选择最优的子节点,直到达到一个叶结点。选择最优子节点根据公式 vi+C×lnNni‾‾‾‾√ ,其中 vi 是节点估计的值, ni 是节点被访问的次数,而 N 则是其父节点已经被访问的总次数,
2. 扩展(Expansion):当前节点不是终止节点(游戏未结束),并且访问该节点次数超过某个设定的阈值,则在创建一个或多个子节点。
3. 模拟(Simulation):从当前叶结点开始,通过随机获采用某个走子策略 p ,模拟走子,直到游戏结束。
4. 回传(Backpropagation):根据模拟的最终结果,反向更新搜索树。
蒙特卡洛树就简单介绍到这里吧,有兴趣可以在网上找到别的资料。在AlphaGo出来之前,最强的围棋Ai就是基于MCTS的,AlphaGo也采用了MCTS的方法再加上神经网络的优化,最终完成了战胜人类职业选手的壮举。
结构
在学习AlphaGo的算法之前,对它的结构有一个大概的认知是很有必要的。我们要知道,它用了神经网络做了什么,用了MCTS又做了些什么。
1. 有监督学习策略网络
2. 可以快速决策的策略网络 pπ :这是为了让在下棋时可以更快地给出走子策略,毕竟大型的网络比较耗时,不过质量上比 pσ 要差一些。
3. 用增强学习训练策略网络 pρ :使用增强学习(RL:reinforcement learning)方法,通过自我对弈来优化策略网络的目的——由提高预测人类走子到提高胜率。
4. 训练价值网络 vθ :这个神经网络是用来预测一个盘面下,使用RL策略网络自我对弈的胜率。
5. MCTS:将策略网络与价值网络有效结合起来,对最优方案进行搜索。
策略网络的有监督学习
这个训练实际上是通过深度卷积神经网络和人类棋手的对弈数据,让AI能够预测专业选手的走子。SL策略网络为 pσ(a|s) ,对于输入的棋盘盘面