By RaySaint 2011/5/27

 

机器学习的基本概念和学习系统的设计

 

最近在看机器学习的书和视频,我的感觉是机器学习是很用的东西,而且是很多学科交叉形成的领域。最相关的几个领域要属人工智能、概率统计、计算复杂性理论、计算智能。


机器学习的定义

《机器学习》By M.Mitchell第一章中和斯坦福机器学习公开课第一课都提到了一个这样定义:

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

 

并举了一个例子,西洋跳棋学习问题:

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

这个例子很清楚的解释了上面的定义,后面会以这个例子来说明机器学习的基本设计方法。


设计学习系统

选择任务

根据上面的定义,我们就选择任务是学习下西洋跳棋。

选择性能标准

在世界锦标赛中的获胜百分比

训练经验选择

相比上面两个,这个选择要考虑的东西要麻烦得多,因为给学习器提供的训练经验对它的成败有重大的影响。

一个关键的选择准则是训练经验必须要能对学习器的决策提供直接或间接的反馈。

以下西洋跳棋为例子,

提供直接反馈的训练样例,即各种棋盘状态和相应的正确走子。

提供间接反馈的训练样例,很多过去对弈序列和最终结局。对于这种情况,存在着一个信用分配的问题,也就是考虑每一次走子对最终结果的贡献程度。这个问题很难解决,以后再来谈。(为什么?只要你下过棋,你就应该明白,就算一开始的走子是最佳的,后面下的很差一盘棋也会输掉,反之,一开始走得不是最佳的,但是也有可能反败为胜)

第二个重要的准则是学习期多大程度上可以控制训练样例序列。

我的理解是获得训练样例的自动程度

还是以下西洋跳棋为例子,

1.训练样例全是“手工”获得的,即学习器需要的训练样例是人工选取的棋盘状态和该棋盘状态下的一次正确走子。

2.训练样例是“半自动”获得的,即学习器需要的训练样例是它本身自己选取的棋盘状态(它对这些棋盘状态感到困惑),然后由人工指导它该如何正确走子。

3.训练样例是“全自动”获得的,学习器跟自己对弈来进行学习。这种情况下,又有两种情形:

(1) 试验它还未考虑过的全新棋局;

(2) 在它目前发现的最有效的路线的微小变化上对弈,来磨砺它的技能。

第三个重要的准则是训练样例的分布能多好地表示实例分布,而最终系统的性能P是通过后者来衡量的。

一般而言,当训练样例的分布和将来的测试样例的分布相似时,学习具有最大的可信度。

比如,西洋跳棋学习中性能指标P是该系统在世界锦标赛上获胜的百分比。假如说世界锦标赛上的选手都是万里挑一的高手,如果你给的训练样例都是一些初学者下的棋局,那么可想而知,学习器最终会在世界锦标赛上败得很惨。

不幸的是,通常情况下学习的样例与最终学习系统被评估时使用的样例有一定的差异,比如世界级的西洋跳棋冠军可能不会有有兴趣和一个程序下棋。然而,目前许多机器学习理论都依赖于训练样例与测试样例分布一致这一假设,但在实践中这个假设经常是不成立的。

假设我们决定系统将通过和自己对弈来训练。这个好处是不需要人工干预,只要时间允许,可以让系统产生无限多的训练数据。


 

学习系统的具体设计步骤

上面我们确定了学习框架:

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

现在,有三个具体的内容要确定:

(1) 要学习的知识的确切类型

(2) 对于这个目标知识的表示

(3) 一种学习机制

选择目标函数

在机器学习中,要学习的知识的确切类型通常是一个函数,我们把它称为目标函数(Target Function)

在学习西洋跳棋中,我们要给出一个函数,它对任何给定的器具能选出最好的走法,假设记这个函数为ChooseMove,那么它的形式如下:

ChooseMove: B->M

其中B是合法棋局集合中的某一棋盘状态,M是走子的方法。

这样,我们可以把提高任务T的性能P的问题简化为学习像ChooseMove这样某个特定的目标函数的问题。所以目标函数的选择是关键性的问题。

事实上,直接学习ChooseMove是非常困难的。所以一般情况下,我们把一个评估函数作为目标函数。令这个函数为V,并用

V:B->R

来表示把任何合法的棋局映射到某一个实数值(R表示实数集合)。我们让这个V给好的棋局赋予较高的评分。如果这个V被成功学习,那么系统就很容易找到当前棋局的最佳走法。方法是,

先产生每一个合法走子对应的所有后继棋局,然后用V来选取分值最高的后继棋局,从而选择最佳走子。

现在一个重要问题是,目标函数V的准确值是多少?

我们可以如下定义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是一个理想目标函数,我们必须找到一个V的可操作的描述,实际上就是一个近似地刻画V的函数。由于这个原因,学习目标函数的过程本质上是函数逼近的过程

选择目标函数的表示

