1.1 什么是机器学习?
根据Tom Mitchell,机器学习的一个比较普及的定义是:
如果一个计算机程序在任务中的表现随着经验的增加而变好,那么这个计算机程序就可以从经验中学习某些类别的任务以及表现。
因此,有许多不同种类的机器学习,这取决于我们希望系统学习的任务的性质、我们用来评估系统的性能度量的性质以及我们给它的训练信号或经验的性质。
在这本书里,我们将讨论最常见的ML类型,但是是从概率的角度。粗略地说,这意味着我们将所有未知量都(例如,对某个感兴趣的量的未来值的预测,如明天的温度,或某个模型的参数)视为随机变量,这些随机变量被赋予概率分布,这些概率分布描述了该变量可能具有的一组加权可能值。(如有必要,请参阅第2章,快速复习概率基础知识。)
我们采用概率方法有两个主要原因。首先,正如我们在第5.1节中解释的那样,这是在不确定性下做出决策的最佳方法。其次,概率建模是大多数其他科学和工程领域使用的语言,因此提供了这些领域之间的统一框架。正如DeepMind的研究员Shakir Mohamed所说:
几乎所有的机器学习都可以从概率的角度来看待,这使得概率思维成为基础。当然,这不是唯一的观点。但正是通过这种观点,我们可以将机器学习与其他计算科学联系起来,无论是随机优化、控制理论、运筹学、计量经济学、信息论、统计物理学还是生物统计学。仅仅因为这个原因,掌握概率思维是必不可少的。
1.2 监督学习
ML最常见的形式是监督学习。在这个问题中,任务是学习从输入到输出的映射。输入也称为特征,协变量(covariates),或者预测因子;这通常是一个固定维度的数字向量,比如一个人的身高和体重,或者图像中的像素。在这种情况下,,其中是向量的维数(即输入特征的个数)。输出也被称为标签、目标或响应。经验以一组个输入输出对的形式给出,即训练集。(叫样本量。)性能度量取决于我们预测的输出类型,如下所述。
有时(例如,在statsmodels Python包中),被称为外部变量(exogeneous variables),y被称为内部变量(endogeneous variables)。
1.2.1 分类
在分类问题中,输出空间是一组无序且互斥的标签,称为类,。预测给定输入的类别标签的问题也称为模式识别。(如果只有两类,通常用或表示,则称之为二元分类。)
1.2.1.1 例子:鸢尾花分类
作为一个例子,考虑将鸢尾花分类为它们的3个亚种,狗尾鸢尾、杂色鸢尾和弗吉尼亚鸢尾的问题。图1.1显示了这些种类的一个例子。
图1.1:三种鸢尾花:狗尾鸢尾、杂色鸢尾和弗吉尼亚鸢尾。
在图像分类中,输入空间是图像的集合,它是一个非常高维的空间:对于通道(如)和像素的彩色图像,我们有,其中。(实际上,我们用一个整数来表示每个像素的亮度,通常在,但为了简化标注,我们假设实值输入.)学习一个从图像到标签的映射是很有挑战性的,如图1.2所示。然而,它可以使用某些类型的函数来处理,例如卷积神经网络或CNN,我们将在第14.1节中讨论。
图1.2:图像分类问题的图示。来自cs231n.github.io/。
幸运的是,一些植物学家已经确定了个简单但信息量大的数字特征——花萼长度、花萼宽度、花瓣长度、花瓣宽度——它们可以用来区分三种鸢尾花。在本节中,为了简单起见,我们将使用这个维数低得多的输入空间,。鸢尾花数据集是个鸢尾花标记样本的集合,每个种类分别有个,由这个特征描述。它被广泛用作例子,因为它很小,而且简单易懂。(我们将在本书后面讨论更大、更复杂的数据集.)
当我们有小的特征数据集时,通常将它们存储在一个的矩阵中,其中每行代表一个样本,每列代表一个特征。这就是所谓的设计矩阵;见表1.1的例子。
表1.1:鸢尾花设计矩阵的一个子集。特征是:花萼长、花萼宽、花瓣长、花瓣宽。每个种类有50个样本。
这个特殊的设计矩阵有 行和 列,因此有一个又高又瘦的形状,因为 .相比之下,有些数据集(如基因组学)的特征比样本多,即;他们的设计矩阵又矮又胖。术语“大数据”通常意味着大,而术语“宽数据”意味着大(相对于而言)。
鸢尾花数据集是表格数据的一个例子。当输入是可变大小(例如单词序列或社交网络),而不是固定长度的向量时,数据通常以某种其他格式存储,而不是用设计矩阵存储。然而,这种数据通常被转换成固定大小的特征表示(称为特征化的过程),因此隐含地创建了用于进一步处理的设计矩阵。我们将在第1.5.4.1节给出了一个例子,在那里讨论序列的词袋表示。
1.2.1.2 探索性的数据分析
在用ML解决问题之前,最好进行探索性的数据分析,看看是否有任何明显的模式(这可能会让我们获得提示选择什么方法),或者数据是否有任何明显的问题(例如标签噪声或异常值)。
对于具有少量特征的表格数据,通常制作成配对图(pair plot),其中面板(panel)显示变量 和 的散点图,对角线条目(diagonal entries)显示变量的边缘密度;所有的图都可以根据类别标签进行随意地颜色编码,如图1.3所示。
图1.3:鸢尾花数据的可视化成对的散点图。在对角线上,我们绘制了每个类别的每个特征的边缘分布。除对角线之外包含所有可能的特征对的散点图。由figures.probml.ai/book1/1.3的代码生成。
对于高维数据,通常我们首先对其进行降维,然后以或的形式可视化数据。我们会在第20章讨论了降维的方法。
1.2.1.3 学习一个分类器
从图1.3可以看出,狗尾鸢尾这一类很容易与其他两类区分开来。例如,假设我们创建了以下决策规则:
这是一个非常简单的分类器的例子,其中我们将输入空间分成两个区域,由在处的一维(1d)决策边界定义。位于该边界左侧的点被分类为狗尾鸢尾;右边的点不是杂色鸢尾就是弗吉尼亚鸢尾。
我们看到这个规则完美地分类了狗尾鸢尾的样本,但是没有分类杂色鸢尾和弗吉尼亚鸢尾的样本。为了提高性能,我们可以通过分割分类器出错的区域来递归地划分空间。例如,我们可以添加另一个决策规则,应用于第一次测试失败的输入,以检查花瓣宽度是小于厘米(在这种情况下,我们预测为杂色鸢尾)还是大于厘米(在这种情况下,我们预测为弗吉尼亚鸢尾)。我们可以将这些嵌套的规则排列成一个树形结构,称为决策树,如图1.4a所示。这就产生了图1.4b所示的二维决策面。
图1.4:深度为的决策树应用于鸢尾花数据的例子,仅使用花瓣长度和花瓣宽度特征。叶节点根据预测的类别进行颜色编码。从根节点传递到每个节点的训练样本数显示在各自的框内;我们显示每个类有多少样本属于这个节点。这个计数向量可以被归一化,以获得每个节点的类标签的分布。然后我们可以选择多数派。由figures.probml.ai/book1/1.4的代码生成。
我们可以通过为每个内部节点存储所使用的特征索引以及相应的阈值来表示树。我们用表示所有这些参数。我们将在第18.1节讨论如何学习这些参数。
1.2.1.4 经验风险最小化
监督学习的目标是自动提出如图1.4a所示的分类模型,以便可靠地预测任何给定输入的标签。衡量这项任务性能的常用方法是根据训练集的错误分类率:
其中为二元指示函数,条件为真时返回,否则返回,即,
这是假设所有误差相等。然而,有些错误可能比其他错误代价更高。例如,假设我们在荒野中觅食,我们发现了一些鸢尾花。再者,假设狗尾鸢尾和杂色鸢尾很好吃,但是弗吉尼亚鸢尾有毒。在这种情况下,我们可以使用表1.2所示的非对称损失函数。
表1.2:鸢尾花分类的假设不对称损失矩阵。
然后,我们可以将经验风险定义为训练集预测器的平均损失:
我们看到错误分类率式(1.2)就相当于当我们使用零一损失来比较真实标签和预测时的经验风险:
更多细节见节。 定义模型拟合或训练问题的一种方法是找到一组参数,使在训练集上的经验风险最小化:
这叫经验风险最小化。
然而,我们真正的目标是将我们尚未看到的未来的输入数据的预期损失降至最低。也就是说,我们想要概括,而不仅仅是在训练集上做得好。我们将在第1.2.3节讨论这一重要问题。
1.2.1.5 不确定性
[我们必须避免]错误的自信,这种自信来自于对世界概率性质的无知,来自于在我们应该看到灰色的地方对看到黑色和白色的渴望。 —— ImmanuelKant, 正如Maria Konnikova解释的那样.
在许多情况下,由于缺乏输入-输出映射的知识(这被称为认知不确定性或模型不确定性),和/或由于映射的内在(不可约)随机性(这被称为随机不确定性或数据不确定性),我们将无法完美地预测给定输入的准确输出。
在我们的预测中表示不确定性对于各种应用都很重要。例如,让我们回到我们的有毒鸢尾花的例子,它的损失矩阵如表1.2所示。如果我们在大概率下预测鸢尾花是弗吉尼亚鸢尾,那么我们就不应该吃它。或者,我们可以执行信息收集操作,例如执行诊断测试,以减少我们的不确定性。有关如何在存在不确定性的情况下做出最佳决策的更多信息,请参见第5.1节。
我们可以使用以下条件概率分布来捕捉我们的不确定性:
其中是将输入映射到个可能输出标签上的概率分布。因为返回类别的标签的概率,所以我们要求对于每个有,并且。为了避免这种限制,通常要求模型返回非规范化的对数概率。然后,我们可以使用softmax函数将这些转换为概率,其定义如下
这将映射到,并满足和的约束。softmax的输入,,称为logits。详情见第2.5.2节。因此,我们将整体模型定义如下:
当 是
形式的仿射函数时,这种情况的一个常见特例出现,其中是模型的参数。这个模型被称为逻辑回归(logistic regression),将在第10章详细讨论。
在统计学中,参数通常被称为回归系数(通常用表示),参数称为截距。在ML中,参数被称为权重,被称为偏差(bias)。这个术语来自电气工程,我们把函数看作是一个接收并返回的电路。每个输入通过权重为的“导线”输入电路。电路计算其输入的加权和,并添加恒定偏置或偏移项。(术语“偏差”的使用不应与第4.7.6.1节中讨论的偏差的统计概念混淆。4.7.6.1.)
为了减少符号混乱,通常通过定义\tilde \textbf w=[b,w_1,...,w_D]以及\tilde \textbf x=[1,x_1,...,x_D]将偏差项吸收到权重中,所以有
这将仿射函数转换成线性函数。我们通常会假设这已经完成,所以我们可以只写出如下预测函数:
1.2.1.6 最大似然估计
在拟合概率模型时,通常使用负对数概率作为我们的损失函数:
这种情况的原因将在第5.1.6.1节中解释,但在直觉上是一个好的模型(具有较低的损失函数)是一个为每个相应的输入分配一个较高概率的真实输出。训练集的平均负对数概率由下式给出
这被称为负对数似然。如果最小化上式,我们可以计算出最大似然估计(MLE):
正如我们将看到的,这是一种非常常见的将模型与数据相匹配的方法。
1.2.2 回归
现在假设我们要预测一个实值量,而不是类标签;这就是所谓的回归。例如,在鸢尾花的情况下,可能是鸢尾花被食用后的毒性程度,或者是植物的平均高度。 回归和分类很像。然而,由于输出是实值的,我们需要使用不同的损失函数。对于回归,最常见的选择是使用二次损失函数(损失):
与小的残差相比,大的残差会有更大的惩罚。使用二次损失时的经验风险等于均方误差(MSE):
如果数据有异常值(离群值),二次误差惩罚可能会过于严重。在这种情况下,最好使用损失函数,这样更加鲁棒。更多细节见第11.6节。
基于1.2.1.5节的讨论,我们也应该为我们预测中的不确定性建模。在回归问题中,通常假设输出分布是高斯分布(正态分布)。正如我们在第2.6节中解释的那样,该分布由下式定义
其中,为均值,为方差,为确保密度积分为所需的归一化常数。在回归的上下文中,我们可以通过定义使均值取决于输入。因此,我们得到以下条件概率分布:
如果我们假设方差是固定的(为简单起见),相应的负对数似然变为
我们看到负对数似然(NLL)与均方误差(MSE)成正比。因此,计算参数的最大似然估计将导致最小化平方误差,这似乎是一种明智的模型拟合方法。
1.2.2.1 线性回归
图1.5: (a)一些一维数据的线性回归。(b)垂直线表示每个输入的观测输出值(蓝色圆圈)与其预测值(红十字)之间的残差。最小二乘回归的目标是选择一条最小化残差平方和的线。由figures.probml.ai/book1/1.5的代码生成。
作为回归模型的一个例子,考虑图1.5a中的维数据。我们可以使用以下形式的简单线性回归模型来拟合该数据
其中是斜率(slope),是偏置(offset),是模型的所有参数。通过调整,我们可以最小化平方误差的总和,如图1.5b中的垂直线所示。直到我们找到最小二乘解
更多细节见第11.2.2.1节。
如果我们有多个输入特性,我们可以写成一下形式
其中。这叫多元线性回归。
例如,将预测温度的任务视为房间中维位置的函数。图1.6(a)绘制了以下形式的线性模型的结果:
图1.6:应用于二维数据的线性和多项式回归。纵轴是温度,横轴是房间内的位置。数据是由位于加州伯克利的英特尔实验室的一些遥感微粒收集的(数据由罗曼·蒂博提供)。(a)拟合平面的公式形如。(b)温度数据用公式的二次函数拟合。由figures.probml.ai/book1/1.6的代码生成。
我们可以扩展这个模型来使用的输入特征(比如加上一天中的时间),但是这样就很难可视化了。
1.2.2.2 多项式回归
图1.5a中的线性模型显然不太适合用来拟合这样的数据。我们可以通过使用阶多项式回归模型来提升拟合效果。如形式,其中是从输入中导出的特征向量,其具有以下形式:
这是一个简单的特征预处理的例子,也叫特征工程。
在图1.7a中,我们看到使用会得到更好的拟合效果。我们可以不断增大的值,从而增加模型中的参数数量,直到;在这种情况下,每个数据点有一个参数,因此我们可以完美地插值数据。如图1.7c所示,得到的模型的均方误差为。然而,直观地说,得到的函数对于未来的输入来说不是一个好的预测器,因为它的曲线剧烈“震荡”。我们将在第1.2.3节对此进行更详细的讨论。
图1.7:(a-c)、和阶多项式拟合个数据点(与图1.5中的数据相同)。(d) 均方误差()多项式的阶。由figures.probml.ai/book1/1.7的代码生成。
我们也可以对多维输入使用多项式回归。例如,图1.6(b)绘出了对输入进行二阶展开后的温度模型的预测
二阶模型的形状比图1.6(a)中的线性模型更拟合这样的数据,因为它捕捉到了房间中央更热的事实。我们还可以添加交叉项,如,来捕捉交互作用的影响(interaction effects)。详见第1.5.3.2节。
请注意,上述模型仍然使用参数的线性函数作为预测函数,即使它是原始输入的非线性函数。这一点很重要的原因是,线性模型会导出具有唯一全局最优值解的均方误差损失函数,如我们在第11.2.2.1节中所述的那样。
1.2.2.3 深度神经网络
在第1.2.2.2节中,我们手动指定了输入特征的变换,即多项式展开,。通过学习自动进行这种非线性特征提取,我们可以构建更强大的模型。如果我们使有它自己的一组参数,比如,那么整个模型就变成了如下形式
我们可以递归分解特征提取器为更简单函数的组合。然后,得到的模型变成一个具有个嵌套函数的堆叠(stack):
其中是层上的函数。最后一层是线性的,形如,其中是学习的特征提取器。这是深度神经网络(DNNs)背后的关键思想,它包括常见的变体,如用于图像的卷积神经网络(CNNs)和用于序列的递归神经网络(RNNs)。详见第三部分。
1.2.3 过拟合和泛化
我们可以重写式(1.4)中的经验风险为下列等效形式:
其中是训练集的大小。这个公式很有用,因为它明确了损失是在哪个数据集上评估的。
有了适当灵活的模型,我们可以通过简单地记忆每个输入的正确输出,将训练损失降至零(假设没有标签噪声)。例如,图1.7(c)完美地插值了训练数据(除了最右侧一点)。但我们关心的是新数据的预测精度,这可能不是训练集的一部分。一个完全符合训练数据,但过于复杂的模型,据说存在过拟合的问题。
为了检测一个模型是否过拟合,假设(目前)我们可以使用用于生成训练集的真实(但未知)分布。然后,我们不计算经验风险,而是计算理论预期损失或总体风险
差被称为泛化差距(generalization gap)。如果一个模型具有较大的泛化差距(即具有低经验风险但拥有高总体风险),则表明其过拟合。
实际上我们不知道。然而,我们可以将我们拥有的数据分成两个子集,称为训练集和测试集。然后,我们可以使用测试风险来近似总体风险:
例如,在图1.7d中,我们将多项式回归的训练误差和测试误差绘制为关于阶数的函数。我们看到,随着模型变得更加复杂,训练误差变为。但测试误差有一个能够表明特征的 型曲线:在左边,,模型欠拟合;在右边,,模型过拟合;而当时,模型复杂度“恰到好处”。
我们如何选择一个具有合适复杂度的模型?如果我们使用训练集来评估不同的模型,我们将总是选择最复杂的模型,因为这样的模型将具有最多的自由度,从而将具有最小的损失(训练误差)。因此,我们应该选择测试损失(误差)最小的模型。
在实践中,我们需要将数据划分为三个集合,即训练集、测试集和验证集;后者用于模型选择,我们只是使用测试集来估计未来的预测性能(总体风险),即测试集不用于模型拟合或模型选择。在第4.5.4节可了解更多详情。
1.2.4 没有免费的午餐定理
所有模型都是错的,但有些模型是有用的。 —— George Box.
鉴于文献中的模型种类繁多,人们自然会想知道哪一个是最好的。不幸的是,没有一个单一的最佳模型能最优地解决各种问题——这有时被称为没有免费的午餐定理。原因是一组在一个领域运行良好的假设(也称为归纳偏置)在另一个领域可能运行不佳。选择合适模型的最佳方式是基于领域知识和/或反复试验(即使用模型选择技术,如交叉验证(第4.5.4节)或贝叶斯方法(第5.2.2节))。因此,工具箱中有许多模型和算法技术可供选择是很重要的。
1.3 无监督学习
在监督学习中,我们假设训练集中的每个输入样本都有一个与之关联的一组输出目标,我们的目标是学习输入-输出映射。 虽然这很有用,但是可能很困难,监督学习本质上只是“美化曲线拟合”。
一个可以说更有趣的任务是尝试“理解”数据,而不是仅仅学习映射。 也就是说,我们只得到观察到的“输入”,而没有任何相应的“输出”。 这被称为无监督学习。
从概率的角度来看,我们可以将无监督学习的任务视为拟合形式的无条件模型,该模型可以生成新数据,而监督学习涉及拟合条件模型,该模型指定(分布在)给定输入的输出。
在统计学界,通常使用来表示未建模的外部变量,简单地作为输入给出。因此,无条件模型将表示为而不是。
无监督学习避免了为训练收集大量标记数据集的需要,这通常既耗时又昂贵(想想让医生给医学图像贴上标签)。
无监督学习还避免了学习如何将世界划分为任意类别的需要。考虑发生在一个视频中的动作(例如“喝”或“啜饮”)时标记的任务。是人拿起杯子的时候,还是杯子第一次接触嘴巴的时候,还是液体倒出来的时候?如果他们倒出一些液体,然后暂停,然后再倒出——这是两个动作还是一个动作?人们通常会在此类问题上产生分歧,这意味着任务没有明确定义。 因此,期望机器学习这种映射是不合理的。
一种更合理的方法是尝试捕获由“一群”注释者产生的标签上的概率分布。这包含了这样一个事实:由于任务本身的模糊性,给定的输入可以有多个“正确”的标签。
最后,无监督学习迫使模型“解释”高维输入,而不仅仅是低维输出。这使我们能够学习“世界如何运转”的更丰富的模型。正如多伦多大学著名的ML教授Geoff Hinton所说:
当我们学会看的时候,没有人告诉我们什么是正确的答案——我们只是看。偶尔,你妈妈会说“那是一只狗”,但那是很少的信息。如果你能以这种方式获得一些信息——甚至每秒一位(bit)——那你就很幸运了。大脑的视觉系统有个神经连接。你只能活秒。所以每秒学一点没用。你需要每秒学位。只有一个地方可以获得这么多信息:从输入本身。 —— Geoffrey Hinton, 1996.
1.3.1 聚类
无监督学习的一个简单例子是在数据中寻找簇(clusters)的问题。目标是将输入划分为包含“相似”点的区域。例如,考虑一个二维版本的鸢尾花数据集。在图1.8a中,我们显示了没有任何类标签的点。直观地说,数据中至少有两个簇,一个在左下角,一个在右上角。此外,如果我们假设一组“好的”簇应该相当紧凑,那么我们可能希望将右上方分成(至少)两个子簇。图1.8b显示了最终划分为三个簇的情况(注意,没有完全正确的簇的数量;相反,我们需要考虑模型复杂度和拟合数据之间的权衡。我们将在第21.3.7节讨论如何进行这种权衡。)
图1.8: (a)鸢尾花数据集中花瓣特征的散点图。(b)使用的无监督聚类的结果。由figures.probml.ai/book1/1.8的代码生成。
1.3.2 发现潜在的“变化因素”
当处理高维数据时,通过将其投影到捕捉数据“本质”的低维子空间来降低维数通常是有用的。解决这个问题的一种方法是假设每个观察到的高维输出是由一组隐藏或未观察到的低维潜在因子生成的。我们可以将模型用图表表示:,其中箭头代表因果关系。由于我们不知道潜在因子,所以我们经常假设一个简单的先验概率模型,比如高斯概率分布,它描述每个因子都是一个随机的维向量。如果数据是实值的,我们也可以使用高斯似然。
最简单的例子是当我们使用线性模型时,。由此产生的模型被称为因子分析(FA)。它类似于线性回归,只是我们只观察输出,而不观察输入。在的特殊情况下,这简化为一个称为概率主成分分析(PCA)的模型,我们将在第20.1节中解释。在图1.9中,我们举例说明了当应用于一些简单的维数据时,这种方法是如何找到维线性子空间的。
图1.9: (a)鸢尾花数据散点图(前个特征)。点按类别进行颜色编码。(b)我们使用主成分分析将二维线性子空间拟合到三维数据。类别标签被忽略。红点是原始数据,黑点是使用\hat \textbf x=\textbf W\textbf z+\pmb \mu从模型生成的点,其中是底层推断的维线性流形上的潜在点。由figures.probml.ai/book1/1.9的代码生成。
当然,假设从到的线性映射是非常严格的。然而,我们可以通过定义,其中是非线性模型,例如深度神经网络。拟合这样的模型(即估计参数)变得困难得多,因为必须推断神经网络的输入以及模型的参数。然而,有各种近似方法,例如可以应用的变分自编码器(参见第20.3.5节)。
1.3.3 自监督学习
最近流行的无监督学习方法被称为自监督学习。在这种方法中,我们从未标记的数据创建代理监督任务。例如,我们可以尝试从灰度图像中预测彩色图像,或者屏蔽句子中的单词,然后在给定周围环境的情况下尝试预测它们。希望得到的预测值\hat \textbf x_1=f(\textbf x_2;\pmb \theta),其中是观察到的输入,而\hat \textbf x_1是预测的输出,将从数据中学习有用的特征,然后可以在标准的下游监督任务中使用。这避免了试图推断观察数据背后的“真实潜在因子”的难题,而是依赖于标准的监督学习方法。我们将在第19.2节中更详细地讨论这种方法。
1.3.4 评估无监督学习
尽管无监督学习很有吸引力,但很难评估无监督学习方法的输出质量,因为没有基本事实可以与[ L. Theis, A. van den Oord, and M. Bethge. “ A note on the evaluation of generative models”. In: ICLR. 2016.]进行比较。
评估无监督模型的一种常见方法是测量模型分配给当前没有观测到过的测试示例的概率。我们可以通过计算数据的(无条件)负对数似然来做到这一点:
这将无监督学习的问题视为密度估计的问题。这个想法是,一个好的模型不会对实际的数据样本感到“惊讶”(即,会给它们分配高的概率)。此外,由于概率总和必须为,如果模型将高的概率分配给数据样本来自的数据空间区域,则隐式地将低的概率分配给数据样本不来自的区域。因此,模型已经学会捕捉数据中的典型模式。这可以在数据压缩算法中使用。
不幸的是,密度估计是困难的,尤其是在高维空间。此外,为数据分配高的概率的模型可能没有学习到有用的高级模式(毕竟,模型可以只记住所有的训练示例)。
另一种评估度量是使用学习的无监督表示作为下游有监督学习方法的特征或输入。如果非监督方法已经发现了有用的模式,那么应该可以使用这些模式来执行监督学习,使用的标记数据比使用原始特征时少得多。例如,在1.2.1.1节,我们看到了个人工定义的鸢尾花特征如何包含执行分类所需的大部分信息。因此,我们仅用个例子就能训练出性能近乎完美的分类器。如果输入是原始像素,我们将需要更多的样本来达到类似的性能(详见第14.1节)。也就是说,我们可以通过先学习一个好的表示来提高学习的样本效率(即减少获得良好性能所需的标记样本的数量)。
样本效率的提高是一个有用的评估指标,但在许多应用中,尤其是在科学领域,无监督学习的目标是获得理解,而不是提高某些预测任务的性能。这需要使用可解释的模型,但也可以生成或“解释”数据中大多数观察到的模式。套用Plato的话,目标是发现如何“carve nature at its joints”。当然,评估我们是否成功发现一些数据集背后真正的底层结构通常需要进行实验,从而与世界互动。我们将在第1.4节中进一步讨论这个话题。
1.4 强化学习
除了监督学习和无监督学习,还有第三种称为强化学习(RL)的ML。在这类问题中,system或agent必须学习如何与其环境交互。这可以通过策略来编码,策略指定响应每个可能的输入(从环境状态中导出)要采取的操作。
例如,考虑一个学习玩电子游戏的agent,比如Atari太空入侵者(见图1.10a)。在这种情况下,输入是图像(或过去图像的序列),输出是移动的方向(左或右)以及是否发射导弹。作为一个更复杂的例子,考虑一个机器人学习走路的问题(见图1.10b)。在这种情况下,输入是所有肢体的关节位置和角度的集合,输出是一组驱动或电机控制信号。
图1.10:一些控制问题的例子。(一)太空侵略者Atari游戏。来自https: //gym.openai.com/envs/SpaceInherits-v0/。(b)在MuJuCo模拟器中控制一个人形机器人,使其尽可能快地行走而不摔倒。来自https: //gym.openai.com/envs/Humanoid-v2/。
与监督学习(SL)的区别在于,系统没有被告知采取哪一个动作是最好的(即,对于给定的输入产生哪一个输出)。相反,系统只是收到一个偶然的奖励(或惩罚)信号,作为对它所采取的行动的回应。这就像和批评家一起学习,批评家偶尔会表扬或责备,而不是和老师一起学习,老师会告诉你每一步该做什么。
由于其广泛的适用性,RL最近越来越受欢迎(因为agent试图优化的奖励信号可以是任何感兴趣的指标)。然而,由于各种原因,让RL工作可能比监督学习或无监督学习更难。一个主要的困难是奖励信号可能只是偶尔给出(例如,如果agent最终达到期望的状态),并且即使这样agent也可能不清楚在它的许多动作中是哪一个获得了奖励。(想想下象棋这样的游戏,只在游戏结束时有一个输赢信号。)
为了补偿来自奖励信号的最小信息量,通常使用其他信息源,例如专家演示,可用于监督学习方法或未标记的数据,无监督学习系统可以使用这些数据来发现环境的底层结构。这使得从有限数量的试验(与环境的相互作用)中学习变得可行。 正如Yann LeCun在年NIPS会议的受邀演讲中所说:“如果智能是蛋糕,那么无监督学习就是巧克力海绵,监督学习就是糖衣,强化学习就是樱桃。” 如图 1.11 所示。
图1.11:机器学习的三种类型被想象成巧克力蛋糕的各层。这个图(最初来自bit.ly/2m65Vs1)是Ya… LeCun在NIPS'16上的一次演讲中使用的,在他的善意许可下使用。
更多关于RL的信息可以在本书的续集[ K. P . Murphy . Probabilistic Machine Learning: Advanced T opics. MIT Press, 2022.]中找到。
NIPS代表“Neural Information Processing Systems”。这是最重要的ML会议之一。它最近被改名为NeurIPS。
1.5 数据
机器学习涉及使用各种算法将模型拟合到数据。虽然我们侧重于建模和算法方面,但值得一提的是,训练数据的性质和质量对于任何学习模型的成功也起着至关重要的作用。
在本节中,我们简要描述了一些我们将在本书中使用的常见图像和文本数据集。我们还简要讨论了数据预处理的主题。
1.5.1 一些常见的图像数据集
在本节中,我们将简要讨论我们将在本书中使用的一些图像数据集。
1.5.1.1 小型图像数据集
其中最简单、应用最广泛的是MNIST。这是一个由个训练图像和个测试图像组成的数据集,每个图像大小为(灰度),显示了来自个类别的手写数字。每个像素都是一个在范围内的整数;这些通常被重新缩放到,以表示像素强度。我们可以选择通过阈值化将它转换成二值图像。如图1.12a所示。
图1.12:(a)MNIST数据集前位数字的可视化。每张图片。有个训练样本和个测试样本。由figures.probml.ai/book1/1.12的代码生成。(b)Fashion-MNIST数据集的可视化。数据集的大小与MNIST相同,但更难分类。有类:T恤/上衣、裤子、套头衫、连衣裙、外套、凉鞋、衬衫、运动鞋、包、踝靴。我们显示了训练集中的前幅图像。由figures.probml.ai/book1/1.12的代码生成。
术语“MNIST”代表“Modified National Institute of Standards”;使用术语“modified”是因为图像已经被预处理以确保数字大部分像素在图像的中心。
MNIST在ML社区中的应用如此广泛,以至于著名的ML研究者Geoff Hinton称之为“机器学习的果蝇”,因为如果我们不能让一种方法在MNIST上很好地工作,它很可能在更难的数据集上也不能很好地工作。然而,如今MNIST分类被认为“太容易了”,因为只看一个像素就可以区分大多数数字对。因此提出了一个数据集,其大小和形状与MNIST相同,但其中每个图像都是一件衣服的图片,而不是手写数字。这被称为Fashion-MNIST数据集(见图1.12b),在最近的文献中也被广泛使用。
对于小型彩色图像,最常见的数据集是CIFAR。这是一个由个图像组成的数据集,每个图像大小为,代表个或个类的日常对象;如图1.13所示。
图1.13:来自CIFAR-10数据集的一些图像。每个图像是,其中大小的最终尺寸是指。有个训练样本和测试样本。有10类:飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车。我们显示了训练集中的前幅图像。由figures.probml.ai/book1/1.12的代码生成。
1.5.1.2 ImageNet
小型数据集对于原型创意很有用,但是在大型数据集上测试方法也很重要,包括图像大小和标记样本的数量。这种类型最广泛使用的数据集被称为ImageNet。这是一个由大小为的大约张图像组成的数据集,显示了来自个类别的各种对象;一些例子见图1.14a。
图1.14: (a)来自ImageNet数据集的样本图像。这个子集由张彩色训练图像组成,每个图像大小为像素。有个可能的标签,每个图像一个,任务是最小化前个标签的错误率,即确保正确的标签在个最可能的预测内。在每个图像下面,我们显示了真实标签,以及前个预测标签的分布。如果真实的标签在前名,它的概率条被涂成红色。预测是由一个叫做“AlexNet”(在14.3.2节会讨论)的卷积神经网络(CNN)生成的。(b)随着时间的推移,ImageNet竞争中的误分类率(前5名)。
ImageNet数据集被用作ImageNet大规模视觉识别挑战(ILSVRC)的基础,该挑战从年持续到年。这使用了来自个类别的张图像的子集。在比赛过程中,社区取得了重大进展,如图1.14b所示。特别是,年标志着卷积神经网络在从ImageNet对图像进行分类的任务中能够超越人类(或至少一个人类,即Andrej Karpathy)的第一年。请注意,这并不意味着卷积神经网络比人类更擅长视觉。相反,它很可能反映了这样一个事实,即数据集做出了许多人类难以理解的细粒度分类区分——例如“老虎”和“虎猫”之间的区分;相比之下,足够灵活的CNNs可以学习任意模式,包括随机标签。
1.5.2 一些常见的文本数据集
机器学习经常应用于文本,以解决各种任务。这就是所谓的自然语言处理(NLP)。下面我们简单地提到一些我们将在本书中使用的文本数据集。
1.5.2.1 文本分类
一个简单的NLP任务是文本分类,它可以用于电子邮件垃圾邮件分类、情感分析(例如,一部电影或产品评论是积极还是消极)等。用于评估此类方法的常用数据集是来自[A. L. Maas, R. E. Daly, P. T. Pham, D. Huang, A. Y.
Ng, and C. Potts. “Learning Word Vectors for Sentiment Analysis”. In: Proc. ACL. 2011, pp. 142–150.]的IMDB电影评论数据集。(IMDB代表“互联网电影数据库”。)这其中包含个标注的样本用于训练,另外个用于测试。每个样本都有一个二进制标签,表示积极或消极评价。一些例句见表1.3。
1.这部电影的选角很精彩,场景,故事,方向,每个人都很适合他们扮演的角色罗伯特是一个了不起的演员...
2.大毛大胸糟糕的音乐和巨大的安全别针这些是描述这部恐怖电影最好的词我喜欢俗气的恐怖电影,我看过上百部...
表 1.3:我们展示了来自 IMDB 电影评论数据集的前两句话的片段。 第一个示例标记为正,第二个示例标记为负。 ( <UNK> 表示一个未知token.)
1.5.2.2 机器翻译
更难的NLP任务是学习将一种语言的句子映射到另一种语言的“语义等价”句子;这叫做机器翻译。训练这样的模型需要均衡的对。幸运的是,有几个这样的数据集,例如,来自加拿大议会(英语-法语对)和欧洲联盟(Europarl)。后者的一个子集称为WMT数据集(机器翻译研讨会),由英语-德语对组成,被广泛用作基准数据集。
1.5.2.3 其他的 seq2seq 任务
机器翻译的本质是学习从一个序列到任何其他序列的映射,这被称为seq2seq模型,可以看作是高维分类的一种形式(更多细节见第15.2.3节)。这个问题的框架很一般,包括很多任务,比如文档摘要、问答等。例如,表1.4显示了如何将问答用公式表示为seq-to-seq的问题:输入是文本和问题,以及输出是答案,是一组单词,可能是从输入中提取的。
表1.4:SQuAD据集中样本段落的问答对。每个回答都是文章中的一段文字。这可以通过使用句子对标记来解决。输入是段落文本和问题。输出是中回答问题的相关单词的标记。
1.5.2.4 语言建模
相当浮夸的术语“语言建模”指的是创建文本序列。这只需要输入句子,而不需要任何相应的“标签”。因此,我们可以将其视为一种无监督学习的形式,我们已经在第1.3节中讨论过。我们可以把seq2seq看作是条件语言建模的一种形式。
1.5.3 预处理离散输入数据
许多ML方法假设数据由实值特征向量组成。然而,有时输入可能具有离散的输入特征,例如像种族和性别这样的类别变量,或者来自某些词汇的单词。在下面的章节中,我们将讨论一些预处理这些数据的方法,以将其转换为向量形式。这是一种常见的操作,用于许多不同类型的模型。
1.5.3.1 One-hot 编码
当我们有类别特征时,我们需要将它们转换成数字标度,这样计算输入的加权组合才有意义。预处理这类类别变量的标准方法是使用One-hot编码,也称为虚拟编码。如果一个变量有个值,我们将表示它的虚拟编码如:。例如,如果有种颜色(比如红色、绿色和蓝色),对应的one-hot向量将是、和。
1.5.3.2 特征交叉
对每个分类变量使用虚拟编码的线性模型可以捕捉每个变量的主要影响,但不能捕捉它们之间的交互影响。例如,假设我们想要预测在给定两个分类输入变量时的车辆的燃油效率:类型(比如SUV、Truck或Family car)和原产国(比如 USA或Japan)。如果我们将三进制和二进制特性的one-hot编码连接起来,我们会得到以下输入编码:
其中是类型,是原产国。
此模型无法捕捉特征之间的依赖关系。例如,我们预计卡车的燃油效率会更低,但也许美国的卡车比日本的更低。这不能使用等式中的线性模型来捕捉。式(1.34)因为“原产国”的贡献与汽车“类型”的贡献是相互独立的。
我们可以通过计算显式特征交叉来解决这个问题。例如,我们可以定义一个具有3 × 2个可能值的新复合特征,以捕捉类型和来源国的交互。新模型变为:
我们可以看到,特征交叉的使用将原始数据集转换为广泛的格式(wide format),有更多的列。
1.5.4 预处理文本数据
在1.5.2节,我们简要讨论了文本分类和其他任务。要将文本数据输入分类器,我们需要解决各种问题。首先,文档的长度是可变的,因此不是许多模型假设的固定长度的特征向量。第二,单词是有许多可能值(等于词汇表的大小)的分类变量,因此相应的编码将是非常高维的,没有自然的相似概念。第三,我们可能会在测试时遇到在训练时没有见过的单词(所谓的out-of-vocabulary或OOV)。下面我们讨论这些问题的一些解决方案。
1.5.4.1 词袋模型
处理可变长度文本文档的一个简单方法是将它们解释为a bag of words,在这种情况下,我们忽略了单词顺序。为了将它转换为来自固定输入空间的向量,我们首先将每个单词映射到来自某个词汇表的(标记)token。
为了减少标记的数量,我们经常使用各种预处理技术,例如:删除标点符号,将所有单词转换为小写;丢掉普通但不具信息性的单词,比如“and”和“the”(这叫stop word removal);用基本形式替换单词,例如用“run”替换“running”和“runs”(这称为词干)等等。
让成为第个文档中位置的标记。如果词汇表中有个唯一标记,那么我们可以将第个文档表示为维向量,其中是单词在文档中出现的次数:
其中是文档的长度。我们现在可以将文档解释为中的向量。这被称为文本的向量空间模型。
传统上,我们将输入数据存储在由表示的设计矩阵中,其中是特征的数量。在向量空间模型的上下文中,更常见的是将输入数据表示为项频率矩阵,其中是文档中项的频率,见图1.15。
图1.15:项-文档矩阵的示例,其中原始计数已被其TF-IDF值替代(参见第1.5.4.2节)。较暗的单元格是较大的值。来自bit.ly/2kByLQI。
1.5.4.2 TF-IDF
将文档表示为字数向量的一个问题是,频繁出现的单词可能会有不适当的影响,仅仅因为它们的字数量级较高,即使它们没有携带太多的语义内容。一个常见的解决方案是通过记录日志来转换计数,这减少了在单个文档中多次出现的单词的影响。
为了减少通常多次出现的单词(跨所有文档)的影响,我们计算了一个称为反向文档频率的量,定义如下: ,其中 是带有术语 的文档数量。我们可以将这些转换组合起来计算TF-IDF矩阵,如下所示:
(我们也经常对每一行进行规范化。)这提供了更有意义的文档表示,可以用作许多ML算法的输入。见code.probml.ai/book1/tfidf…的例子。
1.5.4.3 词嵌入
尽管TF-IDF变换通过对“信息性”单词给予更多的权重而对“非信息性”单词给予更少的权重来改进单词的向量表示,但是它没有克服语义相似的单词(例如“男人”和“女人”)可能比语义不相似的单词(例如“男人”和“香蕉”)相距更远的根本问题。因此,逻辑回归模型隐含地假设输入空间中接近的点应该具有相似的输出,这是无效的。
解决这个问题的标准方法是使用词嵌入,在这种方法中,我们将每个稀疏的one-hot向量 映射到一个低维的稠密向量 利用 ,其中 被学习,使得语义相似的单词被放置在附近。有很多方法可以学习这种嵌入,正如我们在第20.5节中讨论的那样。
一旦我们有了嵌入矩阵,我们就可以将一个可变长度的文本文档表示为一个词嵌入包(bag of
word embeddings)。然后,我们可以通过对嵌入求和(或求平均值)将其转换为固定长度的向量:
其中 是式(1.37)表示的词袋。然后我们可以在逻辑回归分类器中使用这个,我们在第1.2.1.5节中简要介绍了这个分类器。整体模型具有以下形式
我们经常使用预训练的词嵌入矩阵 ,在这种情况下,模型在 中是线性的,这简化了参数估计(见第10章)。另见第15.7节上下文词嵌入的讨论。
1.5.4.4 处理没见过的单词
在测试的时候,模型可能会遇到一个之前没有见过的完全新奇的词。这就是所谓的out of vocabulary或OOV问题。这样的没见过的单词是一定会出现的,因为单词的集合是open class。例如,专有名词(人名和地名)的集合是无界的。
解决这个问题的一个标准启发式方法是用代表“未知”的特殊符号UNK替换所有的没见过的单词。然而,这会丢失信息。例如,如果我们遇到“athazagoraphobia”这个词,我们可能会猜测它的意思是“对某事的恐惧”,因为 phobia是英语(源自希腊语)中表达“害怕”的常见后缀。(事实证明athazagoraphobia的意思是“害怕被遗忘或被忽视”。)
我们可以在字符级别工作,但这需要模型学习如何将常见的字母组合组合成单词。 最好利用词有子结构的事实,然后作为输入的subword units或词条; 这些通常是使用一种称为字节对编码(byte-pair encoding) 的方法创建的,这是一种数据压缩形式,可创建新符号来表示常见子字符串。
1.5.5 处理丢失的数据
有时我们可能会丢失数据,其中输入 或输出 的哪些部分可能是未知的。如果训练时输出未知,则该示例未标记;我们在第19.3节中考虑这样的半监督学习场景。因此,我们将重点放在一些输入特性可能缺失的情况上,或者在训练时,或者在测试时,或者两者都缺失。
为了对此建模,假设 是一个 的二元变量矩阵,其中如果示例 中的特征 缺失,则 ,否则 。设 为输入特征矩阵的可见部分,对应 , 为缺失部分,对应 。设 为输出标签矩阵,我们假设它是完全观察到的。如果我们假设 ,我们说数据完全随机丢失(missing completely at random) 或MCAR丢失,因为丢失不依赖于隐藏或观察到的特征。如果我们假设 ,我们就说数据是随机缺失的(missing at random) 或者MAR,因为缺失不依赖于隐藏特征,而可能依赖于可见特征。如果这两个假设都不成立,我们说数据不是随机缺失的(not
missing at random),或者NMAR。
在MCAR和MAR的案例中,我们可以忽略遗漏机制,因为它没有告诉我们任何关于隐藏特征的信息。然而,在NMAR的案例中,我们需要对缺失的数据机制进行建模,因为缺乏信息可能会提供信息。例如,有人没有填写调查中敏感问题的答案(例如,“您有COVID吗?”)可以提供潜在价值的信息。
在这本书里,我们将永远做MAR假设。然而,即使有这种假设,当我们缺少输入特征时,我们也不能直接使用判别模型,例如DNN模型,因为输入x将具有一些未知值。一种常见的启发式方法被称为均值插补(mean value imputation),其中缺失的值被它们的经验均值代替。更一般地说,我们可以将生成模型与输入相匹配,并用它来填充(fill in) 缺失的值。我们在第20章中简要讨论了一些适合这一任务的生成模型,并在本书的续集中进行了更详细的讨论。
1.6 讨论
在这一节中,我们将 ML 和这本书置于一个更大的背景中。
1.6.1 ML与其他领域的关系
有几个子社区致力于与 ML 相关的主题,每个子社区都有不同的名称。预测分析领域类似于监督学习(特别是分类和回归),但更侧重于业务应用程序。数据挖掘涵盖有监督和无监督机器学习,但更侧重于结构化数据,通常存储在大型商业数据库中。数据科学使用机器学习和统计技术,但也强调其他主题,例如数据集成、数据可视化和与领域专家合作,通常在迭代反馈循环中。这些领域之间的差异通常只是术语之一。可以在developers.google.com/machine-lea…找到一个有用的“ML专业词典”
ML与统计领域也有非常密切的关系。的确,斯坦福大学著名的统计学教授 Jerry Friedman说过
- [如果统计领域]从一开始就将计算方法作为一种基本工具纳入其中,而不是简单地以一种方便的方式来应用我们现有的工具,那么许多其他与数据相关的领域[如ML]就不需要存在——它们本来会是统计的一部分。 ——Jerry Friedman
机器学习也与人工智能(AI) 有关。历史上,人工智能领域假设我们可以手工编程“智能”,但这种方法在很大程度上没有达到预期,主要是因为事实证明,显式编码此类系统所需的所有知识太难了。因此,人们对使用人工智能来帮助人工智能系统获得自己的知识重新产生了兴趣。(事实上,它们之间的联系如此紧密,以至于有时术语“ML”和“AI”可以互换使用,尽管这可能会产生误导。)
1.6.2 本书的结构
我们已经看到,ML 与数学、统计学、计算机科学等许多其他学科密切相关。很难知道从哪里开始。
在这本书里,我们用概率论作为我们统一的镜头,通过这种相互关联的景观走了一条特殊的道路。我们在第一部分中介绍了统计基础,在第二部分至第四部分中介绍了监督学习,在第五部分中介绍了无监督学习。有关这些(以及其他)主题的更多信息,请参见本书的续集。
除了这本书,你可能会发现这本书附带的在线Python笔记本很有帮助。详见probml.ai。
1.6.3 说明
在本书中,我们将看到如何使用机器学习来创建能够(尝试)在给定输入的情况下预测输出的系统,然后这些预测可以用来选择行动,从而最大限度地减少预期损失。当设计这样的系统时,很难设计出一个能正确指定我们所有偏好的损失函数;这可能会导致“reward hacking”,其中机器优化了我们给它的奖励函数,但随后我们意识到该函数没有捕获我们忘记指定的各种约束或偏好。(当需要在多个目标之间进行权衡时,这一点尤其重要。)
奖励黑客已经在人工智能伦理和人工智能安全的背景下引起了各种关注。Russell提出通过不指定奖励函数来解决这个问题,而是强制机器通过观察人类行为来推断奖励,这种方法被称为反向强化学习(inverse reinforcement learning)。然而,过于接近地模仿当前或过去的人类行为可能是不可取的,并且可能被可用于训练的数据所偏向。
另一种方法是将 ML 视为构建构成更大系统一部分的自适应组件的工具。此类系统的设计和监管方式应与我们设计和监管其他复杂、半自主的人工制品(例如飞机、在线交易平台或医疗诊断系统)的方式相同。机器学习在此类系统中发挥着关键作用,但应采取额外的制衡措施来对我们的先验知识和偏好进行编码,并确保系统按照我们预期的方式行事。