AlphaGo简易版MuGo源码解析

news2024/11/15 11:14:06

文章目录

    • 前言
    • 源码实现
      • MuGo的输入数据
      • 模型的搭建
      • 模型的训练
    • 参考链接
    • 结语

前言

自从AlphaGo横空出世,战胜李世石后,AI围棋如雨后春笋一般遍地开花。阅读DeepMind的论文有时还是隔靴搔痒,只有钻到代码里,才能一探究竟。于是,我选择了相对比较容易上手的MuGo作为研究起点。研究AlphaGo/AlphaZero实现原理,一方面是出于对AI围棋的兴趣,另一方面顺带加深对tensorflow等框架的了解。

源码实现

MuGo的代码不多,源文件一共8个。

文件名介绍
features.py特征平面定义
go.py棋盘设置,各种判断,如落子合法性,气的计算
load_data_sets.py加载棋谱文件
main.py主程序,接收命令行参数,完成预处理、训练、对弈三大功能
policy.py神经网络即策略网络的搭建
sgf_wrapper.pysgf棋谱文件解析
strategies.pyMCTS结构定义,Player定义
utils.py辅助函数,如棋盘坐标转换

MuGo的输入数据

在features.py文件中,MuGo一共定义了十多个特征平面作为神经网络的输入:

特征说明取值数
落子颜色Player stones; 对手. 自己; 空3
Ones全1的特征平面,让神经网络借此知道棋盘边界1
当前落子回合数How many turns since a move played8
棋子的气棋子的气数8
对方将被提子数多少棋子将被吃掉8
自方将被提子数多少己方的棋子将被吃掉8
落子后的气Number of liberties after this move played8
是否为征子Whether a move is a successful ladder cap1
是否为逃征子Whether a move is a successful ladder escape1
是否为合法落子合法落子不能填自己的眼,也不能被对手提掉1
Zeros全0的平面1

模型的搭建

整个网络通过五个卷积层,输出落子概率。

在这里插入图片描述

log_likelihood_cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y))