如上所述,我们得到了理想的目标函数,但我们实际上是要学习一个近似函数V’来描述(或表示)目标函数。《机器学习》By M.Mitchell书上说这个描述包含一个重要的权衡过程,一方面,我们总希望选取一个非常有表征能力的描述,以最大可能地逼近理想的目标函数V。另一方面,越有表征能力的描述需要越多的训练数据,使程序能从它表示的多种假设中选择。这里刚好与George F.Luger的《人工智能:复杂问题求解的结构和策略》中的一句话不谋而合:“AI研究者所关心的两个最基本的问题是知识表示和搜索,而表现力(特征抽取的结果)和效率(特征抽取算法的计算复杂度)是评价知识表示语言的主要尺度”。在机器学习中,目标函数就是知识,近似函数就是知识表示,后来我们可以知道,学习机制(函数逼近算法)就是搜索策略。所以,我觉得人工智能和机器学习本质上其实是相同的东西,只不过前者在更理论的层面上(讨论意识和物理世界的关系),而后者更注重实践(解决实际问题,例如下西洋跳棋)。

题外话到此,为了简化讨论我们为目标函数选择一个简单的表示法:对于任何给定的棋盘状态,函数V’可以通过以下棋盘参数的线性组合来计算:

x1:棋盘上黑子的数量

x2:棋盘上白子的数量

x3:棋盘上黑王的数量

x4:棋盘上红王的数量

x5:被红字威胁的黑子数量(即会在下一次被红子吃掉的黑子数量)

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

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

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

其中,w0到w6为数字系数,或叫权,由学习算法来选择。在决定某一个棋盘状态值,权w1到w6决定了不同的棋盘特征的相对重要性,而权w0为一个附加的棋盘状态值常量。

好了,现在我们把学习西洋跳棋战略的问题转化为学习目标函数表示中系数w0到w6值的问题,也即选择函数逼近算法。

选择函数逼近算法

为了学习V’(b),我们需要一系列训练样例,它的形式为<b, Vtrain(b)>其中,b是由x1-x6参数描述的棋盘状态,Vtrain(b)是b的训练值。

举例来说,

<<x1=3,x2=0,x3=1,x4=0,x5=0,x6=0>, +100>;描述了一个黑棋取胜的棋盘状态b,因为x2=0表示红旗已经没有子了。

上面的训练样例表示仍然有一个问题:虽然对弈结束时最终状态的棋盘的评分Vtrain(b)很好确定,但是大量中间状态(未分出胜负)的棋盘如何评分呢?

于是这里需要一个训练值估计法则:

Vtrain(b) <- V’(Successor(b))

Successor(b)表示b之后再轮到程序走棋时的棋盘状态(也就是程序走了一步和对手回应了一步以后的棋局)。

这个看起来有点难理解,我们用当前的V’来估计训练值,又用这一训练值来更新V’。当然,我们使用后续棋局Successor(b)的估计值来估计棋局b的值。直观地讲,越接近游戏结束的棋局的V’越趋向精确。事实上,可以证明这种基于对后继棋局进行估计的迭代估计训练值的方法,可以近乎完美地收敛到 Vtrain估计值。

接下来,我们面临的就是如何调整权值的问题。首先我们要定义如何最佳拟合训练数据,一种常用的方法是最小误差平方和E

image

有很多算法可以得到线性函数的权使此定义的E最小化,这里我们选择一个称为最小均方法(Least Mean Squares)的算法,它对可能的假设(权值)空间进行随机地梯度下降搜索,以使误差平方和E最小化。LMS如下对wi进行更新:

对于每一个训练样例<b,Vtrain(b)>

  • 使用当前的权计算V’(b)
  • 对于每一个权值wi进行如下更新

image

这里image就是一个小的常数(比如0.1),用来调整向梯度方向移动的步长,之所以称为梯度下降法,因为可以证明(Vtrain(b)-V’(b))xi实际上就是image(这里如有疑问,看最后的补充部分)。


最终设计

到此为止,我们的学习系统设计已经完成,我们可以模块化描述这个学习系统,下面这张图来自《机器学习》By M.Mitchell

image

由图可以知道,一个学习系统一般由四个模块组成,以上面下西洋跳棋的学习系统为例:

执行系统:利用 V’来做决策,决定下一步走法的策略

鉴定器:以对弈的路线或历史记录作为输入,输出一系列训练样例

泛化器:以训练样例为输入,产生一个输出假设,即目标函数的描述V’

实验生成器:以当前的假设V’作为输入,输出一个新的问题供执行系统区探索。在下棋的例子中可以是给出一个初始棋局

参考资料:

机器学习 By M.Mitchell

人工智能:复杂问题求解的结构和策略 By George F.Luger

斯坦福公开课机器学习第一课

 

补充:
上面提到这个梯度下降迭代式时
这里要声明一下,准确地说(Vtrain(b)-V’(b))xi是只有一个训练样例时E的偏导
 
当有m个训练样例时:
此时,
上面这个式子称为批梯度下降(Batch Gradient Descent),它一定会收敛到局部极小值(实际上,线性回归的平方函数通常是一个二次的碗状函数,只有一个全局最小值)。但是,它存在一个问题,就是每次迭代要输入全部的数据,当训练样例集很大时(想象一个有几百万条记录的数据库),这显然是不划算的。因此,上文中使用了这个式子,这个又称为随机梯度下降(Stochastic Gradient Descent),或增量式梯度下降,每次输入一个训练样例。但是,它不一定会收敛到局部极小值,可能会在局部极小值附近徘徊。