大爷,快来玩呀!带禁手规则的五子棋实践强化学习理论
下载地址: https://github.com/wangjia184/renju
大爷,快来玩呀!带禁手规则的五子棋游戏,强化学习
- 1.基本结构
- 2.性能
- 3.棋局多样性
- 4.训练
最近迷上了强化学习,自学理论时感觉非常抽象,所以做了个五子棋玩玩。程序可以到我的github(https://github.com/wangjia184/renju)仓库下载,棋力怎么样试试才知道。为了削弱黑棋的优势,实现了禁手规则。三三/四四/长连皆为输。
1.基本结构
这版本采用的是AlphaZero的思路。策略价值神经网络加蒙特卡洛树搜索。残差网络模块长度只有AlphaZero的一半;宽度也从256被缩水到了64。价值输出那的全连接层激活函数换成了ELU避免dying RELU问题。从我的测试来看,棋力还行。
2.性能
蒙特卡罗树搜索属于CPU密集型操作。由于Python的性能太差,而且GIL的存在导致实现并发非常麻烦,所以我采用Rust实现,这里不得不赞一句,用Rust既能获得媲美C++的性能,还具备非常好的内存安全性和线程安全性。越用越喜欢。
性能最大的挑战并不在training阶段,而是在selfplay阶段。因为此阶段每走一步都需要进行成百上千次的mcts迭代,而单次inference的阿姆达尔加速比并不大,我试过Mac M1的GPU甚至NPU,都比CPU慢。甚至还尝试过将多个并行的棋局inference合并到一个batch给GPU推理,发现效果并不理想。最后发现用量化+CPU方式反而是最快的方式。
Selfplay阶段采用ONNX Runtime的INT8量化,精度会有所下降,效果还行;人类对弈阶段用Tensorflow Lite+XNNPACK的FP16量化,精度下降基本可以忽略不记。
策略的优化速度很大程度上和价值迭代以及策略迭代的速度相关,所以优化selfplay可以大大加快速度。
在实现上,设计了一种创新型的lockless 树形结构,可以执行安全的多线程并发操作。Selfplay阶段并不需要用到并发,而human play阶段我发现tflite自带多线程加速单次inference。既然能够发挥硬件性能,所以最终的实现上并不需要用到并发搜索。
3.棋局多样性
SelfPlay阶段的棋局多样性至关重要。同一个batch中需要来自各种不同棋局的训练数据才能让noise相互抵消。所以每次selfplay都会同时使用26种开局,而对于每种开局又再创建20盘对弈。也就是说每轮selfplay同时有520盘对弈进行。
在这些棋局的开始阶段落子抽样算法中,dirichlet noise比重占到了50%,使开局阶段的棋局尽量充满变数。而随着棋局的进行,该比重逐步降低直到10%。
当这520盘对弈都完成后,将所有收集到的棋局都进行旋转/翻转/镜像等操作,数据倍增8x。再将这些训练数据彻底打乱,以5000为最大值组成一个个batch交给后面的training阶段。
而在和人类对弈杰顿,为了增加多变性和趣味性,程序最开始的几手棋会随机落子。
4.训练
训练阶段没有什么特别的,喂数据给tensorflow进行拟合。最初用过Mac M1的GPU,发现tensorflow的metal plugin有内存泄漏,还等着apple修复,所以后来换到了Intel 13700K + 128G RAM的机器上训练。是的,没有显卡(坚决不买30系矿卡),纯CPU训练。训练了大概4~5天吧,就是目前看到的样子。
接下来还打算试试其它的RL算法(比如DQN之类的)来实现五子棋。看着各种RL算法,我感觉刘姥姥进了大观园,挺有意思的。
大爷,快来玩呀!带禁手规则的五子棋实践强化学习理论相关推荐
- 人工智能博弈树极大极小搜索算法alpha-beta剪枝实现五子棋,带禁手
由于2020的特殊情况,导致了一个被拖了挺久的大作业.... 五子棋其实大家很多时候会在闲暇时刻和朋友随便玩玩,这不仅让我回忆起了高中时候摸鱼休息就喜欢和同学在自己打的格子中用铅笔来一盘五子棋,回想起 ...
- python判断五子棋胜负_一个连珠(带禁手的五子棋)判断胜负的PHP实现
gist 打不开的凑合看这个吧 xsir317/renju 曾经从一个C++的源码那里(传送门: Index of /renlib/opensrc 就是那个ForbiddenPointFinder ) ...
- java五子棋禁手规则,复盘等的实现
五子棋程序实现了判赢,禁手,复盘,低级AI(判断还存在许多问题,欢迎指正),继续游戏,夜间模式,悔棋等基本功能 代码可研究不可复制粘贴. 禁手的定义:是为了限制黑方的先手优势而设定的一种比赛规则 禁手 ...
- 百度NeurIPS全球顶会冠军团队,带你7日从零实践强化学习
如今,强化学习不仅成了学术界的宠儿,相关研究论文在各大顶会中的比例飞速上升:也在不断挑战冠军,突破记录,成为了AI开发的热门领域,比如击败围棋世界冠军的Alpha Go,就引起了大家对AI的广泛关注. ...
- 五子棋程序设计(C语言、人机对战、禁手)
五子棋程序设计(C语言.人机对战.禁手) 一.程序需求分析 1.1五子棋简介 五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏. 五子棋有两种玩法.玩法一:双方分别使用黑白两色的棋 ...
- 五子棋的禁手c++语言实现,五子棋游戏软件的设计与实现 毕业论文.doc
论文题目:五子棋游戏软件的设计与实现 教 学 站校本部学生姓名:指导教师:专 业:计算机科学与技术 2014年4月30日 摘要 C++语言是一种面向对象的语言,尽管在当前,可视化语言发展迅速,普及很快 ...
- 五子棋人人对战功能的C语言实现(无禁手)
文章目录 前言 显示棋盘 执行落子 胜负判定 功能综合 前言 之前C语言课的大作业是设计一个可以进行人人对战和人机对战的五子棋程序.我在初期开始写的时候参考过很多份代码,但对于当时我的水平而言不够直观 ...
- 《数位板这样玩——Photoshop+Painter数码手绘必修课(第2版)》—创建数字艺术工作室...
本节书摘来自异步社区<数位板这样玩--Photoshop+Painter数码手绘必修课(第2版)>一书中的创建数字艺术工作室,作者[美]Cher Threinen-Pendarvis,更多 ...
- 诺亚传说手游怎么用电脑玩 诺亚传说手游PC电脑版教程
<诺亚传说手游>是一款经典的科幻之作,游戏是从端游戏中移植,是一款以即时战斗为背景的科幻类游戏,有着精致的3D场景打造带给玩家丰富的玩法体验,优秀的剧情让你感受游戏精彩魅力.下面小编就给亲 ...
最新文章
- USTC English Club Note20171015
- 2006---2009年杭电计算机历年研究生复试---笔试编程
- 您是否真的要加快Maven的编译/打包速度? 那么takari生命周期插件就是答案。
- Mysql查看某个表大小
- EXCHANGE服务器灾难恢复
- jQuery-1.9.1源码分析系列(十) 事件系统——事件包装
- 幼儿园案例经验迁移_共教研,促成长阳光天健城幼儿园9月份教研分享
- jQuery.fn.extend()方法
- java代码获取系统时间相差8小时
- 偶然的相遇【我与51CTO的故事】
- Micro Sip 配置自己的freeswitch服务器地址
- antd使用阿里巴巴矢量图标
- Unity Keyword
- 黄冈市2021高考成绩查询系统,黄冈师范学院
- 活动倒计时HTML,活动倒计时代码(精确到毫秒)jquery插件
- Python中字典创建、遍历、添加
- 基于Mapbox实现地图的样式配置
- 计算机主板外频,笨鸟先飞 主板超频BIOS选项接触(图解)
- vue+echarts实现3d地图——引入3d地图,加点,加点击事件
- 数值最优化—无约束问题信赖域算法
热门文章
- 原创 | 程序员学英语,如何做才能飞起!
- 独家|知识图谱技术在司法领域的应用:国双科技探索与技术分享
- 成为一名优秀的CTO,要具备哪些能力模型?
- dpdk-16.04 igb_uio 模块分析
- 微信内防红短网址是怎么做出来的,微信域名防红原理
- 英,克莱儿•麦克福尔著,付强译《摆渡人2重返荒原》
- Lecture07:双层规划方法
- 自考管理系统中计算机应用名词解释外包,2010年自考管理系统中计算机应用名词解释...
- 阿里巴巴集团技术委员会主席王坚:我曾经被诺贝尔奖得主司马贺忽悠_相信人工智能就是未来!
- 经典教材--C语言程序设计(第五版)pdf