AlphaGo Zero中使用的是强化学习方法,使用的深度神经网络记为 fθ f θ (其中 θ θ 是网络的参数)。网络的输入是棋盘状态 s s (s s 中表示了当前玩家落子的信息,对手的落子信息,棋盘最后一步落子的信息,当前的棋盘转态谁是先手等信息,即棋盘的历史信息和当前信息)。网络的输出是 (p,v) ( p , v ) ,其中 p p 是当前玩家在局面s s 状态下,即将要选择落子到每一步的概率,所以 p p 是一个向量,假设局面是8*8的五子棋,则p p 是长度为64的向量,而 v v 则是一个标量的评估值,估计当前玩家从状态s s 获胜的概率, v v 的取值范围是v∈[−1,1] v ∈ [ − 1 , 1 ] ,从当前玩家的角度看, v=−1,0,1 v = − 1 , 0 , 1 分别代表当前玩家输了,平局,赢了(为了方便描述,下面的解读都以8*8的五子棋作为说明实例。)值得注意的是,这个网络将策略网络(输出 p p 的部分)和价值网络(输出v v 的部分)结合在一起而形成单一架构。该网络由许多具有批量归一化的卷积层和残余块等组成。
图1.a.Self-Play表示的过程如下:
假设 s1 s 1 是初始棋盘状态,当前玩家是1,玩家1在棋盘状态 s1 s 1 下准备落子,它不知道走哪一步是最佳的落子位置,所以先在 s1 s 1 的棋盘状态下,执行n次MCTS搜索,根据MCTS搜索得出的移动概率 π π 进行落子(这里 π π 的计算:(1)根据n次MCTS模拟对局产生的每个节点的访问次数得出概率向量p1,即访问最多的p1向量对应那个节点的概率就越大,p1中每个节点概率之和为1,(2)然后经过公式1的计算,即将每个节点的访问次数N通过公式(1)的变换在进行计算其概率,那么最终的概率是p2,如果 τ τ 一直取值1,则p2其实就是p1,其中 τ τ 为温度参数,控制探索的程度, τ τ 越大,不同走法间差异变小,探索比例增大,反之,则更多选择当前最优操作(3)将p2的每个节点概率即 pa p a 进行公式(2)变换,其中在论文中 ε=0.25 ε = 0.25 , ηa η a 是dirichlet分布,如公式(3)所示,这样做的目的是在一定程度上有助于覆盖到更多的局面)。当前玩家1在棋盘状态 s1 s 1 经过以上的执行n次MCTS搜索得出 π1 π 1 后,选择落子的方法就是按照概率 π1 π 1 的分布取出下一步移动 a1 a 1 ,然后进入下一个棋盘状态 s2 s 2 ,当前玩家交换为玩家2,不断重复上面步骤直到状态 st s t 分出胜负 z z ,这里z z 只有3种可能,赢,平局,输,分别对应1,0,-1。收集到的数据形式是 (si,πi,z) ( s i , π i , z ) 。
以8*8五子棋为例,假设s=4∗8∗8 s = 4 ∗ 8 ∗ 8 的矩阵表示, s[0] s [ 0 ] 用来表示当前玩家走过的位置,从棋盘状态为0到目前状态为止,走过的位置设置1,其他位置为0; s[1] s [ 1 ] 用来表示当前玩家的对手走过的位置,类似 s[0] s [ 0 ] ; s[2] s [ 2 ] 表示lastmove,即上一步落子的位置(上一步落子的一定是当前玩家的对手落子),即只有lastmove设置1,其他位置都是0; s[3] s [ 3 ] 表示当前玩家是否是先手,全部的位置要么设置1,要么设置0.
这里的MCTS搜索相比于纯MCTS搜索,最大的区别是当遇到叶子节点node(在纯MCTS中对应于一个子节点也未访问的节点)时候,(1)这里的MCTS搜索是在深度神经网络 fθ f θ 的指导下进行的,即未访问的节点的子节点的初始化为 fθ(s)=(p,v) f θ ( s ) = ( p , v ) ;此时,叶子节点node被展开,其价值为 v v ,下一步即将要走的概率为p p ,然后叶子节点node用这个 v v 值反向传播去更新从node节点到根节点的一条路径。如果在node节点处,当前局面s s 已经是分出胜负的局面,即node节点还没落子就结束局面,那么赢的一方就是上一个玩家,那么用 v=1 v = 1 值反向传播去更新从node节点到根节点的一条路径,即对于上一个玩家来说,node节点是价值很高的一步落子。由于玩家是交叉进行的,node节点用 v=1 v = 1 更新,那么node的父节点用 v=−1 v = − 1 更新,依次类推。(2)纯MCTS搜索则是在遇到叶子节点node时,判断在node节点下,哪些子节点是可以落子的,选择一个可以落子的子节点进行随机走,直到在node选择的该子节点中分出胜负,然后反向传播去更新从node节点到根节点的一条路径,注意更新的开始是node节点,如果结果是赢,则node节点的 v=1 v = 1 。当下一次模拟在遇到node时候,则还是选择一个node的子节点进行随机走直到分出胜负。纯MCTS搜索相比于借助神经网络的MCTS搜索,其效率比较低,因为一次模拟对局,它只展开node节点的一个子节点,而借助神经网络的MCTS搜索一次可以展开node所有子节点,然后下一次遇到node之后,则可以node是完全展开的节点了,可以继续往下走,走哪一步根据 Q(s,a)+U(s,a) Q ( s , a ) + U ( s , a ) 计算得出,Q,初始值都是0。其中U(s,a)正比于 P(s,a)/(1+N(s,a)) P ( s , a ) / ( 1 + N ( s , a ) ) ,如公式(4),该方法是PUCT算法的变种,这种搜索策略刚开始偏向高先验概率低访问频率的行动,后来逐渐偏好高行动价值的动作。而纯MCTS搜索需要将所有子节点访问后才可以。
loss=(z−v)2−πTlog(p)+c||θ|| l o s s = ( z − v ) 2 − π T l o g ( p ) + c | | θ | |
第一项:通过最小二乘最小化获胜概率误,第二项:通过交叉熵最大化先验走子概率与提升后走子概率一致性;第三项:L2范数权值衰减防止过拟合。
参考
1.AlphaGo Zero论文笔记
2.AlphaZero实战
3.Masteing the game of Go without human knowledge