ApacheCN优质AI博文推荐项目正式上线
AI博客推荐
每天从所有提交的博文中选出两篇文章推送到ApacheCN公共平台。
接受AI相关文章的投稿,如个人学习博文、论文解读、竞赛经验等。
提交时请创建一个新问题,并按以下格式填写:
博文地址:是原创吗?
建议:
原作者信息:作者昵称、原发布平台、联系方式。
提交地址:
试试三子棋地址:
1.摘要:
二、三棋
3.游戏界面的准备
四、人工智能
Verb机器学习
一、定义
2.设计
2.1.选择培训经历
2.2.选择目标函数。
2.3.选择目标函数的表示形式。
2.4.选择函数逼近算法。
不及物动词的应用结构
1、域名:tictactoe.js.org
2.系统类型:纯静态网站
2.1反应堆
2.2蚂蚁设计
3.源代码
3.1目标函数的表示
3.2检查板的边缘。
3.3函数逼近算法
七。评估和跟进:
简化
并发症
有趣的
八。第:章
1.摘要:
年3月,AlphaGo[1]击败了世界围棋冠军李世石,让人工智能被广泛讨论。如今,人工智能创业浪潮正在兴起。这个话题不仅活跃在科技教育界,甚至成为街头巷尾的日常话题。
各种人工智能框架的出现也大大降低了人工智能编程的门槛。例如tensorflow不仅开源,还提供了人工神经网络在线训练的接口:这使得开发者可以使用各种强大的工具来为他们的应用程序赋能,让传统应用程序变得“聪明”。
通过使用这些工具,开发人员不需要了解人工智能的基础知识,但他们不知道为什么。也就是说,如果你需要从0开始,编写一个智能程序,你往往不知道该怎么做。原因在于,这些框架本身是为了解决实际应用问题而创建的,而不是为了学习人工智能的知识和思想。
因此,本文试图通过一个实际例子,而且由于程序的学习是一个动态的过程,程序可能会给出不同的结果对人类国际象棋棋手的相同动作的反应。这使得下棋变得更加有趣。
3.游戏界面的准备
游戏的界面不涉及人工智能,但玩家必须通过界面与程序进行交互。本文采用网页版界面,无需安装即可使用,易于推广。
要编写一个优秀的Web界面,有很多优秀的开发框架可供选择。本文使用React***[5],不仅因为它是目前比较好的前端框架之一,还因为它的官方教程只是提供了编写井字游戏的详细教程[6]。
按照教程编译出来的界面是一个运行的井字棋游戏,可以两人交替玩:
四、人工智能
据***[7]介绍,人工智能也称为机器智能,是指人类制造的机器表现出智能。一般来说,人工智能是指通过普通计算机程序呈现人类智能的技术。
人工智能的研究课题有很多,机器学习就是其中之一。更准确地说,本文中介绍的程序是一个机器学习程序。本文要演示的程序开发步骤是机器学习程序的开发步骤。
Verb机器学习
机器学习是人工智能的一个分支[8]。人工智能研究的历史遵循着一条自然而清晰的路径,从“推理”到“知识”,再到“学习”。显然,机器学习是实现人工智能的一种方式,即利用机器学习来解决人工智能中的问题。
一、定义
通常有如下定义:
机器学习是人工智能的科学。该领域的主要研究对象是人工智能,特别是如何在实证学习中提高特定算法的性能。机器学习是对通过经验自动改进的计算机算法的研究。机器学习是利用数据或过去的经验根据性能标准来优化计算机程序。更准确的教科书定义如下:
对于某种类型的任务T和性能测量P,如果通过P相对于T测量的计算机程序的性能随着经验E的增加而提高,那么我们说该计算机程序正在从经验E中学习。
例如,具体到我们的井字棋游戏,它是:对于学习井字游戏的计算机程序来说,它可以通过与自己下棋来获得经验;它的任务是参加井字游戏;它的表现是基于其获胜的国际象棋。以能力衡量。
2.设计
那么如何设计一个机器学习系统呢?一般来说有以下几个步骤:
2.1.选择培训经历
为该计划选择的两次培训经历:
生成随机的合法国际象棋游戏:在该程序公开访问之前,您可以通过让该程序与一些随机生成的合法国际象棋游戏对弈来生成基本智能,然后将其公开提供给用户。这比直接公开要好,因为如果直接公开的话,程序根本就不智能,会让用户失去兴趣。与玩家对战:程序公开后,随着玩家与程序对战,程序不断调整其内部评价函数参数的权重。在与程序对战的过程中,玩家可能会感觉到程序越来越聪明,这进一步激发了玩家的好奇心和兴趣。当然,除了上述两种训练体验外,你还可以选择其他训练体验,比如使用固定评估函数的棋局生成器。
2.2.选择目标函数。
目标函数是机器学习程序的评估函数,对程序的性能进行评分。一般来说,这个目标函数应该对良好的表现给予高分,对表现不佳的给予低分。
具体到这个三棋程序,对于***B中的任意棋状态B,我们定义如下目标函数V(b):
如果b是最终获胜的游戏,则V(b)=/2;如果b是最终失败的游戏,则V(b)=-/2;如果b是最终平局,则V(b)=0;如果b不是最终的棋局,则V(b)=V(b'),其中b'是双方从b开始采取更好的棋局后所能达到的最终棋局。当然,你也可以选择其他的目标函数,比如如果是最后的胜利,则令v(b)=100;如果是负博弈,则使V(b)=-100,以此类推。如果是平局,那么让V(b)=0显然是一个合适的选择。那么这里选择胜局时为什么要选择V(b)=/2呢?
因为这里假设:到达最后一局之前一盘棋的表现是在输赢之间。如果用连续函数来表示这个趋势,应该是下图所示的曲线:
这很自然地让人想起反三角函数y=arctan(x),它恰好位于-/2和/2之间。因此,将它们分别用作输和赢的表现分数,消除了函数转换的麻烦。
2.3.选择目标函数的表示形式。
有了目标函数,怎么表达呢,也就是怎么表达成一系列自变量呢?
首先,目标函数受游戏状态影响,因此自变量必须是游戏状态。其次,不同的状态对目标函数的影响不同,即不同的自变量具有不同的权重。
如何找到合适的自变量以及目标函数代表什么函数,没有一定的标准。但一旦确定了这个目标函数的表达式,机器学习的过程就转化为函数调优的过程。
通过改变不同自变量的权重,使目标函数计算出的值逼近给定的实验数据。这就是机器学习的过程。
该学习程序将V(b)表示为求线性函数的反正切:v(b)=arctan(w0+w1x1+w2x2+w3x3+w4x4+w5x5),其中W0到W5是由学习算法选择的数值系数或权重。X1到x5是棋盘状态值,权重w1到w5确定不同棋盘特征的相对重要性,权重w0是附加的棋盘状态值常数。
再次强调,自变量的选择没有一定的标准。这里选取的五个自变量是经过一些不同的实验后能够取得良好结果的变量组合,但数量比较少。其他变量组合不太可能产生更好的结果并值得进一步探索。
这里的五个变量是:
x1:棋盘上受到对方威胁的边数,取值范围为0到8。
回顾:针对三子棋的具体学习任务,我们将其转化为学习目标函数表达式中系数w0~w5的值的问题。
2.4.选择函数逼近算法。
这个过程也称为训练值估计,也就是选择权重的过程。我们可以从任意权重值开始,不断调整权重值,直到找到更好的权重值组合。
该程序使用LMS最小均值方法。对于每个训练样本,它可以稍微调整权重以减少该训练数据的误差。
具体来说,LMS权重更新规则如下[9]:
对于每个训练样本
不及物动词的应用结构
1、域名:tictactoe.js.org
使用Js.org的二级域名tictactoe,是三帮旗的英文名。js.org提供免费的二级域名,特别愿意为js应用提供服务,而这些应用恰好是纯js应用。
2.系统类型:纯静态网站
托管在Github页面上。GithubPages非常适合托管静态网站,而且是免费的。
2.1反应堆
2.2蚂蚁设计
AntDesign是阿里巴巴推出的开源React组件库,包含丰富的界面交互组件和精美的设计风格。
3.源代码
完整的源代码托管在github:这里,我们重点关注前面章节代码:介绍的机器学习的关键步骤
3.1目标函数的表示
该程序使用目标函数:对国际象棋比赛进行评分
getBoardScore:函数{权重=权重||Strategy.getInitialWeights();let{输,赢,因素}=Strategy.getBoardStatus(bitmap);if(lost){return{Factors:Factors,NamedFactors:Strategy.getNamedStrategy(Factors),Total:-Math.PI/2}}if(Win){return{Factors:Factors,NamedFactors:Strategy.getNamedStrategy(Factors),Total:Math.PI/2}}让分数=Math.atan(factors.map((s,i)=s*Weights[i]).reduce((prev,next)=prev+next,0));return{Factors:Factors,NamedFactors:Strategy.getNamedStrategy(Factors),Total:Score};}求出分数,即为分数。注意这个score是x1到x5和权重的加权和,然后求arctan,这样score是单调有界的。2.3详细解释五个自变量x1到x5,并在代码中放入一个因子数组。这个因子是通过getBoardStatus计算出来的,这里抽象为***。好处是,如果你想改变自变量,那么这个评分函数就不需要改变。正如前面提到的,自变量的选择是不确定的。
3.2检查板的边缘。
上面的代码中有一个重要的函数:getBoardStatus。其核心是检查棋盘的边缘并获取棋盘的状态。在程序中,棋盘表示为长度为9的数组,其中每个元素为1、0或-1。这意味着当前的宫殿广场是我方的棋子,空出的地方是敌方的棋子。棋盘共有八面。检查棋盘边的函数如下:
函数checkSides(位图){让d=0;让死=0;设w=0;让c=0;for(leti=0;iSides.length;i++){letside=bitmap.filter((_,j)=Sides[i].indexOf(j)=0);}让底片=side.filter(b=b===-1);让零=side.filter(b=b===0);让one=side.filter(b=b===1);if(负数.length===2Zeros.length===1){d++;}if(负数.length===3){dead++;}if(ones.length===3){w++;}if(ones.length===2Zeros.length===1){c++;}}return{danger:d,Lost:dead,opportunity:c,win:w};}3.3函数逼近算法
函数逼近的过程也是学习的过程。有一个函数叫做learn()。该函数接收两个参数,上一场比赛和当前比赛。需要注意的是,正如之前2.2中提到的,函数逼近算法不断地使用当前权重对新的棋局进行评分来估计之前的棋局得分。因此,该函数会使用相同的权重对前后两场比赛进行评分,并使用分数之间的差异来调整权重:与LMS***
学习{
if(!lastSquares){
返回;
}
让estimatedlasscore=Judger。getboardscore(最后一个方块,这个.权重);
令实际得分=评委.getboardscore(当前方块,this.权重);
让diff=实际分数。总估计分数。全部的;
for(令I=0;iltestimatedlasscore.因子.长度;i++){
这。权重[I]=这个。权重[I]+0.1*diff*estimatedlasscore。因素[一];
}
}
4.CI/CD:
有了TravisCI系统,Travis只要提交代码,就会自动运行测试并分析代码。然后发布到Github页面。
七。评估和跟进:
该程序很好地演示了编写人工智能程序的最简单步骤。它不需要任何复杂的人工智能框架,可以从头开始编写。不过还是有优化的可能,比如:
简化
是否有更好或更简洁的目标函数表示?是否可以进一步减少自变量的数量?
并发症
除了简化之外,还可以发展另一个方向,那就是迭代更复杂的游戏。比如拓展棋盘,或者拓展成五子棋等。
有趣的
为了扩大游戏的乐趣,可以考虑添加用户系统,开发排行榜功能,让静态网站变得动态起来。
八。第:章
【1】
【2】
【3】
【4】
【5】
【6】
【7】米。维基百科。org/zh-cn/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD
【8】米。维基百科。org/wiki/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0
[9][美国]米切尔,T.M.)。机器学习[M]曾华军等译.北京:机械工业出版社,。
相关资讯: