评估棋局
如何通过赋权的特征来确定策略呢?在博弈过程中,棋手们遇到的大多数棋局都很难再次遇到,有些恐怕他们终生都无法再遇到了。当然,开局和终局除外。为应对棋局的这种不可穷尽性,塞缪尔设计出能够刻画大量棋局的特征。比如,前面介绍过的“领先棋子数”这一特征,即机器棋手拥有的棋子数与对手的棋子数之差。显然看一眼棋盘很容易确定这个数字。我们认为“领先棋子数”相同的棋局,比如领先一子,具有相同的该特征值。所有其他特征具备同样的属性:大量不同的棋局被归并到同一个集合里,如同我们可以凭借一个数字把具有该数值的所有对象归并到同一个集合里(见图4-1)。这些集合不同于数量庞杂的棋局,它们会在博弈过程中反复出现,由此便获得一种可行的方法,从而摆脱棋局本身的不可穷尽性带来的困扰。
寻找与赢得胜利紧密相关的特征似乎是自然而然的事情。“领先棋子数”明显具备这样的特征。而且对于任意棋局,我们都可以轻而易举地确定其领先棋子数。机器棋手只需计算出自己拥有的棋子数,然后减去对手所拥有的棋子数即可。博弈开始时,“领先棋子数”的值为0,因为此时博弈双方的棋子数相同。随着博弈的继续,该特征值可能为正,比如+2,也可能为负,比如-3。在前一种情况下,机器棋手比对手多2枚棋子,在后一种情况下,它比对手少3枚棋子。
塞缪尔设计了一个重要的特征数组。这个数组包括和胜局紧密相关的特征,如“领先棋子数”“领先的王数”等;也包括和领先局势相关的其他特征,如“越过中线的净突破数”,以及有些看似随意的特征,如“中心力矩”(6)或者“棋子相对于中心的分散程度”。对于某个棋局来说,每个特征都有一个固定的数值。
当然,在评估棋局的特征值时,并非所有的特征都同等重要。为此,塞缪尔根据特征的重要程度为它们赋予了相应的权重。例如,“领先棋子数”的权重可能为50,而“中心力矩”的权重可能只有2。那么,如果在某个棋局中,“领先棋子数”的值为1,“中心力矩”的值为4,则相应的特征值分别为50和8。把所有特征值相加,我们就能知道这个棋局的总体情况。特征值之和越大,对应的棋局越有价值(通向胜利);如果是负数,则要尽量避免出现这个棋局。这种为每个棋局赋予一个单独数值的方法叫作评估函数(valuation function),用V表示。
并非所有的预估都是有效的,评估函数V也有可能产生误导。如果预测是有效的,那么特征一定是经过精心挑选的,相应的权重也是合理的(见图4-2)。我们稍后将会看到学习机制如何通过操纵V中的权重,改进预测值。
图4-2 国际跳棋程序的评估函数
EMERGENCE
当我们讨论国际跳棋程序,以便随着博弈的展开而改进评估函数,或者随后对国际跳棋程序和神经系统中的涌现现象进行比较时,了解评估函数精确的数学形式是大有裨益的。作为评估函数的组成部分,这些特征本身就是函数。也就是说,它们把博弈的状态S(棋盘上棋子的布局)映射到一些数值的某一集合中,如实数集R:
v:S →R
其中,v(s)表示棋局s赋予特征v的值。塞缪尔有代表性地选用了大量特征,为了有所区别,我们用vi表示第i个特征。当有32个特征时,下标从1到32,记作i=1, 2, …, 32。如果特征数目不能提前确定,我们设其为k,用符号{vi:S→R, i=1, 2,…, k}来表示由k个特征组成的集合。塞缪尔的评估函数V仅仅是特征值的加权和,因此对于一个棋局s∈S来说,其值V(s)通过下式获得:
V(s)=∑iwivi(s)
这里wi是第i个特征的权重。V(s)的值是从棋局s开始所能得到的最好结局的预测值。
从评估到策略
到底V是如何确定策略的呢?前面提到过,策略就是能为每一个合规棋局确定唯一棋步的过程。如果认为函数V为每一棋局的赋值是可靠的,那么对于每个棋步(分支),我们总是挑选那个通往最大值棋局的走法。简而言之,我们选择的棋步能够产生具有最大值的结果。在这个规则的约束下,由于V为每一个棋局确定了相应的棋步,所以V就确定了一个策略。
当然,策略有好有坏。我们选择的策略有可能总是导致失败的结局。如果对于一些特定棋局而言,V是一个不成功的预测工具,那么当机器棋手选择这些棋局时,就总会做出错误的决定,选择错误的棋步。塞缪尔为“学习”设定的目标就是,随着博弈实战经验的积累,不断改进预测以及相应的策略。