zl程序教程

您现在的位置是:首页 >  IT要闻

当前栏目

机器学习概念西洋跳棋

2023-03-15 22:05:40 时间

本篇文章基于机器学习来分析下西洋跳棋学习问题。 从1989年开始,美国艾尔伯特大学的计算机科学家Jonathan Schaeffer和同事就致力于开发西洋跳棋人工智能程序。 通过研究5万亿亿个跳棋位置,研究人员于16年4月完成了切努克终极程序,它是无法被击败的——就算人类智力发挥到极限,也只能跟它打个平手。

学习问题的标准描述:

我们给学习一个宽广的定义,以使其包括任何计算机程序通过经验来提高某任务处理性能的行为。更准确地讲:

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

例如,对于学习下西洋跳棋的计算机程序,它可以通过和自己下棋获取经验, 它担负的任务是参与西洋跳棋对弈,它的性能用它赢棋的能力来衡量。通常,为了很好地定义一个学习问题,我们必须明确这样三个特征:任务的种类;衡量任务提高的标准;经验的来源。

西洋跳棋学习问题:

  • 任务 T:下西洋跳棋
  • 性能标准 P:比赛中击败对手的百分比
  • 训练经验 E:和自己进行对弈

我们可以用以上方法定义很多学习问题,例如学习手写识别、学习自动驾驶机器人汽车。

为了更好理解本例,下面简要介绍一下这种跳棋。 棋盘为 8×8方格,深色棋格不可着子。可单步行走,亦可每步跨对方一子单跳或连跳,被跨越的子被杀出局。到达对方底线的子成为王,可回向行走(成为王前只可前行),又可隔空格飞行。下图为西洋跳棋棋盘示例(起始状态)。

这里对学习的定义很宽广,足以包括大多数惯于被称为“学习”的任务,就像我们日常 使用的这个词一样。

设计一个学习系统:

考虑设计一个学习下西洋跳棋的程序。(假设:)

  • 我们的目标是让它进入西洋跳棋世界锦标赛。
  • 我们采用最显而易见的标准衡量它的性能。
  • 在世界锦标赛上打赢的比赛占总参赛次数的百分比

选择训练方式

1、我们面临的第一个设计问题是选取训练经验的类型,使系统从中进行学习。

  • 给学习器提供的训练经验对它的成败有重大的影响。一个关键属性是训练经验能否为系统的决策提供直接或间接的反馈。
  • 对于学习下西洋跳棋,系统可以从直接的(direct)训练样例,即各种棋盘状态和相应的正确走子中学习。
  • 另一种情况,它可能仅有间接(indirect)的信息,包含很多过去的对弈序列和最终结局。对于后一种情况,关于博弈中较早走子的正确性必须从对弈最终的输赢来推断。

2、这时学习器又额外面临一个 信用分配(credit assignment)问题,也就是考虑每一次走子对最终结果的贡献程度。

  • 信用分配可能是一个非常难以解决的问题,因为如果后面下得很差,那么即使起初的走子是最佳的,这盘棋也会输掉。所以通常从直接的训练反馈来学习比间接的简单。

3、训练经验的第二个重要属性是学习器可以在多大程度上控制训练样例序列。

  • 例如,学习器可能依赖施教者选取棋盘状态,和提供每一次的正确移动。或者,学习器可能自己提出它认为特别困惑的棋局并向施教者询问正确的走子。

或者,学习器可以完全控制棋局和(间接的)训练分类,就像没有施教者时它和自己对弈进行学习一样。

  • 注意对于最后一种情况学习器可能选择以下两种情况中的一种:第一,试验它还未考虑过的全新棋局; 第二,在它目前发现的最奏效的路线的微小变化上对弈,以磨砺它的技能。后续的章节考虑一些学习框架,

包括了以下几种情况:训练经验是以超乎学习器控制的随机过程提供的;学习器可向施教者提出不同类型的查询;以及学习器通过自动探索环境来搜集训练样例。

