强化学习入门:使用AlphaZero算法实现井字棋web人机对战游戏

背景

AlphaZero 是由 DeepMind 开发的一种通用强化学习算法,于 2017 年首次提出(2018年发于science)。通过深度神经网络与蒙特卡洛树搜索(MCTS)的结合,无需依赖特定的领域知识,只需通过自对弈的方式训练模型,在围棋、国际象棋、将棋等复杂策略游戏中展现出超越人类顶尖选手的能力,甚至超越了此前依赖领域知识的专用 AI(如 AlphaGo)。

 

技术和方案

self-play

作用:通过多轮自对弈的方式收集训练数据训练模型

具体流程:

  1. 从根节点开始,经过多轮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表示该子节点的访问次数
    • 检查该结点是否是结束结点:
      • 如果不是结束结点:使用模型预估的action概率扩展该子节点,并使用模型预估状态价值反向传播更新祖先结点的状态价值
      • 如果是结束结点:使用结局转态价值反向传播更新主线结点的转态价值
        • 更新公式:self.Q += alpha * (state_value - self.Q) / self.visits
  2. 根据每个结点的访问次数使用softmax函数计算不同action概率(保留当前state、action概率作为训练样本),选择最优action到达下一状态
  3. 重复1-2步骤,直到到达结束结点,根据结束状态的结果更新保留的训练样本的label
  4. 使用本轮收集到的样本训练模型
  5. 重复以上流程完成多轮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

posted @ 2025-03-28 17:59  AI_Engineer  阅读(271)  评论(0)    收藏  举报