原文来自于Github:brilee/MuGo

这是 AlphaGo 基本组成部分的一个纯 Python 实现。

AlphaGo 逻辑/控制流(logic/control flow)其实并不非常复杂,本项目就是其复现。AlphaGo 的秘密武器是在于其各种神经网络之中。

就我所知,AlphaGo 在对弈过程中使用了三个神经网络。

第一个神经网络是一个速度很慢但很准确的策略网络(policy network)。这个网络被训练用来预测人类的走子(大约 57% 的准确度),它会输出一个可能走子的列表,并且每一种走子方式都对应了一个概率。这个网络为蒙特卡洛树搜索(MCTS)提供了可能的走子起点。这个神经网络很慢的一大原因是它具有很大的规模,这是因为这个神经网络的输入是围棋棋盘上的各种计算成本高昂的属性——气的数量、叫吃、征等等。

第二个神经网络也是一个策略网络,它比第一个更小更快,但准确度更低(大约 24%),这个网络并不使用复杂的属性作为输入。一旦到达了当前 MCTS 树的叶节点(leaf node),这个第二个更快的网络就会被用来得到一个棋盘局面的可能走子,并且对这个这个最终局面进行评分。

第三个神经网络是一个价值网络:它为棋盘输出一个预期获胜的范围,而不会自己下任何棋。

然后,将使用第二个神经网络的蒙特卡洛得到的结果和使用第三个神经网络的价值计算结果进行平均,然后这个值被记为该 MCTS 节点的近似结果。

开始

安装 TensorFlow

开始需要安装 TensorFlow,并使用 GPU 驱动器(即英伟达显卡的 CUDA 支持)

获取用于监督学习的 SGF

接下来需要一个 SGF 文件源。你可以在 https://u-go.net/gamerecords 获取 15 年时长的高段位对局数据。你也可以从其它来源下载专业比赛的数据库。

预处理 SGF

第三,对你的 SGF 文件进行预处理。这需要 SGF 文件中的所有局面并提取出每一个局面的特征以及记录正确的下一步走子。

然后将这些局面分割成块(chunk)——一块用于测试,其它的都用于训练。这个步骤需要一定时间,而且要是你修改了 features.py 文件中的特征提取步骤,你还需要重新预处理。

python main.py preprocess data/kgs-*

注:这句代码用了通配符,比如说:KGS 目录可以名为 data/kgs-2006-01、data/kgs-2006-02 等等

监督学习(策略网络)

使用上面预处理过的 SGF 数据(默认输出目录是 ./processed_data/),你可以训练策略网络。

python main.py train processed_data/ --save-file=/tmp/

网络训练好了之后,当前模型会被保存在 --save-file。你可以通过如下代码继续训练这个网络:

python main.py train processed_data/ --read-file=/tmp/savedmodel

--save-file=/tmp/savedmodel --epochs=10 --logdir=logs/my_training_run

此外,你也可以使用 TensorBoard 跟踪你的训练过程——如果你为每一次运行定义了一个不同的名字(如:logs/my_training_run、logs/my_training_run2),你可以将这些运行彼此重叠起来:

tensorboard --logdir=logs/

与 MuGo 对弈

MuGo 使用了 GTP 协议,你可以通过任何兼容 GTP 的程序来使用它。要调用原始策略网络,使用如下代码:

python main.py gtp policy --read-file=/tmp/savedmodel

要调用集成了 MCTS 的策略网络版本,使用:

python main.py gtp mcts --read-file=/tmp/savedmodel

通过 GTP 下棋的一种方式是使用 gogui-display(它有一个兼容 GTP 的 UI)。你可以在 GoGui下载 gogui 工具套件。参见 GoGui了解使用 GTP 的有趣方式。

gogui-twogtp -black 'python main.py gtp policy --read-file=/tmp/savedmodel' -white 'gogui-display' -size 19 -komi 7.5 -verbose -auto

另一种通过 GTP 玩的方式是对抗 GnuGo,同时还能观看比赛:

BLACK="gnugo --mode gtp"

WHITE="python main.py gtp policy --read-file=/tmp/savedmodel"

TWOGTP="gogui-twogtp -black \"$BLACK\" -white \"$WHITE\" -games 10 \

-size 19 -alternate -sgffile gnugo"

gogui -size 19 -program "$TWOGTP" -computer-both -auto

