强化学习入门:使用AlphaZero算法实现井字棋web人机对战游戏
背景
AlphaZero 是由 DeepMind 开发的一种通用强化学习算法,于 2017 年首次提出(2018年发于science)。通过深度神经网络与蒙特卡洛树搜索(MCTS)的结合,无需依赖特定的领域知识,只需通过自对弈的方式训练模型,在围棋、国际象棋、将棋等复杂策略游戏中展现出超越人类顶尖选手的能力,甚至超越了此前依赖领域知识的专用 AI(如 AlphaGo)。
技术和方案
self-play
作用:通过多轮自对弈的方式收集训练数据训练模型
具体流程:
- 从根节点开始,经过多轮simulation后,选择最优action对应的child_node,每轮simulation的过程如下:
- 使用PUCT公式不断选择子节点,直至到达叶子结点,在此叶子结点用模型做一次预估,得到该结点状态值和下一步不同action概率
- PUCT公式:score = Q + c_puct * P * sqrt(N_parent) / (1+N_child)
- 其中:Q是状态价值,c_puct是个超参数,P是模型预估的action概率,N_parent表示父节点的访问次数,N_child表示该子节点的访问次数
- PUCT公式:score = Q + c_puct * P * sqrt(N_parent) / (1+N_child)
- 检查该结点是否是结束结点:
- 如果不是结束结点:使用模型预估的action概率扩展该子节点,并使用模型预估状态价值反向传播更新祖先结点的状态价值
- 如果是结束结点:使用结局转态价值反向传播更新主线结点的转态价值
- 更新公式:self.Q += alpha * (state_value - self.Q) / self.visits
- 使用PUCT公式不断选择子节点,直至到达叶子结点,在此叶子结点用模型做一次预估,得到该结点状态值和下一步不同action概率
- 根据每个结点的访问次数使用softmax函数计算不同action概率(保留当前state、action概率作为训练样本),选择最优action到达下一状态
- 重复1-2步骤,直到到达结束结点,根据结束状态的结果更新保留的训练样本的label
- 使用本轮收集到的样本训练模型
- 重复以上流程完成多轮self-play
在真正对局时只需要上面第一步获取最优action就可以了
模型和loss
模型包含两个目标,分别预估当前转态价值和和下一步的action概率,loss为:
代码实践
为了方便理解,减少复杂度,使用AlphaZero实现井字棋人机对战web游戏:https://github.com/xmm1994/AlphaZeroTicTacToe
问题:
AlphaZero相对于MCTS算法优点?
1. MCTS的状态价值和动作概率都是通过每次模拟统计得到,当状态空间很大时需要非常大的模拟次数才能得到准确的结果,而AlphaZero中状态价值和动作概率是通过模型预估得到,有更强的泛化能力,能提高探索效率
参考资料
https://zhuanlan.zhihu.com/p/22061641827
https://zhuanlan.zhihu.com/p/5367995214
https://zhuanlan.zhihu.com/p/32089487