AlphaZero 实战:从零学下五子棋(附代码)_alphazero: mastering chess and shogi by self-play -程序员宅基地

技术标签: RL  

雷锋网(公众号:雷锋网) AI 科技评论按,本文作者一缕阳光,本文首发于知乎专栏强化学习知识大讲堂,雷锋网 AI 科技评论获其授权转载。

2 个多月前,AlphaGo Zero 横空出世,完全从零开始,仅通过自我对弈就能天下无敌,瞬间刷爆朋友圈,各路大神分分出来解读,惊叹于其思想的简单、效果的神奇。很快就有大神放出了开源版的 AlphaGo Zero,但是只有代码,没有训练出来的模型,因为据大神推算,在普通消费级的电脑上想训练出 AlphaGo Zero 的模型需要 1700 年!然而 DeepMind 在 AlphaGo Zero 的论文里只强调运行的时候需要 4 个 TPU,而完全没有提及训练过程的最大计算需求在于生成 self-play 数据,还引起了一点小争议。

还好,过了不到两个月,在 12 月初,DeepMind 就在 Arxiv 上低调放出了更加通用的 AlphaZero 的论文。AlphaZero 几个小时就征服围棋、国际象棋和日本将棋的壮举再次惊叹世人,但同时 DeepMind 大方公开的 self-play 阶段使用的 5000 个 TPU 也让大家纷纷感叹,原来是“贫穷限制了我们的想象力”!

扯得有点远了,让我们回到这篇文章的正题:AlphaZero 实战,通过自己动手从零训练一个 AI,去体会 AlphaZero 自我对弈学习成功背后的关键思想和一些重要技术细节。这边选择了五子棋作为实践对象,因为五子棋相对比较简单,大家也都比较熟悉,这样我们能更专注于 AlphaZero 的训练过程,同时也能通过亲自对阵,来感受自己训练出来的 AI 慢慢变强的过程。

经过实践发现,对于在 6*6 的棋盘上下 4 子棋这种情况,大约通过 500~1000 局的 self-play 训练(2 小时),就能训练出比较靠谱的 AI;对于在 8*8 的棋盘上下 5 子棋这种情况,通过大约 2000~3000 局自我对弈训练(2 天),也能得到比较靠谱的 AI。所以虽然贫穷,但我们还是可以去亲身感受最前沿成果的魅力!完整代码以及 4 个训练好的模型已经上传到了 github:https://github.com/junxiaosong/AlphaZero_Gomoku

我们先来看两局训练好的 AI 模型(3000 局 self-play 训练得到)对弈的情况,简单感受一下:

每一步棋执行 400 次 MCTS 模拟

每一步棋执行 800 次 MCTS 模拟

从上面的对局样例可以看到,AI 已经学会了怎么下五子棋,知道什么时候要去堵,怎么样才能赢,按我自己对阵 AI 的感受来说,要赢 AI 已经不容易了,经常会打平,有时候稍不留神就会输掉。

这里有一点需要说明,上面展示的两局 AI 对弈中,AI 执行每一步棋的时候分别只执行了 400 次和 800 次 MCTS 模拟,进一步增大模拟次数能够显著增强 AI 的实力,参见 AlphaZero 论文中的 Figure 2(注:AlphaZero 在训练的时候每一步只执行 800 次 MCTS simulations,但在评估性能的时候每一步棋都会执行几十万甚至上百万次 MCTS 模拟)。

下面,我结合 AlphaZero 算法本身,以及 github 上的具体实现,从自我对局和策略价值网络训练两个方面来展开介绍一下整个训练过程,以及自己实验过程中的一些观察和体会。

自我对局(self-play) self-play过程示意图

完全基于 self-play 来学习进化是 AlphaZero 的最大卖点,也是整个训练过程中最关键也是最耗时的环节。这里有几个关键点需要说明:

1. 使用哪个模型来生成 self-play 数据?

在 AlphaGo Zero 版本中,我们需要同时保存当前最新的模型和通过评估得到的历史最优的模型,self-play 数据始终由最优模型生成,用于不断训练更新当前最新的模型,然后每隔一段时间评估当前最新模型和最优模型的优劣,决定是否更新历史最优模型。

