VV游戏

 找回密码
 立即注册
查看: 221|回复: 11

分享一个象棋AI的开源项目,基于AlphaZero算法。

[复制链接]

2

主题

8

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2023-3-4 13:33:55 | 显示全部楼层 |阅读模式

一、从AlphaGo到AlphaZero,实现一套通用的游戏AI训练算法



谷歌最早期的AlphaGo在2016年就已经可以击败围棋职业选手,但是当将AlphaGo应用到其他游戏上时却有很多困难,如:需要专家精心设计特征,需要人类玩家对弈的数据进行监督训练等。在迭代更新之后,一套全新的通用演算法AlphaZero出现了,理论上,只要是双人完全信息博弈的游戏都可以籍由此一套算法来进行AI训练,所以AlphaZero是一套通用演算法(不考虑算力成本)。

  • 对比于AlphaGo,AlphaZero主要对以下几点做了改进:
1、AlphaGo用到了人类专家对弈的棋谱进行训练,AlphaZero则完全从零进行自对弈训练。避免了找专家数据的麻烦。
2、AlphaGo用到了人类专家精心设计的特征,AlphaZero则只用到了棋盘的表示特征。让围棋小白也能训练出一个超强AI。
3、AlphaZero棋力更强,是一个通用算法,理论上双人完全信息博弈类游戏皆可籍由此一个算法搞定。
4、省去模型评估的部分,加速训练过程。


如上图所示,AlphaZero通过几十万次的自我对弈,最终要强于其他游戏软件和AlphaGo。

二、本项目简介

1、视频讲解:从零编写代码!教你打造属于你自己的象棋AI【使用AlphaZero算法】!_哔哩哔哩_bilibili
2、github上开源项目https://github.com/tensorfly-gpu/aichess 求star。也欢迎提加速AI训练的pr。
3、在aistudio上也有一键可运行的项目使用AlphaZero算法打造属于你自己的象棋AI! - 飞桨AI Studio (baidu.com)
4、本项目最好用多个进程进行训练,训练的方法如下:

  • 在终端运行"cd aichess"将路径定位到aichess里,然后运行"python collect.py"进行自我对弈数据的收集。可以开四个这样的终端进行更快速的数据收集。
  • 在终端运行"cd aichess"将路径定位到aichess里,然后运行"python train.py"进行模型的训练。这个只能开一个,因为我们的多进程是collect.py来实现的。
5、训练差不多了之后,就可以进行快乐的人机对战了,可以在aistudio上运行"play_with_ai.py"进行print模式的对弈,也可以把项目copy到本地运行"UIplay"进行UI界面的一个对战。
6、以下视频展示了训练了100次,蒙特卡洛搜索次数设置为4000次的一个人机对弈棋局,模型已经学会一步之内的将军防守,但不会预知两步之内的必杀将军。

与自己训练的AI进行对弈
https://www.zhihu.com/video/1520134097855279104
三、游戏棋盘表示

接下来我们编写游戏棋盘表示,虽然AlphaZero不需要人类添加的特征,但是需要知道走子的规则。在这个游戏棋盘表示里面,我们会实现棋盘类用于棋盘表示,和游戏类用于游戏逻辑的控制,包括自我对弈,人机对弈等。这个代码非常长,主要是象棋本身的逻辑比较复杂,所以一开始上手本项目可以先看蒙特卡洛、神经网络、自我对弈训练部分。
我不太想在知乎上写代码,这个部分代码就在我开源项目game.py里
四、神经网络预测


  • 这一部分,让我们来创建神经网络。网络输入是当前的棋盘状态,然后经过前向传播返回走子概率向量和盘面价值。损失函数包含三部分:1、l2正则化,在优化器中定义;2、mse_loss,价值评估的损失(蒙特卡洛树搜索得到的价值和神经网络预测之间的误差);3、概率向量一致性损失(蒙特卡洛树搜索得到的概率向量和神经网络预测之间的误差)
  • 我们的神经网络将用于蒙特卡洛树搜索中,实现对树搜索过程中遇见的节点进行一个价值的评估,和赋予当前节点所有子节点的先验概率的功能。
  • 我们通过神经网络来对搜索的宽度和深度进行一个裁剪,同时我们使用蒙特卡洛树搜索得到的数据来对神经网络进行一个训练。神经网络和蒙特卡洛搜索树是一个相辅相成的关系。


这个部分代码在开源项目paddle_net.py和pytorch_net.py里
五、蒙特卡洛树搜索


  • 这一节,我们来实现非常关键的蒙特卡洛树搜索。在开始之前,我们先考量一下强化学习价值迭代过程,如下视频所示。这是一个走迷宫游戏s8位置价值为1,价值越高,颜色越红。随着我们智能体的一次次价值迭代,我们可以发现越靠近s8的方块价值越早上升。因为s7走一步就到s8,这样s7就慢慢学到了具有高价值,然后是s4走一步到s7,s4的价值也就慢慢上升。也就是说,价值迭代是一个反向传播的过程。这和我们接下来蒙特卡洛树节点的更新非常相关,如果没有游戏终盘的胜:1,负:-1,我们也是不可能训练的了模型。包括走子概率的学习,也要依赖于状态价值的评估。
  • 所以,在训练的早期,神经网络的预测值是无效的,只有当搜索树搜索到胜负的时候,才能利用胜负的价值起到一个训练指导作用。在训练的后期,神经网络就会慢慢的从游戏终局往游戏开始学习价值。从而使得不需要搜索到游戏终局,也能用神经网络的预测值作为替代。
