- 《对弈程序基本技术》专题
-
- 调整评价函数
-
- David Eppstein */文
- * 加州爱尔文大学(UC Irvine)信息与计算机科学系
-
- 上次我谈到了局面评价中的很多函数,把这些函数加起来就可以组合成评价函数。但是数值从哪里来?
- 例如在黑白棋中,你可以说出四种函数:
- (1) f(局面) = 子力(我的子数 - 对手的子数);
- (2) g(局面) = 角(我控制的 - 对手控制的);
- (3) h(局面) = 机动性(我可以走的)。
- 你必须组合这些函数(可能还有其他项)来构成一个评价函数:eval = a·f + b·g
+ c·h。例如,你可以尝试:eval = -1·f + 10·g
+ 1·h。但是这些数值从哪里来?哪种数值的组合可以得到最好的效果?
- 下面是手工找到这些数值的一些方法:
-
- (1)
规格化(Normalize)。如果你只关心评价的顺序,而通常不怎么关心评价值,那么你就可以把每一项都乘以同样的常数。这就意味着你对某个特定的项目(比如说兵的价值)可以硬性设一个值,其他值就表示成它们相当于多少个兵。这个做法可以让你减少一个需要设定的参数。
-
- (2)
约束法(Deduce Constraints)。你希望让电脑作出什么样的判断,考虑这些问题就可以确定一些参数了。例如在国际象棋中,即使你赚到一个兵,用车换象或马通常还是坏的,但是如果你赚到两个兵那还是好的,因此子力价值要满足R>B+P(防止换单兵)和R<B+2P(鼓励换双兵)。这样的不等式你给得越多,合适的权重组合就越少。在一开始设定权重值的时候,这个方法通常可以得到合适的值,但是后面你仍然需要做一些调整。
-
- (3)
交手法(Hand Tweaking)。这是很常用的方法,仅仅是让你的程序对弈足够多的次数,来找到它的优势和弱点,猜测哪些参数会让程序更好,然后挑选新的参数。这个方法可以很快得到合理的结果,但是你需要对这种棋类有足够的了解,这样就可以根据程序的对局来做分析,知道程序的问题在哪里。(也就是说,当程序很笨但是你很聪明时,这个方法最有用。)
-
- 不需要人工干预的方法有:
-
- (4)
爬山法(Hill-Climbing)。类似于交手法,每次对权重作很小的改变,测试改变后的表现,仅当成绩提高时才采纳这个改变,需要重复很多次。这个方法看上去很慢,并且只能找到“局部最优”的组合(即评价可能很差,但是任何很小的改变都会使评价更差)。
-
- (5)
模拟退火法(Simulated Annealing)。类似于爬山法,也是对权重做改变来提高成绩的。但是如果改变没有提高成绩,有时候(随机地,给定一个几率)也采纳改变,试图跳出全局最优。这个方法需要给定一些几率,从几率高、梯度大的条件开始,然后逐渐减小。模拟退火法比爬山法更慢,但是最终可能得到比较好的值。
-
- (6)
遗传算法(Genetic Algorithms)。爬山法和模拟退火法可以得到一组好的权重,它们是逐渐变化的。相反,遗传算法可以得到几组不同的好的权重,不断增加新的组合跟原来的做比较(取用某组中的某个权重,另一组中的另一个权重,互相交换得到新的),通过淘汰坏的组合来控制种群的数量。
-
- (7)
神经网络(Neural Networks)。实际上这更多地是一种评价函数的类型,而不是用来选择权重的:神经元是阈值(输入权重的和)的函数,第一层神经元输入的关于局面的性质(例如位棋盘表示中的某几个位)就可以构造网络,然后前一层的结果输入到后一层。因此单输入神经元的单层网络就等同于我们上次讨论过的一阶评价函数,但是接下来就可以构造更复杂的神经网络了,而且用这种方法作为评价函数是不难的(只要根据输入的改变来重新计算神经元的输出就可以了)。问题仍然像前面所说的,如何设置权重?除了前面的方法外,针对神经网络还发展出一些方法,例如“暂时差别学习”(Temporal Difference Learning)。其基本思想是确定网络何时会作出坏的评价,并且让每个权重增加或减小看是否会评价得更好,这很类似于爬山法。跟其他自动学习的方法相比,神经网络的好处就在于它不需要很多人类的智慧:你不需要懂得太多的棋类知识,就可以让程序有个比较好的评价函数。但是根据目前我们掌握的情况,根据自己的智慧来做评价函数,要比机器学习做得好,并且做得快。
-
- 这些方法都需要依靠一些自动化的技术,以便对程序的性能进行评估:
- (1) 我们可以用程序处理大量的测试局面(比如人类棋手的高质量对局中提取的局面)并且看它是否得到正确的结果。
- (2) 我们可以让程序对阵一些著名的对手(比如其他程序)来看它能赢几盘。或者我们可以让程序和它自己对阵,以及和它自己的其他版本对阵,例如在爬山法中,用修改过的版本对阵没修改过的版本。这个方法有自身的缺点,除非系统中增加一些随机因素,否则两个程序每次会下出一样的棋,因此你只是看到一局棋的结果而无法代表全部比赛。一个合适的方法就是拿一组测试局面,从每个局面开始就可以下出不同的棋。
- (3) 我们可以比较两个结果,一个用评价函数得到,另一个用评价和搜索相结合得到。如果评价是好的,那么两者应该接近,但是反过来说行吗?
-
- 那么如何来自动掌握评价中的权重呢?可以参考Jay Scott的“博弈中的机器学习”这个网站。他列举了两个实验方法,我认为比较有趣:
- (1) John Stanback(著名的商业国际象棋程序设计师)尝试用遗传算法来设置他的程序Zarkov中评价函数的权重组合。他只测试了2000-3000局,我认为太少,得到的值还不错,但是仍然比手工调整的差。这个例子可以看出遗传算法确实有效,但是需要遗传很多代,或者有一个好的权重组合作为祖先。
- (2) Risto Miikkulainen,是得克萨斯大学里遗传算法的研究员,他曾经针对黑白棋的实验做了个报告。他用遗传算法来调整神经网络型评价函数中的权重。评价网络通过对阵固定程序来建立,如果这个固定程序下棋是随机的,那么神经网络会以棋子-格子数组的形式掌握评价(棋子在角上是好的,在角的邻近格子上是坏的,等等),直到它一直能赢了才停止学习。然后对阵一个浅的搜索结合棋子-格子数组的程序,它最终(通过几个星期的计算)学会了基于机动性的策略。但是如果对手已经是很聪明的基于激动性的程序,那么它始终会输并且不会学习。这个例子可以看出,要进行学习就必须对阵水平相当的程序,例如在遗传算法的同一个种群里,让两个不同的评价的程序进行对阵,也可以让某个程序对阵不同棋力的对手。
-
- 原文:http://www.ics.uci.edu/~eppstein/180a/970415.html
- 译者:象棋百科全书网 (webmaster@xqbase.com)
- 类型:全译
上一篇 局面评估函数——简介(一)
下一篇 其他策略——胜利局面
返 回 象棋百科全书——电脑象棋