背景:完全信息博弈与MCTS算法
要完全弄清AlphaGo背后的原理,首先需要了解一下AI在博弈游戏中常用到的蒙特卡洛树搜索算法——MCTS。

在一个完全信息下的博弈游戏中,如果所有参与者都采取最优策略,那么对于游戏中的任意一个局面ss,总有一个确定性的估值函数v∗(s)v∗(s)可以直接计算出最终的博弈结果。理论上,我们可以通过构建一棵博弈树,递归地求解出v∗(s)v∗(s)。这就是Minimax算法。然而在有些问题中,这棵搜索树往往十分巨大(例如在围棋游戏中达到了250150250150的搜索空间),以至于穷举的算法并不可行。

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

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

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

一种叫做UCB1的策略可以满足这种需求。该策略为每台老虎 机构造了一个关于reward的置信区间:
xi±2lnnni−−−−−√
xi±2ln⁡nni

其中,xixi是对第ii台老虎 机统计出来的平均回报;nn是试验的总次数;nini是在第ii台老虎 机上试验的次数。你要做的,就是在每一轮试验中,选择置信上限最大对应的那台老虎 机。显然,这个策略平衡了explore与exploit。你的每一次试验,都会使被选中的那台老虎 机的置信区间变窄,而使其他未被选中的老虎 机的置信区别变宽——变相提升了这些老虎 机在下一轮试验中被选中的概率。

蒙特卡洛树搜索(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的对弈结果,给出对局面ss的一个估值v(s)v(s)(Monte Carlo rollouts);并选择估值最高的子节点作为当前的策略(policy)。基于MCTS的围棋博弈程序已经达到了业余爱好者的水平。

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

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

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分类器,用来计算在给定的棋面状态ss下每一个位置的落子概率pσ(a|s)pσ(a|s)。对一个棋面状态ss的描述如下:
input features for policy networks
(这里的Features对应着卷积神经网络里的Channels。)

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

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

具体来说,我们定义了一个reward function r(st)r(st):对于非终止的时间步tΔρ∝∂logpρ(at|st)∂ρzt
Δρ∝∂log⁡pρ(at|st)∂ρzt

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

强化学习的Value Networks
最后,Huang等人又开始寻求一个能快速预估棋面价值(棋势)的Value Network。一个棋面的价值函数vp(s)vp(s),被定义为在给定的一组对弈策略pp的情况下,从状态ss出发,最终的期望收益(也即赢棋的概率):
vp(s)=E[zt|st=s,at...T∈p]
vp(s)=E[zt|st=s,at...T∈p]

显然,理想情况下,我们想知道的是在双方均采用最优策略的条件下得到的最优期望收益v∗(s)v∗(s)。然而,我们并不知道什么才是最优的策略。因此,在实际应用中,Huang等人采用了目前最强的策略函数pρpρ(RL policy network )来计算一个棋面的价值vpρ(s)vpρ(s),并训练了一个value network vθ(s)vθ(s)来拟合这个价值函数:vθ(s)≈vpρ(s)≈v∗(s)vθ(s)≈vpρ(s)≈v∗(s)。

Value Network的网络结构与前面的Policy Network类似,也是一个卷积神经网络,只是输出层变成了一个单神经元的标量。我们可以通过构造一组(s,z)(s,z)的训练数据,并用随机梯度下降法最小化网络的输出vθ(s)vθ(s)与目标收益zz的均方差,来调整网络的参数:
Δθ∝∂vθ(s)∂θ(z−vθ(s))
Δθ∝∂vθ(s)∂θ(z−vθ(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)的每一轮模拟也包含四个步骤:

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=arg⁡maxa(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 network pπ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)

其中,nn是模拟的总次数;1(s,a,i)1(s,a,i)标示第ii轮模拟中是否经过边(s,a)(s,a);siLsLi是第ii轮模拟中访问到的叶子节点。
下图展示了一轮模拟的动态过程。

MCTS with policy networks and value networks

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

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