人们在生活中可能已经注意到了这样一种现象:我们能够轻松地通过相貌区分出日本人、韩国人和泰国人,但是面对英国人、俄罗斯人和德国人时,我们却很难辨认他们的面孔。造成这种现象的原因一方面是因为日韩泰都是我国的邻国,我们观察这些国家的普通人的机会相对较多,从而使得我们更容易观察到这些国家特有的面貌特征。另一方面,抛开服装和化妆等因素不论,相同人种之间的相似性使得面貌特征更加容易进行比较和辨别,而不同人种之间的差异则更加难以捕捉。
根据大量的观察,可以总结出不同国别人群的面貌特点,如中国人下颌适中,日本人长脸长鼻,韩国人眼小颧高,泰国人肤色暗深。这些特点被用于判断路人甲来自日本还是路人乙来自韩国等。
这是一个简化版的人类学习机制的例子,即从大量现象中提取反复出现的规律和模式。在人工智能中,这种过程被称为机器学习。从形式化的角度定义,机器学习是指算法利用某些经验,使其在特定任务中的性能得到改善。从方法论的角度看,机器学习是计算机基于数据构建概率统计模型,并运用模型对数据进行预测和分析的学科。
机器学习可以从数据中来,到数据中去。已有数据具有一定的统计特性,不同的数据可以视为满足独立同分布的样本。机器学习根据已有的训练数据推导出描述所有数据的模型,并运用该模型对未知的测试数据做出最优预测。
在机器学习中,数据并非通常意义上的数量值,而是对于对象某些性质的描述。被描述的性质叫作属性,属性的取值称为属性值,不同的属性值有序排列得到的向量就是数据,也叫实例。
在文首的例子中,黄种人相貌特征的典型属性包括肤色、眼睛大小、鼻子长短、颧骨高度。标准的中国人实例甲是属性值{浅、大、短、低}的组合,标准的韩国人实例乙则是属性值{浅、小、长、高}的组合。
根据线性代数的知识,数据的不同属性之间可以视为相互独立,每个属性代表一个不同的维度,这些维度共同构成了一个特征空间。每个实例都可以被视为特征空间中的一个点,即特征向量。这里的特征向量不同于特征值对应的向量,而是指特征空间中的向量。通过对输入数据进行分类,根据特征向量进行分类就能够得到输出。
在实际的机器学习任务中,输出的形式可能更加复杂。根据输入输出类型的不同,预测问题可以分为以下三类:
- 分类问题:输出变量为有限个离散变量,当个数为2时即为最简单的二分类问题;
- 回归问题:输入变量和输出变量均为连续变量;
- 标注问题:输入变量和输出变量均为变量序列。
但是,实际上每个国家的人都是独一无二的,其长相自然也会千差万别。因此,一个浓眉大眼的韩国人可能会被误认为是中国人,而一个肤色较深的日本人也可能被误认为泰国人。
在机器学习中,同样的问题也会存在误差。一个算法既不能和所有训练数据完美匹配,也不能对所有测试数据做出准确的预测。因此,误差性能是机器学习的重要指标之一。
在机器学习中,误差定义为学习器的实际预测输出与样本真实输出之间的差异。在分类问题中,常用的误差函数是错误率,即分类错误的样本占全部样本的比例。
误差可以进一步分为训练误差和测试误差两类。训练误差指的是学习器在训练数据集上的误差,也称经验误差;测试误差指的是学习器在新样本上的误差,也称泛化误差。
训练误差描述的是输入属性与输出分类之间的相关性,能够判定给定的问题是不是一个容易学习的问题。**测试误差则反映了学习器对未知的测试数据集的预测能力,是机器学习中的重要概念。**实用的学习器都是测试误差较低,即在新样本上表现较好的学习器。
学习器通过利用已知数据来对真实情况进行拟合,从而得到一个尽可能逼近真实模型的模型。为了确保这个模型能够适用于所有未知数据,我们需要在训练数据集中尽可能地提取出适用于所有数据的普适规律。
然而,如果过分关注训练误差,即追求预测规律与训练数据的完全符合,就会导致学习器对训练样本的非普适特性产生错误理解,将其误认为是所有数据的普遍性质。这样一来,学习器的泛化能力就会下降。
在前文的例子中,如果接触的外国人较少,没有见过双眼皮的韩国人,那么就可能会形成“单眼皮都是韩国人”的错误定式,这种典型的过拟合现象,即把训练数据的特征错当成了整体的特征。
欠拟合是指学习器不能很好地拟合训练数据,而其原因是学习能力太弱,以至于训练数据的基本性质都没有学到。如果学习器能力不足,甚至可能会把黑猩猩的图像误认为人,这就是欠拟合的后果。
欠拟合可以通过改进学习器算法来克服,而过拟合则无法避免,只能尽量降低其影响。由于训练样本数量有限,因此具有有限个参数的模型足以将所有训练样本纳入其中。但是,模型的参数越多,能与这个模型精确相符的数据就越少,将这样的模型运用到无穷的未知数据中时,过拟合的出现便不可避免。
此外,训练样本本身可能包含一些噪声,这些噪声也会给模型的精确性带来额外的误差。整体来说,测试误差与模型复杂度之间呈现抛物线关系。当模型复杂度较低时,测试误差较高;随着模型复杂度的增加,测试误差将逐渐下降并达到最小值;之后,当模型复杂度继续上升时,测试误差会随之增加,对应着过拟合的发生。
为了更准确地估计测试误差,一种广泛应用的方法是交叉验证。交叉验证的思想是重复利用有限的训练样本,通过将数据切分成若干个子集,让不同的子集分别组成训练集和测试集,并在此基础上反复进行训练、测试和模型选择,以达到最优效果。
如果将训练数据集分成 10 个子集 D1-10 进行交叉验证,则需要使用 10 轮训练来测试每个模型。在第一轮中,使用子集 D2-D10 作为训练集,并在子集 D1 上进行测试;在第二轮中,使用子集 D1 和 D3-D10 作为训练集,在子集 D2 上进行测试。依此类推,当模型在所有 10 个子集全部完成测试后,其性能就是 10 次测试结果的平均值。在不同模型中,平均测试误差最小的模型就是最优模型。
机器学习中一个重要的工程问题是参数调整,也称为调参。这是因为算法的参数值对模型性能有着显著的影响。在神经网络和深度学习中,由于参数数量众多,调参变得更加重要和复杂。假设一个神经网络中包含1000个参数,每个参数有10种可能的取值,对于每一组训练/测试集,就有100010个模型需要考察。因此,调参过程中需要权衡性能和效率的关系。
根据训练数据是否带有标签信息,可以将机器学习任务分为三类:监督学习、无监督学习和半监督学习。
- 监督学习:基于已知类别的训练数据进行学习;
- 无监督学习:基于未知类别的训练数据进行学习;
- 半监督学习:同时使用已知类别和未知类别的训练数据进行学习。