4、训练经验的第三个重要属性是,训练样例的分布能多好地表示实例分布,而最终系统的 性能 P 是通过后者来衡量的。一般而言,当训练样例的分布和将来的测试样例的分布相似时,学习具有最大的可信度。

  • 对于我们的西洋跳棋学习,性能指标 P 是该系统在世界锦标赛上赢棋的百分比。
  • 如果它的训练经验 E 仅由和它自己对弈的训练组成,便存在一个明显的危险:这个训练可能不能充分地表示该系统以后被测试时的情形。
  • 例如,学习器可能在训练中从来未遇到过某些非常关键性的棋局,而它们又非常可能被人类世界冠军采用。

5、实际上,学习的样例通常与最终系统被评估时的样例有一定差异,学习器必须能从中进行学习(举例来说,世界级的西洋跳棋冠军可能不会有兴趣教一个程序下棋)。

掌握了样例的一种分布,不一定会导致对其他的分布也有好的性能。 可以看到,目前多数机器学习理论都是基于训练样例与测试样例分布一致这一前提。尽管我们需要这样的前提以便得到理论的结果,但同样必须记住在实践中这个假设经常是不严格成立的。

进行算法设计

我们决定系统将通过和自己对弈来训练。这样的好处是不需要 外界的训练者,所以可以让系统产生无限多的训练数据,只要时间允许。 一个完整的学习任务

     	 • 任务 T:下西洋跳棋
	     • 性能标准 P:世界锦标赛上击败对手的百分比
		 • 训练经验 E:和自己进行对弈

为了完成这个学习系统的设计,现在需要选择:

  1. 要学习的知识的确切类型
  2. 对于这个目标知识的表示
  3. 一种学习机制

选择目标函数:

我们从一个对于任何棋局都能产生合法(legal)走子的西洋跳棋博弈程序开始。那么,最终的程序仅须学会从这些合法的走子中选择最佳的。 这个学习任务代表了一大类任务:合法走子定义了某个先验已知的巨大搜索空间,但最佳的搜索策略未知。 很多最优化问题都可归于此类,例如对于生产过程的调度和控制问题,生产中的每一步都很清楚,但调度这些步骤的最佳策略未知。

为了学习从合法走子中作出选择,很明显,要学习的信息类型就是一个程序或函数,它 对 任 何 给 定 的 棋 局 能 选 出 最 好 的 走 法 。 可 称 此 函 数 为 ChooseMove , 并 用 记 法ChooseMove:B→M 来表示这个函数以合法棋局集合中的棋盘状态作为输入,并从合法走子集合中产生某个走子作为输出。在关于机器学习的所有讨论中,我们发现可以把对任务 T提高性能 P 的问题简化为学习象 ChooseMove 这样某个特定的 目标函数(target function )的问题。所以目标函数的选择是一个关键的设计问题。

  • 尽管在例子中很明显应把 ChooseMove 作为目标函数,但我们会发现学习这个目标函数是非常困难的,原因是提供给系统的是间接的训练经验。
  • 另外一个可供选择的目标函数是一个评估函数,它为任何给定棋局赋予一个数字的评分。可以发现,对于本例,学习这个目标函数更简单

令这个目标函数为 V,并用 V:B→ℜ 来表示 V 把任何合法的棋局映射到某一个实数值(用ℜ来表示实数集合)。我们打算让这个目标函数 V 给好的棋局赋予较高的评分。如果系统能够成功地学会这个目标函数 V,那么它便能使用此函数轻松地找到当前棋局的最佳走法。实现的方法是,先产生每一个合法走子对应的所有后续棋局,然后使用 V 来选取其中最佳的后继棋局,从而选择最好的走子。