而到了 AlphaZero 版本中,这一过程得到简化,我们只保存当前最新模型,self-play 数据直接由当前最新模型生成,并用于训练更新自身。直观上我们可能会感觉使用当前最优模型生成的 self-play 数据可能质量更高,收敛更好,但是在尝试过两种方案之后,我们发现,在 6*6 棋盘上下 4 子棋这种情况下,直接使用最新模型生成 self-play 数据训练的话大约 500 局之后就能得到比较好的模型了,而不断维护最优模型并由最优模型生成 self-play 数据的话大约需要 1500 局之后才能达到类似的效果,这和 AlphaZero 论文中训练 34 小时的 AlphaZero 胜过训练 72 小时的 AlphaGo Zero 的结果也是吻合的。

个人猜测,不断使用最新模型来生成 self-play 数据可能也是一个比较有效的 exploration 手段,首先当前最新模型相比于历史最优模型一般不会差很多,所以对局数据的质量其实也是比较有保证的,同时模型的不断变化使得我们能覆盖到更多典型的数据,从而加快收敛。

2. 如何保证 self-play 生成的数据具有多样性?

一个有效的策略价值模型,需要在各种局面下都能比较准确的评估当前局面的优劣以及当前局面下各个 action 的相对优劣,要训练出这样的策略价值模型,就需要在 self-play 的过程中尽可能的覆盖到各种各样的局面。

前面提到,不断使用最新的模型来生成 self-play 数据可能在一定程度上有助于覆盖到更多的局面,但仅靠这么一点模型的差异是不够的,所以在强化学习算法中,一般都会有特意设计的 exploration 的手段,这是至关重要的。