还有一种玩法是通过 GTP 连接 CGOS(http://yss-aya.com/cgos/ 计算机围棋在线服务器)。由 http://boardspace.net 运营的 CGOS 服务器已经关闭了;你需要在 http://yss-aya.com 接入 CGOS 服务器。

配置好了你的 cgos.config 文件之后,你可以通过 cgosGtp -c cgos.config 连接到 CGOS,以及使用 cgosView http://yss-aya.com 6819 查看你自己的游戏。

运行单元测试

python -m unittest discover tests

你想更深入了解学习Python知识体系,你可以看一下我们花费了一个多月整理了上百小时的几百个知识点体系内容:

python alpha_如何用Python打造一个简易版的Alpha GO?相关推荐

  1. js计算器代码加减乘除_如何用jQuery做一个简易版计算器

    经过几个小时地敲敲打打,终于把这一部分的代码完成了. 这类问题的难点不在于布局,而是如何恰当地使用jQuery达成计算.交互的目的,比如储存.显示数值,数据类型的转换等. 在听老师讲课之前的我,思路是 ...

  2. python发音机器人_只需三步,菜鸟也能用Python做一个简易版Siri

    原标题:只需三步,菜鸟也能用Python做一个简易版Siri 当下,各个手机厂商都陆续的推出了属于自己的智能手机机器人,像是苹果的Siri,小米的小爱,还有等等.这些智能机器人不仅仅方便了我们对于手机 ...

  3. Spring Security和 JWT两大利器来打造一个简易的权限系统。

    写在前面 关于 Spring Security Web系统的认证和权限模块也算是一个系统的基础设施了,几乎任何的互联网服务都会涉及到这方面的要求.在Java EE领域,成熟的安全框架解决方案一般有 A ...

  4. 如何用C++实现一个简易数据库(九)

    如何用C++实现一个简易数据库(九) 本文是<如何用C++实现一个简易数据库>的第九个单元 源码位于tutorial09-实现拆分叶结点 1. 如何分裂叶子结点? 按照惯例,我们先增加一个 ...

  5. 如何用C++实现一个简易数据库(十一)

    如何用C++实现一个简易数据库(十一) 本文是<如何用C++实现一个简易数据库>的第十一个单元 源码位于tutorial11-实现扫描多层树 1. Cursor存在什么问题? 我们在上一章 ...

  6. 如何用C++实现一个简易数据库(十)

    如何用C++实现一个简易数据库(十) 本文是<如何用C++实现一个简易数据库>的第十个单元 源码位于tutorial10-实现递归搜索 1. 如何实现递归搜索B-Tree? 按照惯例,先看 ...

  7. 一个简易版的iphone电子书阅读器

    2019独角兽企业重金招聘Python工程师标准>>> 一个简易版的iphone电子书阅读器 里面的基本功能都有了 感兴趣的朋友可以下来研究 点击此处下载源码 转载:http://w ...

  8. DFiddler:A HTTP Packets Listener一个简易版的手机端的Fiddler。

    Diddler A HTTP Packets Listener一个简易版的手机端的Fiddler. Android系统需要Root权限. PIC_20140121_220503_617.jpeg PI ...

  9. 肝一波 ~ 手写一个简易版的Mybatis,带你深入领略它的魅力!

    零.准备工作 <dependencies><dependency><groupId>mysql</groupId><artifactId>m ...

最新文章

  1. java渐变色字体生成器_java阴影文字效果怎么做?渐变的怎么做?
  2. leetcode算法题--最长的斐波那契子序列的长度
  3. linux 编译文件mm,Linux编译C++文件,说没有找到头文件,怎么啊?新手,不太会用...
  4. 2019牛客暑期多校训练营(第五场)- generator 1
  5. stm32硬件设计手册_基于STM32自制三菱PLC之软硬件设计
  6. 诺基亚报告称:到2020年北美电子邮件流量占比将跌至7%
  7. oracle Blob保存方式,关于文件保存到Oracle中BLOB字段的方法及例子
  8. esxi不能识别Intel 网卡怎么办
  9. html做table某一列的合计,Jquery、js计算table列合计
  10. <C语言>数据文件自动生成的实现
  11. 正弦信号、余弦信号与复指数信号(欧拉公式)
  12. 统计学习之第四天(可汗学院公开课:统计学)
  13. 初中python编程初步教学设计_初中Python程序设计顺序结构教学设计方案.docx
  14. 文本相似度:A Survey of Text Similarity Approaches
  15. Aspose.Words 创建表格
  16. java json 解析_Java解析JSON的四种方式
  17. java酷炫代码_Java8 中有趣酷炫的小技巧
  18. 搭建hadoop 集群,出现 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
  19. 关于计算机房弱电工程的书籍,弱电工程计算机机房设计规范..doc
  20. 苹果、微软、Google 和 Mozilla 共同合作,改进跨浏览器的扩展开发

热门文章

  1. PagerHelper-分页类
  2. 贡献一个连jquery都觉的大的时候可以用的 js库
  3. 机器学习相关——SVD分解
  4. 3000元电脑配置_2019年全新九代i59400F配RTX2060打游戏的装机电脑配置清单及价格...
  5. java 多线程并发 问题_JAVA多线程和并发基础面试问答
  6. linux传输文件无密码,Linux下scp无密码上传 下载 文件 目录
  7. java collection join_java – @ElementCollection @CollectionTable在一对多映射中
  8. linux程序实例获取,Linux命令备忘实例(4)——获取内容
  9. xss 跨站脚本漏洞 php,跨站脚本漏洞(XSS)基础讲解
  10. 大学必须掌握的计算机技巧,大学生必须掌握的电脑办公技巧