对于任意棋局,目标函数 V 的准确值应该是多少呢?当然任何对较好的棋局赋予较高 的分数的评估函数都适用。然而,最好在那些产生最佳对弈的众多方法中定义一个特定的目标函数 V。可以看到,这将使得设计一个训练算法变得简单。因此,对于集合 B 中的任意的棋局状态 b,我们如下定义目标函数 V(b):

  1. 如果 b 是一最终的胜局,那么 V(b)=100
  2. 如果 b 是一最终的负局,那么 V(b)=-100
  3. 如果 b 是一最终的和局,那么 V(b)=0
  4. 如果 b 不是最终棋局,那么 V(b)=V(b′),其中 b′是从 b 开始双方都采取最优对 弈后可达到的终局。

然而,由于这个定义的递归性,它的运算效率不高,所以这个定义对于西洋跳棋比赛者 不可用。 除了无关紧要的前三种终局的情况,对于某一个棋盘状态(情况 4)b 要决定它的值 V(b)需要向前搜索到达终局的所有路线!由于这个定义不能由西洋跳棋程序高效地运算,这个定义被称为 不可操作的定义 。当前的目标是发现一个可操作的定义 V,它能够被西洋跳棋程序用来在合理的时间内评估棋局并选取走法。

这样,这种情况的学习任务被简化成发现一个数 理想目标函数 V 的可操作描述。通常要 完美地学习这样一个 V 的可操作的形式是非常困难的。

事实上,我们经常希望学习算法仅得到目标函数的某个 近似(approximation),由于这个原因学习目标函数的过程常被称为函数逼近函数逼近(function approximation)。

在当前的讨论中,用Vˆ来表示程序中实际学习到的函数,以区别理想目标函数 V。

目标函数的表示

至此,我们已经确定了目标函数 V,接下来必须选择一个表示,被学习程序用来描述要 学习的函数Vˆ。对此也有很多设计选择。

  • 例如,可以将Vˆ表示为一张大表,对于每个惟一的棋盘状态 b,表中有惟一的表项来确定它的状态值Vˆ(b)。

或者,可以让程序用一个规则集合来匹配棋局的特征以表示Vˆ,或采用一个与预定义棋盘特征有关的二次多项式函数,或者用人工神经元网络。 通常,选择这个描述包含一个重要的权衡过程。一方面,我们总希望选取一个非常有表征力的描述,以最大可能地逼近理想的目标函数 V.另一方面,越有表征力的描述需要越多的训练数据,使程序能从它表示的多种假设中做出选择。为了简化讨论,现在选择一个简单的表示法:对于任何给定的棋盘状态,函数Vˆ可以通过以下棋盘参数的线性组合来计算: x 1 :棋盘上黑子的数量 x 2 :棋盘上红子的数量 x 3 :棋盘上黑王的数量 x 4 :棋盘上红王的数量? x 5 :被红子威胁的黑子数量(即会在下一次被红吃掉的子)? x 6 :被黑子威胁的红子数量

学习程序把Vˆ(b)表示为一个线性函数

 Vˆ(b)=w0 +w1x1 +w2x2 +w3x3 +w4x4 +w5x5 +w6x6

其中 w 0 到 w 6 为数字系数,或叫权,由学习算法来选择。在决定某一个棋盘状态的分值时,w 1 到 w 6 决定了不同的棋盘特征的相对重要性,而权 w 0 为一个附加的常量。 概括一下目前为止的设计。我们已经详细阐述了这个学习问题的原型,即为它选择一种 类型的训练经验、一个要学习的目标函数和这个目标函数的一种表示法。现在的学习任务是:

西洋跳棋程序的部分设计 • 任务 T:下西洋跳棋 • 性能标准 P:世界锦标赛上击败对手的百分比 • 训练经验 E:和自己进行训练对弈 • 目标函数:V:B→ℜ • 目标函数的表示: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 前三条是对学习任务的说明,后两条制定了为实现这个学习程序的设计方案。注意这个 设计的关键作用是把学习西洋跳棋战略的问题简化为学习目标函数描述中系数w 0 到w 6 值的问题。

选择函数逼近算法