train_step = tf.compat.v1.train.AdamOptimizer(1e-4).minimize(log_likelihood_cost, global_step=global_step)
was_correct = tf.equal(tf.argmax(logits, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(was_correct, tf.float32))

优化函数为softmax_cross_entropy_with_logits()。

模型的训练

def train(self, training_data, batch_size=32):
    num_minibatches = training_data.data_size // batch_size
    for i in range(num_minibatches):
        batch_x, batch_y = training_data.get_batch(batch_size)
        _, accuracy, cost = self.session.run(
            [self.train_step, self.accuracy, self.log_likelihood_cost],
            feed_dict={self.x: batch_x, self.y: batch_y})
        self.training_stats.report(accuracy, cost)

    avg_accuracy, avg_cost, accuracy_summaries = self.training_stats.collect()
    global_step = self.get_global_step()
    print("Step %d training data accuracy: %g; cost: %g" % (global_step, avg_accuracy, avg_cost))
    if self.training_summary_writer is not None:
        activation_summaries = self.session.run(
            self.activation_summaries,
            feed_dict={self.x: batch_x, self.y: batch_y})
        self.training_summary_writer.add_summary(activation_summaries, global_step)
        self.training_summary_writer.add_summary(accuracy_summaries, global_step)

获得某个局面position下的落子概率:

def run(self, position):
    'Return a sorted list of (probability, move) tuples'
    processed_position = features.extract_features(position, features=self.features)
    probabilities = self.session.run(self.output, feed_dict={self.x: processed_position[None, :]})[0]
    return probabilities.reshape([go.N, go.N])

参考链接

  • MuGo源码地址

结语

本文还在写作中,TODO

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/132191.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Arthas诊断追踪性能案例

文章目录1、什么是Arthas2、安装启动3、追踪流程背景:本次案例使用Windows操作系统进行本地环境演示(生产环境Linux同理) 案例:查询接口性能特别慢,通过Arthas追踪诊断链路中哪个步骤导致性能如此之慢 注意&#xff1a…

code review的思考和实践

使用方式 1.看名称效果图,有没有和自己想要的效果类似的 2.有的话,复制粘贴代码使用 3.也可以自己修改一下 4.css效果并不是特别难,只是有时候我们可能想不到 5.笔者空闲时间,会继续更新的哦,点赞关注不迷路**^_^** …

EMNLP 22:SetGNER: General Named Entity Recognition as Entity Set Generation

SetGNER: General Named Entity Recognition as Entity Set Generation **任务形式:**识别flat、nest和不连续实体。 **任务建模方式:**采用基于pointer的方式实现任务建模,文本序列中的每个word可以用tag表示,具体为&#xff1…

Java算法_LeetCode122:买卖股票的最佳时机II

LeetCode122:买卖股票的最佳时机II 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 …

有关于huggingface evaluate的使用

老版本Transformer的from datasets import load_metric,在新版本中被替换成了evaluate。 这个包挺难用的,而且不同版本的接口都有点不太一样,本博客以transformers4.18.0, evaluate0.4.0为例,示范一下如何使用evaluate进行常见的…

【LDF】线性判别函数(一)

基于判别函数的判别准则 对于ccc类分类问题:设 gi(x),i1,2,…,cg_i(\mathbf{x}), i1,2, \ldots, cgi​(x),i1,2,…,c, 表示每个类别对应的判别函数,决策规则为:如果 gi(x)>gj(x),∀j≠ig_i(\mathbf{x})>g_j(\mathbf{x}), \forall j \n…

[机器学习-概念新] 什么是欧式距离、标准化欧式距离、马氏距离、余弦距离

1.欧式距离(Euclidean Distance) 欧式距离源自N维欧氏空间中两点间的距离公式: 代码实践 from scipy import spatial vec1 [1, 2, 3, 4] vec2 [5, 6, 7, 8] euclidean spatial.distance.euclidean(vec1, vec2) print(euclidean) 2.标准化欧式距离(S…

狂揽两千星,速度百倍提升,高性能Python编译器Codon开源

这个高性能 Python 编译器具有支持 Python 众多语法、完美互通其他框架等优点。 众所周知,Python 是一门简单易学、具有强大功能的编程语言,在各种用户使用统计榜单中总是名列前茅。相应地,围绕 Python,研究者开发了各种便捷工具&…

G1垃圾回收

目录一、G1垃圾回收器G1垃圾回收阶段(3个)① Young Collection② Young Collection CM③ Mixed CollectionYoung Collection 跨代引用RemarkG1—垃圾回收器优化字符串去重类卸载巨型对象动态调整阈值一、G1垃圾回收器 定义: Garbage First&…

lanmp环境搭建,你需要一次独立安装来深入了解各个软件

一,安装Apache yum install httpd -y,安装apache,版本为2.4.6,最新为2.4.9。 cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak; vim /etc/httpd/conf/httpd.conf (默认唯一) 端口改为8000,不能与Ngin…

File类的使用

java,File类File类静态成员变量构造方法常用方法用于创建、删除文件/文件夹的方法用于遍历文件/文件目录的方法文件过滤器方法File类 Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。 File对象代表磁盘…

数据分析的大体思路

目录标题数据分析企业数据的分析的三个方向:离线分析(Batch Processing)实时分析(Real Time Processing |Streaming):机器学习(Machine Learning)数据分析的流程明确分析的目的和思路…

JVM调优基本概念

1、jvm组成以工作流程 jvm组成 类装载器、运行时数据区(内存模型)、字节码执行引擎 工作大致流程 首先我们的java类编译成class类文件,当我们的class文件开始执行,我们的虚拟机便开始工作。 类加载器将class加载到运行时数据区…

SSM之Spring(一)

目录 一:Spring简介 1.1 Spring概述 1.2 SpringFrameWork 1.2.1 SpringFrameWork特性 1.2.2 Spring Framework五大功能模块 二:IOC 2.1 IOC容器 2.1.1 IOC思想 2.1.2 IOC容器在Spring中的实现 2.2 基于XML管理bean 2.2.1 入门案例 2.2.2 获取bean…

Golang switch 的使用的注意事项和细节

内容来自:尚硅谷-韩老师教学笔记,链接:尚硅谷 1)case/switch 后是一个表达式( 即:常量值、变量、一个有返回值的函数等都可以) 2)case 后的各个表达式的值的数据类型,必须和 switch 的表达式数据类型一致 3…

辞暮尔尔烟火年年,朝朝暮暮岁岁平安。(2022年度总结)

目录 前言: 一、第一件事情,重新认识自己,从内核出发 二、第二件事情,告别内卷,拥抱微雕 三、第三件事情,愿2023,你我更更好 前言: 今天是2022年12月31日,2022年的最…

Shell——变量与脚本运行的方式

文章目录变量定义变量的几种方式1)无引号2)单引号3)双引号4)反引号export定义变量变量的提取、修改与删除1)变量的提取2)变量的修改3)变量的删除特殊变量1)位置参数2)${#…

Jetpack组件(fragment)(1)

一.什么是Fragment? 碎片是活动的一部分,使得活动更加的模块化设计。我们可以认为碎片是一种子活动。 碎片拥有自己的布局,自己的行为及自己的生命周期回调。当活动在运行的时候,你可以在活动中添加或者移除碎片。你可以合并多个碎片在一个…

Android修炼之混淆

自嘲时刻 作为Java和Android开发者,大家应该都对混淆很熟悉了。网上也有各路大神提供的混淆模板,基本上直接拿来用就好。但我还是想捋一捋,因为工作中被混淆这家伙“玩弄”了好几次,必须把它记在小本本上。 介绍 基本概念 混淆…

Cesium中使用Sampler3D,3D纹理,实现体渲染

Cesium中使用Sampler3D,3D纹理,实现体渲染 Cesium目前(20221231)还不支持直接使用3D纹理,但是其实内部已经可以WebGL2,而且内置常量也有3DTexture。所以,可以通过仿Texture,来实现3…