1.3.1 机器学习的基本元素
构建一个完整的机器学习系统,需要几个基本元素,以下四个元素是一个机器学习系统不可或缺的:数据集、目标函数、模型和优化算法。
1.数据集
机器学习是从数据中学习,数据集是必需的元素。目前的机器学习方法大多针对特定问题有效,尽管一些将在特定问题有效的算法迁移到更广泛问题的研究已经取得一些进展,但可靠的机器学习算法仍以专用于特定问题的方法为主。例如,针对围棋设计的系统不会用于打麻将,针对垃圾邮件检测设计的系统不会用于对木马病毒的检测。
机器学习要针对具体问题从数据中学习,在确定了要解决的问题后,收集数据是第一步。要从已经发生的该类问题中,收集大量原始数据,并对数据进行适当的预处理,以适合机器学习的后续处理。例如,原始数据中的一些特征是文字描述的,要变成数值。如果是监督学习,要对数据进行标注。
对于监督学习,预处理和标注以后,得到式(1.2.1)所示的数据集。在每个样本(xi,yi)中,xi是特征向量,代表对对象的描述,yi是标注值,指出对象是什么。为了利用数据集进行学习和测试,可将数据集划分为训练集Dtrain和测试集Dtest。训练集用于学习模型,用测试集测试所学模型的有效性。
在机器学习的学习和应用中,数据集有两种典型的来源。在机器学习的学习或算法研究中,可使用标准数据集,这些数据集是有关组织或研究者收集并发布的,其中很多可免费使用,在网络上搜索并下载即可。这些数据集种类很多,语音、文字、图像等通用的数据集更是多种多样,数据集从小规模到大规模都有,为机器学习的学习和研究提供了很大方便。
手写数字识别数据集MNIST,由美国国家标准与技术研究所发布,包含60 000个训练集图像及其标注,以及10 000个测试集图像及其标注,每个手写体图像剪裁成28×28像素的数字图像,图1.3.1是该数据集一部分样本的图像显示。
图1.3.1 MNIST数据集部分样本显示
CIFAR-10是一个中规模彩色图像数据集,包含60 000张图片,均为32×32的彩色照片,每个像素点包括RGB三个数值,数值范围是0~255。所有照片分属10个不同的类别,均做了标注。类型分别是airplane(飞机)、automobile(汽车)、bird(鸟)、cat(猫)、deer(鹿)、dog(狗)、frog(青蛙)、horse(马)、ship(船)和truck(卡车)。其中50 000张图片被划分为训练集,剩下的10 000张图片属于测试集。图1.3.2给出CIFAR-10部分样本的显示。
有一些小的数据集如山鸢尾Iris数据集仅包含150个样本,只有三个类型,这种数据集可用于一些较简单的经典学习算法的实验。也有一些超大规模的数据集,如ImageNet包含1500万张图片,约2.2万类,实际研究中一般只使用其一个子集,例如ISLVRC(ImageNet large scale visual recognition competition)竞赛使用约128万张图片做训练集,共计1000类,这种大规模数据集主要用于训练深度网络。还有许多面向各种应用的数据集,如用于机器翻译的WMT、用于语音识别的TIMIT等。Kaggle网站上有各种各样的由个人或组织公布的各类数据集,并支持在这些数据集上进行机器学习算法的挑战比赛。
图1.3.2 CIFAR-10部分样本显示
数据集的第二种来源就是面对实际问题,从实际问题中采集数据,对数据进行预处理生成合格的数据集。例如,云南当地植物资源极其丰富,可以采集大量植物图片,并可以发动旅游爱好者“众筹”当地的植物照片,剪裁成标准图片并请当地植物行家进行标注,用这样的数据集训练一个当地植物识别软件App。另一个例子是机械故障诊断,通过测量系统积累许多故障下的测量信号,但这样的数据集往往规模有限,可称为小样本情况,传统的机器学习算法如SVM可能更适合解决这类问题。
2.目标函数
一个机器学习系统要完成一类任务,就要有一个评价函数用于刻画系统对于目标的达到程度,即要有一个目标函数(或称评价函数)。一般来讲,衡量系统是否达到所要求的目标,一种方式是评价其与目标系统的差距,另一种是评价系统的收益。前者是目标函数最小化,后者是目标函数最大化。在不同的场景下,可以用目标函数、代价函数、评价函数、风险函数、损失函数、收益函数等名词作为性能评价的函数,一些专用系统还有特定的一些评价函数,本书对此不做进一步讨论。
以监督学习的损失函数为例,对目标函数进一步说明。设要学习一个模型
这里假设模型是参数模型,w是模型参数。若模型是理想的,在输入x时输出为y,但学习得到的模型并不理想,模型的输出和期望的输出y之间有误差,定义一个样本的损失函数为
这里以L(·,·)表示一个一般的损失函数,实际中可取具体的损失函数,例如误差平方、误差绝对值等。设(x,y)的联合概率密度为p(x,y),则总体损失函数为样本损失函数的期望值,可表示为
这里Ep(x,y)表示按概率函数p(x,y)取期望。但是,在机器学习的情境中,只有样本集,概率密度函数p(x,y)一般是未知的,故式(1.3.3)无法直接计算。实际存在的只是一组样本,例如在学习过程中只有训练集,为了叙述方便,训练集表示为
可以计算训练样本集的平均损失
式(1.3.5)称为经验损失函数,名称源于其通过样本计算获得,样本可以看成一种经验。为了学习得到最优模型(参数模型等价为得到相应的最优模型参数),从原理上需通过最小化式(1.3.3)的损失函数J*(w)得到最优参数wo,但由于不能直接使用式(1.3.3),实际通过最小化式(1.3.5)的经验损失函数J(w)得到逼近的最优参数。
通过损失函数J*(w)优化得到的解wo使用了问题的全部统计知识,因此是该问题的总体最优解,但通过式(1.3.5)的经验损失函数J(w)最小化得到的解只使用了训练集的数据,即只使用了由部分经验数据所能够表示的统计特征。一个自然的问题:对于训练集中没有的新样本,这个模型的推广能力如何?这个问题称为机器学习的泛化(generalization)问题,对未知样本的期望损失称为泛化损失,理论上在一定条件下可估计泛化损失界。
如前所述,如果得到一个数据集,可将其分为训练集和测试集,测试集内的样本与训练集样本来自同一个概率分布(实际中来自对同一类应用场景的采样),对监督学习来讲测试集也是带标注的,但与训练集是互相独立的。测试集表示为
学习过程中用训练集确定了模型,将模型用于测试集,计算测试集平均损失
以测试集损失近似表示泛化损失。当泛化损失满足要求时,才认为机器学习算法得到了所需的模型。很多情况下,损失函数代表的是一类误差,这时可分别用以下几种误差来表达损失:在训练集上的平均损失称为训练误差,在测试集上的平均损失为测试误差,可用测试误差近似表示泛化误差。
3.模型
这里模型指的是一个机器学习算法采用的具体数学表示形式,即式(1.2.2)广义的数学函数的具体化,从大类型来讲可分为参数模型和非参数模型。非参数模型的表示随具体应用而定,不易给出一个一般性的表示。参数模型可表示为式(1.2.4)的一般形式
最基本的参数模型可分为线性模型和非线性模型。这里的线性和非线性既可以指与参数w的关系,也可以指与特征向量x的关系。对w是否线性决定了系统优化的复杂度,而对x是否线性决定了系统的表达能力。若对两者均是线性的,则是一种最简单的模型;若对两者均是非线性的,所描述的问题则更复杂。
机器学习中已存在很多种人们已经构造的模型,如神经网络、支持向量机、决策树、K均值聚类等,后续章节会分别介绍这些模型。一些模型的表达能力可能更适合某一类问题,难有一种模型对所有问题都是最优的。在机器学习系统中,需要预先选择一种模型,确定模型的规模,然后进行训练,若无法达到所需要的目标,可以改变模型的规模,或改变模型的类型进行重新学习,找到对所要解决的问题可能最适合的模型。
并不是模型越复杂越好。例如,对于一个回归问题,若损失函数为模型输出与期望输出之间的均方误差,在训练集是有限的情况下,若选择一个非常复杂的模型,模型的表达能力很强,训练过程中可能使得训练误差趋近甚至等于0。这样的模型选择是否最优(测试误差是否也很小),答案可能是否定的。样本集的获得过程难免存在噪声,模型为了尽可能使训练误差小,可能过度拟合了噪声的趋向,由于噪声又是非常杂乱的,拟合的模型可能局部变化过于急剧,这种模型对于新的输入,可能预测性能不好,或者对测试集误差很大,这种情况称为过拟合(overfitting)。过拟合的基本表现:训练误差达到很理想的结果,但泛化性能差。
欠拟合(underfitting)是另一种趋向,即模型过于简单,无法表达数据中较复杂的变化规律,因此训练误差无法下降到较小的程度,既然对训练样本都无法得到好的拟合,也就谈不上有好的泛化性能。在确定机器学习系统的过程中,不希望过拟合和欠拟合。实际系统开发者为避免欠拟合,往往选择相对复杂一些的模型,对这种选择的关键技术是克服过拟合,克服过拟合问题的一种方法是正则化(regularization)。
针对系统复杂性方面,正则化的基本做法是对目标函数增加一个约束项。若原来的目标函数是一个损失函数,则新目标函数由原损失函数加上一个约束项组成,约束项用于控制系统复杂度,约束项上一般施加一个权因子λ,用于平衡损失函数和约束项的影响强度,λ是一种超参数,超参数一般不能通过训练过程确定,大多通过交叉验证的方式确定。
4.优化算法
当数据集、目标函数、模型都选定后,就要通过优化算法将模型内容确定下来。例如,对于参数模型,需要用训练数据对描述模型的目标函数进行优化得到模型参数。一般来讲,对较为复杂的机器学习模型,难以得到对参数解的闭式公式,需要用优化算法进行迭代寻解。若一类机器学习问题直接使用已有的优化算法即可有效求解,则直接使用这些算法;若没有直接求解算法,或直接使用现有算法效率太低,则可针对具体问题设计改进现有算法或探索新的专门算法。