为了学习目标函数Vˆ,需要一系列训练样例,每一个样例描述了特定的棋盘状态 b 和 它的训练值 V train (b)。换言之,每一个训练样例是形式为的序偶。举例来说,下面的训练实例描述了一个黑棋胜利(注意 x 2 =0 表示红棋已经没有子了)的棋盘状态 b,它的目标函数值 V train (b)为 100。 <,+100>下文描述了一个过程,它先从学习器可得的间接训练经验中导出上面的训练样例,然后调整权值 w i 以最佳拟合这些训练样例。

估计训练值

根据以上的学习模型,学习器可以得到的训练信息仅是对弈最后的胜负。 另一方面, 我们需要训练样例为每个棋盘状态赋予一个分值。给对弈结束时的棋盘状态评分是容易的,而要给对弈结束前的大量中间棋局评分就不那么容易了。因为,一盘棋的最终输赢未必能说明这盘棋当中的每一个棋盘状态的好或坏。例如,即使某个程序输了一盘棋,仍会有这样的情况,这盘棋前面的棋局应该给予很高的评价,失败的原因在于后来糟糕的走法。 尽管估计中间棋局训练值具有内在的模糊性,但令人惊讶的是有一个简单的方法却取得了良好结果。这种方法对于任何中间棋局 b 的训练值 V train (b)等于Vˆ(Successor(b)),其中Vˆ是学习器采用的对 V 的近似,Successor(b) 表示 b 之后再轮到程序走棋时的棋子状态(也就是程序走了一步和对手回应一步后的棋局)。 这种估计训练值的方法可被归纳为: 训练值估计法则

V train (b)←Vˆ(Successor(b)) 

或许这看起来有点离奇,只使用当前的Vˆ来估计训练值,这一训练值有被用来更新 Vˆ。但请注意,我们是在用后续棋局 Successor(b)的估计值来估计棋局 b 的值。凭直觉,我们可以看到越接近游戏结束的棋局的Vˆ越趋向精确。事实上,在特定条件下(将在第 13 章讨论)这种基于对后继棋局进行估计的迭代估计训练值的方法,已被证明可以近乎完美地收敛到V train 估计值。

权值调整

剩下的事情就是为 这个学习算法选择最适合训练样例{}的权 w i 。第一步必须定义 最佳拟合(best fit)训练数据的含义。一种常用的方法是把最佳的假设(或权向量集合)定义为使训练值和假设Vˆ 预测出的值间的误差平方 E 最小。

至此,我们的目标就是寻找权值(等价地,寻找Vˆ),使对于观测到的训练数据 E 值最 小化。第 6 章将讨论在什么条件下,最小化误差平方和等价于寻找给定观测训练数据下的最可能假设。 已经知道一些算法可以得到线性函数的权使此定义的 E 最小化。在这里需要一个算法, 它可以在有了新的训练样例时进一步改进权值,并且它对估计的训练数据中的差错有好的健壮性。

一个这样的算法被称作最小均方法(least mean squares),或叫 LMS 训练法则。对于每一训练样例,它把权值向减小这个训练数据误差的方向略为调整。

这个算法可被看作对可能的假设(权值)空间进行随机的梯度下降搜索,以使误差平方和 E最小化。LMS 算法是这样定义的:

LMS 权值更新法则 对于每一个训练样例 • 使用当前的权计算Vˆ(b) • 对每一个权值 w i 进行如下更新

w i ←w i +η(V train (b)-Vˆ(b)) x i

这里 η 是一个小的常数(比如 0.1)用来调整权值更新的幅度。为了直观地理解这个权 值更新法则的工作原理,请注意当误差(V train (b)-Vˆ(b))为 0 时,权不会被改变。

(V train (b)-Vˆ(b))为正时(例如,当Vˆ(b)太低时)每一个权值会根据其对应特征值增加一定的比例。这会提升Vˆ(b)的值而减小误差。 注意如果某个参数 x i 为 0,那么它的值不会因这个误差而改变,这样便使只有那些在训练样例的棋局中确实出现的特征的权值才被更新。 令人吃惊的是,在一定的条件下,这种简单的权值调整方法被证明可以收敛到 V train 值的最小误差平方逼近。

