TensorFlow 2.0神经网络实践
上QQ阅读APP看书,第一时间看更新

1.1 数据集的重要性

由于数据集的概念在ML中至关重要,因此,我们详细地研究一下,重点是如何创建所需的分割,以构建完整和正确的ML流水线。

数据集(dataset),顾名思义,是数据的集合。在形式上,可以将数据集描述为数据对(ei,li)的集合:

其中ei是第i个示例,li是其标签,k代表数据集的有限的基数。

一个数据集的元素数量是有限的,ML算法将多次遍历该数据集,尝试了解数据结构,直到解决了要求它执行的任务。如第2章中所示,一些算法会同时考虑所有数据,而其他算法会在每次训练迭代中迭代查看一小部分数据。

典型的有监督学习任务是对数据集进行分类。我们在数据上训练一个模型,使其学习将示例ei中提取的一组特定特征(或示例ei本身)对应到标签li上。

一旦开启机器学习世界之旅,读者就应该熟悉数据集、数据集分割和轮的概念,以便在接下来的章节中讨论这些概念时,读者已了然于胸。

现在,你已了解什么是数据集。下面让我们深入研究一下数据集分割的基本概念。数据集包含你可以处理的所有数据,如前所述,ML算法需要在数据集中多次遍历并查看数据,以便学习如何执行任务(例如分类任务)。

如果我们使用相同的数据集来训练和测试算法的性能,如何保证即使是在没见过的数据上,算法性能依然良好呢?好吧,我们做不到。

最常见的做法是将数据集分割为三部分:

·训练集:用于训练模型的子集。

·验证集:用于在训练期间测试模型性能以及执行超参数调整/搜索的子集。

·测试集:在训练或验证阶段不接触的子集。仅用于最终性能评估。

这三部分都是数据集的不相交子集,如图1-1所示。

图1-1 维恩图表示应如何分割数据集,训练集、验证集和测试集之间不应重叠

训练集通常是较大的子集,因为它必须是整个数据集的有意义的表示。验证集和测试集较小,而且通常大小相同——当然,这只是一般情况,对于数据集的基数没有限制。实际上,为了对算法进行训练和表示,唯一重要的是数据集要足够大。

我们会让模型从训练集中学习,使用验证集评估其在训练过程中的性能,并在测试集中进行最终的性能评估,这使我们能够正确定义和训练可以很好推广的有监督学习算法,因此即使在没见过的数据上也能很好地工作。

轮是学习算法对整个训练集处理一遍的过程。因此,如果我们的训练集有60000个示例,一旦ML算法使用所有示例进行学习,就表示一轮过去了。

MNIST数据集是ML中最著名的数据集之一。MNIST是标记对(labeled pair)的数据集,其中每个示例都是一个手写数字的28×28二值图像,而标签是图像表示的数字。

然而,我们并不打算在本书中使用MNIST数据集,原因如下:

·MNIST太简单了。不论是传统的还是最新的ML算法都可以几乎完美地对数据集进行分类(准确率>97%)。

·MNIST被过度使用。我们不会使用与其他人相同的数据集来开发相同的应用程序。

·MNIST无法代表现代计算机视觉任务。

上述原因来自Zalando Research的研究人员于2017年发布的一个名为fashion-MNIST的新数据集的描述。fashion-MNIST也将是我们在本书中使用的数据集之一。

fashion-MNIST是MNIST数据集的替代,这意味着它们具有相同的结构。正因如此,通过更改数据集路径,任何使用MNIST的源代码都可以使用fashion-MNIST。

与原始的MNIST数据集一样,fashion-MNIST由包含60000个示例的训练集和10000个示例的测试集组成,甚至图像格式(28×28)也是相同的。主要的区别在于:图像不是手写数字的二值图像,而是衣服的灰度图像。由于它们是灰度级不是二进制的,因此它们的复杂度较高(二进制表示背景值为0,前景为255;而灰度为全量程[0,255])。如图1-2所示。

图1-2 从fashion-MNIST数据集(左图)和MNIST数据集(右图)中采样的图像。值得注意的是,由于MNIST数据集是二值图像数据集,因此它更简单。而fashion-MNIST数据集,由于使用了灰度色板以及其数据集元素固有的内在复杂性,则更加复杂

像fashion-MNIST这样的数据集是用于有监督学习算法中使用的理想候选数据集,因为它们需要带有标注的示例进行训练。

在描述不同类型的ML算法之前,有必要熟悉n维空间的概念,这是每个ML从业者的必修课。

1.1.1 n维空间

n维空间是一种对数据集建模的方法,其示例各有n个属性。

数据集中的每个示例ei都由它的n个属性xj=0,…,n–1来描述,表达式如下:

直观地说,你可以考虑一个示例,如数据库表中的一行,其中的属性是列。例如,像fashion-MNIST这样的图像数据集是一个元素的数据集,每个元素都有28×28=284个属性——它们没有特定的列名,但是这个数据集的每一列都可以看作是图像中的一个像素位置。

当我们开始思考诸如n维空间中由属性唯一标识的点之类的示例时,就产生了维度的概念。

