- 人工智能基础
- 周颖 郑文明 徐卫 赵力编著
- 4062字
- 2021-03-31 17:55:25
2.3 分类器介绍
一个样本属于且只属于多个类中的一个,一个样本只能属于一个类,不同类之间是互斥的,因此分类器就是一个由特征向量到预测类别并将样本正确分类的函数。在鸢尾花的分类问题中,我们用+1和-1两个值分别代表变色鸢尾和山鸢尾两个类别,并用字母y表示,即y可以取+1和-1两个值。前面我们已经提取了鸢尾花的特征,将它表示为特征向量,并把特征向量画在了特征空间中。那么对鸢尾花品种分类的问题就转变成在特征空间中将一些特征点分开的问题。如果我们用直线作为分界线,那么这个问题就变成:坐标平面中有两类点,画一条直线将这两类点分开。我们设这个函数为f(x),f(x)是分类函数的核心。函数f(x)的形式多种多样,具有f(x1,x2,…,xn)=a1x1+a2x2+…+anbn+b形式的分类器被称为线性分类器,其中,n是特征向量的维数;a1,a2,an,b是函数的系数,被称为分类器的参数。
在区分鸢尾花品种的简单例子中,我们可以直接画出一条直线将两类点分开。实际情况中,特征点在特征空间中的位置非常复杂,采用观察和尝试来画出分类直线往往是不可能的,也是没有效率的。因此需要通过一些方法,让分类器自己学习得到分类直线。
2.3.1 训练分类器
我们可以把人工智能系统和人类做类比。人们需要经过在学校的学习来吸收知识;为了检验学习效果,要参加考试;学到知识、掌握技能后,就会在工作中解决实际问题。人工智能系统也类似,它的学习过程被称为训练(training);考试过程被称为测试(testing);解决实际问题的过程,被称为应用(application)。训练集和测试集的作用和类比见表2-1。
表2-1 训练集和测试集

让分类器学习从而得到合适的参数的过程称为分类器的训练。在本小节中所讲的训练分类器就是找到一条好的分类直线。我们在学校通过老师、课本来接受知识,那么人工智能系统是通过什么进行学习的呢?答案是数据。数据是人工智能的支柱之一,人工智能系统的训练往往需要大量的数据作支撑。
在训练阶段使用的数据被称为训练数据;相应地,测试阶段使用的数据被称为测试数据。在分类中,训练数据和测试数据一般都需要知道它们实际的类别。
人工地给数据标上真实类别(其他任务中对应着其他真实的值)的过程被称为数据的标注(annotation)。数据标注的过程耗时耗力,有的数据标注还可能需要相关领域的专业知识。对数据的采集和标注是非常重要的过程,人工智能系统是数据驱动的,数据标注的质量会直接影响到训练后人工智能系统的性能好坏。
鸢尾花的数据是由美国植物学家埃德加·安德森(Edgar Anderson)在加拿大加斯佩半的农场测量鸢尾花的花瓣长度和宽度等特征得到的。此外,他根据自己所学的植物学知识,标注好每一朵花属于什么种类,我们可以将山鸢尾打上“0”标签,将变色鸢尾打上“1”标签。有了这样的数据集,就可以在它的基础之上去训练一个分类器。由上面的介绍我们得知,当一个数据集被用于分类器训练时,称之为训练集。接下来将介绍基于数据集来训练分类器的过程。这个过程是由一系列判断和计算步骤组成的,通常被称为算法(algorithm)。在一个数据集上,使用不同的算法可能会获得不同的分类器。如何设计一个算法能获得性能好的分类器是机器学习里面一个经典的研究课题。
我们的目的就是寻找一个线性分类器对鸢尾花分类,在这里线性分类器的f(x)可以被概括地表示为f(x1,x2)=a1x1+a2x2+b。我们要找到合适的a1,a2,b参数,使得对应的分类器能够区分变色鸢尾和山鸢尾。通过上面的介绍我们可以把特征向量表示在直角坐标系中,如下图所示,用x1表示花瓣的长度,x2表示花瓣的宽度,比如(1.1,0.1),就可以是直角坐标系中的一个点,那么将样本的所有数据都对应到下图的直角坐标系,再用一条线将样本进行分类,区别山鸢尾和变色鸢尾,下图是分类的三种情况,这里将×表示为山鸢尾,将○表示为变色鸢尾,那么第一个图中有9个山鸢尾被分类成变色鸢尾,第二个图有两个样本分类错误,第三个图虽全部分类正确但是分类器显得过于复杂和过度拟合训练数据,这将会导致该分类器不会在最终的测试即“考试”阶段举一反三,反而得不到“好成绩”。因此,图2-4就是欠拟合、刚好和过拟合三种情况。

图2-4 欠拟合、刚好、过拟合
最后,我们用表2-2来总结模型分类的三种情况。我们需要找到一种分类“刚好”的情况。
表2-2 表格说明

2.3.2 感知器
首先我们介绍一下机器学习的三种主要的学习方式。
监督学习
使用有类标的训练数据构建模型,即在训练过程中,所有的数据都是知道它的类别的。通过构建的这个模型对未来的数据进行预测。在监督学习的下面,又可以分为分类(利用分类对类标进行预测)和回归(使用回归预测连续输出值),上面鸢尾花的分类就是一个监督学习的典型例子,因为在分类前我们已经将样本打上标签即类标。
无监督学习
在没有已知输出变量(分类问题中是数据的类标)和反馈函数指导的情况下提取有效信息来探索数据的整体结构。
强化学习
构建一个系统,在与环境交互的过程中提高系统的性能,我们可以将强化学习视为与监督学习相关的一个领域。但是强化学习与监督学习不同的是,在强化学习中,并没有一个确定的类标或一个连续类型的值,而是一个通过反馈函数产生的反馈值。该反馈值是对当前的系统行为的一个评价。强化学习解决的主要是交互式问题,象棋对弈就是一个常用的强化学习的例子。
感知器(perceptron)是一种训练线性分类器的算法,由弗朗克·罗森布拉特(Frank Rossenblatt)基于MPC神经元模型提出,感知器可以看作一个处理二分类问题的算法。感知器的结构模型如图2-5所示。