最终的设计

西洋跳棋学习系统的最终设计可以自然地用四个清楚的程序模块来描述,这些模块在很 多学习系统中是核心组件。这四个模块它们是:

执行系统(Performance system) ,这个模块是用学会的目标函数来解决给定的任务,在此就是对弈西洋跳棋。它把新问题(新一盘棋)的实例作为输入,产生一组解答路线(对弈历史记录)作为输出。在这里,执行系统采用的选择下一步走法的策略是由学到的评估函数Vˆ来决定的。所以我们期待它的性能会随着评估函数的日益准确而提高。

鉴定器(Critic) ,它以对弈的路线或历史记录作为输入,输出目标函数的一系列训练样 例。如图所示,每一个训练样例对应路线中的某个棋盘状态和目标函数给这个样例的评估值V train 。在我们的例子中,鉴定器对应式 1.1 给出的训练法则。

泛化器(Generalizer) ,它以训练样例作为输入,输出一个假设,作为它对目标函数的 估计。它从特定的训练样例中泛化,猜测一个一般函数,使其能够覆盖这些样例以及样例之外的情形。在我们的例子中,泛化器对应 LMS 算法,输出假设是用学习到的权值 w 0 ,…, w 6描述的函数Vˆ。

实验生成器(Experiment Generator ),它以当前的假设(当前学到的函数)作为输入,输出一个新的问题(例如,最初的棋局)供执行系统去探索。它的角色是挑选新的练习问题,以使整个系统的学习速率最大化。在我们的例子中,实验生成器采用了非常简单的策略:它总是给出一个同样的初始棋局来开始新的一盘棋。更完善的策略可能致力于精心设计棋子位置以探索棋盘空间的特定区域。

总体来看

我们为西洋跳棋程序作的设计就是产生执行系统、鉴定器、泛化器和实验生 成器的特定实例。很多机器学习系统通常可以用这四个通用模块来刻画。 设计西洋跳棋程序的流程被归纳在图 1-2 中。

这个设计已经在几方面把学习任务限制在较小的范围内。要学习的知识类型被限制为一个单一的线性评估函数。 而且这个评估函数被限制为仅依赖于六个棋盘特征。如果目标函数真的可表示为这些特定参数的线性组合,那么程序学到这个目标函数的可能性很大。 反之,最多只希望它学到一个合理的近似,因为一个程序当然不能学会它根本不能表示的东西。

我们假定真实函数 V 的合理的近似确实可被表示为这种形式。那么问题变成这种学习 技术是否确保能发现一个合理的近似。

已经设计的程序能学得足够好而击败人类的西洋跳棋冠军吗?或许不能。部分地,这是 因为Vˆ的线性函数表示太简单以致于不能很好捕捉这种棋的微妙之处。然而,如果给与一个更完善的目标函数表示法,这种通用的途径事实上可以非常成功。

  • 例如,Tesauro(1992,1995)报告了学习下西洋双陆棋的程序的类似设计,方法是学习一个非常类似的棋局评估函数。它的程序使用人工神经元网络表示学到的评估函数,它考虑对棋局的完整描述而不是棋盘的几个参数。
  • 经历了一百万次以上的自我生成的训练比赛后,他的程序能够和一流的人类西洋双陆棋选手一争高下。当然还可能为西洋跳棋学习任务设计很多其他的算法。
  • 例如,一种可能只简单地存储训练样例,然后去寻找保存的“最接近的”情形来匹配新的情况。或者可以产生大量候选的西洋跳棋程序,并让它们相互比赛,保留最成功的程序并进一步用模拟进化的方式来培育或变异它们。
  • 人类似乎遵循另一种途径寻找学习策略,他们分析或向自己解释比赛中碰到的成败的原因。

上面的设计是这些种类中的一个简单的算法,它是为了给我们今后的针对特定类别的任务的学习方法的设计奠定基础。