当维度小于或等于3且属性为数字时,可以很容易将此表示可视化。为了理解这个概念,让我们把目光投向数据挖掘领域中最常见的数据集——Iris数据集。

这里我们要做的是探索性的数据分析。当开始使用一个新的数据集时,进行探索性数据分析是很好的做法:先对数据进行可视化并努力理解数据,再考虑将ML应用于数据集上。

该数据集包含三个类别,每个类别有50个示例,其中每个类别都指向鸢尾花的一种类型。这些属性都是连续的,除了以下标签/类:

·萼片长度(cm)

·萼片宽度(cm)

·花瓣长度(cm)

·花瓣宽度(cm)

·类别——山鸢尾(Iris-Setosa)、变色鸢尾(Iris-Versicolor)和维吉尼亚鸢尾(Iris Virginica)

在这个小数据集中,有四个属性(加上类信息),这就意味着有四个维度,很难同时可视化。我们能做的就是在数据集中选取特征对(萼片宽度、萼片长度)和(花瓣宽度、花瓣长度),并将其绘制在二维平面中,以便了解一个特征与另一个特征是如何相关(或不相关)的,并找出数据中是否存在某些自然分区。

使用诸如可视化两个特征之间的关系之类的方法只能使我们对数据集进行一些初步的认识,在更复杂的场景中没有帮助,在这种情况下,属性的数量更多且不总是数值的。

在图1-3中,我们给每个类别分配不同的颜色,Setosa、Versicolor、Virginica分别对应蓝色、绿色和红色。

正如我们从图1-3中看到的,在这个由属性(萼片长度、萼片宽度)所标识的二维空间中,蓝色圆点们彼此都很接近,而其他两个类别仍然是混合的。从图1-3中我们可以得到的结论是,鸢尾花的长度和宽度之间可能存在正相关关系,但除此之外没有其他关系。下面,让我们看一下花瓣之间的关系。如图1-4所示。

如图1-4所示,此数据集中有三个分割。为了区分它们,我们可以使用花瓣的长度和宽度属性。

分类算法的目标是让它们学习如何识别哪些特征是有区分性的,以便正确区分不同类的元素。神经网络已经被证明是避免进行特征选择和大量数据预处理的正确工具:它们对噪声有很强的抵抗力,以至于几乎不需要数据清理。

图1-3 Iris数据集的散点图,每个类别都有不同的颜色,x轴和y轴分别表示萼片长度和萼片宽度(附彩图)

图1-4 Iris数据集的散点图,每个类别都有不同的颜色,x轴和y轴分别表示花瓣长度和花瓣宽度(附彩图)

警告 这仅适用于大的数据集,其中噪声被正确的数据所淹没。对于小数据集,研究特征的最好办法是绘制特征,并提供重要特征作为输入来帮助ML算法。

Iris数据集是可用来描述n维空间最直接的数据集。如果我们再回到fashion-MNIST数据集,事情将变得更加有趣。

一个示例具有784个特征,如何可视化784维空间?答案是:不能可视化!

我们唯一能做的就是降维,以减少可视化所需的维数,并更好地理解底层数据结构。

一种最简单的数据约简技术(通常对高维数据集毫无意义)是对随机选取的数据维度进行可视化。我们对Iris数据集进行了此操作:从四个可用维度中选取了两个随机维度,并将数据绘制在二维平面上。当然,对于低维空间,这可能会有所帮助,但对于诸如fashion-MNIST之类的数据集,则完全是在浪费时间。一些更好的降维技术,比如主成分分析(Principal Component Analysis,PCA)或t-分布邻域嵌入算法(t-distributed Stochastic Neighbor Embedding,t-SNE),在本书中我们将不做详细介绍,因为在接下来的章节中,我们将用到的数据可视化工具TensorBoard,已经为我们实现了这些算法。

此外,在高维空间中工作时,某些特定的几何属性无法如我们所预想的那样正常工作,这被称为维度诅咒。下面我们将看到如何使用一个简单的几何示例来说明随着维度的增加,欧几里得距离是如何不同工作的。

1.1.2 维度诅咒

在D维空间中以为中心取一个超立方体[0,1]D。以D维超球面为例,SD以空间原点o=(0,0,…,0)为中心。直观地说,超立方体的中心c在球面内,对于D的每个值都成立吗?

我们可以通过度量超立方体中心与原点之间的欧几里得距离来验证这一点:

由于球体的半径在任何维度上均为1,因此可以得出结论,当D大于4时,超立方体的中心在超球体之外。

在维度诅咒中,指的是只有在高维空间中处理数据时才会出现的各种现象,而在二维或三维空间等低维环境中不会出现这些现象。

随着维度的增加,一些违反直觉的事情开始发生,这就是维度诅咒。

现在,应该更清楚的是,在高维空间中工作并不容易,而且也不直观。深度神经网络的最大优势之一(也是其广泛使用的原因之一),是在高维空间中使问题易于处理,从而逐层降维。

我们将要描述的第一类ML算法是有监督学习。当我们试图寻找能够在n维空间中划分不同类别元素的函数时,这类算法是合适的工具。