AlphaGo简易版MuGo源码解析

news/2024/11/17 22:49:01/

文章目录

    • 前言
    • 源码实现
      • 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_sizefor 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.ppmy.cn/news/8392.html

相关文章

Spring 核心概念 IOC/DI IOC容器 Bean

目录 一:代码书写现状 二:核心思想 一:代码书写现状 常规操作如上,但存在着问题,将项目上线后,需要将数据层进行更换,更换如下: 数据层更换后,业务层也需要进行更换,更换如下: 数据…

spring boot 实现搜索引擎的设计思想

实现思路 索引构建模块 搜索模块 数据库模块 索引模块 对于搜索一个东西,我们很自然的能想到遍历去查找。比如我要查找一本书叫 《红楼梦》,那么我直接在所有结果中进行遍历查找,当我们找到书名为《红楼梦》的结果时,就代表我们…

俯瞰·明统一战争·北伐中原

目录 背景 北方战略位置、前三次北伐快速俯瞰 实施策略 第一阶段 第二阶段 第三阶段 影响 雪压枝头低,虽低不着泥。一朝红日出,依旧与天齐。 背景 元至正二十七年(1367年)四月,吴王朱元璋命中书右丞相徐达为征…

沸腾过程气泡成核OVITO渲染

《Lammps空间划分——识别气泡、三维裂隙》 根据博文对纳米气泡的筛选(获得select),本案例练习如何渲染气泡。 文章目录一、选择气泡(select)二、删除液体三、渲染液体四、巧妙利用原子半径大小五、气泡渲染并获得体积…

笑对过往、活在当下、期盼未来

哈喽大家好,我是阿Q。 去年今日,也是安静的午后,拿起铅笔在纸上寥寥草草的写下几个年终关键词,思索良久,迟迟未能下笔。 时至今日,年末将至,再次执笔已时隔一年,再不拿笔记录这转瞬…

【数据集6】全球人工不透水面积GAIA

全球人工不透水面积(lobal artificial impervious area, GAIA) 人工不透水区是表征建成区和城市范围的重要覆盖类型,特别是在较细的空间分辨率下。 1 简介 原理: 由Landsat卫星图像和辅助数据集生成,如夜间灯光数据…

CSS权威指南(一)CSS概述

文章目录1.元素2.引入样式表3.样式表4.媒体查询5.特性查询1.元素 (1)置换元素和非置换元素 置换元素,指用来置换元素内容的部分不由文档内容直接表示。比如img标签。非置换元素,元素的内容是由用户代理在元素自身生成的框中显示…

Rust入门(三):内存与指针

Rust内存回收 所有程序都必须管理其运行时使用计算机内存的方式。 一些语言中具有垃圾回收机制,比如说java; 一些语言需要程序员手动分配和释放内存,比如说c; rust采用了第三种方式,使用所有权管理系统来管理内存 …