代码改变世界

机器学习:计算机学习西洋跳棋

2014-01-08 16:16  ☆Ronny丶  阅读(3828)  评论(1编辑  收藏  举报

一、西洋跳棋

西洋跳棋是一种两人棋盘游戏。玩家的棋子都是沿斜角走的。棋子可跳过敌方的棋子并吃掉它。

相关规则参考:Wiki

image

二、机器学习

通过让程序分析人们购物清单,来分析人们对商品的品牌、价格的偏好。

通过跟踪个人的新闻浏览,分析其兴趣爱好、并为其推荐感觉兴趣的新闻或产品。

通过对已知的手写字符的分析,能够让计算机程序自动的认出手写字符。

以上这些都是机器学习的例子,在今天,机器学习已经不知不觉的进入到人们的生活,也许你为奇怪为什么网页上的广告都是显示你最在在淘宝或京东上最近购买的商品。最终你会发现,你使用的软件,你操作的系统,变得越来越智能。

机器学习:任何计算机程序通过经验来提高某任务处理性能的行为,都称为机器学习。

定义

对于某类任务T和性能度量P,如果一个计算机程序在T上以P衡量的性能随着经验E而自我完善,那么我们称这个计算机程序在经验E中学习。

既然学习的定义如上面描述,那么我们用机器学习来定义下西洋跳棋。

任务T:下西洋棋

性能标准P:比赛中击攻对手的百分比

训练经验E:和自己或与选手对弈。

三、如何设计一个机器学习系统

上面我们已经把下西洋棋用机器学习的方法表示出来,接下来,我们需要一步一步考虑如何完成这个学习系统的设计。

面临的第一个问题就是训练经验,因为它是整个系统的输入:

首先,这个经验一定要可以为我们下西洋棋每一步的决策提供直接或间接的反馈。直接的经验比如:和种棋盘状态和相应的正确走子;间接的经验比如:根据最终局的胜负或走子序列反馈每步走子的贡献度。

其次,学习器可以在多大程度上控制训练样例序列。可以用一些固定的走子步骤和棋局,可以允许学习器主动地去微调一些走子方式和尝试一些它还未考虑过的全新棋局。

最后,训练样例的分布能多好地表示实例分布,就是说你不能一直让学习系统一直与菜鸟对弈,这样遇到大师级的就不能有很好的表现,因为它会遇到平时训练时没有遇到过的走子或棋位布局。

那么我们就选择和100位水平高低各不相同的选手对弈各100局,总共1万局够成了我们的训练经验。

为了完成这个下棋的学习系统,我们需要选择:

1) 目标函数

2) 目标知识的表示

3) 一种学习机制

目标函数:我们在西洋棋对弈时,能够操作的步骤就是走子,合法的走子有很多种,每一种都会产生一个不同的棋局,我们的目标就是选择出最好的走法,于是定义我们的目标函数是这样的:

目标函数V,并用$V:B \to R$来表示$V$把任何合法的棋局映射到某一个实数值。

我们让目标函数$V$给好的棋局赋予较高的评分,如果系统能够成功地学会这个目标函数$V$,那么它便能使用此函数轻松地找到当前棋局的最佳走法。

于是我们的目标就落在了,怎样给一个棋局评分,我们需要一套规则来给所有的棋局评分。一个棋局,其最直观的形式就是棋局上所有点棋子状态有或没有,比如传统的10*10的棋盘,那每个格子里要么有子,要么没有子,我们可以用1或0表示,这样一局棋局就可以表示为一个10*10的矩阵,矩阵的元素为1或0。

我们会发现这样表示一个棋局还是太抽象,不容易找出判断棋局好坏的规则,我们希望选择一些具有表征能力的描述,以最大可能的代替一个棋局的信息。如果可以选择棋盘上黑子的数量和红子的数量,这时候,较为一般的数量占优的棋局会有较高的评分。下面是我们选择的几个棋盘状态特征:

feature1:棋盘上黑子的数量

feature2:棋盘上红子的数量

feature3:棋盘上红王的数量

feature4:棋盘上黑五的数量

feature5:被红子威胁的黑子的数量

featurn6:被黑子威胁的红子的数量

但是上面6个特征它们说明棋局好坏的能力也不同,有的代表性强,有的代表性弱,所以我们要给它们赋予一定的权重:

$$v(b)=w_0+w_1 x_1+w_2 x_2+w_3 x_3+w_4 x_4+w_5 x_5+w_6 x_6$$

那么V(b)就是一个目标函数,对于每一种走子b,目标函数都可以计算出一个实数值来说明棋局的好坏。

比如黑子赢了的棋局,我们将它的函数值定位为V(bi)=+100,这种情况下,已经没有红子,那么这个棋局就可以表示为:

$$<<x_1=3,x_2=0,x_3=1,x_4=0,x_5=0,x_6=0>,+100>$$

有了上面这些表示,我们就可以运用一些对局的局来训练我们的系统,那么就想通过这些样本来选择一组最合适的权值,让所有棋局与我们最终的预测结果都尽可能一致。

任何一个样本棋局都要表示为这样一个数据对$<b,V(b)>$,其中的$V(b)$我们通过给出来些近似函数$\hat{V}(b)$来手动的标记。

剩下的事情就是为这个学习算法选择最合适训练样例的权。一种常用的方法是把最佳的假设(或权重向量集合)定义为使训练值和假设预测出的值间的误差平方和E最小。

$$E=\sum_{<b,V_{train}(b)>}(V_{train}(b)-\hat{V}(b))^2$$

这里我们可以采用最小均方法来求最佳权值,或叫LSM训练法则

对于每一个训练样本$<b,V_{train}(b)>$

使用当前的权重计算$\hat{V}(b)$

对每一个权重$w_i$进行如下更新:

$$w_i \gets w_i +\eta (V_{train} (b)-\hat{V}(b))x_i$$

这里是一个小的常数,用来调整权值的更新幅度,比如果误差为0时,权值就不会更新。

四、最终的设计

 

image

执行系统:这个模块用学会的目标函数(决策器)来下棋。它把一局新的棋局作为输入,然后会产生一组解答路线。

鉴定器:它将一组解答路线生成为一组训练数据。

泛化器:它以训练样本作为输入,产生一个输出假设,作为它对目标函数的估计。

实验生成器:它以泛化器中生成的假设来生成一个决策器,决定每种棋局下应该执行的走子。

五、可靠吗

如此设计的程序能击败人类的西洋跳棋冠军吗?或许不能,部分原因在于我们对目标函数的表示过于简单了,我们可以设计更复杂更具有表征性的特征。学习的方式也是多种多样:

我们可以简单的只储存训练样例,然后去寻找保存的“最接近”的情形来匹配新的情况——最近邻法。

可以产生大量的跳棋程序,让它们相互比赛,保留最成功的程序并进一步用模拟进化的方式来培育或变异它们——遗传算法。

而人们有着不一样的学习机制,我们可以分析或向自己解释比赛中碰到的成败的原因——基于解释的学习。这当然也是机器学习最高级的形式。