AlphaGo原理浅析

论文笔记:Mastering the game of Go with deep neural networks and tree search

背景:彻底信息博弈与MCTS算法

要彻底弄清AlphaGo背后的原理,首先须要了解一下AI在博弈游戏中经常使用到的蒙特卡洛树搜索算法——MCTS。算法

在一个彻底信息下的博弈游戏中,若是全部参与者都采起最优策略,那么对于游戏中的任意一个局面\(s\),总有一个肯定性的估值函数\(v^*(s)\)能够直接计算出最终的博弈结果。理论上,咱们能够经过构建一棵博弈树,递归地求解出\(v^*(s)\)。这就是Minimax算法。然而在有些问题中,这棵搜索树每每十分巨大(例如在围棋游戏中达到了\(250^{150}\)的搜索空间),以致于穷举的算法并不可行。网络

有两种策略能够有效地下降搜索空间的复杂度:1. 经过一个evalutaion function对当前局面进行价值的评估以下降搜索的深度;2. 剪枝以下降搜索的宽度。然而,这些策略都须要引入一些先验的知识。app

因而,人们提出了蒙特卡洛树搜索(MCTS)算法。MCTS是一类通用博弈算法——理论上,它不须要任何有关博弈的先验知识。框架

想象一下,你站在一堆老虎 机面前,每一台老虎 机的reward都服从一个随机的几率分布。然而,一开始,你对这些几率分布一无所知。你的目标是寻找一种玩老虎 机的策略,使得在整个游戏的过程当中你能得到尽量多的reward。很明显,你的策略须要可以在尝试尽量多的老虎 机(explore)与选择已知回报最多的老虎 机(exploit)之间寻求一种平衡。async

一种叫作UCB1的策略能够知足这种需求。该策略为每台老虎 机构造了一个关于reward的置信区间:
\[x_i\pm\sqrt{\frac{2\ln{n}}{n_i}}\]
其中,\(x_i\)是对第\(i\)台老虎 机统计出来的平均回报;\(n\)是试验的总次数;\(n_i\)是在第\(i\)台老虎 机上试验的次数。你要作的,就是在每一轮试验中,选择置信上限最大对应的那台老虎 机。显然,这个策略平衡了explore与exploit。你的每一次试验,都会使被选中的那台老虎 机的置信区间变窄,而使其余未被选中的老虎 机的置信区别变宽——变相提高了这些老虎 机在下一轮试验中被选中的几率。分布式

蒙特卡洛树搜索(MCTS)就是在UCB1基础上发展出来的一种解决多轮序贯博弈问题的策略。它包含四个步骤:函数

  1. Selection。从根节点状态出发,迭代地使用UCB1算法选择最优策略,直到碰到一个叶子节点。叶子节点是搜索树中存在至少一个子节点从未被访问过的状态节点。
  2. Expansion。对叶子节点进行扩展。选择其一个从未访问过的子节点加入当前的搜索树。
  3. Simulation。从2中的新节点出发,进行Monto Carlo模拟,直到博弈结束。
  4. Back-propagation。更新博弈树中全部节点的状态。进入下一轮的选择和模拟。

能够看出,经过Selection步骤,MCTS算法下降了搜索的宽度;而经过Simulation步骤,MCTS算法又进一步下降了搜索的深度。所以,MCTS算法是一类极为高效地解决复杂博弈问题的搜索策略。post

关于MCTS算法更多详细的介绍,可参见博客:Introduction to Monte Carlo Tree Search学习

AlphaGo的基本原理

围棋是一类彻底信息的博弈游戏。然而,其庞大的搜索空间,以及局面棋势的复杂度,使得传统的剪枝搜索算法在围棋面前都望而却步。在AlphaGo出现以前,MCTS算法算是一类比较有效的算法。它经过重复性地模拟两个players的对弈结果,给出对局面\(s\)的一个估值\(v(s)\)(Monte Carlo rollouts);并选择估值最高的子节点做为当前的策略(policy)。基于MCTS的围棋博弈程序已经达到了业余爱好者的水平。lua

