c语言五子棋蒙特卡洛,五子棋对弈——MCTS学习(示例代码)
初识AlphaZero
AlphaZero能够基于强化学习实现较高技巧的棋类博弈,我看过nb网友实现的基于MCTS的五子棋模型后,惊叹不已!特此记录一下其中训练的一些方法和技巧。
MCTS
MCTS是指蒙特卡洛搜索树。
蒙特卡洛搜索树没听过的话,想必你是知道蒙特卡罗模拟的。这个模拟过程就是暴力的按照概率去操作所有过程,最后得出一个统计的结果。举一个很简单的例子,比如你要计算圆周率(pi),那么可以画一个正方形和一个内切圆。用两个面积之比可以得到圆周率的值,于是我们进行蒙特卡洛模拟,具体过程是在正方形内撒点,在每个区域内点数均匀的情况下,我们可以认为一个区域内的点数正比于面积,那么我们通过统计点数之比就可以近似得到面积之比。
而MCTS与模拟有一些区别,分为四个部分:SELECTION,EXPANSION,SIMULATION,BACK_PROPAGATION。
关于MCTS的详细内容可以参考这篇文章。
UCB
树上的上限置信区间算法是一个能很好权衡探索与利用的算法。
[UCT(v) = frac{Q(v)}{N(v)} + c sqrt{frac{2ln N(u)}{N(v)}}
]
式中(Q)是赢的次数,(N)是这个点经过次数,(u)是(v)节点的父亲节点。通过调节系数(c)我们也能改变对exploration和exploitation的倾向。
SELECTION
第一步,从当前根节点选择一个子节点,作为下一次的根。提供一个判断标准,我们算出每个叶子节点的分数,选择最高的一个吧?
但是直接选择最高的一个其实是有问题的。因为如果每次都从最高的开始选,可能存在一些效果更好的选择但是我们从来没有探索过,所以我们一般采用(UCB)来作为评估手段。
EXPANSION
在第一步中,我们始终在向下进行选择,然而一定会到达一种状态
游戏结束
有一个节点没有探索过
对于上面第二种结果,我们就要应用我们的EXPANSION了。扩展这个没有儿子节点的node的所有后续可能局面。
SIMULATION
在上一步的基础上,我们按照游戏规则模拟整局游戏,直到游戏结束,这一步是比较简单的。
BACK_PROPAGATION
得到游戏结果,包括打分和赢家,我们对这一条树上路径进行往回更新,更新祖先节点的分数和行动概率,以改良结果。
值得一提的是,上面讲到的是传统MCTS,我们还实现一个基于深度模型预测的MCTS,这个东西比上面所提到的有些进步,它的EXPANSION决策不再是随机的,而是按照Model给出的预测结果进行选择的,最后的结果也将会影响Model的参数。
Policy Value Net
网络结构
接下来说一说训练代码的模型结构。
公共的三层全卷积网络,然后分成Policy和Value两个输出端。
policy端,4个1X1的filter进行滤波,接全连接层,然后做softmax得到落子概率。
value端,filter后接全连接层,tanh后得到([-1,1])的评分。
输入描述
输入为4个(width imes height)的矩阵,前两个表示两个玩家的落子位置,第三个是对手上一次落子位置,第四个表示是否先手(原文中用了四个,但我认为前两个矩阵的顺序完全可以决定当前玩家是谁,比如规定第一个矩阵表示当前玩家的落子位置。如果知道原因的大佬希望评论区留言)。
train目标
输入是局面(state),网络输出的落子概率和最终评分分别是(p)和(v),MCTS模拟结果的落子概率和评分分别是(pi)和(z),我们的目标就是网络输出和MCTS的结果尽量相同,这样模型预测的结果尽量代替上千次MCTS的模拟,MCTS又在模型基础上模拟出更多的训练数据。
定义损失函数为
[l = (z-v)^2 - pi ^T log p + c ||heta||^2
]
前两项分别是下一步概率和评分的损失,最后一项是防止过拟合。
self play
训练时,两个玩家分别是纯粹MCTS策略玩家和有模型优化的MCTS_AlphaZero策略。他们在下棋的时候,不会直接落子,而是自己和自己self-play若干局,这样就在当前局面中构造了一个蒙特卡洛搜索树。MCTS的EXPANSION策略上面讲过了,这里说一下后者是怎么做的。
为了达到exporation的效果,我们的(UCT)还不够。self-play时,我们的“树玩家”并不是严格执行着某一个落子结果,而是按照概率随机进行的,而且在原有move probability的基础上,还加了一个迪利克雷分布的噪声,
[P(s, a) = (1 - varepsilon)p_a + varepsilon eta_a
]
有助于探索更多局面。文中作者找到的一个比较好的参数为
[varepsilon = 0.25, eta_a sim Dir(0.3)
]
AlphaZero玩家还会不停地给Policy Value Net返回训练需要的((state, p, v))结果,但需要注意的是,每次计算的时候,考虑的都是当前玩家的最优策略,注意Game Theory。
Policy Value Net拿到数据之后,去梯度下降,用最新的模型去和纯MCTS的玩家博弈,看看平均胜率,如果比历史的模型胜率更高,那么就更新我们的best_model。
Tricks
每次训练得到的数据不要直接扔进去训练,我们做一个操作:由于五子棋游戏本身的各种旋转、对称局面等价性,我们对同一种数据做旋转和对称,那么这些state的结果也是一样的。
参考
c语言五子棋蒙特卡洛,五子棋对弈——MCTS学习(示例代码)相关推荐
- harris角点检测c语言程序,Harris角点检测学习(示例代码)
1.角点的定义与性质 角点是一种局部特征,具有旋转不变性和不随光照条件变化而变化的特点,一般将图像中曲率足够高或者曲率变化明显的点作为角点.检测得到的角点特征通常用于图像匹配.目标跟踪.运动估计等方面 ...
- 蒙特卡洛树搜索(MCTS)的实例代码
另一篇博客对代码的讲解 原理: 在当前树节点(设为A)状态下,如果所有子节点都展开了,则按UCT算法选择最优节点作为当前节点,循环下去,直到该节点有未展开的子节点,则从未展开的子节点里瞎选一个并展开它 ...
- C语言循环选择还有,C语言第五讲,语句 顺序循环选择.(示例代码)
C语言第五讲,语句 顺序循环选择. 一丶语句的简明了解 我们知道,在编写C语言程序的时候,代码是顺序执行的. 从上往下执行. 但是我们可以控制流程的. 在控制之前,我们要先熟悉什么是语句. 相比大家学 ...
- c语言无视数据类型字符串存储,C语言基础-第二课-数据类型与运算符(示例代码)...
1 C语言中的数据类型 1.1 常量 常量就是在程序中不可变化的量,常量在定义的时候必须给一个初值. 1.1.1#define 定义一个宏常量 1.1.2const 定义一个const常量 1 ...
- 易语言html规则分析,易语言算法原理浅析【一】(示例代码)
注: 如果你看完了下面的文章.就来试试这个KeyGenMe吧,相信你能有所收获. 一.文章开头首先我们要贴上一段易语言代码,并且编译这段代码,从汇编角度分析易语言程序编译后,易语言算法在汇编中的实现过 ...
- c语言变量加常量,C语言(二)---常量与变量(示例代码)
一.进制 1.1 二进制 1.1 简介 二进制数据是用0和1两个数码来表示的数.它的基数是2,进位规则是"逢二进1",借位规则是"借一当二".当前的计算机系统使 ...
- 谁的饭量大 c语言编程,c语言第一章第一节 认识变量(示例代码)
声明:本人大一新生,闲着无聊..写写c语言教程..菜鸟一枚..大神勿喷!!! 接下来我们都用dev来进行编译..vc++太古老了,没提示功能,不好上手,并且老是出毛病..vs太大了,编个c不至于,运行 ...
- apt包管理 Android,apt软件包管理学习(示例代码)
软件通常以软件包的形式存储在仓库中,管理软件一般叫做软件包管理.本文主要记录apt包管理工具的基本使用:查找,安装,升级和删除. 包管理工具 软件包一般是一个压缩文件,里面包括编译好的二进制文件和需要 ...
- c语言数位重排为最大数,18.12.09-C语言练习:黑洞数 / Kaprekar问题(示例代码)
题目: 程序: 1 #include 2 3 int main(void) {4 intn, a, b, c, t, A, B;5 printf("输入一个三位数整数:");6 s ...
最新文章
- 成功解决linear_model\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been ad
- 【项目实战】vue+springboot项目使用富文本编辑器实现长文章发表和展示
- 如何让智能客服成为企业的生产力工具?
- 1965 - 2019 年最流行的编程语言变化
- 软件项目组织管理(九)项目人力资源管理
- 四人帮–代理设计模式
- 谈区块链的时候别忘记了“新零售”
- 【Oracle】管理还原数据(undo)
- 使用阿里云容器镜像的 github关联仓库,海外机器构建 Docker 镜像
- Oracle开发实战经典教程(教学视频)
- 1.2-知识图谱有什么用?
- ctf writeup之程序员密码
- VMware新建虚拟机在按照过程图形化鼠标点击不了,
- 直接使用word模板生成word文件
- iOS开发:兼容适配iPhone X
- 刚发布!新型病毒下,程序员可在家免费学习了!
- 非极大抑制(Non-Maximum Suppression)
- word文档多级列表设置
- 实验1 BP神经网络实验
- 带上传进度的文件上传
热门文章
- spring学习指南 第4版_邹为诚《综合英语教程(1)》(第3版)学习指南词汇短语课文精解全文翻译练习答案电子版学习资料...
- ubuntu下图片处理工具
- Linux命令fc,来学一学在Linux中使用fc命令
- Matlab中title函数使用
- ADODB操作数据库函数DBData和qstr
- SWUST OJ#978 #979 #980 二叉树的遍历
- 服装厂需要计算机系的嘛,90后小伙不愿去服装厂上班,问明原因,他只说了这10个字!...
- rearm 命令_利用rearm命令延长Windows 7试用期
- Bootstrap Collapse(手风琴)插件添加加减号、三角形图标
- STM32—TIMx实现编码器四倍频