六安沧州西安三亚宝鸡菏泽
投稿投诉
菏泽德阳
山西湖州
宝鸡上海
茂名内江
三亚信阳
长春北海
西安安徽
黄石烟台
沧州湛江
肇庆鹤壁
六安韶关
成都钦州

自学围棋的你也可以造一个

  01hr遥想当年,AlphaGo的Master版本,在完胜柯洁九段之后不久,就被后辈AlphaGoZero(简称狗零)击溃了。
  从一只完全不懂围棋的AI,到打败Master,狗零只用了21天。
  而且,它不需要用人类知识来喂养,成为顶尖棋手全靠自学。
  如果能培育这样一只AI,即便自己不会下棋,也可以很骄傲吧。
  于是,来自巴黎的少年DylanDjian(简称小笛),就照着狗零的论文去实现了一下。
  他给自己的AI棋手起名SuperGo,也提供了代码(传送门见文底)。
  除此之外,还有教程
  一个身子两个头
  智能体分成三个部分:
  一是特征提取器(FeatureExtractor),二是策略网络(PolicyNetwork),三是价值网络(ValueNetwork)。
  于是,狗零也被亲切地称为双头怪。特征提取器是身子,其他两个网络是脑子。
  特征提取器
  特征提取模型,是个残差网络(ResNet),就是给普通CNN加上了跳层连接(SkipConnection),让梯度的传播更加通畅。
  跳跃的样子,写成代码就是:
  1classBasicBlock(nn。Module):
  2
  3Basicresidualblockwith2convolutionsandaskipconnection
  4beforethelastReLUactivation。
  5
  6:hr7definit(self,inplanes,planes,stride1,downsampleNone):
  8super(BasicBlock,self)。init()
  9:hr10self。conv1nn。Conv2d(inplanes,planes,kernelsize3,
  11stridestride,padding1,biasFalse)
  12self。bn1nn。BatchNorm2d(planes)
  13:hr14self。conv2nn。Conv2d(planes,planes,kernelsize3,
  15stridestride,padding1,biasFalse)
  16self。bn2nn。BatchNorm2d(planes)
  17:hr18:hr19defforward(self,x):
  20residualx
  21:hr22outself。conv1(x)
  23outF。relu(self。bn1(out))
  24:hr25outself。conv2(out)
  26outself。bn2(out)
  27:hr28outresidual
  29outF。relu(out)
  30:hr31returnout
  然后,把它加到特征提取模型里面去:
  1classExtractor(nn。Module):
  2definit(self,inplanes,outplanes):
  3super(Extractor,self)。init()
  4self。conv1nn。Conv2d(inplanes,outplanes,stride1,
  5kernelsize3,padding1,biasFalse)
  6self。bn1nn。BatchNorm2d(outplanes)
  7:hr8forblockinrange(BLOCKS):
  9setattr(self,res{}。format(block),
  10BasicBlock(outplanes,outplanes))
  11:hr12:hr13defforward(self,x):
  14xF。relu(self。bn1(self。conv1(x)))
  15forblockinrange(BLOCKS1):
  16xgetattr(self,res{}。format(block))(x)
  17:hr18featuremapsgetattr(self,res{}。format(BLOCKS1))(x)
  19returnfeaturemaps
  策略网络
  策略网络就是普通的CNN了,里面有个批量标准化(BatchNormalization),还有一个全连接层,输出概率分布。
  1classPolicyNet(nn。Module):
  2definit(self,inplanes,outplanes):
  3super(PolicyNet,self)。init()
  4self。outplanesoutplanes
  5self。convnn。Conv2d(inplanes,1,kernelsize1)
  6self。bnnn。BatchNorm2d(1)
  7self。logsoftmaxnn。LogSoftmax(dim1)
  8self。fcnn。Linear(outplanes1,outplanes)
  9:hr10:hr11defforward(self,x):
  12xF。relu(self。bn(self。conv(x)))
  13xx。view(1,self。outplanes1)
  14xself。fc(x)
  15probasself。logsoftmax(x)。exp()
  16:hr17returnprobas
  价值网络
  这个网络稍微复杂一点。除了标配之外,还要再多加一个全连接层。最后,用双曲正切(HyperbolicTangent)算出(1,1)之间的数值,来表示当前状态下的赢面多大。
  代码长这样
  1classValueNet(nn。Module):
  2definit(self,inplanes,outplanes):
  3super(ValueNet,self)。init()
  4self。outplanesoutplanes
  5self。convnn。Conv2d(inplanes,1,kernelsize1)
  6self。bnnn。BatchNorm2d(1)
  7self。fc1nn。Linear(outplanes1,256)
  8self。fc2nn。Linear(256,1)
  9:hr10:hr11defforward(self,x):
  12xF。relu(self。bn(self。conv(x)))
  13xx。view(1,self。outplanes1)
  14xF。relu(self。fc1(x))
  15winningF。tanh(self。fc2(x))
  16returnwinning
  未雨绸缪的树
  狗零,还有一个很重要的组成部分,就是蒙特卡洛树搜索(MCTS)。
  它可以让AI棋手提前找出,胜率最高的落子点。
  在模拟器里,模拟对方的下一手,以及再下一手,给出应对之策,所以提前的远不止是一步。
  节点(Node)
  树上的每一个节点,都代表一种不同的局势,有不同的统计数据:
  每个节点被经过的次数n,总动作值w,经过这一点的先验概率p,平均动作值q(qwn),还有从别处来到这个节点走的那一步,以及从这个节点出发、所有可能的下一步。
  1classNode:
  2definit(self,parentNone,probaNone,moveNone):
  3self。pproba
  4self。n0
  5self。w0
  6self。q0
  7self。children〔〕
  8self。parentparent
  9self。movemove
  部署(Rollout)
  第一步是PUCT(多项式上置信树)算法,选择能让PUCT函数(下图)的某个变体(Variant)最大化,的走法。
  写成代码的话
  1defselect(nodes,cpuctCPUCT):
  2OptimizedversionoftheselectionbasedofthePUCTformula
  3:hr4totalcount0
  5foriinrange(nodes。shape〔0〕):
  6totalcountnodes〔i〕〔1〕
  7:hr8actionscoresnp。zeros(nodes。shape〔0〕)
  9foriinrange(nodes。shape〔0〕):
  10actionscores〔i〕nodes〔i〕〔0〕cpuctnodes〔i〕〔2〕
  11(np。sqrt(totalcount)(1nodes〔i〕〔1〕))
  12:hr13equalsnp。where(actionscoresnp。max(actionscores))〔0〕
  14ifequals。shape〔0〕amp;gt;0:
  15returnnp。random。choice(equals)
  16returnequals〔0〕
  结束(Ending)
  选择在不停地进行,直至到达一个叶节点(LeafNode),而这个节点还没有往下生枝。
  1defisleaf(self):
  2Checkwhetheranodeisaleafornot
  3:hr4returnlen(self。children)0
  到了叶节点,那里的一个随机状态就会被评估,得出所有下一步的概率。
  所有被禁的落子点,概率会变成零,然后重新把总概率归为1。
  然后,这个叶节点就会生出枝节(都是可以落子的位置,概率不为零的那些)。代码如下
  1defexpand(self,probas):
  2self。children〔Node(parentself,moveidx,probaprobas〔idx〕)
  3foridxinrange(probas。shape〔0〕)ifprobas〔idx〕amp;gt;0〕
  更新一下
  枝节生好之后,这个叶节点和它的妈妈们,身上的统计数据都会更新,用的是下面这两串代码。
  1defupdate(self,v):
  2Updatethenodestatisticsafterarollout
  3:hr4self。wself。wv
  5self。qself。wself。nifself。namp;gt;0else0
  1whilecurrentnode。parent:
  2currentnode。update(v)
  3currentnodecurrentnode。parent
  选择落子点
  模拟器搭好了,每个可能的下一步,都有了自己的统计数据。
  按照这些数据,算法会选择其中一步,真要落子的地方。
  选择有两种,一就是选择被模拟的次数最多的点。试用于测试和实战。
  另外一种,随机(Stochastically)选择,把节点被经过的次数转换成概率分布,用的是以下代码
  1totalnp。sum(actionscores)
  2probasactionscorestotal
  3movenp。random。choice(actionscores。shape〔0〕,pprobas)
  后者适用于训练,让AlphaGo探索更多可能的选择。
  三位一体的修炼
  狗零的修炼分为三个过程,是异步的。
  一是自对弈(SelfPlay),用来生成数据。
  1defselfplay():
  2whileTrue:
  3newplayer,checkpointloadplayer()
  4ifnewplayer:
  5playernewplayer
  6:hr7Createtheselfplaymatchqueueofprocesses
  8resultscreatematches(player,coresPARALLELSELFPLAY,
  9matchnumberSELFPLAYMATCH)
  10forinrange(SELFPLAYMATCH):
  11resultresults。get()
  12db。insert({
  13game:result,
  14id:gameid
  15})
  16gameid1
  二是训练(Training),拿新鲜生成的数据,来改进当前的神经网络。
  1deftrain():
  2criterionAlphaLoss()
  3datasetSelfPlayDataset()
  4player,checkpointloadplayer(currenttime,loadedversion)
  5optimizercreateoptimizer(player,lr,
  6paramcheckpoint〔optimizer〕)
  7bestplayerdeepcopy(player)
  8dataloaderDataLoader(dataset,collatefncollatefn,
  9batchsizeBATCHSIZE,shuffleTrue)
  10:hr11whileTrue:
  12forbatchidx,(state,move,winner)inenumerate(dataloader):
  13:hr14Evaluateacopyofthecurrentnetwork
  15iftotaliteTRAINSTEPS0:
  16pendingplayerdeepcopy(player)
  17resultevaluate(pendingplayer,bestplayer)
  18:hr19ifresult:
  20bestplayerpendingplayer
  21:hr22example{
  23state:state,
  24winner:winner,
  25move:move
  26}
  27optimizer。zerograd()
  28winner,probaspendingplayer。predict(example〔state〕)
  29:hr30losscriterion(winner,example〔winner〕,
  31probas,example〔move〕)
  32loss。backward()
  33optimizer。step()
  34:hr35Fetchnewgames
  36iftotaliteREFRESHTICK0:
  37lastidfetchnewgames(collection,dataset,lastid)
  训练用的损失函数表示如下:
  1classAlphaLoss(torch。nn。Module):
  2definit(self):
  3super(AlphaLoss,self)。init()
  4:hr5defforward(self,predwinner,winner,predprobas,probas):
  6valueerror(winnerpredwinner)2
  7policyerrortorch。sum((probas
  8(1e6predprobas)。log()),1)
  9totalerror(valueerror。view(1)policyerror)。mean()
  10returntotalerror
  三是评估(Evaluation),看训练过的智能体,比起正在生成数据的智能体,是不是更优秀了(最优秀者回到第一步,继续生成数据)。
  1defevaluate(player,newplayer):
  2resultsplay(player,opponentnewplayer)
  3blackwins0
  4whitewins0
  5:hr6forresultinresults:
  7ifresult〔0〕1:
  8whitewins1
  9elifresult〔0〕0:
  10blackwins1
  11:hr12Checkifthetrainedplayer(black)isbetterthan
  13thecurrentbestplayerdependingonthethreshold
  14ifblackwinsamp;gt;EVALTHRESHlen(results):
  15returnTrue
  16returnFalse
  第三部分很重要,要不断选出最优的网络,来不断生成高质量的数据,才能提升AI的棋艺。
  三个环节周而复始,才能养成强大的棋手。
  有志于AI围棋的各位,也可以试一试这个PyTorch实现。
  本来摘自量子位,原作DylanDjian。
  代码实现传送门:
  网页链接
  教程原文传送门:
  网页链接
  AlphaGoZero论文传送门:
  网页链接