然而,传统的MCTS算法的局限性在于,它的估值函数或是策略函数都是一些局面特征的浅层组合,每每很难对一个棋局有一个较为精准的判断。为此,AlphaGo的做者训练了两个卷积神经网络来帮助MCTS算法制定策略:用于评估局面的value network,和用于决策的policy network。(后面会看到,这两个网络的主要区别是在输出层:前者是一个标量;后者则对应着棋盘上的一个几率分布。)

首先,Huang等人利用人类之间的博弈数据训练了两个有监督学习的policy network:\(p_\sigma\)(SL policy network)和\(p_\pi\)(fast rollout policy network)。后者用于在MCTS的rollouts中快速地选择策略。接下来,他们在\(p_\sigma\)的基础上经过自我对弈训练了一个强化学习版本的policy network:\(p_\rho\)(RL policy network)。与用于预测人类行为的\(p_\sigma\)不一样,\(p_\rho\)的训练目标被设定为最大化博弈收益(即赢棋)所对应的策略。最后,在自我对弈生成的数据集上,Huang等人又训练了一个value network:\(v_\theta\),用于对当前棋局的赢家作一个快速的预估。

pipeline of neural networks

所以,用一句话简单归纳一下AlphaGo的基本原理:在MCTS的框架下引入两个卷积神经网络policy network和value network以改进纯随机的Monte Carlo模拟,并借助supervised learning和reinforcement learning训练这两个网络。

接下来将对AlphaGo的细节进行展开讨论。

有监督学习的Policy Networks

Huang等人首先训练了一个有监督的Policy Network用来模拟人类专家的走子。SL policy network是一个卷积神经网络;其输出层是一个Softmax分类器,用来计算在给定的棋面状态\(s\)下每个位置的落子几率\(p_\sigma(a|s)\)。对一个棋面状态\(s\)的描述以下:
input features for policy networks
(这里的Features对应着卷积神经网络里的Channels。)

通过人类高手三千万步围棋走法的训练后,SL policy network模拟人类落子的准确率已经达到了57%;相应地,网络的棋力也获得大大的提高。可是,若是直接用这个网络与人类高手,甚至是MCTS的博弈程序进行对弈,依然是输面居多。并且,这个网络的走子太慢了!平均每步\(3ms\)的响应时间,使得这个网络很难被直接用于MCTS的rollout中进行策略的随机。所以,Huang等人经过提取一些pattern features又训练了一个更快速(响应时间达到了\(2\mu s\))但准确率有所下降(24.2%)的rollout policy network: \(p_\pi\)

强化学习的Policy Networks

接下来,为了进一步提升policy network的对弈能力,Huang等人又采用一种policy gradient reinforcement learning的技术,训练了一个RL policy network:\(p_\rho\)。这个网络的结构与SL policy network的网络结构相同,依然是一个输出为给定状态下落子几率的卷积神经网络。网络的参数被初始化为\(p_\sigma\)的参数;接下来,经过不断地自我对弈(与历史版本),网络的权重向着收益最大化的方向进化。此时,网络的学习目标再也不是模拟人类的走法,而是更为终极的目标:赢棋。

具体来讲,咱们定义了一个reward function \(r(s_t)\):对于非终止的时间步\(t<T\),总有\(r(s_t)=0\)。每一步的收益\(z(t)\)被定义为\(\pm r(s_T)\):即对当前玩家而言对弈的最终结果(\(+1\)表明赢棋;\(-1\)表明输棋)。网络的权重经过随机梯度上升法进行调整:
\[\Delta\rho\propto\frac{\partial\log{p_\rho(a_t|s_t)}}{\partial\rho}z_t\]

经过这种方式训练出来的RL policy network,在与SL policy network对弈时已有80%的赢面。即使是与依赖Monte Carlo搜索的围棋博弈程序相比,不依赖任何搜索的RL policy network,也已经达到了85%的赢面。

强化学习的Value Networks