为了更方便的理解博弈树,如下是甲乙二人的一个博弈示例。


接下来我们正式进入蒙特卡洛树搜索,为了方便理解,我们以井字棋为例,使用puct算法进行4次模拟,每次模拟都需要走到叶节点才停止(也就是尚未扩展的节点)。其中Q值是随意设的,并不代表真实情况。
如下,我们进行第一次模拟,根据puct算法得出三个动作值都是0,我们从中选一个最大值,假设就是第一个,得到神经网络估计的Q值0.6,然后我们进行一次反向传播更新其所有父节点的各个参数值(Q,访问次数)等。


然后我们进行第二次模拟,根据上一次模拟更新的参数再次计算动作值,第一个动作值最大为1.85,我们就选第一个节点。注意:因为第一个节点已经不是叶节点了,所以我们要再进行下一个子节点的选择,同样初次访问,所有动作值是0,假设我们选了第一个子节点,返回0.3,然后对父节点更新时要将Q值添加负号。算出第一个节点的平均Q值为0.15。


同样,我们再进行第三次模拟。


第四次模拟。


如下所示,蒙特卡洛树搜索一直循环(选节点、扩展和评估、反向更新树中各节点)直到指定的模拟次数,最后进行一步落子。请务必要注意到神经网络在此过程中的缩减搜索树宽度和深度的含义。


随着我们蒙特卡洛树搜索模拟的次数增多,对子节点的估值就会越准确。在本项目的搜索树中,展开搜索树2000个节点之后,以节点的选择次数作为走子概率,然后加上迪利克雷噪声进行真实走子。真实走子之后,根节点变换到走子后的盘面。树搜索次数越多让走子的结果更可靠,平均值依概率收敛到期望。



加上迪利克雷噪声用于探索未知盘面。

加上迪利克雷噪声用于探索未知盘面。
这个部分代码在开源项目mcts.py里。
六、影分身训练

本项目的同步并行是基于数据库的方式来实现的。每个分身自我对弈结束都把自己的数据添加到同一个data_buffer中去。每次自我对弈结束,都拿到主体更新的最新模型进行下一次的对弈。主体每隔固定时间读取data_buffer进行一次模型训练。


这个部分代码在开源项目collect.py和train.py里。
七、参考与致谢


  • 本项目主要参考的资料如下,十分感谢大佬们的分享
1、程世东 https://zhuanlan.zhihu.com/p/34433581 (中国象棋cchesszero )
2、AI在打野 https://aistudio.baidu.com/aistudio/projectdetail/1403398 (用paddle打造的五子棋AI)
3、junxiaosong https://github.com/junxiaosong/AlphaZero_Gomoku (五子棋alphazero)
4、书籍:边做边学深度强化学习:PyTorch 程序设计实践
5、书籍:强化学习第二版
后续应该会对该AI继续训练下去,亲手造一个超强的下棋AI简直太酷了!
回复

使用道具 举报

1

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2023-3-4 13:34:13 | 显示全部楼层
up有没有训练好的模型文件呀
回复

使用道具 举报

1

主题

8

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2023-3-4 13:35:09 | 显示全部楼层
暂时还没有,这个训练很费时间
回复

使用道具 举报

2

主题

6

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2023-3-4 13:35:30 | 显示全部楼层
大佬训练100次,蒙特卡洛搜索次数设置为4000,用了多久呢?是通过aistudio训练的吗?有.pth之类的模型文件生成吗?[思考]
回复

使用道具 举报

1

主题

8

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2023-3-4 13:36:19 | 显示全部楼层
在最新版本里有current_policy.model的模型文件
回复

使用道具 举报

0

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-3-4 13:37:14 | 显示全部楼层
用了一天吧,这个训练特别慢
回复

使用道具 举报

1

主题

10

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2023-3-4 13:37:45 | 显示全部楼层
用了一天吧,这个训练特别慢
回复

使用道具 举报

1

主题

6

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2023-3-4 13:38:38 | 显示全部楼层
会有current_policy.pkl生成,45MB大小
回复

使用道具 举报

1

主题

8

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2023-3-4 13:39:00 | 显示全部楼层
先在b站学习了答主的视频,后自己做了很多修改,现在在知乎刷到答主文章。 感谢答主的无私分享。
回复

使用道具 举报

0

主题

7

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-3-4 13:40:00 | 显示全部楼层
问一下代码是否支持ELO分的计算呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|VV游戏

GMT+8, 2025-6-1 07:20 , Processed in 0.125854 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表