阿尔法狗2016版本使用人类高手棋谱数据初步训练策略网络,并使用深度强化学习中的REINFORCE算法进一步训练策略网络。策略网络训练好之后,使用策略网络辅助训练价值网络。零狗(AlphaGo Zero)使用MCTS控制两个玩家对弈,用自对弈生成的棋谱数据和胜负关系同时训练策略网络和价值网络。
在机巧围棋中,训练策略网络和价值网络的方法原理与零狗基本相同。
本文将详细讲解阿尔法狗2016版本和零狗中两个神经网络的训练方法。
1. 阿尔法狗2016版本的训练方法
2016年3月,阿尔法狗以4 : 1战胜了世界冠军李世石九段。赛前(2016年1月27日)DeepMind公司在nature上发表论文Mastering the game of Go with deep neural networks and tree search详细介绍了阿尔法狗的算法原理。
阿尔法狗的训练分为三步:
- 随机初始化策略网络 π ( a ∣ s ; θ ) \pi(a|s;\theta) π(a∣s;θ)的参数之后,使用行为克隆(Behavior Cloning)从人类高手棋谱中学习策略网络;
- 让两个策略网络自我博弈,使用REINFORCE算法改进策略网络;
- 使用两个已经训练好的策略网络自我博弈,根据胜负关系数据训练价值网络 v ( s ; ω ) v(s;\omega) v(s;ω)。
1.1 行为克隆
REINFORCE算法会让两个策略网络博弈直至游戏结束,使用游戏结束后实际观测到的回报 u u u对策略梯度中的动作价值函数 Q π Q_{\pi} Qπ做蒙特卡洛近似,从而计算出策略梯度的无偏估计值,并做随机梯度上升更新策略网络参数。
一开始的时候,策略网络的参数都是随机初始化的。假如直接使用REINFORCE算法学习策略网络,会让两个随机初始化的策略网络博弈。由于策略网络的参数是随机初始化的,它们会做出随机的动作,要经过一个很久的随机摸索过程才能做出合理的动作。因此,阿尔法狗2016版本使用人类专家知识,通过行为克隆初步训练一个策略网络。
行为克隆是一种最简单的模仿学习,目的是模仿人的动作,学出一个随机策略网络 π ( a ∣ s ; θ ) \pi(a|s;\theta) π(a∣s;θ)。行为克隆的本质是监督学习(分类或回归),其利用事先准备好的数据集,用人类的动作指导策略网络做改进,目的是让策略网络的决策更像人类的决策。
在这个网站上可以下载到K Go Server(KGS,原名Kiseido Go Server)上大量6段以上高手玩家的对局数据,每一局有很多步,每一步棋盘上的格局作为一个状态 s k s_k sk,下一个棋子的位置作为动作 a k a_k ak,这样得到数据集 { ( s k , a k ) } \{(s_k,a_k)\} {(sk,ak)}。
设362维向量 f k = π ( ⋅ ∣ s k ; θ ) = [ π ( 0 ∣ s k ; θ ) , π ( 1 ∣ s k ; θ ) , ⋯ , π ( 361 ∣ s k ; θ ) ] f_k=\pi(\cdot|s_k;\theta)=[\pi(0|s_k;\theta),\pi(1|s_k;\theta),\cdots,\pi(361|s_k;\theta)] fk=π(⋅∣sk;θ)=[π(0∣sk;θ),π(1∣sk;θ),⋯,π(361∣sk;θ)]是策略网络的输出, a ˉ k \bar{a}_k aˉk是对动作 a k a_k ak的独热编码(one-hot)。可以使用 a ˉ k \bar{a}_k aˉk和 f k f_k fk的交叉熵 H ( a ˉ k , f k ) H(\bar{a}_k,f_k) H(aˉk,fk)作为损失函数,计算损失函数关于策略网络参数的梯度,使用随机梯度下降更新策略网络参数,最小化损失函数的值,使策略网络的决策更接近人类高手的动作。
行为克隆得到的策略网络模仿人类高手的动作,可以做出比较合理的决策。根据阿尔法狗的论文,它在实战中可以打败业余玩家,但是打不过职业玩家。由于人类高手在实际对局中很少探索奇怪的状态和动作,因此训练数据集上的状态和动作缺乏多样性。在数据集 { ( s k , a k ) } \{(s_k,a_k)\} {(sk,ak)}上做完行为克隆之后,策略网络在真正对局时,可能会见到陌生的状态,此时做出的决策可能会很糟糕。如果策略网络做出的动作 a t a_t at不够好,那么下一时刻的状态 s t + 1 s_{t+1} st+1可能会比较罕见,于是做出的下一个动作 a t + 1 a_{t+1} at+1会很差;这又导致状态 s t + 2 s_{t+2} st+2非常奇怪,使得动作 a t + 2 a_{t+2} at+2更糟糕。如此“错误累加”,进入这种恶性循环。
为了克服上述行为克隆的缺陷,还需要用强化学习训练策略网络。在行为克隆之后再做强化学习改进策略网络,可以击败只用行为克隆的策略网络,胜算是80%。
为什么可以使用策略网络输出和人类高手动作独热编码的交叉熵作为损失函数,可以参见我的另一篇博客:为什么交叉熵常被用作分类问题的损失函数。
1.2 使用REINFORCE算法改进策略网络
REINFORCE是一种策略梯度方法,其使用实际观测到的回报 u u u对策略梯度的无偏估计 g ( s , a ; θ ) ≜ Q π ( s , a ) ⋅ ∇ θ ln π ( a ∣ s ; θ ) g(s,a;\theta)\triangleq{Q_\pi(s,a)}\cdot\nabla_\theta{\ln\pi(a|s;\theta)} g(s,a;θ)≜Qπ(s,a)⋅∇θlnπ(a∣s;θ)中 Q π Q_\pi Qπ做蒙特卡洛近似,并通过下面的公式做随机梯度上升,更新策略网络:
θ n e w ← θ n o w + β ⋅ ∑ t = 1 n u t ⋅ ∇ ln π ( a t ∣ s t ; θ n o w ) ( 1 ) \theta_{new}\leftarrow\theta_{now}+\beta\cdot\sum_{t=1}^nu_t\cdot\nabla\ln\pi(a_t|s_t;\theta_{now})~~~~~~~~~~~~~~~~~~~~~~~(1) θnew←θnow+β⋅t=1∑nut⋅∇lnπ(at∣st;θnow) (1)
其中, β \beta β是学习率, n n n是游戏至终局共进行的步数, π ( a t ∣ s t ; θ n o w ) \pi(a_t|s_t;\theta_{now}) π(at∣st;θnow)是策略网络的输出, ln π ( a t ∣ s t ; θ n o w ) \ln\pi(a_t|s_t;\theta_{now}) lnπ(at∣st;θnow)是策略网络输出值的对数, ∇ ln π ( a t ∣ s t ; θ n o w ) \nabla\ln\pi(a_t|s_t;\theta_{now}) ∇lnπ(at∣st;θnow)是策略网络输出值的对数对策略网络参数求的梯度。
如图一所示,阿尔法狗使用两个策略网络进行博弈,将胜负作为奖励,计算回报 u t u_t ut的值。参与博弈的一个策略网络叫做“玩家”,用最新的参数 θ n o w \theta_{now} θnow;另一个叫做“对手”,它的参数是从过时的参数中随机选出来的,记作 θ o l d \theta_{old} θold。“对手”的作用相当于模拟器(环境)的状态转移函数,在训练过程中,只更新“玩家”的参数,不更新“对手”的参数。
让“玩家”和“对手”博弈,将一局游戏进行到底,根据博弈的胜负关系可以确定公式(1)中回报 u t u_t ut的值。假设一局游戏“玩家”共走了 n n n步,设游戏未结束时,奖励 r 1 = r 2 = ⋯ = r n − 1 = 0 r_1=r_2=\cdots=r_{n-1}=0 r1=r2=⋯=rn−1=0。游戏结束时,如果“玩家”赢了,则奖励 r n = + 1 r_n=+1 rn=+1。“玩家”输了,则奖励 r n = − 1 r_n=-1 rn=−1。设定折扣率 γ = 1 \gamma=1 γ=1,当“玩家”赢了,所有的回报 u 1 = u 2 = ⋯ = u n = + 1 u_1=u_2=\cdots=u_n=+1 u1=u2=⋯=un=+1,当“玩家”输了,所有的回报 u 1 = u 2 = ⋯ = u n = − 1 u_1=u_2=\cdots=u_n=-1 u1=u2=⋯=un=−1。
回报的定义是 u t = r t + γ r t + 1 + γ 2 r t + 2 ⋯ + γ n r n u_t=r_t+\gamma{r_{t+1}}+\gamma^2r_{t+2}\cdots+\gamma^nr_n ut=rt+γrt+1+γ2rt+2⋯+γnrn,在阿尔法狗中,设定折扣率 γ = 1 \gamma=1 γ=1。
REINFORCE算法是深度强化学习领域的一种策略梯度方法,策略梯度的推导比较麻烦,因此本文不会讲解公式(1)的由来。或许以后有时间会系统地讲解深度强化学习相关算法,可以关注我哟~
1.3 训练价值网络
在阿尔法狗中,价值网络 v ( s ; ω ) v(s;\omega) v(s;ω)是对状态价值函数 V π ( s ) V_\pi(s) Vπ(s)的近似,用于评估状态 s s s的好坏。状态价值函数 V π ( s ) V_\pi(s) Vπ(s)依赖于状态 s s s,状态 s s s越好,那么价值 V π ( s ) V_\pi(s) Vπ(s)就越大; V π ( s ) V_\pi(s) Vπ(s)还依赖于策略函数 π \pi π,策略 π \pi π越好,同样价值 V π ( s ) V_\pi(s) Vπ(s)也就越大。如果策略 π \pi π是固定的,则可以用状态价值函数 V π ( s ) V_\pi(s) Vπ(s)评估状态 s s s的好坏。因此,阿尔法狗在完成第二步——训练策略网络 π \pi π之后,用 π \pi π辅助训练 v v v。
让训练好的策略网络做自我博弈,每对弈完一局,可以记录(状态—回报)二元组 ( s k , u k ) (s_k,u_k) (sk,uk)。自我博弈需要重复非常多次,将最终得到的数据集记作 { ( s k , u k ) } k = 1 m \{(s_k,u_k)\}_{k=1}^m {(sk,uk)}k=1m。根据定义,状态价值 V π ( s k ) V_\pi(s_k) Vπ(sk)是回报 U k U_k Uk的期望: V π ( s k ) = E [ U k ∣ S k = s k ] V_\pi(s_k)=\mathbb{E}[U_k|S_k=s_k] Vπ(sk)=E[Uk∣Sk=sk]。训练价值网络 v ( s ; w ) v(s;w) v(s;w)的目标是使其接近 V π V_\pi Vπ,即让 v ( s ; ω ) v(s;\omega) v(s;ω)拟合回报 u k u_k uk。
定义回归问题:
ω m i n 1 2 m ∑ k = 1 m [ v ( s k ; ω ) − u k ] 2 \overset{min}{_\omega}\frac{1}{2m}\sum_{k=1}^m[v(s_k;\omega)-u_k]^2 ωmin2m1k=1∑m[v(sk;ω)−uk]2
用均方误差(MSE)作为损失函数,训练价值网络 v ( s ; ω ) v(s;\omega) v(s;ω),求解这个回归问题。
2. 零狗的训练方法
根据论文Mastering the game of Go without human knowledge可知,零狗和阿尔法狗2016版本的最大区别在于训练策略网络 π ( a ∣ s ; θ ) \pi(a|s;\theta) π(a∣s;θ)的方式。训练 π \pi π的时候,不再向人类高手学习,也不用REINFORCE方法,而是向MCTS学习。可以把零狗训练 π \pi π的方法看做是模仿学习,被模仿的对象不是人类高手,而是MCTS。
2.1 自我博弈
用MCTS控制两个玩家对弈,每走一步棋,需要进行成千上万次模拟,并记录下每个动作被选中的次数 N ( a ) , ∀ a ∈ { 0 , 1 , 2 , ⋯ , 361 } N(a),\forall{a\in\{0,1,2,\cdots,361\}} N(a),∀a∈{0,1,2,⋯,361}。设当前时刻为 t t t,棋盘上状态为 s t s_t st,执行MCTS得到362个动作被选中的次数:
N ( 0 ) , N ( 1 ) , ⋯ , N ( 361 ) N(0),N(1),\cdots,N(361) N(0),N(1),⋯,N(361)
对这些动作被选中的次数做归一化,得到362个和为1的正数,将这362个数记作362维向量 p t = n o r m a l i z e ( [ N ( 0 ) , N ( 1 ) , ⋯ , N ( 361 ) ] T ) p_t=normalize\Big([N(0),N(1),\cdots,N(361)]^T\Big) pt=normalize([N(0),N(1),⋯,N(361)]T)。
设这一局游戏走了 n n n步之后分出胜负,奖励 r n r_n rn要么等于 + 1 +1 +1,要么等于 − 1 -1 −1,取决于游戏的胜负。游戏结束之后,可以得到回报 u 1 = u 2 = ⋯ = u n = r n u_1=u_2=\cdots=u_n=r_n u1=u2=⋯=un=rn。
每自对弈一局可以得到数据: ( s 1 , p 1 , u 1 ) , ( s 2 , p 2 , u 2 ) , ⋯ , ( s n , p n , u n ) (s_1,p_1,u_1),(s_2,p_2,u_2),\cdots,(s_n,p_n,u_n) (s1,p1,u1),(s2,p2,u2),⋯,(sn,pn,un)。使用这些数训练策略网络 π \pi π和价值网络 v v v。对 π \pi π和 v v v的训练同时进行。
2.2 训练策略网络和价值网络
根据我的另一篇博客蒙特卡洛树搜索(MCTS)可知,MCTS做出的决策优于策略网络 π \pi π的决策(这也是阿尔法狗使用MCTS做决策,而 π \pi π只是用来辅助MCTS的原因)。既然MCTS做出的决策比 π \pi π更好,那么可以把MCTS的决策作为目标,让 π \pi π去模仿。与1.1节所述行为克隆一致,只不过被模仿的对象不是人类高手,而是MCTS,即训练策略网络的数据不是收集到的人类高手对局数据,而是2.1节所述MCTS控制两个玩家对弈生成的对局数据。
训练价值网络的目标与阿尔法狗2016版本一致,都是让 v ( s t ; ω ) v(s_t;\omega) v(st;ω)拟合回报 u t u_t ut。其中回报 u t u_t ut不是通过策略网络做自我博弈胜负得到,而是2.1节所述方法生成。
在零狗中,对策略网络和价值网络的训练是同时进行的。将策略网络的损失与价值网络的损失相加,作为训练时优化的目标函数:
l = ( u − v ) 2 − π T l o g p + c ( ∣ ∣ θ ∣ ∣ 2 + ∣ ∣ ω ∣ ∣ 2 ) l=(u-v)^2-\pi^Tlog~p+c\big(||\theta||^2+||\omega||^2\big) l=(u−v)2−πTlog p+c(∣∣θ∣∣2+∣∣ω∣∣2)
其中, u u u是2.1所述通过MCTS自我博弈收集到的回报数据, v v v是价值网络输出, ( u − v ) 2 (u-v)^2 (u−v)2即为价值网络的损失(均方损失); π \pi π是策略网络输出, p p p是2.1所述通过MCTS自我博弈收集到的被归一化了的每个动作被选中次数数据, − π T l o g p -\pi^Tlog~p −πTlog p即为策略网络的损失(交叉熵损失); θ \theta θ和 ω \omega ω分别是策略网络参数和价值网络参数, ( ∣ ∣ θ ∣ ∣ 2 + ∣ ∣ ω ∣ ∣ 2 ) \big(||\theta||^2+||\omega||^2\big) (∣∣θ∣∣2+∣∣ω∣∣2)即为防止过拟合的正则项(L2正则); c c c是一个超参数,用于控制L2正则化权重。
零狗论文中所述神经网络 f θ ( s ) = ( P ( s , ⋅ ) , V ( s ) ) f_\theta(s)=\big(P(s,\cdot),V(s)\big) fθ(s)=(P(s,⋅),V(s))由策略网络和价值网络构成,因此论文中神经网络参数 θ \theta θ,等同于本文中的策略网络和价值网络参数 θ + ω \theta+\omega θ+ω。如果读者留意到零狗论文中目标函数 l = ( u − v ) 2 − π T l o g p + c ∣ ∣ θ ∣ ∣ 2 l=(u-v)^2-\pi^Tlog~p+c||\theta||^2 l=(u−v)2−πTlog p+c∣∣θ∣∣2与文本所述存在一定差别,不必感到疑惑,也不必质疑本文的正确性。
本文对论文中相关原理以更容易理解的方式来表述,但是相关方法在本质上是相同的。
2.3 训练流程
随机初始化策略网络参数 θ \theta θ和价值网络参数 ω \omega ω,然后让MCTS自我博弈,玩很多局游戏。每完成一局游戏,更新一次 θ \theta θ和 ω \omega ω。具体训练流程如下,训练会重复如下步骤直到收敛:
- 让MCTS自我博弈,完成一局游戏,收集到 n n n个三元组: ( s 1 , p 1 , u 1 ) , ( s 2 , p 2 , u 2 ) , ⋯ , ( s n , p n , u n ) (s_1,p_1,u_1),(s_2,p_2,u_2),\cdots,(s_n,p_n,u_n) (s1,p1,u1),(s2,p2,u2),⋯,(sn,pn,un);
- 做梯度下降,同时更新策略网络参数 θ \theta θ和价值网络参数 ω \omega ω。
3. 结束语
本文介绍了阿尔法狗2016版本和零狗中训练策略网络和价值网络的方法,机巧围棋中训练方法与零狗基本一致。大家可以在GitHub上clone机巧围棋的代码,结合本文理解和学习零狗的训练方法。
最后,期待您能够给本文点个赞,同时去GitHub上给机巧围棋项目点个Star呀~
机巧围棋项目链接:https://github.com/QPT-Family/QPT-CleverGo