在 AlphaGo Zero 论文中,每一个 self-play 对局的前 30 步,action 是根据正比于 MCTS 根节点处每个分支的访问次数的概率采样得到的(也就是上面 Self-play 示意图中的 

3. 始终从当前 player 的视角去保存 self-play 数据

在 self-play 过程中,我们会收集一系列的 

4. self-play 数据的扩充

围棋具有旋转和镜像翻转等价的性质,其实五子棋也具有同样的性质。在 AlphaGo Zero 中,这一性质被充分的利用来扩充 self-play 数据,以及在 MCTS 评估叶子节点的时候提高局面评估的可靠性。但是在 AlphaZero 中,因为要同时考虑国际象棋和将棋这两种不满足旋转等价性质的棋类,所以对于围棋也没有利用这个性质。

而在我们的实现中,因为生成 self-play 数据本身就是计算的瓶颈,为了能够在算力非常弱的情况下尽快的收集数据训练模型,每一局 self-play 结束后,我们会把这一局的数据进行旋转和镜像翻转,将 8 种等价情况的数据全部存入 self-play 的 data buffer 中。这种旋转和翻转的数据扩充在一定程度上也能提高 self-play 数据的多样性和均衡性。

策略价值网络训练 策略价值网络训练示意图

所谓的策略价值网络,就是在给定当前局面 

1. 局面描述方式

在 AlphaGo Zero 中,一共使用了 17 个 

在我们的实现中,对局面的描述进行了极大的简化,以 

其实在最开始尝试的时候,我只用了前两个平面,也就是双方的棋子的位置,因为直观感觉这两个平面已经足够表达整个完整的局面了。但是后来在增加了后两个特征平面之后,训练的效果有了比较明显的改善。个人猜想,因为在五子棋中,我方下一步的落子位置往往会在对手前一步落子位置的附近,所以加入的第三个平面对于策略网络确定哪些位置应该具有更高的落子概率具有比较大的指示意义,可能有助有训练。同时,因为先手在对弈中其实是很占优势的,所以在局面上棋子位置相似的情况下,当前局面的优劣和当前 player 到底是先手还是后手十分相关,所以第四个指示先后手的平面可能对于价值网络具有比较大的意义。

2. 网络结构

在 AlphaGo Zero 中,输入局面首先通过了 20 或 40 个基于卷积的残差网络模块,然后再分别接上 2 层或 3 层网络得到策略和价值输出,整个网络的层数有 40 多或 80 多层,训练和预测的时候都十分缓慢。

所以在我们的实现中,对这个网络结构进行了极大的简化,最开始是公共的 3 层全卷积网络,分别使用 32、64 和 128 个 

3. 训练目标

前面提到,策略价值网络的输入是当前的局面描述 

根据上面的策略价值网络训练示意图,我们训练的目标是让策略价值网络输出的 action 概率 

从优化的角度来说,我们是在 self-play 数据集上不断的最小化损失函数: 

下图展示的是一次在 

在训练过程中,除了观察到损失函数在慢慢减小,我们一般还会关注策略价值网络输出的策略(输出的落子概率分布)的 entropy 的变化情况。

正常来讲,最开始的时候,我们的策略网络基本上是均匀的随机输出落子的概率,所以 entropy 会比较大。随着训练过程的慢慢推进,策略网络会慢慢学会在不同的局面下哪些位置应该有更大的落子概率,也就是说落子概率的分布不再均匀,会有比较强的偏向,这样 entropy 就会变小。

也正是由于策略网络输出概率的偏向,才能帮助 MCTS 在搜索过程中能够在更有潜力的位置进行更多的模拟,从而在比较少的模拟次数下达到比较好的性能。

下图展示的是同一次训练过程中观察到的策略网络输出策略的 entropy 的变化情况。

另外,在漫长的训练过程中,我们最希望看到的当然是我们训练的 AI 正在慢慢变强。所以虽然在 AlphaZero 的算法流程中已经不再需要通过定期评估来更新最优策略,在我们的实现中还是每隔 50 次 self-play 对局就对当前的 AI 模型进行一次评估,评估的方式是使用当前最新的 AI 模型和纯的 MCTS AI(基于随机 rollout)对战 10 局。

pure MCTS AI 最开始每一步使用 1000 次模拟,当被我们训练的 AI 模型 10:0 打败时,pure MCTS AI 就升级到每一步使用 2000 次模拟,以此类推,不断增强,而我们训练的 AlphaZero AI 模型每一步始终只使用 400 次模拟。在上面那次 3050 局自我对局的训练实验中,我们观察到:

经过 550 局,AlphaZero VS pure_MCTS 1000 首次达到 10:0

经过 1300 局,AlphaZero VS pure_MCTS 2000 首次达到 10:0

经过 1750 局,AlphaZero VS pure_MCTS 3000 首次达到 10:0

经过 2450 局,AlphaZero VS pure_MCTS 4000 取得 8 胜 1 平 1 负

经过 2850 局,AlphaZero VS pure_MCTS 4000 取得 9 胜 1 负。

OK,到这里整个 AlphaZero 实战过程就基本介绍完了,感兴趣的小伙伴可以下载我 github 上的代码进行尝试。为了方便大家直接和已经训练好的模型进行对战体验,我专门实现了一个纯 numpy 版本的策略价值前向网络,所以只要装了 python 和 numpy 就可以直接进行人机对战啦,祝大家玩的愉快!^_^

参考文献:

AlphaZero: Mastering Chess and Shogi by Self-Play with a General Reinforcement Learning Algorithm

AlphaGo Zero: Mastering the game of Go without human knowledge

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/AMDS123/article/details/79092978

智能推荐

攻防世界_难度8_happy_puzzle_攻防世界困难模式攻略图文-程序员宅基地

文章浏览阅读645次。这个肯定是末尾的IDAT了,因为IDAT必须要满了才会开始一下个IDAT,这个明显就是末尾的IDAT了。,对应下面的create_head()代码。,对应下面的create_tail()代码。不要考虑爆破,我已经试了一下,太多情况了。题目来源:UNCTF。_攻防世界困难模式攻略图文

达梦数据库的导出(备份)、导入_达梦数据库导入导出-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏10次。偶尔会用到,记录、分享。1. 数据库导出1.1 切换到dmdba用户su - dmdba1.2 进入达梦数据库安装路径的bin目录,执行导库操作  导出语句:./dexp cwy_init/[email protected]:5236 file=cwy_init.dmp log=cwy_init_exp.log 注释:   cwy_init/init_123..._达梦数据库导入导出

js引入kindeditor富文本编辑器的使用_kindeditor.js-程序员宅基地

文章浏览阅读1.9k次。1. 在官网上下载KindEditor文件,可以删掉不需要要到的jsp,asp,asp.net和php文件夹。接着把文件夹放到项目文件目录下。2. 修改html文件,在页面引入js文件:<script type="text/javascript" src="./kindeditor/kindeditor-all.js"></script><script type="text/javascript" src="./kindeditor/lang/zh-CN.js"_kindeditor.js

STM32学习过程记录11——基于STM32G431CBU6硬件SPI+DMA的高效WS2812B控制方法-程序员宅基地

文章浏览阅读2.3k次,点赞6次,收藏14次。SPI的详情简介不必赘述。假设我们通过SPI发送0xAA,我们的数据线就会变为10101010,通过修改不同的内容,即可修改SPI中0和1的持续时间。比如0xF0即为前半周期为高电平,后半周期为低电平的状态。在SPI的通信模式中,CPHA配置会影响该实验,下图展示了不同采样位置的SPI时序图[1]。CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。_stm32g431cbu6

计算机网络-数据链路层_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏8次。数据链路层习题自测问题1.数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与”数据链路接通了”的区别何在?2.数据链路层中的链路控制包括哪些功能?试讨论数据链路层做成可靠的链路层有哪些优点和缺点。3.网络适配器的作用是什么?网络适配器工作在哪一层?4.数据链路层的三个基本问题(帧定界、透明传输和差错检测)为什么都必须加以解决?5.如果在数据链路层不进行帧定界,会发生什么问题?6.PPP协议的主要特点是什么?为什么PPP不使用帧的编号?PPP适用于什么情况?为什么PPP协议不_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输

软件测试工程师移民加拿大_无证移民,未受过软件工程师的教育(第1部分)-程序员宅基地

文章浏览阅读587次。软件测试工程师移民加拿大 无证移民,未受过软件工程师的教育(第1部分) (Undocumented Immigrant With No Education to Software Engineer(Part 1))Before I start, I want you to please bear with me on the way I write, I have very little gen...

随便推点

Thinkpad X250 secure boot failed 启动失败问题解决_安装完系统提示secureboot failure-程序员宅基地

文章浏览阅读304次。Thinkpad X250笔记本电脑,装的是FreeBSD,进入BIOS修改虚拟化配置(其后可能是误设置了安全开机),保存退出后系统无法启动,显示:secure boot failed ,把自己惊出一身冷汗,因为这台笔记本刚好还没开始做备份.....根据错误提示,到bios里面去找相关配置,在Security里面找到了Secure Boot选项,发现果然被设置为Enabled,将其修改为Disabled ,再开机,终于正常启动了。_安装完系统提示secureboot failure

C++如何做字符串分割(5种方法)_c++ 字符串分割-程序员宅基地

文章浏览阅读10w+次,点赞93次,收藏352次。1、用strtok函数进行字符串分割原型: char *strtok(char *str, const char *delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。其它:strtok函数线程不安全,可以使用strtok_r替代。示例://借助strtok实现split#include <string.h>#include <stdio.h&_c++ 字符串分割

2013第四届蓝桥杯 C/C++本科A组 真题答案解析_2013年第四届c a组蓝桥杯省赛真题解答-程序员宅基地

文章浏览阅读2.3k次。1 .高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记_2013年第四届c a组蓝桥杯省赛真题解答

基于供需算法优化的核极限学习机(KELM)分类算法-程序员宅基地

文章浏览阅读851次,点赞17次,收藏22次。摘要:本文利用供需算法对核极限学习机(KELM)进行优化,并用于分类。

metasploitable2渗透测试_metasploitable2怎么进入-程序员宅基地

文章浏览阅读1.1k次。一、系统弱密码登录1、在kali上执行命令行telnet 192.168.26.1292、Login和password都输入msfadmin3、登录成功,进入系统4、测试如下:二、MySQL弱密码登录:1、在kali上执行mysql –h 192.168.26.129 –u root2、登录成功,进入MySQL系统3、测试效果:三、PostgreSQL弱密码登录1、在Kali上执行psql -h 192.168.26.129 –U post..._metasploitable2怎么进入

Python学习之路:从入门到精通的指南_python人工智能开发从入门到精通pdf-程序员宅基地

文章浏览阅读257次。本文将为初学者提供Python学习的详细指南,从Python的历史、基础语法和数据类型到面向对象编程、模块和库的使用。通过本文,您将能够掌握Python编程的核心概念,为今后的编程学习和实践打下坚实基础。_python人工智能开发从入门到精通pdf