论文笔记:Mastering the game of Go with deep neural networks and tree search
来源:互联网 发布:手机怎么复制淘宝链接 编辑:程序博客网 时间:2024/06/09 15:55
背景:完全信息博弈与MCTS算法
要完全弄清AlphaGo背后的原理,首先需要了解一下AI在博弈游戏中常用到的蒙特卡洛树搜索算法——MCTS。
在一个完全信息下的博弈游戏中,如果所有参与者都采取最优策略,那么对于游戏中的任意一个局面
有两种策略可以有效地降低搜索空间的复杂度:1. 通过一个evalutaion function对当前局面进行价值的评估以降低搜索的深度;2. 剪枝以降低搜索的宽度。然而,这些策略都需要引入一些先验的知识。
于是,人们提出了蒙特卡洛树搜索(MCTS)算法。MCTS是一类通用博弈算法——理论上,它不需要任何有关博弈的先验知识。
想象一下,你站在一堆老虎 机面前,每一台老虎 机的reward都服从一个随机的概率分布。然而,一开始,你对这些概率分布一无所知。你的目标是寻找一种玩老虎 机的策略,使得在整个游戏的过程中你能获得尽可能多的reward。很明显,你的策略需要能够在尝试尽可能多的老虎 机(explore)与选择已知回报最多的老虎 机(exploit)之间寻求一种平衡。
一种叫做UCB1的策略可以满足这种需求。该策略为每台老虎 机构造了一个关于reward的置信区间:
其中,
蒙特卡洛树搜索(MCTS)就是在UCB1基础上发展出来的一种解决多轮序贯博弈问题的策略。它包含四个步骤:
- Selection。从根节点状态出发,迭代地使用UCB1算法选择最优策略,直到碰到一个叶子节点。叶子节点是搜索树中存在至少一个子节点从未被访问过的状态节点。
- Expansion。对叶子节点进行扩展。选择其一个从未访问过的子节点加入当前的搜索树。
- Simulation。从2中的新节点出发,进行Monto Carlo模拟,直到博弈结束。
- Back-propagation。更新博弈树中所有节点的状态。进入下一轮的选择和模拟。
可以看出,通过Selection步骤,MCTS算法降低了搜索的宽度;而通过Simulation步骤,MCTS算法又进一步降低了搜索的深度。因此,MCTS算法是一类极为高效地解决复杂博弈问题的搜索策略。
关于MCTS算法更多详细的介绍,可参见博客:Introduction to Monte Carlo Tree Search
AlphaGo的基本原理
围棋是一类完全信息的博弈游戏。然而,其庞大的搜索空间,以及局面棋势的复杂度,使得传统的剪枝搜索算法在围棋面前都望而却步。在AlphaGo出现之前,MCTS算法算是一类比较有效的算法。它通过重复性地模拟两个players的对弈结果,给出对局面
然而,传统的MCTS算法的局限性在于,它的估值函数或是策略函数都是一些局面特征的浅层组合,往往很难对一个棋局有一个较为精准的判断。为此,AlphaGo的作者训练了两个卷积神经网络来帮助MCTS算法制定策略:用于评估局面的value network,和用于决策的policy network。(后面会看到,这两个网络的主要区别是在输出层:前者是一个标量;后者则对应着棋盘上的一个概率分布。)
首先,Huang等人利用人类之间的博弈数据训练了两个有监督学习的policy network:
因此,用一句话简单概括一下AlphaGo的基本原理:在MCTS的框架下引入两个卷积神经网络policy network和value network以改进纯随机的Monte Carlo模拟,并借助supervised learning和reinforcement learning训练这两个网络。
接下来将对AlphaGo的细节进行展开讨论。
有监督学习的Policy Networks
Huang等人首先训练了一个有监督的Policy Network用来模拟人类专家的走子。SL policy network是一个卷积神经网络;其输出层是一个Softmax分类器,用来计算在给定的棋面状态
(这里的Features对应着卷积神经网络里的Channels。)
经过人类高手三千万步围棋走法的训练后,SL policy network模拟人类落子的准确率已经达到了57%;相应地,网络的棋力也得到大大的提升。但是,如果直接用这个网络与人类高手,甚至是MCTS的博弈程序进行对弈,依然是输面居多。而且,这个网络的走子太慢了!平均每步
强化学习的Policy Networks
接下来,为了进一步提高policy network的对弈能力,Huang等人又采用一种policy gradient reinforcement learning的技术,训练了一个RL policy network:
具体来说,我们定义了一个reward function
通过这种方式训练出来的RL policy network,在与SL policy network对弈时已有80%的赢面。即便是与依赖Monte Carlo搜索的围棋博弈程序相比,不依赖任何搜索的RL policy network,也已经达到了85%的赢面。
强化学习的Value Networks
最后,Huang等人又开始寻求一个能快速预估棋面价值(棋势)的Value Network。一个棋面的价值函数
显然,理想情况下,我们想知道的是在双方均采用最优策略的条件下得到的最优期望收益
Value Network的网络结构与前面的Policy Network类似,也是一个卷积神经网络,只是输出层变成了一个单神经元的标量。我们可以通过构造一组
在构造训练数据时有一些技巧。如果我们从人类对弈的完整棋局中抽取足够数量的训练数据,很容易出现过拟合的问题。这是因为,在同一轮棋局中的两个棋面的相关性很强(往往只相差几个棋子);此时,网络很容易记住这些棋面的最终结果,而对新棋面的泛化能力很弱。为了解决这个问题,Huang等人再次祭出强化学习的大杀器:通过RL policy network的自我对弈,产生了三千万个从不同棋局中提取出来的棋面-收益组合的训练数据。基于这份数据训练出来的Value Network,在对人类对弈结果的预测中,已经远远超过了使用fast rollout policy network的MCTS的准确率;即便是与使用RL policy network的MCTS相比,也已是不遑多让(而Value Network的计算效率更高)。
整合
到这里,我们手头上已经有一个牛逼但是巨慢的SL policy network;有一个不那么牛逼但是很快的fast policy network;有一个一心只想着如何赢棋的RL policy network;还有一个能一眼洞穿棋局的value network。那么,将这些networks放在一起互相补足,会得到什么呢?
答案就是AlphaGo。而把这些networks整合在一起的框架,就是MCTS算法。
与经典的MCTS算法类似,APV-MCTS(asynchronous policy and value MCTS)的每一轮模拟也包含四个步骤:
- Selection:APV-MCTS搜索树中的每条连边
(s,a) (s,a)都包含三个状态:决策收益Q(s,a) Q(s,a),访问次数N(s,a) N(s,a),和一个先验概率P(s,a) P(s,a)。这三个状态共同决定了对一个节点下行为的选择:at=argmaxa(Q(st,a)+u(st,a)) at=argmaxa(Q(st,a)+u(st,a))
其中,u(s,a)∝P(s,a)1+N(s,a) u(s,a)∝P(s,a)1+N(s,a) - Expansion:步骤1中的selection终止于叶子节点。此时,要对叶子节点进行扩展。这里采用SL policy network
pσ pσ计算出叶子节点上每个行为的概率,并作为先验概率P(sL,a) P(sL,a)存储下来。 - Evaluation。使用value network
vθ(s) vθ(s)和fast rollout policy networkpπ pπ模拟得到的博弈结果对当前访问到的叶子节点进行估值:V(sL)=(1−λ)vθ(sL)+λzL V(sL)=(1−λ)vθ(sL)+λzL - Backup。更新这一轮模拟中所有访问到的路径的状态:
N(s,a)=∑i=1n1(s,a,i) N(s,a)=∑i=1n1(s,a,i)Q(s,a)=1N(s,a)∑i=1n1(s,a,i)V(siL) Q(s,a)=1N(s,a)∑i=1n1(s,a,i)V(sLi)
其中,n n是模拟的总次数;1(s,a,i) 1(s,a,i)标示第i i轮模拟中是否经过边(s,a) (s,a);siL sLi是第i i轮模拟中访问到的叶子节点。
下图展示了一轮模拟的动态过程。
模拟结束后,算法会选择访问次数
值得注意的是,在整个模拟的过程中,我们见到了SL policy network(用于Expansion中先验概率的计算);见到了fast rollout policy network(用于Evaluation中的快速走子);见到了value network(用于Evaluation中对棋势的预估)。等等,RL policy network去哪了?为什么不用RL policy network替代SL policy network?明明RL policy network有着更强的棋力啊(85%的赢面)?
这是因为,与RL policy network相比,由人类专家走法训练出来的SL policy network在策略上的多样性更强;因此更适用于MCTS中的搜索。但是,用RL policy network的自我对弈结果训练出来的value network的泛化能力就要比SL policy network训练出来的value network要强得多了。
结语
回顾一下,我们发现AlphaGo本质上是CNN、RL、MCTS三者相结合的产物。其中,MCTS是AlphaGo的骨骼,支撑起了整个算法的框架;CNN是AlphaGo的眼睛和大脑,在复杂的棋局面前寻找尽可能优的策略;RL是AlphaGo的血液,源源不断地提供新鲜的训练数据。三者相辅相成,最终4:1战胜了人类围棋世界冠军李世石。其实还有很多细节我没有详细的展开,包括如何在分布式的机器上更高效地训练;如何更新MCTS中的权重等等。然而,其背后的基本原理差不多就是这些了。
- 论文笔记:Mastering the game of Go with deep neural networks and tree search
- 读书笔记:Mastering the game of Go with deep neural networks and tree search
- Mastering the game of Go with deep neural networks and tree search 中文版来了
- Mastering the game of Go with deep neural networks and tree search
- AlphaGo论文的译文,用深度神经网络和树搜索征服围棋:Mastering the game of Go with deep neural networks and tree search
- 深入解读AlphaGo,Nature-2016:Mastering the game of Go with deep neural networks and tree search
- 深度学习入门笔记:Fast Image Search with Deep Convolutional Neural Networks and Efficient Hashing Codes
- speech recognition with deep recurrent neural networks-论文笔记
- ImageNet Classification with Deep Convolutional Neural Networks论文笔记
- 论文笔记《ImageNet Classification with Deep Convolutional Neural Networks》
- 论文笔记ImageNet Classification with Deep Convolutional Neural Networks(AlexNet)
- 论文笔记:ImageNet classification with deep convolution neural networks
- [论文笔记]Modeling Interestingness with Deep Neural Networks
- ImageNet Classification with Deep Convolutional Neural Networks 论文笔记
- 论文笔记:ImageNet Classification with Deep Convolutional Neural Networks
- 论文笔记之Label-Free Supervision of Neural Networks with Physics and Domain Knowledge
- Mastering the game of Go without human knowledge笔记
- 【论文阅读】Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huff
- 元素为结构体的vector 找最大元素
- 2017年计算机软考(软件设计师)知识点归纳(持续更新中。。。)
- 每天一个linux命令(51):lsof命令
- 一步一步学springboot (五)打包成标准的web工程war包可独立部署到tomcat或weblogic
- 模块和包(Modules and Packages)
- 论文笔记:Mastering the game of Go with deep neural networks and tree search
- Vue.js新手入门指南
- 【机器学习实战】第2章 K-近邻算法(k-NearestNeighbor,KNN)
- 开发自己的梦想,我在路上。
- Unity Input.anyKeyDown和模拟键盘按下事件
- 集合框架-ArrayList集合的toString()方法源码解析
- 一步一步学springboot (六)集成拦截器和过滤器及监听器
- 数据结构基础
- 细说开发一些快捷方式提高效率