概述 (源码在最后)
早些年,IBM研发的深蓝机器人战胜了当时的国际象棋冠军,引发了人们对人工智能的关注, 去年,谷歌的alphaGo战胜了李世石九段,又引发了一场人工智能和机器学习的热潮。随着新算法的和算法变种的出现,人工智能特别是机器学习领域又被推向了计算机行业的风口浪尖。如今人工智能已经深入到生活的各个方面,比如手机上的siri,电脑上的小娜,离我们最近的可能是各种推送的广告也越来越智能化。本文讲述一种基于机器学习的智能五子棋的实现方式,以丰富我们的业余生活。
现状:
目前网上有一些五子棋AI程序,大部分是基于最大最小树的剪枝算法,或者是一些自定义的算法,无法达到机器自我学习的目的,也基本没有禁手规则。
在不考虑禁手的情况下,五子棋的走法并不复杂,传统通过递归树的方法已经可以让机器达到很厉害的水平。
目的:
传统算法AI走棋套路固定,不灵活,下多了就没意思,而本文实现的功能机器可以随着游戏的进行改变下棋的手法,从而提高灵活性,并加入禁手功能,让游戏更有乐趣。
设计:
首先,定义一个五子的棋学习问题:
任务T:下五子棋
性能标准:人机对战中取得更高的胜率
训练经验:和人类下棋
列出这个问题后,根据米切尔的机器学习一书,我们缺少目标函数和目标函数的表示,这里目标函数是以传统的给棋盘定义一个分值的方法出。
分值包括棋盘上1子、2子、3子、4子、5子的个数,以及每颗子周围的形势、所处位置的好坏,目前我们用到了16种因素,这些因素分别记作X1,X2,X3,X4... 每一个因素都包含一个分值,记做θ1,θ2,θ3,θ4... 那么期望H的表达式写作(下面表达式省略了后面n个 ..+ θiXi):
这个函数是一个多维的一阶线性函数,由此可以看出,我们可以把五子棋的下棋方法简化成为在多维度上的分类的问题。
以上函数表示的是棋盘的实际值,那么我们怎么来获取棋局的期望值呢?有一个方法:因为这盘棋最终会得到一个输或者赢的结果,那么这个结果期望可以用作最后一步前一步的期望,依次倒推,则可以使用下一步(我下一手后,对手再下一手)的实际值作为当前的期望。
下完后,根据最小二乘法,把每一步的误差加起来,得到一个总误差J(θ):
这里,y(i)是第i步的期望输出。
我们的目的是调整θi的取值来使误差达到最小化,要求误差的最小化,实际上就是当θ变化的时候,J(θ)变化最小,即J(θ)对θ求偏导,得到其最小的变化率,就是目的所在。
根据米切尔机器学习第四章,期望向量实际上与权向量θ的关系是一个负梯度的关系,所以θ(也叫做权)的表达式:
这个公式也叫做梯度下降法则,以下是J(θ)对θ求导过程:
代入上面的梯度公式,得到:
所以对于每个权,θi := θi+ n*Xi*(E-O) ,其中 n是系数,E是期望输出,O是实际输出。
利用这个公式,每走一步都对当前棋盘形势对应的权进行调整。
算法
另外,我们需要一个算法来指导机器走棋,当然最简单的方法是对每一个位置都进行模拟下子,得到对应的期望值,然后以期望值最高的一步作为最终下的点。
这里使用的方法是使用最大最小搜索树,其原理是先模拟自己下一步棋,把下棋后的期望记下,然后在此基础上,模拟对手下棋并再次计算期望,将期望差相减,得到差值最大的一步棋。主要的伪代码如下:
遍历可走的位置:
下棋,计算期望
遍历对手可走的位置:
对手下棋,计算期望
如果下的棋超过了上一轮下棋的期望,返回
#剪枝,该位置对手期望大,肯定不能走
如果超过了上一次的期望,记下
对手遍历结束,返回本轮下棋最大期望
如果这轮期望差大于上一轮,则记下期望差,并记下下棋的位置
#要找出期望差最大的位置
遍历结束,得到期望差最大的点
使用上述逻辑,我们基本可以打败一般的对手,上述代码可以是递归的,传统的下法是让这个算法递归n次,从而下出比较牛逼的棋,而我们并没有这么做,因为如果一味递归,就减弱了机器学习的意义,而且普通人下棋只会凭感觉,并不会考虑后面n手棋。
调试和发现的问题
调试是一个麻烦的过程,首先,我们没有样本,所以先按照网上的经验给了权值一些适当的初始值,在调试过程中,发现这些权值的大小直接影响机器的抉择,某个值一定幅度的偏差会导致机器变得很傻逼。
另外,我们设计开始加入一些跟大局观相关的因素,这是创新点,让机器不走死套路。在调试的时候发现,某些因素是错误的,会导致棋盘后期权重盖过主因素,使机器变得越来越傻。另外,一些因素由于权值过高会直接影响到开局的落子。
另一个方面就是梯度下降算法自带的弊病,一是收敛速度比较慢,二是可能收敛到局部最小值,我们仅靠个人下棋训练没办法使其达到很高水平。相反,烂的下棋者会让机器因为变得容易获胜而强化烂的走棋线路。
经过几百盘的对弈调整,最终把权调整到一个相对好的值。
当然,最后发现也存在不少的问题,主要有一下几点:
1、目前对于棋盘的胜利因素考虑不够周到,使得机器有时候还是会出现一些小失误。
2、权重不够好,比如有时候机会会下双活三,而放弃堵黑棋的活三。
3、不支持手机,因为坐标问题,还不支持手机点击
改进
继续优化棋盘胜利因素,并手动导入一些训练样本,得出最好的权值。
由于坐标问题,暂时不支持手机浏览器,考虑改进支持。
另外再优化一下界面会更好,现在是一个网络版,可以直接访问网页进行游戏。
点击此处进行游戏
参考文献:
1、《机器学习》 ([美]米歇尔(Mitchell,T.M.) 2014年 机械工业出版社
2、《神经网络与深度学习》吴岸城 2016年6月
源码比较乱,多多包涵 http://lazypos.pw:8080/new.rar