AI帮我下围棋!!

  “我训练的ai”第一次下过腾讯围棋的初级ai!而且仅用了50手!

​   ​寒假闲着没事开始学习围棋,结果被初级ai和各路棋手打爆:(

  于是开始研究,我脑子算不过来就不信用电脑还算不过来。正好前年寒假学习的深度学习知识还剩点在脑子里,就打算训练一个非常简单的ai来帮我下棋。

​  一开始的打算非常非常非常非常简单,就是使用大量的高手对局数据集进行监督学习得到一个策略选择网络。它的功能就是根据当前的局面输出那些高手们最有可能下的一个位置。 ​
​  于是我花了两天时间准备了从1561年到2018年的94013场围棋高手棋谱,19583095个落子样本,得到30多G的训练数据(后来才发现原来可以压缩保存)。为了能让他们塞下我的电脑,我不得不删掉了E盘的两个游戏。

​  然后电脑呼呼吵了一晚上,终于训练出我的第一个模型。当我拿它去比试时候,发现它下的棋根本不是人,不过它本来也不是人:P。它连我都下不过。 ​ ​  显然,仅仅对当前局面来做出判断还是太鼠目寸光了。了解了一下大名鼎鼎的阿尔法狗的设计思路后,发现我设计的这个模型还是太弱小了。不过我这个小笔记本想要跑阿尔法狗的模型显然不现实,况且我的数据量也没阿尔法狗多。于是在聪明的豆包的帮助下,我优化了一下模型结构,让它能够更好关注棋盘的全局特征。

​  虽然优化后的新模型比上一个要牛逼些,但是水平依然不是人,我还是可以轻松打爆它。看来想要得到一个像个人样的围棋ai没有那么简单。仅仅使用一个简单的策略选择网络不能赢棋。 ​
  于是我结合ai给出的信息开始在网上查找一些资料,发现有个叫MiniMax树搜索和蒙特卡洛推演的东西。这个东西厉害啊,简单来说就是将人脑在下棋过程中的博弈和推演用算法具象化出来。而阿尔法狗就是结合了这两个东西,叫蒙特卡洛树搜索。其实就是把这两个名字各取一半拼了起来:P。 ​
  为了实现这个算法,我还需要一个网络——价值判断网络。它的作用很简单,就是根据当前局面输出黑白双方的价值或者胜率。但是想要得到它却没有那么容易,说实话,我至今还未真正得到。 ​   首先就是要如何得到价值网络的训练数据,我的所有棋谱可没有告诉我它们每个局面的价值都是多少。因此我决定先设计一个算法,根据围棋的规则(每个棋的气、死棋活棋的数量、目数等等)为每个局面计算其价值。算法是设计出来了,但是验证的正确性有些堪忧。比如,对于一些黑棋胜利白棋输的对局,算法计算出白棋的价值居然还要高一些,这显然是完全错误的。我对1000个终局进行验证测试,其准确率竟然只有26%,这和瞎蒙的50%还差一大截。显然这样是有问题的,也可能是我算法设计的缺陷。

  实际上对于围棋这种复杂的东西,想要设计一个算法准确描述双方的局面价值并没有那么容易。因此我最终将眼光看向了现有的模型——KataGo,它是目前继阿尔法狗之后最主流的围棋ai。不过我肯定是不会直接完全用它的,而是让它来帮我看看当前局面的下一个行棋方的胜率是多少。 ​   所以呢,“我的这个ai”其实有两部分组成,一个是我自己的策略选择网络,另一个是有KataGo帮忙的价值判断网络。关于先前提到的蒙特卡洛树搜索,受限于硬件性能,我也只能实现一半,实现了MiniMax树搜索那部分。不过它的效果还是挺不错的,起码像个人了。 ​
  其实我也想过不借助KataGo的力量,自己训练一个局面价值网络。我查阅了阿尔法狗的实现方式,发现它的数据集使用了3000万个对局,每个对局抽一个局面,然后用该局面所在对局的胜负作为标签来训练。不过我上哪搞那么多数据(其实可以自对弈得到:P),就算有那么多数据我也塞不下电脑里,就算塞下电脑我训练也得练好久:(。于是我想到先用下别人造好的轮子。最开始我使用KataGo是为了帮我标注数据集,我给它局面让它帮我打分,用于生成训练数据。不过它干活有点慢,我计算了一下,想要生成100万个数据集得让它连着干一个星期。这我可等不起。为了早点体验到ai的魅力,我就干脆让KataGo直接当我的局面价值判断助手了。

  以后有时间的话,我应该会再优化一下,争取把那两个引号去掉🧐