年后的家乡叮咚叮咚一阵闹铃声把我吵醒了。我睁开眼睛一看,发现我现在身处一个陌生的房间。突然有一个一米刚过的小矮人机器人走了过来,用眼睛扫描似的盯着我看了一会儿后说:徐惠泽,男,30岁,身……再见了我的爱仿佛就在昨天,你牵着我的手,踏上了婚姻的红地毯。仿佛就在昨天,你悄悄告诉我,要我永远做你的好妻子。可是今天,却物是人非是不是所有的美梦都容易早早惊醒?翻……细微处的爱昏黄的灯下,孤凄的树影散乱一地仿佛散落一地的乌金。雨沙沙地击打着铺着碎石的路面,他撑着一把破旧的雨伞匆匆跑来。回到家里,便免不了她的一顿骂:怎么现在才回来,不是早就……黄豆和黄豆芽到底哪一种更营养黄豆和黄豆芽,它们的关系不言而喻,营养方面到底谁更胜一筹呢?那今天就来了解一下它们二者的小知识吧。黄豆多吃易腹胀黄豆的营养很丰富,它含有很多的蛋白质、脂肪、碳水化合……张仲景一生骄傲的方子巧治过敏性荨麻疹本文理论依据:《伤寒论》你好,我是中医人,文君然。在我的后台,每天都有很多朋友在和我交流。有些人,则打算直接来找我。编辑我想说的是,我在这里写一点中医科……眼球突出手术后注意什么手术的效果不仅和手术过程中的方法有关,同时还和手术后的护理有非常密切的关系,眼部突出手术虽然是现在很常见的一种手术,这种手术的副作用经过长时间的研究已经在逐渐的减少,但是在手术……生殖器流脓小便刺痛多因这病当我们的身体出现异常症状时,最佳的处理方法就是区医院检查治疗,既不能不管不顾也不能随便乱吃药。就拿男人的生殖器来说,出现流脓且小便刺痛的症状时,就应该抓紧去医院确诊。哪些疾病会……深度曝光外汇投资骗局让人陷入骗局的深渊双击最近后台很多人让我讲讲外汇平台,尤其是PTFX,嗯,我从了。总有些我认为是常识的事情,在别人看来都是第一次接触。很多骗局都是如此,圈内人不上当,圈外人不设防。……救生缓降器安装发生火灾我们被困在房间无法出去时,需要救生缓降器帮助我们从阳台或窗口逃出。那么您知道救生缓降器安装方法吗?下面就和本站小编来看下怎么使用救生缓降器吧。公众配备救生缓降器,……客厅布艺沙发怎么选购布艺沙发是比较时尚温馨的一种沙发,而且布艺沙发的价格也比较便宜,深受人们的喜爱。下面小编带您了解一下客厅布艺沙发怎么选购。1、摆放黄金原则,适合才能更舒适。一套好的……低温天气行车有哪些隐患冬季,低温雨雪天气是常态,这对于很多司机来说是一个不小的困扰,尤其新手司机更是不习惯这种天气的发生。因此,平时知道一些低温天气行车有哪些安全隐患的知识就非常有必要。下面,本站就……小区绿化树木影响采光怎么办树多是很多人对小区绿化好的评价标准,然而不少小区业主却正在为大树长得太茂密而烦恼,靠楼栋太近的大树,挡住了1楼到3楼人家的阳光,让业主们备感纠结。那么,小区绿化树木影响采光怎么……
最后一次分手一hr紫涵一个人从医院里出来,突然感觉全身冷的发抖,她伸出双臂紧紧地抱住自己,神情漠然地往住的地方走。一阵哭泣声吸引了她的注意力。她盯着站在路边哭泣的小男孩,突然心里一阵……流浪的心原来快乐就在我身边,只是我不愿意去发现。我一直活在自己虚拟的世界里,在那里面只有无尽的哀怨与伤感,我活得好辛苦。没有人能够拯救我,因为我把自己封闭了,在那个孤独的地方没有交流更……欧美风直发发型超显气质发型走国际范直发是淑女最爱的发型,一直深受广大女生的喜爱,尤其是身材细瘦高挑的女生,留一款欧美风直发,不仅彰显出浓郁的异域风情,而且能带来让人印象深刻的美感。这款欧美风直发,将头顶的……健美的锻炼方法有哪些每个人的健美锻炼方法自然是大不相同的,这还是要根据每个人的身体状况不同来选择的,不过这种健美的锻炼方法大部分都是针对于男性朋友们的,这主要就是由于只有男性朋友们才希望自己的身体……秋季韩国女生流行烫发发型空气感烫发发型将发量变得蓬松起来,使得这款天鹅米的斜刘海长卷发具有完美减龄的功效,突显修颜的感觉。女生们非常喜欢的一款烫发发型图片,搭配经典日式斜刘海更能展现女人的柔美。……锁骨发适合什么脸型比短发气质长发甜美若说去年是短发大势年,那今年就是中长发的天下!从郑有美、孙艺珍、申世景到徐睿知、金玉彬,韩剧女主角们都纷纷留起了这头锁骨发,就让我们一起来看看!比短发气质、比长发甜美,兼……小鸭子去春游春天,阳光明媚,普照着大地,河水也渐渐变暖。小鸭子们很想去春游,见识一下这大千世界。小鸭子们来到河边,只见水是那么地清澈,蓝天、小桥、房屋的倒影都清晰可见。小鸭子们一个接……碎花长裙搭配什么上衣复古或优雅随意切换春暖花开的季节里怎么能少得了小碎花元素呢?好不容易抛弃了厚重又笨拙的羽绒服,终于可以换上飘逸又浪漫的长裙,加上小碎花,日系还是复古,甜美还是优雅,都能为你信手捏来。不仅各个风格……波西米亚编发教程波西米亚气质编发美翻天波西米亚编发教程相信很多女孩都有满满的浪漫情怀;除了钟爱波西米亚裙子,当然唯美、梦幻的波西米亚编发,也是不二之选,波西米亚编发,恬静异域风情,绝对美翻天。style……浅谈当代大学生如何正确面对心理问题现代社会对人的素质提出了更高要求,没有较高的心理健康水平,将不能适应社会发展的要求。一个人的心理达到什么样的标准才算健康呢?这是一个复杂的问题,不同的学者从不同的角度有不同的论……找到合适你的工作了吗什么样的工作才是好工作?对不同的人而言,答案是完全不同的,因此我们几乎无法回答这个问题。即使我们问怎样是一份合适的工作,也很难有个统一的答案,因为每个人对合适的定义都不一样。P……魏继新燕儿窝之夜主要内容简介及赏析作者简介魏继新,1950年2月7日生于四川省广安县城关镇。1966年毕业于四川省广安县第一中学。1969年去广安县枣山公社插队落户。1971年先后在南充地区纺织机械厂、南充织绸……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网