本教程介绍了一个同步的单线程单GPU的game-agnostic的AlphaZero复现工作。这是一部很漂亮的作品,它训练了一个仅通过自己和自己下棋的方式来学习的智能体,除了游戏规则之外,智能体没有利用任何的人类知识。与DeepMind之前的论文相比,该方法相当简单,而且AlphaGo Zero最终令人信服地击败了AlphaGo。AlphaGo使用专家游戏的数据进行训练,并击败了最好的人类围棋选手。最近,DeepMind在Arxiv上发布了AlphaZero的预印版,将AlphaGo Zero方法扩展到国际象棋和日本将棋。
这篇文章的目的是从AlphaGo Zero论文中提炼出关键思想,并通过代码具体地理解它们。我们假定读者基本熟悉机器学习和强化学习概念,如果您了解神经网络基础知识和蒙特卡洛树搜索,则应该可以更容易理解。在开始之前(或者在读完本教程之后),我建议阅读原始论文。它写得很好,可读性很强,插图也很漂亮!AlphaGo Zero是通过自我游戏(self-play)强化学习来训练的。它将神经网络和蒙特卡罗树搜索结合在一个优雅的策略迭代框架中,实现了稳定的学习。不过,这只是空话-让我们立即深入研究细节吧!
神经网络
毫不意外的是,AlphaGo Zero的核心是一个神经网络。网络 f θ f_\theta fθ( θ \theta θ是神经网络的权重)以棋盘的某个状态作为输入。网络有两个输出:
- v θ ( s ) ∈ [ − 1 , 1 ] v_\theta(s) \in [-1,1] vθ(s)∈[−1,1], 受棋盘状态 s s s控制的连续值,实则为当前玩家视角的状态值函数 V π ( s ) V_\pi(s) Vπ(s)。
- p θ ( s ) p_\theta(s) pθ(s), 指示了动作空间中所有动作可能采取的概率值,即策略 π ( a ∣ s ) \pi(a|s) π(a∣s)
在训练神经网络时,我们在每盘棋结束时向模型送入训练数据,数据格式如 ( s t , π t , z t ) (s_t,\pi_t,z_t) (st,πt,zt), π t \pi_t πt是从当前状态 s t s_t st估计的策略向量(下一节我们介绍如何从一个状态估计策略), z t ∈ { − 1 , 1 } z_t \in \{ -1,1\} zt∈{ −1,1}是当前玩家视角在状态 s t s_t st时对游戏输赢的估计值,+1表示当前玩家赢得棋局,-1表示输掉。(为什么总是强调当前玩家视角,AlphaGo Zero采取左右手互博的机制,在某一回合执白棋,下一回合则执黑棋,黑白双方对棋局的预测是截然相反的,零和游戏嘛) 网络的优化函数如下所示,不包括正则化项。
l = ∑ t ( v θ ( s t ) − z t ) 2 − π t ⋅ log ( p θ ( s t ) ) l=\sum_t (v_\theta(s_t)-z_t)^2-\pi_t \cdot \log(p_\theta(s_t)) l=