AlphaGo原理浅析
一、PolicyNetwork(走棋网络)
首先来讲一下走棋网络。我们都知道,围棋的棋盘上有19条纵横交错的线总共构成361个交叉点,状态空间非常大,是不可能用暴力穷举的方式来模拟下棋的。但是我们可以换一种思路,就是让计算机来模拟职业棋手来下棋。DeepMind团队首先想到的是用深度卷积神经网络,即DCNN来学习职业棋手下棋。他们将围棋棋盘上的盘面视为19*19的图片作为输入,黑子标为1,白子标为-1,无子标为0。但是还不能仅仅将这一张图送入网络中进行训练,因为围棋盘面的情况非常复杂,棋子之间的关系都是非线性的,所以如果只输入这一个矩阵的话训练起来会很耗资源和计算量。
所以DeepMind团队又把一些新的特征维度送到深度卷积神经网络中,让模型训练变得更加简单,这些新的特征由围棋术语中的气、目、空这些概念构成。最终他们将棋盘局面变成48张图,也就是最终输入深度卷积神经网络中的是一个19*19*48的图像栈,将输入代入到13层的卷积神经网络中进行训练,选择192个滤波器进行卷积,最终输出一个361维的向量,表示的是职业棋手在棋盘上每个交叉点上落子的概率,比如这幅图中输出的是职业棋手大概率在这个范围内落子,然后在这个点落子的概率是0.4,所以计算机就会选择在概率最高的这个0.4的点落子。这套网络的训练集是16万局6-9段的人类职业棋手的对弈棋谱,收取了将近3000万步。最终这套网络经过训练之后已经能正确符合57%的人类落子行为,已经能和业余水平的人类棋手过招。这张图显示了策略网络的战力相对于训练后准确性的关系,可以看到当网络的卷积核个数为384个时,这个走棋网络具有最高的水平,但是为了兼顾速度他们最终选择卷积核个数为192个。
这张图列出的是他们最终选择的作为每个棋局输入的48个特征面。
二、Fastrollout(快速走子)
我们得到的这个走棋网络效果还算不错,但是运行速度太慢了,要用3毫秒,而围棋是一项需要计时的比赛,也就是说速度越快,那么也就代表着AlphaGo具有越高的下棋水平,所以DeepMind又做了一个相对简化的版本,叫作快速走子。快速走子用的是局部特征匹配加线性回归的方法,比使用神经网络的走棋网络快了1000倍,但是模拟职业棋手的准确率降低了一半。这张图显示了采用不同的策略进行下棋的准确性的比较,可以看到快速走子和前面所提到的走棋网络还是有一定差距的。
三、ValueNetwork(估值网络)
现在我们已经有了一个比较强但是很慢的监督学习走棋网络,以及一个很快但是准确率相对较低的快速走子网络,这两个网络一起构成了AlphaGo的落子选择器,即告诉AlphaGo下一步可以走哪些步。但仅有策略网络的AlphaGo还不够强,因为它只是模拟人类棋手下棋,学习的是人类棋手的方法,那16万局的棋谱也不都是顶尖人类棋手的棋谱,好棋坏棋它都有学,所以仅靠策略网络永远也无法达到顶尖的水平。于是DeepMInd团队又加入了一个估值网络,用来表示某一局面下双方的输赢概率。训练一个这样的网络肯定需要数据集,注意这时候他们就运用了增强学习的方法。我们前面说的,用16万张棋谱训练出了一个走棋网络Pσ1,然后再用Pσ1与Pσ1左右互搏模拟对弈比如1万局,得到1万局新的棋谱。之后再用新的棋谱训练出Pσ2。再用Pσ2与Pσ2左右互搏得到Pσ3,以此类推最终得到Pσn。我们将Pσn取一个新名字叫做Pρ,即增强学习的策略网络(RL)。这时的Pρ与最原始的Pσ1对局可以达到80%的胜率,但是Pρ与人类棋手的比赛却效果反而不如Pσ1,这可能是因为Pρ的落子选择过于单一,而人类棋手非常狡猾,下棋的时候套路很多,所以实战效果很差。但是我们用增强学习方法得到了很多质量很好的样本用于估值网络v(s)来训练,实验表明基于Pρ训练的估值网络的效果要好于最原始的Pσ1。
四、蒙特卡洛树搜索算法
现在我们有一快一慢的两个策略网络以及一个估计局面输赢的估值网络。我们可以先用策略网络模拟人类棋手走子,它得到了一个人类棋手常见的走棋范围,把整个棋面的361个落子点压缩到一个比较小的范围,减少了需要考虑的可能性。之后再用基于增强学习训练出来的估值网络筛选出赢棋概率较高的落子方案。但是高手下棋的时候都是“手下一着子,心想三步棋”,实际甚至都不止想三步之后的情况。比如实际情况往往是这一手你下了a1,你的胜率是70%,轮到对方下一手a2,对方的赢棋概率是60%,而第三步轮到你下a3的时候你的赢棋概率降到了30%,那么你当初要不要下a1这一手呢?为什么三步之后我们的赢棋概率从70%降到了30%呢?因为我们的估值函数v(s)模拟的是我们通过增强学习的下棋策略下完全局所得到的胜率,但是实战中人类棋手有一定概率不按照的套路来下,所以估值函数会出现误差,导致下着下着AlphaGo的胜率变低了。所以我们前面得到的估值函数,也就是这里vaule network还不太完美,这里我们就要引入蒙特卡洛树搜索(MCTS)的概念,将走棋网络、快速走子以及估值网络结合到这个框架上来。
具体的方法就是,首先用得到一个棋局,先用走棋网络开局,走L步,选取比较有价值的走法得到一颗树,给每个走法一个初始的分数。先选择初始分数最高的a点,在a点上用蒙特卡洛搜索树的架构调用快速走子网络,将L步之后的棋局模拟到底,并模拟出多盘未来的对局,最终得到一个估值分数z。并在此同时在这个a点调用我们前面提到的估值网络v(s),那么a点的新分数=调整后的初始分+ 0.5 通过模拟得到的赢棋概率 + 0.5 局面评估分。之后再更新a点上级所有根节点的分数,更新的方法就是把所有子节点的分数相加取平均值。这样再选取一个更新后的最高的分数进行模拟,一直不断地模拟和更新分数,直到最后选取一个访问次数最多的节点,而不是最终分数最高的节点,因为访问次数最多的节点比分数最高的节点要更加可靠。这样我们就完成了AlphaGo对某一局面的决策,选择蒙特卡洛树中访问次数最多的节点作为下一步的走法,最终取得了非常好的效果。
a是DeepMind团队后面将不同围棋程序之间比赛所得到的结果图,每个程序在走子之前大约有5秒的计算时间。为了让AlphaGo面对的比赛更富有挑战性,一些程序在和其他对手比赛时被让了4子。程序水平的评估基于Elo尺度:一个230点的差距大概相对于79%的赢率,大概相应于KGS的一个业余段级之间的差距。和人类欧洲冠军樊麾的比赛也包含在图上,但这些比赛使用更长的赛时制。此图所示的置信区间为95%。b是使用不同部件进行组合的单机版本的AlphaGo的表现。只单单使用策略网络则意味着没有任何搜索。c是AlphaGo的蒙特卡洛树搜索的搜索县城和GPU的可扩展性研究,使用异步(浅蓝)或分布式(深蓝)搜索,每次走子有2秒的计算时间。
后记:
以上都是我在看过论文原文以及一些大牛写的AlphaGo原理的博客后自己的一些理解,其中有很多细节方面并没有涉及到,如有错误望大家能批评指正。
参考文献:
2、28 天自制你的 AlphaGo(五):蒙特卡洛树搜索(MCTS)基础
3、论文笔记:Mastering the game of Go with deep neural networks and tree search (AlphaGo)
5、机器学习系列(8)_读《Nature》论文,看AlphaGo养成
AlphaGo原理浅析的更多相关文章
- HTTP长连接和短连接原理浅析
原文出自:HTTP长连接和短连接原理浅析
- (转) 一张图解AlphaGo原理及弱点
一张图解AlphaGo原理及弱点 2016-03-23 郑宇,张钧波 CKDD 作者简介: 郑宇,博士, Editor-in-Chief of ACM Transactions on Intellig ...
- Javascript自执行匿名函数(function() { })()的原理浅析
匿名函数就是没有函数名的函数.这篇文章主要介绍了Javascript自执行匿名函数(function() { })()的原理浅析的相关资料,需要的朋友可以参考下 函数是JavaScript中最灵活的一 ...
- [转帖]Git数据存储的原理浅析
Git数据存储的原理浅析 https://segmentfault.com/a/1190000016320008 写作背景 进来在闲暇的时间里在看一些关系P2P网络的拓扑发现的内容,重点关注了Ma ...
- Android-Binder原理浅析
Android-Binder原理浅析 学习自 <Android开发艺术探索> 写在前头 在上一章,我们简单的了解了一下Binder并且通过 AIDL完成了一个IPC的DEMO.你可能会好奇 ...
- Dubbo学习(一) Dubbo原理浅析
一.初入Dubbo Dubbo学习文档: http://dubbo.incubator.apache.org/books/dubbo-user-book/ http://dubbo.incubator ...
- 沉淀,再出发:docker的原理浅析
沉淀,再出发:docker的原理浅析 一.前言 在我们使用docker的时候,很多情况下我们对于一些概念的理解是停留在名称和用法的地步,如果更进一步理解了docker的本质,我们的技术一定会有质的进步 ...
- 阻塞和唤醒线程——LockSupport功能简介及原理浅析
目录 1.LockSupport功能简介 1.1 使用wait,notify阻塞唤醒线程 1.2 使用LockSupport阻塞唤醒线程 2. LockSupport的其他特色 2.1 可以先唤醒线程 ...
- 【Spark Core】TaskScheduler源代码与任务提交原理浅析2
引言 上一节<TaskScheduler源代码与任务提交原理浅析1>介绍了TaskScheduler的创建过程,在这一节中,我将承接<Stage生成和Stage源代码浅析>中的 ...
随机推荐
- Sql Server数据库之多表查询
一.连接查询 概念:根据两个表或多个表的列之间的关系,从这些表中查询数据 目的:实现多表查询操作 语法:From join_table join_type join_table[ON(join_con ...
- hbase 存储结构和原理
HBase的表结构 建表时要指定的是:表名.列族 建表语句 create 'user_info', 'base_info', 'ext_info' 意思是新建一个表,名称是user_info,包含两个 ...
- Dear Menuhin
2017-11-26 Sa Nov 11:05 AM @ HOME, TOSBE Nicole assigned us a composition about the Thanksgiving day ...
- 初学python笔记----字符串
---恢复内容开始--- 1.在python中,用引号括起来的都是字符串,引号可以是单引号,也可以是双引号 2.修改字符串的大小写 3.字符串拼接用“+” 4.制表符("\t"), ...
- ThingJS平台制作第一人称视角下的巡更效果
今天想要做一个类似巡更的过程,就像是在学校保安巡更,小区保安巡更一样.巡更需要用到相应的场景,比如说:园区.学校.超市以及工厂等等,然后需要规划好路线也就是巡更的路线,并且视角要跟随路线来变换,从而达 ...
- 每日笔记-redis的理解及相关应用
原文链接:常见面试题 本文大纲与之类似,在其基础上加入了自己在实际项目中对部分知识点的理解 Q1:谈谈对redis的理解 Q2:谈谈实际应用中怎么用redis的 2.1 缓存 2.2 分布式锁 2.3 ...
- python异常捕捉以及处理
看标题觉得高大上,好像能处理所有的异常.但是,事实是只能按照字面的意思来理解这一段话. 众所周知写代码哪有不出bug的? 那么出现了bug 我们不想让程序因为bug的存在而退出.那么要怎么做呢? 今天 ...
- MyCP(课下作业,必做)- 20175218
MyCP(课下作业,必做) 1.任务详情 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2 ...
- LeetCode至 少有 1 位重复的数字
给定正整数 N,返回小于等于 N 且具有至少 1 位重复数字的正整数. 示例 1: 输入:20 输出:1 解释:具有至少 1 位重复数字的正数(<= 20)只有 11 . 示例 2: 输入:10 ...
- 通行导论-IP数据网络基础(2)
传输控制协议(TCP) 差错控制:TCP使用差错控制提供可靠性,包括检测受到损伤.丢失.失序的报文段 实现方法:1.16位检验和,2.确认机制:采用确认证实收到的报文段,3.重传(设置一个重传超时RT ...