【《基于机器学习的围棋博弈系统设计》15000字(论文)】_第1页
【《基于机器学习的围棋博弈系统设计》15000字(论文)】_第2页
【《基于机器学习的围棋博弈系统设计》15000字(论文)】_第3页
【《基于机器学习的围棋博弈系统设计》15000字(论文)】_第4页
【《基于机器学习的围棋博弈系统设计》15000字(论文)】_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGEii基于机器学习的围棋博弈系统设计摘要: 本次设计的课题名为——基于机器学习的智能博弈系统的设计与实现,主要通过处理SGF格式的围棋棋谱、对围棋数据进行编码与特征处理、使用TensorFlow机器学习框架构建神经网络并进行深度学习训练,以生成一个具有一定智能度的AI模型,可以进行基础的围棋博弈。在机器学习模型的构建过程中,训练数据是一切的开始,本次课程设计通过解析SGF格式的围棋数据,对行棋过程进行矩阵式编码,并且以棋子气的状态以及棋局劫争状态为特征,构建多个特征平面,以棋盘当前特征作为输入,下一步的行棋位置作为输入,组合作为机器学习的训练数据进行训练学习;而为了更加有效的拟合数据,创建以多层卷积层为基础的卷积神经网络进行初始的监督学习;然后通过价值网络的构建以及强化学习更新优化之前的训练模型,使其具备更高的智能度,最终得到一个相对智能的围棋机器人。关键词: 围棋;卷积神经网络;蒙特卡洛树搜索;监督学习;强化学习目录摘要 PAGEREF摘要\*romaniTOC\o"2-3"\h\z\t"标题1,1,次标题,1"目录 iii1 绪论 11.1 研究背景 11.2 研究意义 11.3 研究现状 11.4 研究内容 21.5 论文结构. 32 博弈基础理论与方法 42.1 围棋博弈基础知识 42.1.1 围棋起源与规则 42.1.2 围棋的复杂度 42.2 基本树搜索理论 42.2.1 极小-极大搜索 42.2.2 α-β剪枝搜索 52.3 蒙特卡洛树搜索与围棋 62.3.1 简单蒙特卡洛方法 72.3.2 蒙特卡洛树搜索(MCTS) 72.3.3 MCTS应用于围棋 83 博弈系统数据处理 93.1 SGF棋谱简介与解析 93.1.1 SGF文件简介 93.1.2 SGF文件解析 93.2 棋局编码与特征构建 93.2.1 常见数据编码 93.2.2 围棋数据编码 103.3 特征平面构建 114 计算机围棋神经网络的构建 134.1 神经网络基础理论 134.1.1 TensorFlow与Keras 134.1.2 卷积神经网络 144.1.3 神经相关算法 154.2 监督学习与围棋 164.2.1 监督学习与无监督学习 164.2.2 监督学习训练围棋 164.2.3 监督学习神经网络构建 174.3 计算机围棋强化学习 224.3.1 强化学习概念 224.3.2 强化学习实现 235 总结 25参考文献 27 PAGE10 绪论研究背景人工智能作为近些年的热门话题,热度一直高居不下,并且逐渐进入了我们的生活。人工智能就是机器模拟人类的思维进行学习工作。作为人工智能领域的核心——机器学习使机器模拟人类神经网络的工作原理进行学习,解决了机器无法适应复杂环境的难题,使人工智能领域有了新的实质性发展。2016年,基于神经网络和蒙特卡洛树搜索实现的围棋AI—AlphaGo横空出世,并打败了围棋界传奇冠军选手李世石,代表人类智慧巅峰的围棋宣告被计算机突破REF_Ref72182442\r\h[1]。对其围棋领域本身而言,围棋彻底进入了AI时代,众多围棋选手以AI作为训练对手,开发出新的围棋布局、围棋定式等,而它带来的深度学习算法,也极大地促进了人工智能领域的发展。其使用的机器学习平台——TensorFlow经过多年的发展也逐渐方便成熟,便于我们构建机器学习模型!研究意义机器学习是研究计算机如何模拟人类学习行为,以获取新的知识或技能,重新组织已有的知识并使之不断改善提高的一门科学。而要获得一个更接近现实的机器学习模型,则必须要有大量的数据对机器进行训练而趋近完美。而围棋作为人类智慧的顶峰,因其19*19的庞大棋盘、对局中存在的打劫、吃子、倒扑等手段,变化极其复杂,数据统计围棋的变化甚至远超宇宙原子总数。所以以围棋作为机器学习的对象,不仅可以发现围棋中潜在的定式和行棋手段,对扩充围棋理论研究有重要的意义,并且其中运用的神经网络、算法、树搜索等理论对人工智能领域的发展和理解也有重要的指导意义。DeepMind公司开发的围棋程序——AlphaGo,于2016年以4胜1负的成绩战胜了围棋世界冠军李世石,并在之后多次更新升级,最后迭代出AlphaGoZero、AlphaZero、MuZero等版本,此后人类棋手在AI上难求一胜,代表人类智慧顶峰的围棋宣告被计算机突破。对其围棋领域本身而言,围棋彻底进入了AI时代,众多围棋选手以AI作为训练对手,开发出新的围棋布局、围棋定式等。AlphaGo的出现不止对围棋领域影响深远,它带来的深度学习算法、卷积神经网络的应用,也大大地促进了人工智能领域的发展。自此机器学习被应用于生活中的各个领域,如语音识别、自动驾驶、智能推荐、图片识别、蛋白质结构解析等。本次设计从围棋领域研究机器学习,探究机器学习实现原理和核心算法,感受该领域的美妙之处。并通过编程实现机器学习在围棋领域的突破,认识机器学习对于模拟人类思考的正确性,为今后人工智能、机器学习领域相关的应用开发打下基础!研究现状国外的发展与现状:上世纪90年代基于神经网络和Temporaldifference进行自对弈训练的西洋双陆棋AI(TD-Gammon)以及采用经过国际象棋规则和棋盘评估修正后的极大极小算法进行博弈的国际象棋AI(深蓝)相继战胜人类,但围棋领域一直未被计算机攻克。直到2016年,DeepMind开发的AlphaGo以4胜1负的成绩战胜韩国传奇选手李世石,表明围棋也逐渐被计算机攻克,第二年,当时围棋界排名第一的柯洁也输给了升级后的AlphaGoMaster版本,围棋也彻底从代表着人类独有智慧的神坛上跌落,此后在围棋领域人类面对AI再无胜绩。但围棋AI的发展并未止步,DeepMind之后更是发布了AlphaGoZero、AlphaZero、MuZero版本,依靠更强大的算法和神经网络,完全抛弃人类知识进行学习,在围棋、国际象棋等棋类西游都达到世界最强水平。此后,各种围棋AI也相继问世并有着不俗的表现。国内的发展:国内围棋AI在AlphaGo问世后蓬勃发展,近些年来出现了星阵围棋、KataGo、PhoenixGo等人工智能围棋,目前这些围棋AI都可以轻松战胜顶级职业选手。近些年来举办的世界人工智能围棋大赛中,国内研发的围棋AI在比赛中大放异彩,2020年的比赛中更是占据了四强中的三个席位,这标志着我国相关领域的蓬勃发展。研究内容本次毕业设计主要学习了机器学习与TensorFlow机器学习框架的相关知识,了解机器学习的基本原理、相关算法的实现以及如何使用TensorFlow构建神经网络并进行机器训练,具体研究内容为:1.SGF围棋文件处理:在KGS围棋服务器上获取近些年的围棋对弈棋谱,了解SGF文件的格式以及存储内容的方式,为后续解析数据做准备。2.围棋数据特征编码:解析SGF文件格式的棋谱文件,对棋谱的基本状态进行编码,并进行特征平面的设计和编码,构造原始处理数据(以第n手的棋盘状态为特征输入,下一步的落子点为输出标签)。3.基础监督学习:构建多分类模型的神经网络,将上一步骤获取的特征作为神经网络的基本特征、下一步落子点为标签,设计由多个卷积层构成隐含层的神经网络,神经网络的最后一层由softmax函数激活,然后对这些数据进行拟合训练,得到一个初始的机器模型,该模型能够实现:输入的一个棋局状态,推测下一步落子点。4.强化学习:上一步骤得到的初始模型只是基于一定数量的人类棋谱下对行棋动作做的一个基本预测,竞技水平相对比较低且并不具备较大的创新过程。为了优化机器模型,以上个步骤监督学习得到的模型为基础,通过收集“经验—训练—评估”的过程对基础模型进行强化学习训练,得到加强后机器模型。5.价值网络的构建:通过监督学习产生的策略网络生成棋招,之后由增强的策略网络进行自对弈,直到产生胜负结果。以最终的胜负作为价值判断的依据,由此生成一个价值网络,用于判断行棋的输赢概率。论文结构.全文按以下组织方式进行:第1章为绪论部分,主要介绍本次设计的研究背景、研究意义、研究现状、论文内容和论文结构;第2章主要介绍博弈的基本理论和方法,包括与围棋起源与规则、围棋复杂度、博弈树的概念和博弈树常用搜索算法;第3章主要介绍本次博弈系统的设计过程中对围棋数据的处理过程,包括围棋文件解析、围棋数据编码以及围棋特征平面设计;第4章主要介绍本次系统设计过程的神经网络设计部分,包括神经网络基础理论、使用到的相关算法、监督学习过程和强化学习过程设计;第5章为结论部分,对本文所做的设计进行总结与反思,并展望课题的发展前景。博弈基础理论与方法围棋博弈基础知识围棋起源与规则围棋是一种二人棋类游戏,相传由五千年前我国的黄帝所创。后来传入东亚各国和欧美地区。围棋使用方形棋盘及黑白两种颜色的圆形棋子进行游戏,棋盘被横纵19条线段(正式比赛多为19*19的棋盘,也有9路、13路和21路围棋)分成361个交叉点,在交叉点上落棋,双方交替走棋,当一个交叉点或一条棋链最外围都被对方的棋子包围则为死棋,落子后除非为死棋(从棋盘上清除)否则不能移动,最后以围地多者为胜。因为黑方先行有优先布局的优势,因此人为规定黑方在棋局结束时要给白方贴目(即黑方减去一些领地进行胜负结算),我国的贴目数为7.5目,日本为6.5目。围棋的复杂度围棋长期以来被成为人类博弈智慧的巅峰,在于其博弈过程变化多端、非常复杂,需要庞大地计算量对棋局进行评估。仅从结果论讲,一盘棋的结果为3的361次方,而其中蕴含的打劫吃子等手段,使得棋局变化更加复杂,而宇宙原子总数也仅仅约为10的80次方,相比之下围棋的变化远超宇宙原子总数,所以以穷举法算尽围棋的规则以达到攻克围棋的目的是非常困难的REF_Ref72182464\r\h[2]。下表为三种棋类的复杂度对比如表2.1所示:表2.1棋类游戏复杂度表游戏围棋井字棋国际象棋State-spaceComplexity31010Game-treeSize361!≈9!10Game-treeComplexity2501010基本树搜索理论极小-极大搜索极小-极大搜索方法是博弈树搜索的基本方法。首先需要设计一个评价函数对棋局进行局面评估。在博弈过程中,我们总是希望自己落子时候能够对己方利益最大化,而敌方落子时总是落在对我们最不利的位置,极小-极大搜索算法便是根据这个思想设计而来。极小-极大搜索的具体过程如下所示,附图2.1:1、轮到我方落子时,搜索一定深度内棋局的所有状态,计算所有叶节点下的棋局评估得分。然后从最深一层的节点开始逆向计算;2、对于我方的落子点,选择子节点中的最大值;3、对于对方的落子点,选择子节点中的最小值;4、循环2、3过程直至得出根节点的值,根节点取值的分枝为当前的最佳走法。图2.1极小-极大搜索过程极小-极大搜索是一种假设对手每次回应都如预料的情况下,从中找出对我方最有利的行棋步骤的搜索方法。但实际博弈过程中对手往往不会如我们所预测的步骤行棋,所以在使用极小-极大搜索算法时,不管设定的搜索深度是多少,只适用于当前一步棋的行棋选择,再次轮到我方行棋时,需要重新对棋局进行搜索,来重新决定下一步棋如何走。对于棋局较小的游戏(如井字棋)而言,计算机使用极小-极大算法遍历所有可能会非常方便,但对于国际象棋或围棋这种局面复杂的游戏而言,棋局本身的复杂度都是宇宙级别的,并且通过极小-极大搜索生成的博弈树将会非常庞大,通过极小极大值搜索将会是一个非常漫长的过程,所以要在复杂的棋类游戏中进行树搜索,需要一种策略来减少树的部分,这种减少搜索树大小的策略称之为剪枝。α-β剪枝搜索Alpha-beta剪枝是一种降低极小-极大算法搜索树大小的搜索算法。该算法核心为:评估出某策略的后续走法比之前策略的还差时,不再计算该策略的后续。该算法和极小-极大算法所得结论相同,但搜索时规避了不具搜索价值的分枝。Alpha-eta剪枝建立在两个基础上:1、整个博弈过程属于零和博弈,即一方的收益必然对应着另一方的损失;2、每一方在行动时总会选择使自己利益最大化的决策。在上述前提下,α-β剪枝算法的核心思想就是:有一个选择A和选择B,在得知B选择不如A选择好,那么就不需要再考虑B选择的具体情况。以2.2.1中的树形结构图为基础,进行剪枝的过程如图2.2所示:1、对于红色方的第一个分支的5和1,选择对自己最有利的5,并向前回溯,存入上一层的节点中;2、对于蓝色方而言,选择对自己最有利的,所以以目前的搜索情况看,需要选择小于等于5的节点;3、红色方继续搜索下一分支,发现有大于5的6,所以向前回溯的过程中,上层节点必然大于等于6;4、根据第一次的搜索情况,蓝色方要小于等于5,此时6的节点对自己更不利,必然不会选择,所以红色方第二次搜索过程中之后的节点无需进行,剪枝完成;5、循环以上过程,进行回溯。图2.2α-β剪枝搜索过程蒙特卡洛树搜索与围棋蒙特卡洛树搜索又称随机抽样方法,是以概率和统计理论方法为基础的一种方法,是使用随机数来解决计算问题的方法。传统的经验方法由于不能逼近真实的物理过程,难以得到满意的结果,而蒙特卡洛树搜索通过模拟采样能够真实地预测现实情况并且可以得到相对满意的结果。蒙特卡洛方法通常将所求解的问题同一定的概率模型相联系,用电子计算机实现抽样模拟与统计,以求得近似解REF_Ref72182519\r\h[3]。简单蒙特卡洛方法简单蒙特卡罗搜索基于一个强化学习模型Mv和一个模拟策略π.在此基础上,对于当前我们要选择动作的状态St,对每一个可能采样的动作a{S_t,a,R_(t+1)^k,A_(t+1)^k,……S_t^k}k+1K对于每个(StQa

简单蒙特卡罗搜索可以处理中等规模的问题。但是对于围棋这种状态动作数量级非常大的问题,搜索过程会变得非常慢。同时,由于使用蒙特卡罗法计算其动作价值函数,模拟采样得到的一些中间状态和对应行为的价值就被忽略了。蒙特卡洛树搜索(MCTS)MCTS不再对当前状态St每个动作都要进行K次模拟采样,而是总共对当前状态St进行K次采样,这样采样到的动作可能只是动作全集的一部分。MCTS降低了采样的数量和采样后的搜索计算,而代价是动作全集中的很多动作可能没有采样到,会错失好的动作选择。在MCTS中,基于一个强化学习模型Mv和一个模拟策略π,当前状态S{S_t,a,R_(t+1)^k,A_(t+1)^k,……S_t^k}k+1K采样完毕后,基于采样结果构建MCTS的搜索树,然后近似计算QSt,aQaMCTS搜索的策略分为两个阶段:第一个是树内策略:为当模拟采样得到的状态存在于当前的搜索树时使用的策略。树内策略可以使用ϵ−贪婪策略,随着模拟的进行策略可以得到持续改善,还可以使用上限置信区间算法UCT;第二个是默认策略:如果当前状态不在搜索树内,使用默认策略完成整个状态序列的采样,并把当前状态纳入到搜索树中REF_Ref72182612\r\h[5]。MCTS应用于围棋在围棋游戏中,一步棋只有在棋局结束才能得到真正的结果,一次采样要到棋局结束然后把结果反馈到之前的所有节点中。对于MCTS的树结构,在节点上保存状态对应的历史胜负记录,在每条边上保存采样的动作。以图2.3为例,MCTS的搜索共有四步:图2.3蒙特卡洛树搜索过程1、选择:从根节点开始,每次都选一个价值最高的节点,一般使用UCT选择分数最高的节点,直到来到一个从未扩展过的节点,如图中的3/3节点,然后进入第二步;2、扩展:在这个未扩展的子节点上加一个0/0的子节点,表示没有记录参考,然后进入第三步;3、仿真:从上面没有试过的行棋法开始,使用监督学习得到的快速走子策略至棋局结束,得出胜负结果。快速走子策略是一种速度快但不是很精确的策略,之所以选择这个策略,是因为如果选择更具价值的策略,模拟的棋局质量可能会有很大提高,但由于耗时增加,在单位时间内的模拟次数减少,不一定会棋力更强。4、回溯:将最后得到的胜负结果回溯加到MCTS树结构上。新加入的节点也要加上一次胜负历史记录,如上图第四图所示。博弈系统数据处理SGF棋谱简介与解析SGF文件简介SGF(SmartGameFormat)全称为智能游戏格式,开发于上世纪90年代,是一种基于文本的简单格式,虽然存储形式为文本,但是表达力很强,可用于存储多种棋类游戏的过程以及游戏的扩充(如职业选手的评论)。现代棋谱多用SGF格式进行存储,围棋的SGF棋谱从KGS围棋服务器上下载得到。SGF文件解析SGF元数据的格式是用两个大写字母表示一个属性名称,然后再一个方括号内指定它的值;对于落子点,以W、B表示白子和黑子,落在第m行第n列的子,位置以第m个英文字母和第n个英文字母组合表示,如W[ab]表示落在第1行第1列的白子。以下列围棋棋谱为例,文本前7行分别对应:当前SGF版本(4)—围棋的游戏编号(1)—棋盘尺寸(9*9)—让子数(0)—贴目数(6.5)—使用日式规则(Japanese)—最终结果(白胜9.5目)。(;FF[4]GM[1]SZ[9]HA[O]KM[6.5]RU[Japanese]RE[W+9.5];B[ge];W[df];B[dg];W[eh];B[ct];W[be];B[eg];W[fh];B[de];W[ec];B[fb];W[eb];B[ea];W[da];B[fa];W[cb];B[bf];w[fc];B[gb];W[fe];B[gd];W[ig];B[bd];W[he])棋局编码与特征构建常见数据编码对于机器学习来讲,数据源的选取是非常重要的,以最简单的一次函数为例,我们需要提供输入变量x、输出值y为训练数据,通过机器训练拟合y关于x的函数式,最终得到一个:y=a×x+b的关系式对未知的输入x进行输出y的预测。而对于当今机器学习应用广泛的分类问题来讲,训练数据的选取则会复杂很多。以基础的服饰分类问题为例,输入数据为一定像素的图片,输出为服饰的类别,而神经网络不支持将图片格式的数据传入行进训练,那么如何将图片数据以及分类标签解析为能够用做机器学习的训练数据呢?图3.1α-β图片编码神经网络的输入是张量(Tensor)形式的(image-height,image-width,color-channel),包含了图像高度、宽度及颜色信息。不需要输入batchsize。如果您不熟悉图像处理,颜色信息建议您使用RGB色彩模式,此模式下,color-channel为(R,G,B)分别对应RGB的三个颜色通道(colorchannel)。以图3.1为例,我们构建张量数据用来表征一张图片的信息,张量的形状为(28,28,3),可以简单理解为大小为28*28*3的三维矩阵,参数分别对应图片的长度、高度、RGB色彩值,至于该一张图片对应的张量中具体的值为多少,由图片本身以及数据归一化处理后填入,图片分类问题中的输出值,即图片的类别,也是不能直接用“鞋”、“衬衫”等字符串表示的,因为这些字符串并不具备数学特征,不能由输入数据进行运算得来。原始数据集使用数字0~n用来分别表示不同类别,而为了数据能够更好地进行拟合,在机器训练开始之前,通常会把类别进行独热编码(One-Hot编码)。独热编码,又称为一位有效编码,主要是采用N位寄存器来对N个状态进行编码,每个状态都有独特的寄存器位,并且在任意时候只有一位有效,寄存器利用0和1表示一些参数,使用N位状态寄存器来对N个状态进行编码。对于上述图片分类例子,假设有“鞋”、“衬衫”、“棉袄”三种类别,我们用三位数字表示其类别,分别用[0,0,1]、[0,1,0]、[1,0,0]表示。围棋数据编码在本次毕业设计的实例中,原始的SGF文件是不能直接用于机器训练的,需要解析后才能使用,回想围棋的过程,简单来说就是向棋盘上轮流落子,从计算机的角度来看,其实就是向一个数组赋值而已,不过这个数组是个二维数组,初值全为0,且后续赋值只有1和-1(分别代表黑方和白方),但是神经网络的训练数据为张量,所以我们不用数组而选择一个二维矩阵进行围棋数据的编码,并用多个19*19的矩阵表征不同的棋局特征。下列代码描述了一个基本的根据棋盘字符串还原棋局的过程,结果如图3.2所示:fromdlgo.gosgf.sgfimportSgf_gamefromdlgo.gosgf.goboard_fastimportGameState,Movefromdlgo.gotypesimportPointfromdlgo.utilsimportprint_boardsgf_content="(;GM[1]FF[4]SZ[9];B[ee];W[ef];B[ff]"+\";W[df];B[fe];W[fc];B[ec];W[gd];B[fb])"sgf_game=Sgf_game.from_string(sgf_content)game_state=GameState.new_game(19)foriteminsgf_game.main_sequence_iter():color,move_tuple=item.get_move()ifcolorisnotNoneandmove_tupleisnotNone:row,col=move_tuplepoint=Point(row+1,col+1)move=Move.play(point)game_state=game_state.apply_move(move)print_board(game_state.board)图3.2棋盘状态编码还原特征平面构建完成了围棋数据的编后应当思考的问题是:训练数据应该是什么结构的呢?更具体来讲,我们应该输入什么、输出什么?首先我们假设:将整个SGF棋谱解析全局解析后作为输入数据传入神经网络进行训练,那么输出结果是什么?整个博弈过程结束后,能够直观地呈现在我们面前的是黑白双方的输赢、黑白双方的目数,思考一下,如果以这两个参数作为输出结果进行机器训练,我们后续应该如何对机器模型进行机器测试?我们不难发现,如果采用这样的输入输出参数进行训练,就算对于高度智能的模型,之后的检验过程也将是:①输入一个棋局状态;②机器模型通过分析得出当前局面黑白双方的目数;③判断当前(仅当前局面,不思考棋局深度)双方谁更领先。如果采用上述的训练方法,很显然,我们仿佛得到了一个点目机器,它并不具备深度思考并进行博弈,仅仅是在数目而已。而我们真实的棋局过程是:①判断当前局面(包括劫争、目数、活棋等);②思考如何解决当下问题并考虑如何长远布局;③得出落子位置。我们所期待的最终的机器模型应该具备以上的特点,学习人的思路,最后通过数据训练与经验累积成为一个高智能的博弈机器。基于上述过程,正确的数据应当是:以实时棋局状态作为输入,以下一步的落子点作为输出。值得思考的是,表征棋局的状态有很多,比如当前棋局落子情况、劫争、黑白子的气等,这些都可以构成特征平面并作为输入数据进行训练。本次设计分别进行两种特征构建方式:第一种是构建单一特征平面,该特征平面仅仅是当前棋盘的落子情况,后续经过训练发现,以单一特征平面进行机器训练,训练数据量大大减少、训练速度加快,经过训练后对弈测试数据的预测率可达80%以上,可以仿照人的手法进行下棋(比如开局星位布局、外围作战),但是博弈水平并不高,对于一些定式或者活棋的应对并不理想。第二种特征构建方式是构建7个特征平面用来表征棋局状态,7个特征平面的构建方式为:①黑方仅剩1口气的子编码为1,其余黑子为0②黑方仅剩2口气的子编码为1,其余黑子为0③黑方至少3口气的子编码为1,其余黑子为0④~⑤为白方进行和黑方相同的编码⑦由于劫争不能落子的点标记为1这种特征构建方式更接近真实博弈过程中我们的思考方式,经过训练后博弈水平比单一特征平面训练得出的模型要高一些,但是因为数据量是单一平面的7倍,所以对于同样的训练棋谱,需要更多的时间对所有数据进行同次数的遍历,并且需要更多次的数据遍历才能达到比较高的预测率。以100份棋局为例,单一特征平面产生的数据全部数据大概为11000多,对全部数据进行一次模拟过程大概需要30分钟,每次模拟完成后使用训练数据进行正确率检验,花费的时间大约在5-10分钟,进行50次以上的全数据模拟即可达到85%以上的正确率;但是使用七个特征平面进行训练,数据量翻倍,对全部数据进行一次遍历并进行测试,大约需要花费2.5~3个小时的时间,并且需要更多的全数据遍历才能达到较高的正确率,对于电脑资源的消耗比较大。计算机围棋神经网络的构建神经网络基础理论神经网络是一种计算模型,由大量的神经元节点互联形成。每个节点代表一种特定的输出函数,称为激励函数。每层的神经元都由上层的多个神经元加权运算后得到。计算机神经网络是仿照生物神经网络工作原理所设计的一种学习模型,生物获得的化学或物理信号通过神经元的层层传递进行工作,而计算机神经网络通过多层神经元的加权计算,最终拟合出输入值和输出值存在的复杂关系,通过这种工作方式,计算机可以仿照人类思想进行学习,得到更逼近显示的计算机模型。神经网络结构如图4.1所示:图4.1神经网络结构TensorFlow与KerasTensorFlow是Google开发的开源机器学习平台,支持python、JavaScript以及C++程序开发语言,并且支持Windows、Mac、Linux以及移动手机端等多种平台。通过安装TensorFlow,我们可以调度电脑资源进行机器学习训练,TensorFlow可以使用GPU进行硬件加速,往往可以比CPU运算快很多倍。。Keras是基于TensorFlow和Theano的深度学习库,是由python编写而成的高层神经网络API。它是为了支持快速实践而对TensorFlow的再次封装,方便我们快速进行模型构建与训练,忽略神经网络的底层实现细节。显卡支持Cuda的话,可以利用Cuda加速模型训练。(当安装TensorFlow-GPU后,电脑上有可用的GPU,代码会自动调度GPU进行并行计算。)目前Keras已经被TensorFlow收录,成为其默认的框架,是TensorFlow的高级APIREF_Ref72182626\r\h[6]。卷积神经网络卷积神经网络是指包含卷积层和稠密层的神经网络,而卷积层的名称来源于一种数学方法——卷积。卷积是一种数据过滤的方法,对于普通的矩阵运算,卷积的操作为:将两个矩阵相乘,然后将结果矩阵的所有元素相加得到一个标量值。而对于实际应用中更加复杂的卷积操作,比如检测图像中是否存在某种特殊标记,具体的卷积操作为:①对于图像矩阵N(尺寸为S*S),选取一个尺寸较小的矩阵a(称为过滤器或卷积核),尺寸为s*s(s<S);②用过滤器a检测图像矩阵N中尺寸为s*s的所有分块,生成一个新的矩阵R,新矩阵的大小为(S-s+1)*(S-s+1);③假设图像中的某个特征,经过过滤器检验形成的新矩阵R存在某种特殊规律(比如矩阵R存在一行为全为1或其他特征),则可以将这个过滤器用于检测图像是否存在指定特征。如图4.2所示:图4.2α-β卷积运算过程卷积被广泛应用于从图像数据中抽取由价值的信息,在预测围棋行棋位置正需要这个功能。在上面的例子中,我们需要选取一个特定的过滤器,但对于比较复杂的情况,这个过滤器是比较难以寻找的。不过在神经网络中,过滤器并不人为指定,而是通过方向传播算法从训练数据中学习出来。卷积层正是用于实现这个过程。在KerasAPI中,可以使用Conv2D()方法对二维的围棋编码数据进行卷积运算,以寻找围棋中存在的复杂特征!一般为了更好的拟合数据或者特征比较模糊、难以寻找,实际神经网络的设计往往包含多个卷积层。通过卷积和池化,然后得到了众多特征,稠密层的每一个节点都与这些特征节点相连构成稠密层。稠密层的作用就是分类,每一个特征节点占有一定权重来决定输入属于那个分类,最终全部特征的加权共同决定了输入所属分类的权重或概率。在KerasAPI中,可以使用Dense()方法添加稠密层。神经相关算法神经网络中的每个神经元接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层。如果不使用激励函数,每一层节点的输入都是上层输出的线性函数,无论神经网络有多少层,最终得到的输入输出模型都将是线性的。假设神经网络输入为x,输出为y,有多个隐藏层,每个隐藏层输出为xi,权重和偏置项分别为ki、bi。第一层得出的输入输出关系为:x1=k1x+b1,之后的隐藏层得出的输入输出关系为:x而实际应用中更多的是非线性的关系,所以需要使用非线性函数作为激活函数,这样每一层都可以得到更为复杂的函数关系,神经网络表达能力就更加强大,研究表明使用激活函数激活几乎可以模拟任意函数。损失函数是用来评估模型的预测值与真实值的误差程度,损失函数越小,模型的数据拟合能力越强,神经网络中常用的损失函数有均方误差损失函数、交叉熵损失函数等。Relu激活函数Relu函数又称为线性整流函数,一般解析式为fx=max⁡(0,x), 即在x>0时候y=x,x≤0时y图4.3Relu函数图Softmax激活函数Softmax激活函数将多个神经元的输出映射到(0,1)区间内,可以看成是当前输出是属于各个分类的概率,因为广泛应用于多分类问题,解析式为:Si=监督学习与围棋监督学习训练围棋AlphaGo的初代版本前期是基于监督学习的实现过程,简单来说,监督学习就是一个有输入且有对应输出的数据拟合过程,无监督学习因为训练数据没有输出,而是更像是一种“聚类”过程。我们本次的设计也是采用监督学习进行初始模型的构建:正如3.3中分析的过程一样,以棋局状态为输入,以下一步落子点为输出,二者作为训练数据进行监督学习训练。这个训练阶段是通过分析近些年来的人类棋谱的特征,通过神经网络训练机器模型,使机器能够根据棋局状态对下一步的行棋动作进行预测。通过初期监督学习训练出的机器模型可以称为一个快速走子网络,它的作用是针对棋局状态,预测出下一步最有可能落子的几个位置,这些行棋位置对于当前的机器模型和棋局深度来讲并不一定是较优选择,但是这些是根据人类棋谱进行数学运算后得出的“普遍”选择,这里所说的“普遍”是指通过神经网络训练的机器认为这些落点符合某种规律,所以选择这些落点。以图4.4的引征为例,下列蓝色标记点都可以作为征子进行选择,而当前机器的模型通过训练可以得出这几个落点概率较大可供选择,但是并不能通过思考棋局深度来选出对后续行棋过程价值较高的点,而只是根据监督学习得来的公式计算出一个概率值,然后选择概率最大的进行落子。图4.4围棋引征图所以当前阶段的模型是不具备思考深度的,无法对后续棋局进行运算。而这个初级模型得到的这些位置的选择,也是为后续强化学习中蒙特卡洛树搜索过程提供采样依据,使后续能够高效地采样模拟,模拟更加真实的博弈过程,构建更有效的价值网络,以提高博弈机器人的智能度。监督学习神经网络构建在第3章节我们已经进行了围棋数据的处理,训练数据由两部分组成:①表征棋局多个特征的19*19的矩阵②经过独热编码后的代表落子位置的长度为361的向量本次设计我们选择构建卷积神经网络对训练数据进行拟合,之所以选择构建卷积神经网络,卷积层的参数通常比与其复杂度相似的稠密曾要少的多,在设计之初进行了一次实验,在同样的数据量,当使用卷积模型后,正确率提高3倍的同时,参数数量仅仅是线性模型的75%左右,这大大提高了模型的训练速度。但是在计算上比稠密层所使用的常规矩阵乘法代价更高昂。本次博弈系统的卷积神经网络主要由多层卷积层和稠密层以及填零层组成,具体设计过程为:①使用填零层扩充输入数据:输入数据为19*19的矩阵,考虑到需要使用多层卷积层,而每次卷积之后会将上一层输入图像缩小,我们在每次使用卷积层之前,首先需要对输入图像进行扩充,即在原输入矩阵的外围进行多层的填0操作。KerasAPI提供了一个非常实用的填0层工具——ZeroPadding2D(填0层),所以我们在每次建立卷积层前,都先使用填0层认为地增加卷积层的输入尺寸,以此来避免卷积操作过度地缩小输入数据,如下面代码所示(神经网络的第一层需要指定输入参数的形状,我们在第一层就使用了填0层,所以需要在第一个填0层指定input_shape参数):ZeroPadding2D((3,3),input_shape=input_shape,data_format='channels_first')ZeroPadding2D((2,2),data_format='channels_first'), ②卷积层设计:通过查阅资料我们得知,在19*19的围棋数据训练中,过滤器的大小为5~10相对比较合适,所以我们选择5*5和7*7的卷积核,而对于过滤器数量的选择,100以下相对比较合适。如果过滤器的数量选择过多的话,构建出的模型参数的数量将会非常庞大,当然我们也可以选择使用池化层(Pooling)缩减空间、减少模型的参数: 池化层(Pooling)是在卷积深度学习中比较常用的一种技术,他是通过将图像的各个分块合并成单个值,来对图像进行向下采样,以此缩小输入数据的尺寸,减少上一层的神经元的数量。以一个8*8的矩阵为例,我们采用一个2*2的分块、以最大池化策略进行空间缩减,具体过程为:将8*8的矩阵分成16个2*2的块,每一个块级矩阵都取其中的最大值来代替当前分块,最终形成一个4*4的矩阵,原来的64个参数就被缩减为16个参数。 考虑到围棋的变化非常复杂,可能需要更多的参数来对围棋数据进行拟合,所以本次设计并没有采用池化层对每一个卷积层的输出参数进行缩减,对于每一个卷积层,使用ReLU激活函数进行激活REF_Ref72182570\r\h[4],具体代码如下:Conv2D(64,(7,7),padding='valid',data_format='channels_first'),Activation('relu'),Conv2D(64,(5,5),data_format='channels_first'),Activation('relu'), ③稠密层的设计:经过多个卷积层对输入数据进行处理后,我们可以得到多维的输出参数,但是Dense层的输入为向量(一维数据),所以我们需要先将卷积操作后的数据展平到一维,之后再传入一个或多个Dense层,所以卷积层之后首先使用KerasAPI的Flatten(),然后再传入Dense层。关于Dense层,我们也使用ReLU激活函数进行激活,并设置输出参数为1024,代码如下所示:keras.layers.Flatten(),keras.layers.Dense(1024),keras.layers.Activation('relu'), ④输出层的设计:对于整个机器模型,我们希望通过棋局状态得到下一步的落子位置,基于这个思想,我们最后一层的输出应该是一个对全棋盘落子点的概率预测,最终又回到了分类问题上。所以最终我们为Dense层添加一个softmax激活层,因为棋盘大小为19*19,所以最终的输出应该是一个361的向量,表示落子概率分布,具体代码如下所示:go_board_rows,go_board_cols=19,19num_classes=go_board_rows*go_board_colsmodel.add(keras.layers.Dense(num_classes,activation='softmax')) 至此监督学习阶段的神经网络已经基本构建完毕,核心层神经网络层代码如下:from__future__importabsolute_importimporttensorflowastffromtensorflowimportkerasfromtensorflow.python.keras.layersimportZeroPadding2D,Conv2D,Activation,Flatten,Densedeflayers(input_shape):return[ZeroPadding2D((3,3),input_shape=input_shape,data_format='channels_first'),Conv2D(64,(7,7),padding='valid',data_format='channels_first'),Activation('relu'),ZeroPadding2D((2,2),data_format='channels_first'),Conv2D(64,(5,5),data_format='channels_first'),Activation('relu'),ZeroPadding2D((2,2),data_format='channels_first'),Conv2D(64,(5,5),data_format='channels_first'),Activation('relu'),ZeroPadding2D((2,2),data_format='channels_first'),Conv2D(48,(5,5),data_format='channels_first'),Activation('relu'),ZeroPadding2D((2,2),data_format='channels_first'),Conv2D(48,(5,5),data_format='channels_first'),Activation('relu'),ZeroPadding2D((2,2),data_format='channels_first'),Conv2D(32,(5,5),data_format='channels_first'),Activation('relu'),ZeroPadding2D((2,2),data_format='channels_first'),Conv2D(32,(5,5),data_format='channels_first'),Activation('relu'),keras.layers.Flatten(),keras.layers.Dense(1024),keras.layers.Activation('relu'),]input_shape=(encoder.num_planes,go_board_rows,go_board_cols)model=keras.Sequential()network_layers=layers(input_shape)forlayerinnetwork_layers:model.add(layer)model.add(keras.layers.Dense(num_classes,activation='softmax')) 然后调用Keras模型的summary()方法查看模型,如下图4.5所示:model_save.summary()图4.5神经网络各层详情 然后使用KerasAPI的compile()方法对模型进行编译进行模型编译过程:①损失函数选择:因为该模型是用于处理分类问题,均方误差在进行连续范围内的数字预测问题上比较有效,所以使用分类交叉熵作为损失函数;②优化器选择:另外在博弈过程中,棋局初始布局的几步棋几乎都在棋盘的星位附近,从来不会在最边缘落子。而在棋局终盘阶段,情况则相反。在深度学习模型中,最后一层都是尺寸和棋盘尺寸相同的稠密层。这一层的每个神经元都对应棋盘上的一个交叉点。如果使用SGD随机梯度下降,所有神经元的学习率都是一样的。如果在选择训练数据时做得不够好,可能会导致学习率已经下降了太多,以至于在终盘阶段第1、2行上的动作再也无法得到有用的更新,即再也没有学习效果了。这正是全局设置学习率所带来的问题。而要解决这个问题,可以利用采用了自适应梯度方法的技术——Adagrad和Adadelta。当拥有大量数据,而数据中的模式出现频率很低的时候,Adagrad和Adadelta的工作效果非常好。而当前模型正具备这两个条件:拥有大量的围棋数据,而且由于专业围棋比赛极端复杂,以至于被专业人士认为是标准定式的落子动作组合在数据集中出现的频率并不高。所以使用Adadelta优化器优化神经网络;③评估条件的选择:以accuracy评估模型实时训练过程的能力;具体代码如下:pile(loss='categorical_crossentropy',optimizer='adadelta',metrics=['accuracy'])计算机围棋强化学习通过监督学习得到的围棋机器人模型可以根据棋局状态对下一步的行棋动作进行预测,但是这些预测只是根据人类棋谱的行棋动作进行的动作模仿,机器模型只是归纳了众多人类棋谱后,得出初步的行棋规律,确定行棋位置。但是机器人并不会像人类一样通过计算之后几手棋甚至几十手棋评估棋局状态,进行随机应变并下出具备“思考性”的棋,也就是说,此时的机器模型并不具备前瞻性预测。为了提高机器模型的博弈能力,我们需要对当前模型进行强化学习。强化学习概念强化学习是机器学习的范式和方法论,用于描述和解决智能体在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题,通过强化学习,可以对监督学习得到的原始数据模型进行提高,使原有模型可以遇到更多训练数据集中不存在的数据,完善机器模型的拟合能力,使其更加完备。强化学习的常见模型是马尔可夫决策过程(MarkovDecisionProcess,MDP)。MDP是一个代理采取行动从而改变自己的状态获得奖励与环境发生交互的循环过程。求解强化学习问题所使用的算法可分为策略搜索算法和值函数算法两类。深度学习模型可以在强化学习中得到使用,形成深度强化学习。不同于监督学习和非监督学习,强化学习不要求预先给定任何数据,而是通过接收环境对动作的奖励获得学习信息并更新模型参数。强化学习实现本次博弈系统的强化学习部分的具体实现过程为:价值网络构建本次设计选择以棋局最终结果作为反馈进行价值网络的构建,在博弈游戏中收获只有两种可能——赢或输,而且都是在游戏结束时一次性获得的,而且一局棋的胜利必定有一部分要归功于棋局早期的表现,因此在构建价值网络的过程中,必须将最终收获回溯到之前的每一次动作,并且要计算一次行动的回报,应该将这次行动之后的所有收获累加起来。计算行动回报的部分代码如下所示:forexp_indexinrange(exp_length):total_return[exp_index]=reword[exp_index]forfuture_reword_indexinrange(exp_index+1,exp_length):total_return[exp_index]+=reword[future_reword_index] 另外在博弈游戏中,一手棋对未来n个回合的影响是不一样的,一般情况下,越远离某一次行动,受到这手棋的影响应当越小,所以在计算回报的过程中,应当对每次行动进行加权处理,行动里的越远,权重应当越小,这样未来的收获就会比近期的收获影响小。我们可以采用收获打折的技巧对行动加权,比如每一步行动获得下一步行动的全部收获,再下一步的行动只获得80%,以此进行收获加权处理。更改代码如下所示:forexp_indexinrange(exp_length):discount=0.8total_return[exp_index]=reword[exp_index]forfuture_reword_indexinrange(exp_index+1,exp_length):total_return[exp_index]+=reword[future_reword_index]discount*=0.8 模型自对弈强化学习需要足够多的经验来进行学习才能得到显著提高,同时要考虑的是,如果一个初级模型以一个围棋高手作为对手进行强化学习,因为水平过于低级,最终可能甚至无法分辨自己的落子点哪个是正确的或者错误的,而且由于对手远强于当前模型,可能高手下错几步也能取胜,因此难以从中学到经验,学习过程会比较缓慢;而当机器模型选择一个水平更低的模型进行训练,可能会构建出错误的价值网络,出现“臭棋篓子越下越臭”的情况

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论