最后,Huang等人又开始寻求一个能快速预估棋面价值(棋势)的Value Network。一个棋面的价值函数\(v^p(s)\),被定义为在给定的一组对弈策略\(p\)的状况下,从状态\(s\)出发,最终的指望收益(也即赢棋的几率):
\[v^p(s)=E[z_t|s_t=s,a_{t...T}\in p]\]

显然,理想状况下,咱们想知道的是在双方均采用最优策略的条件下获得的最优指望收益\(v^*(s)\)。然而,咱们并不知道什么才是最优的策略。所以,在实际应用中,Huang等人采用了目前最强的策略函数\(p_\rho\)(RL policy network )来计算一个棋面的价值\(v^{p_\rho}(s)\),并训练了一个value network \(v_\theta(s)\)来拟合这个价值函数:\(v_\theta(s) \approx v^{p_\rho}(s) \approx v^*(s)\)

Value Network的网络结构与前面的Policy Network相似,也是一个卷积神经网络,只是输出层变成了一个单神经元的标量。咱们能够经过构造一组\((s,z)\)的训练数据,并用随机梯度降低法最小化网络的输出\(v_\theta(s)\)与目标收益\(z\)的均方差,来调整网络的参数:
\[\Delta\theta\propto\frac{\partial{v_\theta(s)}}{\partial\theta}(z-v_\theta(s))\]

在构造训练数据时有一些技巧。若是咱们从人类对弈的完整棋局中抽取足够数量的训练数据,很容易出现过拟合的问题。这是由于,在同一轮棋局中的两个棋面的相关性很强(每每只相差几个棋子);此时,网络很容易记住这些棋面的最终结果,而对新棋面的泛化能力很弱。为了解决这个问题,Huang等人再次祭出强化学习的大杀器:经过RL policy network的自我对弈,产生了三千万个从不一样棋局中提取出来的棋面-收益组合的训练数据。基于这份数据训练出来的Value Network,在对人类对弈结果的预测中,已经远远超过了使用fast rollout policy network的MCTS的准确率;即使是与使用RL policy network的MCTS相比,也已经是不遑多让(而Value Network的计算效率更高)。

accuracy of 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)的每一轮模拟也包含四个步骤:

  1. Selection:APV-MCTS搜索树中的每条连边\((s,a)\)都包含三个状态:决策收益\(Q(s,a)\),访问次数\(N(s,a)\),和一个先验几率\(P(s,a)\)。这三个状态共同决定了对一个节点下行为的选择:
    \[a_t=\arg\max_a{(Q(s_t,a)+u(s_t,a))}\]
    其中,\(u(s,a)\propto\frac{P(s,a)}{1+N(s,a)}\)
  2. Expansion:步骤1中的selection终止于叶子节点。此时,要对叶子节点进行扩展。这里采用SL policy network \(p_\sigma\)计算出叶子节点上每一个行为的几率,并做为先验几率\(P(s_L,a)\)存储下来。
  3. Evaluation。使用value network \(v_\theta(s)\)和fast rollout policy network \(p_\pi\)模拟获得的博弈结果对当前访问到的叶子节点进行估值:\[V(s_L)=(1-\lambda)v_\theta(s_L)+\lambda z_L\]
  4. Backup。更新这一轮模拟中全部访问到的路径的状态:
    \[N(s,a)=\sum_{i=1}^n{1(s,a,i)}\]
    \[Q(s,a)=\frac{1}{N(s,a)}\sum_{i=1}^n{1(s,a,i)V(s_L^i)}\]
    其中,\(n\)是模拟的总次数;\(1(s,a,i)\)标示第\(i\)轮模拟中是否通过边\((s,a)\)\(s_L^i\)是第\(i\)轮模拟中访问到的叶子节点。

下图展现了一轮模拟的动态过程。

MCTS with policy networks and value networks

模拟结束后,算法会选择访问次数\(N(s,a)\)最大的策略\(a\)做为当前的走子策略。

值得注意的是,在整个模拟的过程当中,咱们见到了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中的权重等等。然而,其背后的基本原理差很少就是这些了。

相关文章
相关标签/搜索