图2-5 感知器模型结构
感知器的训练方法是利用被误分类的训练数据调整现有分类器的参数,使得调整后的分类器判断更加准确。感知器使用被分错的样本来调整分类器——如果标注的类别是+1,使得a1x1+a2x2+b<0的样本就是被误分类;如果标注的类别是-1,使得a1x1+a2x2+b≥0的样本就是被误分类。综合起来就是若y×(a1x1+a2x2+b)≤0,那么样本就被分错了,其中y表示数据的真实类别。根据这个误分类的样本来调整分类直线的参数,使得直线向该误分类数据一侧移动,以减小该误分类数据与直线的距离,直到直线越过该误分类数据使其被正确分类。具体的感知器学习算法如下所示。
第一步:选取初始分类器参数a1,a2,b;
第二步:在训练集中选取一个训练数据,如果这个训练数据被误分类,则按照以下规则更新参数(将箭头右边更新后的值赋给左边的参数):
a 1←a1+ηyx1
a 2←a2+ηyx2
b←b+ηy
第三步:回到第二步,直到训练数据中没有误分类数据(即收敛时)为止。
其中,η是学习率(learning rate),学习率是指每一次更新参数的程度大小。学习率越低,损失函数的变化速度就越慢,虽然使用低学习率可以确保我们不会错过任何局部极小值,但也意味着将花费更长的时间来进行收敛。
表2-3是对学习率的总结。
表2-3 大学习率和小学习率

感知器的学习算法就是不断减少对数据误分类的过程。在这里,同学们可能会有两个疑问:一是如何衡量分类器对数据的误分类程度呢?二是我们该如何利用误分类的数据来调整分类器的参数,也就是感知器学习算法中更新参数的规则是怎么来的呢?为此,我们分别介绍损失函数和优化方法来回答上面的两个问题。
损失函数(loss function)是在训练过程中用来度量分类器输出错误程度的数学化表示。预测错误程度越大,损失函数的取值就越大。定义合适的损失函数对于训练分类器是非常重要的。感知器和支持向量机就是基于不同的损失函数建立起来的。
在分类鸢尾花的例子中,假定总共有N个训练数据,我们用来表示第i个训练数据的特征向量,y(i)表示第i个训练数据的标注类别,那么感知器的损失函数L定义为

显然,如果没有误分类的数据,那么损失函数为零,如果有误分类数据,就会使得损失函数增大,并且误分类数据越多,损失函数越大。
有了损失函数衡量分类器对数据的误分类程度后,我们可以用优化的方法来调整分类器的参数,以减少分类器对数据的误分类。上面感知器学习算法中调整参数的规则是优化方法在感知器损失函数上的具体应用。细心的同学可能会发现,损失函数是在整个训练数据集上求得的,如果用它来更新参数,则是利用了整个数据集中被误分类的数据;而感知器学习算法中的第二步是每一次随机选取一个样本,如果是误分类样本则用它来更新参数,这样不断迭代直到训练数据中没有误分类数据为止。这是感知器损失函数利用优化方法得到感知器学习算法中做的一点小改动。
一般地,优化(optimization)就是调整分类器的参数,使得损失函数最小的过程。我们通过一个直观的例子来理解优化过程,损失函数的最小点就是该函数值的最小点,也就是函数的全局最低点,而局部最低点不一定是全局最低点。图2-6就是全局最低点和局部最低点的区别。

图2-6 局部最低点和全局最低点
2.3.3 支持向量机
在2.3.2节,我们介绍了感知器学习算法。通过实验,我们知道了在同样的训练数据下,感知器算法由于初始参数的选择不同或者学习率的不同等原因都会得到不同的分类直线。这些不同的分类直线都能够将不同类别的数据分开,那么它们之间有没有优劣之分呢?
支持向量机(support vector machine,SVM)是在特征空间上分类间隔最大的分类器,它与感知器一样,是对两个类别进行分类。线性分类器是分类器中的一种,类似地,线性支持向量机也是支持向量机中的一种。若无特殊说明,我们这里说的支持向量机均指的是线性支持向量机。首先假设二分类的目标是-1或者1,有许多条直线可以分割两类目标,但是我们定义分割两类目标有最大距离的直线为最佳线性分类。直观上,我们很容易找到分类间隔最大的分类直线。得到一个超平面,公式如下:

其中,A是斜率向量,x是输入向量,对于这个公式有很多证明方式,但是,从几何观点看,这是二维数据点(x0,y0)到一条直线y=Ax-b的垂直距离

同学们可以动手试试,想象自己拿了一根很粗的粉笔,要画一条线使得两类数据被正确分开,同时所画的线条是最粗的。那么这条最粗的直线就有最大的分类间隔,对应着支持向量机要找的分类直线。如图2-7所示的直角坐标系,wx-b=0就是最大分类间隔。

图2-7 最大分类间隔
支持向量是那些能够定义分类直线的训练数据,也是那些最难被分类的训练数据。直观地说,它们就是对求解分类任务最富有信息的数据。我们来看一个例子,在图2-8中,箭头是我们在图a新增的样本点;图b是最大分类间隔的,可以将新增样本点正确分类;图c不是最大分类间隔,将新增样本错误分类,因此找到最大间隔可以将样本有效分类。

图2-8 最大分类间隔例子