1. 引言

直到最近,你在日常生活中可能接触到的几乎所有计算机程序,都是基于一套预先设置好的、规定其行为的刚性规则编写的。假设我们想编写一个应用程序来管理一个电子商务平台。在白板前围坐几个小时思考这个问题后,我们可能会得出一个可行解决方案的粗略框架,例如:(i) 用户通过在网页浏览器或移动应用程序中运行的界面与应用程序交互;(ii) 我们的应用程序与商业级数据库引擎交互,以跟踪每个用户的状态并维护历史交易记录;以及 (iii) 在我们应用程序的核心,即应用程序的*业务逻辑*(你也可以称之为*大脑*),阐明了一套规则,将每一种可能的情况映射到我们的程序应采取的相应行动。

为了构建我们应用程序的大脑,我们可能会列举出程序应该处理的所有常见事件。例如,每当客户点击将商品添加到购物车时,我们的程序就应该在购物车数据库表中添加一个条目,将该用户的ID与所请求商品的ID关联起来。然后,我们可能会尝试遍历所有可能的极端情况,测试我们规则的适用性并进行任何必要的修改。如果用户用一个空购物车发起购买会发生什么?虽然很少有开发者能第一次就完全做对(可能需要一些测试运行来解决问题),但在大多数情况下,我们可以在看到真实客户*之前*就编写出这样的程序并自信地发布它们。我们能够手动设计自动化系统来驱动功能性产品和系统,通常是在新颖的情况下,这本身就是一项了不起的认知壮举。当你能够设计出\(100\%\)奏效的解决方案时,你通常不需要担心机器学习。

对于日益壮大的机器学习科学家群体来说,幸运的是,许多我们希望自动化的任务并不那么容易屈服于人类的聪明才智。想象一下,和你认识的最聪明的人围在白板前,但这次你们要解决的是以下问题之一:

  • 编写一个程序,根据地理信息、卫星图像和过去一段时间的天气数据来预测明天的天气。

  • 编写一个程序,接收一个以自由格式文本表达的事实性问题,并正确回答它。

  • 编写一个程序,给定一张图像,识别其中描绘的每个人,并为每个人画出轮廓。

  • 编写一个程序,向用户展示他们可能喜欢但在正常浏览过程中不太可能遇到的产品。

对于这些问题,即使是顶尖的程序员也很难从头开始编写解决方案。原因各不相同。有时,我们正在寻找的程序遵循一个随时间变化的模式,所以没有固定的正确答案!在这种情况下,任何成功的解决方案都必须优雅地适应不断变化的世界。有时,关系(比如像素和抽象类别之间的关系)可能过于复杂,需要成千上万次的计算,并遵循未知的原则。在图像识别的情况下,执行任务所需的确切步骤超出了我们的有意识理解,尽管我们的潜意识认知过程可以毫不费力地执行这项任务。

机器学习是研究能从经验中学习的算法的学科。当一个机器学习算法积累更多经验时,通常是以观测数据或与环境互动的形式,它的性能会得到提升。与之形成对比的是我们确定性的电子商务平台,无论积累多少经验,它都遵循相同的业务逻辑,直到开发者自己学习并决定是时候更新软件了。在本书中,我们将教你机器学习的基础知识,特别关注深度学习,这是一套强大的技术,正在推动计算机视觉、自然语言处理、医疗保健和基因组学等不同领域的创新。

1.1. 一个激励人心的例子

在开始写作之前,本书的作者们和大部分上班族一样,需要喝点咖啡提神。我们跳上车开始驾驶。Alex用iPhone喊出“嘿 Siri”,唤醒了手机的语音识别系统。然后Mu下达指令“导航到蓝瓶咖啡店”。手机迅速显示了他的指令的转录文本。它还识别出我们是在询问方向,并启动了地图应用来满足我们的请求。地图应用启动后,识别出多条路线。在每条路线旁边,手机都显示了预计的通行时间。虽然这个故事是为了教学方便而编造的,但它表明,在短短几秒钟内,我们与智能手机的日常互动就可能涉及到多个机器学习模型。

想象一下,仅仅为了编写一个程序来响应像“Alexa”、“OK Google”和“嘿 Siri”这样的*唤醒词*。试着在一个房间里,只用一台电脑和一个代码编辑器来编写它,如 图 1.1.1 所示。你会如何从第一性原理出发编写这样一个程序?想一想……这个问题很难。每秒钟,麦克风会收集大约44,000个样本。每个样本都是声波振幅的测量值。什么样的规则能够可靠地将一小段原始音频映射到关于该片段是否包含唤醒词的自信预测 \(\{\textrm{是}, \textrm{否}\}\)?如果你被卡住了,别担心。我们也不知道如何从头开始编写这样的程序。这就是我们使用机器学习的原因。

../_images/wake-word.svg

图 1.1.1 识别一个唤醒词。

诀窍在这里。通常,即使我们不知道如何明确地告诉计算机如何从输入映射到输出,我们自己却能够完成这项认知任务。换句话说,即使你不知道如何编程让计算机识别“Alexa”这个词,你自己却能识别它。有了这种能力,我们就可以收集一个巨大的*数据集*,其中包含音频片段的样本和相关的标签,指明哪些片段包含唤醒词。在当前主流的机器学习方法中,我们不试图*明确地*设计一个系统来识别唤醒词。相反,我们定义一个灵活的程序,其行为由若干*参数*决定。然后,我们使用数据集来确定最佳的参数值,即那些能根据选定的性能度量标准提高我们程序性能的参数值。

你可以把参数想象成我们可以转动的旋钮,用来操控程序的行为。一旦参数固定下来,我们就称这个程序为*模型*。通过操控参数所能产生的所有不同程序(输入-输出映射)的集合被称为模型的*族*。而使用我们的数据集来选择参数的“元程序”被称为*学习算法*。

在我们开始使用学习算法之前,我们必须精确地定义问题,明确输入和输出的确切性质,并选择一个合适的模型族。在这个例子中,我们的模型接收一段音频作为*输入*,并生成一个 \(\{\textrm{是}, \textrm{否}\}\) 之间的选择作为*输出*。如果一切按计划进行,模型的猜测通常会正确判断音频片段是否包含唤醒词。

如果我们选择了正确的模型族,那么应该存在一种旋钮设置,使得模型在每次听到“Alexa”这个词时都会触发“是”。因为唤醒词的选择是任意的,我们可能需要一个足够丰富的模型族,通过另一种旋钮设置,它可以在听到“Apricot”这个词时才触发“是”。我们期望同一个模型族应该适用于“Alexa”识别和“Apricot”识别,因为它们直观上看起来是相似的任务。然而,如果我们想处理根本不同的输入或输出,比如想从图像映射到标题,或者从英语句子映射到汉语句子,我们可能需要一个完全不同的模型族。

你可能猜到了,如果我们只是随机设置所有的旋钮,我们的模型不太可能识别出“Alexa”、“Apricot”或任何其他英语单词。在机器学习中,*学习*是我们发现正确的旋钮设置以从我们的模型中强迫出期望行为的过程。换句话说,我们用数据来*训练*我们的模型。如 图 1.1.2 所示,训练过程通常如下:

  1. 从一个随机初始化的、无法做任何有用事情的模型开始。

  2. 获取一些数据(例如,音频片段和相应的 \(\{\textrm{是}, \textrm{否}\}\) 标签)。

  3. 调整旋钮,使模型在这些样本上的表现更好。

  4. 重复步骤2和3,直到模型变得非常出色。

../_images/ml-loop.svg

图 1.1.2 一个典型的训练过程。

总结一下,我们不是编写一个唤醒词识别器,而是编写一个程序,如果给它一个大型的带标签的数据集,它就能*学会*识别唤醒词。你可以把这种通过给程序提供数据集来确定其行为的行为看作是*用数据编程*。也就是说,我们可以通过给我们的机器学习系统提供许多猫和狗的例子来“编程”一个猫检测器。这样,检测器最终将学会如果是猫就输出一个非常大的正数,如果是狗就输出一个非常大的负数,如果不确定则输出接近零的数。这仅仅触及了机器学习能做什么的皮毛。深度学习,我们稍后会更详细地解释,只是解决机器学习问题的众多流行方法之一。

1.2. 关键组件

在我们的唤醒词示例中,我们描述了一个由音频片段和二元标签组成的数据集,并模糊地说明了我们如何训练一个模型来近似地将音频片段映射到分类。这类问题,即我们试图根据已知输入,利用一个包含已知标签的样本数据集来预测一个指定的未知标签,被称为*监督学习*。这只是众多机器学习问题中的一种。在我们探讨其他类型之前,我们想更详细地说明一些核心组件,无论我们处理什么样的机器学习问题,这些组件都会伴随我们:

  1. 我们可以从中学习的*数据*。

  2. 一个如何转换数据的*模型*。

  3. 一个量化模型表现好坏的*目标函数*。

  4. 一个调整模型参数以优化目标函数的*算法*。

1.2.1. 数据

不言而喻,没有数据就无法进行数据科学。我们可以花上数百页来思考数据究竟*是*什么,但现在,我们将专注于我们将要处理的数据集的关键属性。通常,我们关心的是一个样本集合。为了有效地处理数据,我们通常需要想出一种合适的数值表示。每个*样本*(或*数据点*、*数据实例*)通常由一组称为*特征*(有时也称为*协变量*或*输入*)的属性组成,模型必须基于这些属性进行预测。在监督学习问题中,我们的目标是预测一个特殊属性的值,称为*标签*(或*目标*),它不属于模型的输入部分。

如果我们处理的是图像数据,每个样本可能包含一张独立的照片(特征)和一个表示照片所属类别的数字(标签)。这张照片会被数值化地表示为三个数值网格,分别代表每个像素位置上红、绿、蓝光的亮度。例如,一张\(200\times 200\)像素的彩色照片将由\(200\times200\times3=120000\)个数值组成。

或者,我们可以处理电子健康记录数据,并解决预测特定患者在未来30天内生存可能性的任务。在这里,我们的特征可能包括一系列现成的属性和频繁记录的测量值,包括年龄、生命体征、合并症、当前用药和近期手术。用于训练的标签将是一个二元值,表示历史数据中的每位患者是否在30天窗口内存活。

在这些情况下,当每个样本都由相同数量的数值特征来表征时,我们称输入为定长向量,并将向量的(恒定)长度称为数据的*维度*。正如你可能想象的那样,定长输入可能很方便,让我们少了一个需要担心的复杂问题。然而,并非所有数据都能轻易地表示为*定长*向量。虽然我们可能期望显微镜图像来自标准设备,但我们不能期望从互联网上挖掘的图像都具有相同的分辨率或形状。对于图像,我们可能会考虑将它们裁剪成标准尺寸,但这种策略只能解决部分问题。我们可能会在裁剪掉的部分丢失信息。此外,文本数据更顽固地抗拒定长表示。考虑一下在亚马逊、IMDb和TripAdvisor等电子商务网站上留下的客户评论。有些很短:“太臭了!”。有些则长篇大论。深度学习相对于传统方法的一个主要优势是现代模型能够相对优雅地处理*变长*数据。

一般来说,我们拥有的数据越多,我们的工作就越容易。当我们有更多数据时,我们可以训练更强大的模型,并更少地依赖预设的假设。从(相对)小数据到大数据的转变是现代深度学习成功的主要贡献者。为了强调这一点,深度学习中许多最令人兴奋的模型在没有大数据集的情况下是无法工作的。其他一些模型可能在小数据情况下也能工作,但并不比传统方法更好。

最后,仅仅拥有大量数据并巧妙地处理它是不够的。我们需要*正确*的数据。如果数据充满了错误,或者选择的特征不能预测我们感兴趣的目标量,学习就会失败。这种情况可以用一句俗语很好地概括:*垃圾进,垃圾出*。此外,糟糕的预测性能并不是唯一的潜在后果。在机器学习的敏感应用中,如预测性警务、简历筛选和用于贷款的风险模型,我们必须特别警惕垃圾数据带来的后果。一个常见的失败模式是,数据集中某些人群在训练数据中没有得到充分代表。想象一下,一个皮肤癌识别系统从未见过黑人皮肤。当数据不仅对某些群体代表不足,而且反映了社会偏见时,也可能发生失败。例如,如果过去的招聘决定被用来训练一个用于筛选简历的预测模型,那么机器学习模型可能会无意中捕捉并自动化历史上的不公正。请注意,这一切都可能在数据科学家没有主动共谋,甚至没有意识到的情况下发生。

1.2.2. 模型

大多数机器学习都涉及到在某种意义上转换数据。我们可能想建立一个系统,它接收照片并预测笑脸的程度。或者,我们可能想接收一组传感器读数,并预测这些读数的正常程度与异常程度。我们用*模型*来表示一种计算机制,它接收一种类型的数据,并吐出可能不同类型的预测。我们特别感兴趣的是可以从数据中估计的*统计模型*。虽然简单的模型完全有能力解决相应简单的问题,但我们在本书中关注的问题挑战了经典方法的极限。深度学习与经典方法的主要区别在于它关注的一系列强大模型。这些模型由许多从上到下链接在一起的连续数据转换组成,因此得名*深度学习*。在讨论深度模型之前,我们也会讨论一些更传统的方法。

1.2.3. 目标函数

早些时候,我们将机器学习介绍为从经验中学习。这里的*学习*,我们指的是随着时间的推移在某项任务上有所改进。但是由谁来评判什么是改进呢?你可能会想象,我们可以提议更新我们的模型,但有些人可能会对我们的提议是否构成改进持不同意见。

为了发展一个正式的机器学习数学系统,我们需要有正式的衡量标准来评判我们的模型有多好(或多坏)。在机器学习和更广泛的优化领域,我们称这些为*目标函数*。按照惯例,我们通常定义目标函数,使其值越低越好。这仅仅是一个惯例。你可以将任何值越高越好的函数,通过取反,转换成一个性质相同但值越低越好的新函数。因为我们选择越低越好,这些函数有时也被称为*损失函数*。

当试图预测数值时,最常见的损失函数是*平方误差*,即预测值与真实目标值之差的平方。对于分类问题,最常见的目标是最小化错误率,即我们的预测与真实情况不符的样本比例。一些目标(如平方误差)易于优化,而另一些(如错误率)由于不可微或其他复杂性而难以直接优化。在这些情况下,通常会优化一个*代理目标*。

在优化过程中,我们将损失视为模型参数的函数,并将训练数据集视为一个常量。我们通过最小化在一组用于训练的样本上产生的损失来学习模型参数的最佳值。然而,在训练数据上表现良好并不能保证我们在未见过的数据上也会表现良好。因此,我们通常希望将可用数据分成两个部分:*训练数据集*(或*训练集*),用于学习模型参数;和*测试数据集*(或*测试集*),用于评估。最终,我们通常会报告我们的模型在这两个分区上的表现。你可以将训练性能类比为学生为准备某次真正的期末考试而做的模拟考试的分数。即使结果令人鼓舞,也不能保证在期末考试中取得成功。在学习过程中,学生可能会开始记住模拟试题,表面上掌握了主题,但在面对真正的期末考试中从未见过的题目时却会失误。当一个模型在训练集上表现良好,但在未见过的数据上无法泛化时,我们说它对训练数据*过拟合*了。

1.2.4. 优化算法

一旦我们有了数据源和表示、一个模型以及一个明确定义的目标函数,我们就需要一个能够搜索最佳参数以最小化损失函数的算法。深度学习中流行的优化算法基于一种称为*梯度下降*的方法。简而言之,在每一步中,该方法会检查每个参数,看看如果你对该参数进行微小扰动,训练集损失会如何变化。然后,它会沿着降低损失的方向更新该参数。

1.3. 机器学习问题的种类

在我们的激励示例中的唤醒词问题只是机器学习可以解决的众多问题之一。为了进一步激励读者并为我们提供一些贯穿全书的通用语言,我们现在对机器学习问题的概貌进行一个广泛的概述。

1.3.1. 监督学习

监督学习描述的是这样一类任务:给定一个包含特征和标签的数据集,要求我们生成一个模型,在给定输入特征时预测标签。每个特征-标签对被称为一个样本。有时,当上下文清晰时,我们可能用*样本*这个词来指代一组输入,即使相应的标签是未知的。监督的作用在于,为了选择参数,我们(监督者)为模型提供一个由带标签的样本组成的数据集。用概率的术语来说,我们通常感兴趣的是估计给定输入特征下标签的条件概率。虽然这只是几种范式之一,但监督学习占据了机器学习在工业界成功应用的大部分。部分原因是因为许多重要任务可以被清晰地描述为根据一组特定的可用数据来估计未知事物的概率:

  • 根据计算机断层扫描图像,预测是癌症还是非癌症。

  • 给定一个英语句子,预测其正确的法语翻译。

  • 根据本月的财务报告数据,预测下个月的股票价格。

虽然所有的监督学习问题都可以用简单的“根据输入特征预测标签”来描述,但监督学习本身可以有多种形式,并且需要大量的建模决策,这取决于(除其他考虑因素外)输入和输出的类型、大小和数量。例如,我们使用不同的模型来处理任意长度的序列和固定长度的向量表示。我们将在本书中深入探讨许多这类问题。

非正式地说,学习过程大致如下。首先,获取一个大的样本集合,其中特征是已知的,并从中随机选择一个子集,获取每个样本的真实标签。有时这些标签可能是已经收集到的可用数据(例如,患者在接下来的一年内是否死亡?),其他时候我们可能需要雇佣人类标注员来标注数据(例如,将图像分配到类别)。这些输入和相应的标签共同构成了训练集。我们将训练数据集输入到一个监督学习算法中,该算法是一个函数,它以数据集为输入,输出另一个函数:学习到的模型。最后,我们可以将以前未见过的输入喂给学习到的模型,用其输出作为相应标签的预测。完整的流程如 图 1.3.1 所示。

../_images/supervised-learning.svg

图 1.3.1 监督学习。

1.3.1.1. 回归

也许最容易理解的监督学习任务是*回归*。例如,考虑一组从房屋销售数据库中收集的数据。我们可以构建一个表格,其中每一行对应一个不同的房子,每一列对应一个相关的属性,如房屋的平方英尺、卧室数量、浴室数量以及步行到市中心的分钟数。在这个数据集中,每个样本都是一个特定的房子,相应的特征向量就是表格中的一行。如果你住在纽约或旧金山,并且不是亚马逊、谷歌、微软或Facebook的CEO,那么你家的(平方英尺、卧室数、浴室数、步行距离)特征向量可能看起来像这样:\([600, 1, 1, 60]\)。然而,如果你住在匹兹堡,它可能更像\([3000, 4, 3, 10]\)。像这样的定长特征向量对于大多数经典的机器学习算法至关重要。

一个问题之所以成为回归问题,实际上是由目标的形式决定的。假设你正在市场上寻找新房。你可能想根据上述一些特征来估计一栋房子的公平市场价值。这里的数据可能包括历史上的房屋挂牌信息,而标签可能是观察到的销售价格。当标签取任意数值(甚至在某个区间内)时,我们称之为一个*回归*问题。目标是产生一个模型,其预测能紧密地逼近实际的标签值。

许多实际问题都可以很轻松地描述为回归问题。预测用户会给电影打多少分可以被看作是一个回归问题,如果你在2009年设计了一个出色的算法来完成这项壮举,你可能就赢得了一百万美元的Netflix奖。预测病人在医院的住院天数也是一个回归问题。一个很好的经验法则是,任何*多少*或*几多*的问题很可能就是回归问题。例如:

  • 这次手术需要多少小时?

  • 这个城镇在未来六小时内会有多少降雨量?

即使你从未接触过机器学习,你也可能非正式地解决过一个回归问题。想象一下,例如,你家的下水道修好了,承包商花了3个小时从你的排污管里清除污物。然后他们给你寄了一张350美元的账单。现在想象一下,你的朋友雇了同一个承包商2个小时,收到了一张250美元的账单。如果这时有人问你,他们即将到来的清污发票大概会是多少钱,你可能会做出一些合理的假设,比如工作时间越长,费用越高。你也可能会假设有一个基础费用,然后承包商按小时收费。如果这些假设成立,那么根据这两个数据样本,你已经可以确定承包商的定价结构:每小时100美元,外加50美元的上门费。如果你理解了这些,那么你已经掌握了*线性*回归的高层次思想。

在这种情况下,我们可以得出与承包商价格完全匹配的参数。但有时这是不可能的,例如,如果一些变动是由你那两个特征之外的因素引起的。在这些情况下,我们会尝试学习能够最小化我们的预测与观测值之间距离的模型。在本书的大部分章节中,我们将专注于最小化平方误差损失函数。正如我们稍后将看到的,这种损失对应于我们的数据被高斯噪声损坏的假设。

1.3.1.2. 分类

虽然回归模型非常适合解决*多少*的问题,但很多问题并不能舒适地套用这个模板。例如,考虑一家银行想要为其移动应用开发一个支票扫描功能。理想情况下,客户只需拍一张支票的照片,应用就会自动从图像中识别文本。假设我们有能力分割出对应每个手写字符的图像块,那么剩下的主要任务就是确定每个图像块中描绘的是已知字符集中的哪一个字符。这类*哪一个*的问题被称为*分类*,需要一套与回归不同的工具,尽管许多技术可以通用。

在*分类*中,我们希望我们的模型查看特征,例如图像中的像素值,然后预测一个样本属于某个离散选项集中的哪个*类别*(有时称为*类*)。对于手写数字,我们可能有十个类别,对应于数字0到9。最简单的分类形式是只有两个类别时,我们称之为*二元分类*。例如,我们的数据集可以包含动物的图像,我们的标签可能是类别\(\textrm{\{猫, 狗\}}\)。在回归中,我们寻求一个回归器来输出一个数值,而在分类中,我们寻求一个分类器,其输出是预测的类别分配。

出于一些我们在本书变得更技术性时会谈到的原因,优化一个只能输出*确定*类别分配(例如,“猫”或“狗”)的模型可能很困难。在这些情况下,用概率的语言来表达我们的模型通常要容易得多。给定一个样本的特征,我们的模型为每个可能的类别分配一个概率。回到我们的动物分类例子,其中类别是\(\textrm{\{猫, 狗\}}\),一个分类器可能会看到一张图片并输出图片是猫的概率为0.9。我们可以这样解释这个数字:分类器有90%的把握认为图片描绘的是一只猫。预测类别的概率大小传达了一种不确定性的概念。这不是唯一可用的不确定性度量,我们将在处理更高级主题的章节中讨论其他度量。

当我们有两个以上可能的类别时,我们称之为*多类分类*问题。常见的例子包括手写字符识别 \(\textrm{\{0, 1, 2, ... 9, a, b, c, ...\}}\)。虽然我们通过尝试最小化平方误差损失函数来解决回归问题,但分类问题中常见的损失函数被称为*交叉熵*,当我们稍后章节介绍信息论时,这个名字的含义将被揭开。

请注意,最有可能的类别不一定是你决策时要使用的那个。假设你在后院发现了一个漂亮的蘑菇,如 图 1.3.2 所示。

../_images/death-cap.jpg

图 1.3.2 死亡帽 - 不要吃!

现在,假设你构建了一个分类器,并训练它根据照片来预测蘑菇是否有毒。假设我们的毒物检测分类器输出 图 1.3.2 显示的是死亡帽的概率为0.2。换句话说,分类器有80%的把握认为我们的蘑菇不是死亡帽。尽管如此,你吃了它就是个傻瓜。这是因为一顿美味晚餐的确定好处,不值得冒20%的死亡风险。换句话说,不确定风险的影响远远超过了好处。因此,为了决定是否吃这个蘑菇,我们需要计算与每个行为相关的预期损害,这取决于可能的结果以及与每个结果相关的利益或危害。在这种情况下,吃下蘑菇所产生的损害可能是 \(0.2 \times \infty + 0.8 \times 0 = \infty\),而丢弃它的损失是 \(0.2 \times 0 + 0.8 \times 1 = 0.8\)。我们的谨慎是有道理的:正如任何真菌学家会告诉我们的那样,图 1.3.2 中的蘑菇实际上是一个死亡帽。

分类问题可能比简单的二元或多类分类复杂得多。例如,有一些分类的变体处理层次结构的类别。在这种情况下,并非所有错误都是平等的——如果非要出错,我们可能宁愿错误分类到一个相关的类别,而不是一个遥远的类别。这通常被称为*层次分类*。为了得到启发,你可以想想林奈,他将动物群组织成一个层次结构。

在动物分类的情况下,把贵宾犬错当成雪纳瑞可能不算太糟,但如果我们的模型把贵宾犬和恐龙混淆了,它将付出巨大的代价。哪个层次结构是相关的,可能取决于你打算如何使用这个模型。例如,响尾蛇和袜带蛇在系统发育树上可能很接近,但把响尾蛇错当成袜带蛇可能会有致命的后果。

1.3.1.3. 打标签

一些分类问题可以很好地适应二元或多类分类的设置。例如,我们可以训练一个普通的二元分类器来区分猫和狗。鉴于目前计算机视觉的发展水平,我们可以用现成的工具轻松做到这一点。然而,无论我们的模型变得多么准确,当我们遇到一张描绘*不莱梅的城市乐手*的图片时,我们可能会遇到麻烦,这是一个流行的德国童话故事,讲述了四只动物的故事(图 1.3.3)。

../_images/stackedanimals.png

图 1.3.3 一头驴,一条狗,一只猫和一只公鸡。

如你所见,照片中有一只猫、一只公鸡、一条狗和一头驴,背景是一些树木。如果我们预见到会遇到这样的图片,多类分类可能不是正确的问题设定。相反,我们可能希望给模型一个选项,让它说图片描绘了一只猫、一条狗、一头驴*和*一只公鸡。

学习预测非互斥类别的问题被称为*多标签分类*。自动打标签问题通常最好用多标签分类来描述。想想人们可能在技术博客文章上使用的标签,例如,“机器学习”、“技术”、“小工具”、“编程语言”、“Linux”、“云计算”、“AWS”。一篇典型的文章可能会有5-10个标签。通常,标签会表现出某种相关性结构。关于“云计算”的文章很可能提到“AWS”,而关于“机器学习”的文章很可能提到“GPU”。

有时,这类打标签问题会涉及到庞大的标签集。美国国家医学图书馆雇佣了许多专业的标注员,他们将每一篇待在PubMed中索引的文章与一组从医学主题词(MeSH)本体中抽取的标签相关联,该本体包含大约28,000个标签。正确地给文章打标签非常重要,因为它能让研究人员对文献进行详尽的回顾。这是一个耗时的过程,通常在存档和打标签之间有一年的延迟。机器学习可以提供临时的标签,直到每篇文章都经过适当的人工审查。事实上,多年来,BioASQ组织已经为这项任务举办了竞赛

1.3.1.5. 推荐系统

推荐系统是另一个与搜索和排名相关的问题设定。这些问题相似,因为目标都是向用户展示一组相关的项目。主要区别在于推荐系统强调对特定用户的*个性化*。例如,对于电影推荐,科幻迷的结果页面和彼得·塞勒斯喜剧鉴赏家的结果页面可能会有显著不同。类似的问题也出现在其他推荐场景中,例如零售产品、音乐和新闻推荐。

在某些情况下,顾客会提供明确的反馈,告知他们对某个特定产品的喜好程度(例如,亚马逊、IMDb或Goodreads上的产品评分和评论)。在其他情况下,他们提供的是隐式反馈,例如,跳过播放列表中的曲目,这可能表示不满意,或者只是表示这首歌在当前情境下不合适。在最简单的表述中,这些系统被训练来估计某个分数,例如预期的星级评分或特定用户购买特定商品的概率。

有了这样的模型,对于任何给定的用户,我们都可以检索得分最高的对象集合,然后将其推荐给用户。生产系统要先进得多,在计算这类分数时会考虑到详细的用户活动和物品特性。图 1.3.4 显示了亚马逊根据为捕捉Aston偏好而调整的个性化算法推荐的深度学习书籍。

../_images/deeplearning-amazon.jpg

图 1.3.4 亚马逊推荐的深度学习书籍。

尽管推荐系统具有巨大的经济价值,但天真地建立在预测模型之上的推荐系统存在一些严重的概念缺陷。首先,我们只观察到*审查过的反馈*:用户优先评价他们有强烈感觉的电影。例如,在一个五星评分制中,你可能会注意到物品收到很多一星和五星的评价,但三星的评价却明显很少。此外,当前的购买习惯往往是当前推荐算法的结果,但学习算法并不总是考虑到这个细节。因此,可能会形成反馈循环,即推荐系统优先推送某个商品,该商品随后被认为更好(由于购买量增加),进而被更频繁地推荐。许多这些问题——关于如何处理审查、激励和反馈循环——都是重要的开放研究问题。

1.3.1.6. 序列学习

到目前为止,我们一直在研究那些我们有固定数量输入并产生固定数量输出的问题。例如,我们考虑了根据一组固定特征来预测房价:平方英尺、卧室数量、浴室数量以及到市中心的通勤时间。我们还讨论了将一个(固定维度的)图像映射到它属于固定数量类别中每个类别的预测概率,以及仅根据用户ID和产品ID来预测与购买相关的星级评分。在这些情况下,一旦我们的模型训练完成,每个测试样本被输入到我们的模型后,它就会被立即忘记。我们假设连续的观测是独立的,因此没有必要保留上下文。

但是我们应该如何处理视频片段呢?在这种情况下,每个片段可能由不同数量的帧组成。而如果我们考虑到前一帧或后一帧,我们对每一帧中发生的事情的猜测可能会更强。语言也是如此。例如,一个流行的深度学习问题是机器翻译:即接收某种源语言的句子并预测它们在另一种语言中的翻译的任务。

这类问题也出现在医学领域。我们可能希望一个模型能监控重症监护室的病人,并在他们未来24小时内死亡风险超过某个阈值时发出警报。在这里,我们不会每小时都丢弃我们所知道的关于病人历史的一切,因为我们可能不希望仅仅根据最近的测量结果来做预测。

像这样的问题是机器学习中最令人兴奋的应用之一,它们是*序列学习*的实例。它们要求模型要么接收输入序列,要么发出输出序列(或两者兼而有之)。具体来说,*序列到序列学习*考虑的是输入和输出都由可变长度序列组成的问题。例子包括机器翻译和语音到文本转录。虽然不可能考虑所有类型的序列转换,但以下特殊情况值得一提。

标注与解析。这涉及到用属性来标注一个文本序列。在这里,输入和输出是*对齐的*,即它们的数量相同,并以相应的顺序出现。例如,在*词性(PoS)标注*中,我们为句子中的每个词标注相应的词性,即“名词”或“直接宾语”。或者,我们可能想知道哪些连续的词组指的是命名实体,如*人*、*地点*或*组织*。在下面这个极其简单的例子中,我们可能只想指出句子中的任何词是否是命名实体的一部分(标注为“Ent”)。

Tom has dinner in Washington with Sally
Ent  -    -    -     Ent      -    Ent

自动语音识别。在语音识别中,输入序列是说话者的录音(图 1.3.5),输出是说话者所说内容的文本记录。挑战在于音频帧的数量远多于文本(声音通常以8kHz或16kHz采样),即音频和文本之间没有1:1的对应关系,因为数千个样本可能对应一个口语单词。这些是序列到序列的学习问题,其中输出远短于输入。虽然人类非常擅长识别语音,即使是低质量的音频,但让计算机完成同样的事情是一个巨大的挑战。

../_images/speech.png

图 1.3.5 录音中的-D-e-e-p- L-ea-r-ni-ng-

文本到语音。这是自动语音识别的逆过程。在这里,输入是文本,输出是音频文件。在这种情况下,输出比输入长得多。

机器翻译。与语音识别中输入和输出按相同顺序出现的情况不同,在机器翻译中,未对齐的数据提出了新的挑战。在这里,输入和输出序列可以有不同的长度,并且相应序列的对应区域可能以不同的顺序出现。考虑下面这个说明性的例子,它展示了德国人将动词放在句末的奇特倾向。

German:           Haben Sie sich schon dieses grossartige Lehrwerk angeschaut?
English:          Have you already looked at this excellent textbook?
Wrong alignment:  Have you yourself already this excellent textbook looked at?

许多相关问题也出现在其他学习任务中。例如,确定用户阅读网页的顺序是一个二维布局分析问题。对话问题展现了各种额外的复杂性,其中确定下一步要说什么需要考虑到现实世界的知识和对话在长时间跨度上的先前状态。这些主题都是活跃的研究领域。

1.3.2. 无监督学习和自监督学习

前面的例子都集中在监督学习上,我们给模型提供一个包含特征和相应标签值的大型数据集。你可以把监督学习者想象成一个工作极其专业化、老板极其专制的员工。老板站在学习者身后,告诉他们在每种情况下该怎么做,直到他们学会从情境映射到行动。为这样的老板工作听起来很糟糕。另一方面,取悦这样的老板却很容易。你只需尽快识别出模式,并模仿老板的行动。

考虑到相反的情况,为一个不知道自己想要你做什么的老板工作可能会令人沮丧。然而,如果你打算成为一名数据科学家,你最好习惯这一点。老板可能只是给你一大堆数据,然后告诉你*用它做点数据科学!* 这听起来很模糊,因为它确实很模糊。我们称这类问题为*无监督学习*,我们能问的问题的类型和数量只受我们创造力的限制。我们将在后面的章节中讨论无监督学习技术。为了激发你现在的兴趣,我们描述了以下一些你可能会问的问题。

  • 我们能否找到少数几个能准确概括数据的原型?给定一组照片,我们能否将它们分组为风景照、狗的照片、婴儿、猫和山峰的照片?同样,给定一组用户的浏览活动,我们能否将他们分组为行为相似的用户?这个问题通常被称为*聚类*。

  • 我们能否找到少数几个能准确捕捉数据相关属性的参数?球的轨迹可以很好地用球的速度、直径和质量来描述。裁缝们已经开发出少数几个参数,能够相当准确地描述人体形状,以便制作合身的衣服。这些问题被称为*子空间估计*。如果依赖关系是线性的,则称为*主成分分析*。

  • 是否存在一种将(任意结构化)对象表示在欧几里得空间中的方法,使得符号属性能够很好地匹配?这可以用来描述实体及其关系,例如“罗马”\(-\)“意大利”\(+\)“法国”\(=\)“巴黎”。

  • 我们观察到的许多数据的根本原因是否有某种描述?例如,如果我们有关于房价、污染、犯罪、地理位置、教育和薪水的人口统计数据,我们能否仅凭经验数据发现它们之间的关系?关注*因果关系*和*概率图模型*的领域正是解决这类问题的。

  • 无监督学习中另一个重要而令人兴奋的最新发展是*深度生成模型*的出现。这些模型可以显式或*隐式*地估计数据的密度。一旦训练完成,我们可以使用生成模型来根据样本的可能性对其进行评分,或者从学习到的分布中采样合成样本。生成模型领域的早期深度学习突破伴随着*变分自编码器*的发明 (Kingma and Welling, 2014, Rezende et al., 2014),并随着*生成对抗网络*的发展而继续 (Goodfellow et al., 2014)。最近的进展包括归一化流 (Dinh et al., 2014, Dinh et al., 2017) 和扩散模型 (Ho et al., 2020, Sohl-Dickstein et al., 2015, Song and Ermon, 2019, Song et al., 2021)

无监督学习的另一个发展是*自监督学习*的兴起,这种技术利用未标记数据的某些方面来提供监督。对于文本,我们可以训练模型来“填空”,通过使用其周围的词(上下文)在大型语料库中预测随机遮蔽的词,而无需任何标记工作 (Devlin et al., 2018)!对于图像,我们可以训练模型来判断同一图像的两个裁剪区域之间的相对位置 (Doersch et al., 2015),根据图像的其余部分预测图像被遮挡的部分,或者预测两个样本是否是同一基础图像的扰动版本。自监督模型通常学习表示,这些表示随后通过在某些下游感兴趣的任务上微调得到的模型来加以利用。

1.3.3. 与环境互动

到目前为止,我们还没有讨论数据实际上从何而来,或者当一个机器学习模型产生输出时到底发生了什么。这是因为监督学习和无监督学习并没有以一种非常复杂的方式来解决这些问题。在每种情况下,我们都是先预先收集一大堆数据,然后让我们的模式识别机器开始工作,而不再与环境进行任何互动。因为所有的学习都是在算法与环境断开连接后发生的,这有时被称为*离线学习*。例如,监督学习假设了如 图 1.3.6 所示的简单交互模式。

../_images/data-collection.svg

图 1.3.6 从环境中为监督学习收集数据。

这种离线学习的简单性有其魅力。好处是我们可以孤立地担心模式识别,而不用关心与动态环境互动所带来的复杂性。但这种问题设定是有限的。如果你是看着阿西莫夫的机器人小说长大的,那么你脑海中描绘的人工智能体不仅能做出预测,还能在世界上采取行动。我们想要思考的是智能*代理*,而不仅仅是预测模型。这意味着我们需要考虑选择*行动*,而不仅仅是做出预测。与单纯的预测相比,行动实际上会影响环境。如果我们想训练一个智能代理,我们必须考虑到它的行动可能如何影响代理未来的观察,因此离线学习是不合适的。

考虑与环境的互动开启了一整套新的建模问题。以下仅是几个例子。

  • 环境是否记得我们之前做过什么?

  • 环境是否想帮助我们,例如,一个用户将文本读入语音识别器?

  • 环境是否想打败我们,例如,垃圾邮件发送者调整他们的邮件以规避垃圾邮件过滤器?

  • 环境是否有变化的动态?例如,未来的数据会一直与过去相似,还是模式会随着时间的推移而改变,无论是自然地还是响应我们的自动化工具?

这些问题引出了*分布偏移*的问题,即训练数据和测试数据是不同的。我们中许多人可能都遇到过这样的例子,就是参加由讲师出题的考试,而作业是由他们的助教编写的。接下来,我们简要描述强化学习,这是一个丰富的框架,用于构建代理与环境互动的学习问题。

1.3.4. 强化学习

如果你有兴趣使用机器学习来开发一个与环境互动并采取行动的代理,那么你很可能最终会专注于*强化学习*。这可能包括机器人技术、对话系统,甚至为视频游戏开发人工智能(AI)的应用。将深度学习应用于强化学习问题的*深度强化学习*已经大受欢迎。突破性的深度Q网络,仅使用视觉输入就在雅达利游戏中击败了人类(Mnih et al., 2015),以及AlphaGo程序,它在围棋棋盘上击败了世界冠军(Silver et al., 2016),是两个突出的例子。

强化学习对一个代理与环境在一系列时间步中互动的问题给出了一个非常普遍的陈述。在每个时间步,代理从环境中接收到一些*观察*,并且必须选择一个*行动*,这个行动随后通过某种机制(有时称为*执行器*)传回给环境,在每个循环之后,代理从环境中获得一个奖励。这个过程如图 1.3.7所示。然后,代理接收到后续的观察,选择后续的行动,依此类推。强化学习代理的行为由一个*策略*来支配。简而言之,一个*策略*就是一个将环境观察映射到行动的函数。强化学习的目标是产生好的策略。

../_images/rl-environment.svg

图 1.3.7 强化学习与环境之间的互动。

强化学习框架的通用性怎么强调都不过分。例如,监督学习可以被重塑为强化学习。假设我们有一个分类问题。我们可以创建一个强化学习代理,每个类别对应一个行动。然后我们可以创建一个环境,它给出的奖励恰好等于原始监督学习问题中的损失函数。

此外,强化学习还可以解决监督学习无法解决的许多问题。例如,在监督学习中,我们总是希望训练输入与正确的标签相关联。但在强化学习中,我们不假设环境会为每个观察结果告诉我们最优的行动。通常,我们只会得到一些奖励。此外,环境甚至可能不会告诉我们哪些行动导致了奖励。

以国际象棋为例。唯一真正的奖励信号出现在游戏结束时,当我们赢了,获得奖励(比如\(1\)),或者当我们输了,获得奖励(比如\(-1\))。因此,强化学习者必须处理“信用分配”问题:确定哪些行动应该为结果受到赞扬或责备。同样的情况也适用于一位在10月11日获得晋升的员工。这次晋升很可能反映了他在过去一年中一系列明智的选择。未来要获得晋升,就需要弄清楚在此过程中哪些行动导致了早前的晋升。

强化学习者可能还必须处理部分可观察性问题。也就是说,当前的观察结果可能无法告诉你关于当前状态的一切。比如说,你的清洁机器人在你房子的众多相同壁橱中的一个里被困住了。解救这个机器人需要推断其精确位置,这可能需要考虑它进入壁橱之前的观察结果。

最后,在任何给定时刻,强化学习者可能知道一种好的策略,但可能存在许多代理从未尝试过的更好的策略。强化学习者必须不断选择是“利用”当前已知的最佳策略,还是“探索”策略空间,这可能需要放弃一些短期奖励以换取知识。

一般的强化学习问题有一个非常通用的设定。行动会影响后续的观察结果。奖励只有在与所选行动对应时才会被观察到。环境可能是完全可观察的,也可能是部分可观察的。一次性考虑所有这些复杂性可能要求过高。而且,并非每个实际问题都表现出所有这些复杂性。因此,研究人员已经研究了许多强化学习问题的特例。

当环境是完全可观察时,我们称强化学习问题为“马尔可夫决策过程”。当状态不依赖于先前的行动时,我们称之为“上下文赌博机问题”。当没有状态,只有一组可用行动且其奖励最初未知时,我们面临的是经典的“多臂赌博机问题”。

1.4. 历史渊源

我们刚刚回顾了机器学习可以解决的一小部分问题。对于各种各样的机器学习问题,深度学习提供了强大的解决方案。尽管许多深度学习方法是近期的发明,但从数据中学习的核心思想已经被研究了几个世纪。事实上,人类自古以来就渴望分析数据和预测未来结果,而正是这种渴望构成了许多自然科学和数学的根源。两个例子是伯努利分布,以雅各布·伯努利(1655–1705)的名字命名,以及由卡尔·弗里德里希·高斯(1777–1855)发现的高斯分布。例如,高斯发明了最小均方算法,至今仍用于从保险计算到医疗诊断的众多问题。这些工具增强了自然科学中的实验方法——例如,将电阻中的电流和电压联系起来的欧姆定律,就完全可以用一个线性模型来描述。

即使在中世纪,数学家们也对估计有敏锐的直觉。例如,雅各布·科贝尔(1460–1533)的几何学书籍中,就展示了通过平均16名成年男子的脚长来估计人群中典型脚长的方法(图 1.4.1)。

../_images/koebel.jpg

图 1.4.1 估计一只脚的长度。

当一群人从教堂出来时,16名成年男子被要求排成一排测量他们的脚长。然后将这些测量值的总和除以16,以获得现在所谓的“一英尺”的估计值。这个“算法”后来得到了改进,以处理畸形的脚;脚最短和最长的两名男子被排除,只对剩下的人进行平均。这是修剪均值估计的最早例子之一。

随着数据的可用性和收集,统计学真正开始腾飞。其先驱之一罗纳德·费希尔(1890–1962)对其理论及其在遗传学中的应用做出了重大贡献。他的许多算法(如线性判别分析)和概念(如费希尔信息矩阵)在现代统计学的基础中仍然占有重要地位。甚至他的数据资源也产生了深远的影响。费希尔在1936年发布的鸢尾花数据集至今仍被用来演示机器学习算法。费希尔也是优生学的支持者,这应该提醒我们,数据科学在道德上可疑的用途,与其在工业和自然科学中的富有成效的用途一样,有着悠久而持续的历史。

机器学习的其他影响来自克劳德·香农(1916–2001)的信息论和艾伦·图灵(1912–1954)提出的计算理论。图灵在他著名的论文《计算机器与智能》(Turing, 1950)中提出了“机器能思考吗?”这个问题。他描述了现在被称为图灵测试的方法,并提出,如果一个人类评估者很难仅凭文本互动来区分机器的回答和人类的回答,那么这台机器就可以被认为是“智能”的。

进一步的影响来自神经科学和心理学。毕竟,人类清楚地表现出智能行为。许多学者曾问,是否可以解释并可能逆向工程这种能力。最早的生物启发算法之一是由唐纳德·赫布(1904–1985)提出的。在他开创性的著作《行为的组织》(Hebb, 1949)中,他假设神经元通过正强化来学习。这被称为赫布学习法则。这些思想启发了后来的工作,如罗森布拉特的感知机学习算法,并为当今支撑深度学习的许多随机梯度下降算法奠定了基础:强化期望的行为,减少不期望的行为,以获得神经网络中参数的良好设置。

“神经网络”这个名字正是源于生物学的启发。一个多世纪以来(可追溯到亚历山大·贝恩,1873年,和詹姆斯·谢灵顿,1890年的模型),研究人员一直试图组装出类似于相互作用的神经元网络的计算电路。随着时间的推移,对生物学的解释变得不那么字面化,但这个名字保留了下来。其核心在于几个关键原则,这些原则在今天大多数网络中都可以找到:

  • 线性和非线性处理单元的交替使用,通常被称为“层”。

  • 使用链式法则(也称为“反向传播”)来一次性调整整个网络中的参数。

在经历初期的快速发展后,神经网络的研究在1995年到2005年间陷入停滞。这主要有两个原因。首先,训练一个网络在计算上非常昂贵。虽然上世纪末随机存取存储器(RAM)很充足,但计算能力却很稀缺。其次,数据集相对较小。事实上,1936年费希尔的鸢尾花数据集仍然是测试算法有效性的常用工具。拥有60000个手写数字的MNIST数据集被认为是巨大的。

鉴于数据和计算的稀缺,诸如核方法、决策树和图模型等强大的统计工具在许多应用中被证明在经验上更优越。此外,与神经网络不同,它们不需要数周的训练时间,并且能提供具有强大理论保证的可预测结果。

1.5. 深度学习之路

随着海量数据的出现,这一切都发生了很大变化。这得益于万维网、为数亿用户提供在线服务的公司的出现、低成本高质量传感器的普及、廉价的数据存储(克莱德定律)以及廉价的计算(摩尔定律)。特别是,最初为电脑游戏设计的GPU的进步,彻底改变了深度学习的计算格局。突然之间,那些似乎在计算上不可行的算法和模型变得触手可及。这在tab_intro_decade中得到了最好的说明。

:数据集与计算机内存和算力

表 1.5.1 标签:tab_intro_decade

年代

数据集

内存

每秒浮点运算次数

1970

100 (鸢尾花)

1 KB

100 KF (Intel 8080)

1980

1 K (波士顿房价)

100 KB

1 MF (Intel 80186)

1990

10 K (光学字符识别)

10 MB

10 MF (Intel 80486)

2000

10 M (网页)

100 MB

1 GF (Intel Core)

2010

10 G (广告)

1 GB

1 TF (NVIDIA C2050)

2020

1 T (社交网络)

100 GB

1 PF (NVIDIA DGX-2)

请注意,随机存取存储器的增长速度并未跟上数据的增长。与此同时,计算能力的增长速度超过了数据集的增长。这意味着统计模型需要变得更具内存效率,并且由于计算预算的增加,它们可以自由地花费更多的计算机周期来优化参数。因此,机器学习和统计学的最佳选择从(广义)线性模型和核方法转向了深度神经网络。这也是为什么许多深度学习的中流砥柱,如多层感知机 (McCulloch and Pitts, 1943)、卷积神经网络 (LeCun et al., 1998)、长短期记忆 (Hochreiter and Schmidhuber, 1997) 和 Q学习 (Watkins and Dayan, 1992),在经历了相当长时间的相对沉寂之后,在过去十年中被“重新发现”的原因之一。

最近在统计模型、应用和算法方面的进展有时被比作寒武纪大爆发:物种进化中的一个快速发展时期。事实上,当前的技术水平并不仅仅是可用资源应用于几十年前算法的简单结果。请注意,下面的思想列表仅仅触及了帮助研究人员在过去十年取得巨大进展的一小部分。

  • 新的容量控制方法,例如 *dropout* (Srivastava et al., 2014),帮助减轻了过拟合。在这里,噪声在训练期间被注入(Bishop, 1995)到整个神经网络中。

  • “注意力机制”解决了困扰统计学一个多世纪的第二个问题:如何在不增加可学习参数数量的情况下增加系统的记忆和复杂性。研究人员通过使用一种只能被视为“可学习指针结构”(Bahdanau et al., 2014)的方法找到了一个优雅的解决方案。例如,对于机器翻译,不再需要将整个文本序列存储在固定维度的表示中,而只需要存储一个指向翻译过程中间状态的指针。这使得长序列的准确性显著提高,因为模型在开始生成新序列之前不再需要记住整个序列。

  • 完全基于注意力机制构建的 *Transformer* 架构 (Vaswani et al., 2017) 展示了卓越的“扩展”行为:随着数据集大小、模型大小和训练计算量的增加,其性能会变得更好 (Kaplan et al., 2020)。该架构已在广泛领域取得了令人信服的成功,例如自然语言处理 (Brown et al., 2020, Devlin et al., 2018)、计算机视觉 (Dosovitskiy et al., 2021, Liu et al., 2021)、语音识别 (Gulati et al., 2020)、强化学习 (Chen et al., 2021) 以及图神经网络 (Dwivedi and Bresson, 2020)。例如,一个在文本、图像、关节扭矩和按钮按压等多种模态上预训练的单一 Transformer 模型,可以玩雅达利游戏、为图像添加标题、聊天以及控制机器人 (Reed et al., 2022)

  • 通过对文本序列的概率进行建模,“语言模型”可以根据其他文本预测文本。随着数据、模型和计算规模的扩大,语言模型通过基于输入文本生成类似人类的文本来执行所需任务的能力不断增强 (Anil et al., 2023, Brown et al., 2020, Chowdhery et al., 2022, Hoffmann et al., 2022, OpenAI, 2023, Rae et al., 2021, Touvron et al., 2023a, Touvron et al., 2023b)。例如,通过将语言模型与人类意图对齐(Ouyang et al., 2022),OpenAI的ChatGPT允许用户以对话方式与其互动,以解决诸如代码调试和创意写作等问题。

  • 多阶段设计,例如通过记忆网络 (Sukhbaatar et al., 2015) 和神经程序员-解释器 (Reed and De Freitas, 2015),使得统计建模者能够描述迭代的推理方法。这些工具允许深度神经网络的内部状态被重复修改,从而执行推理链中的后续步骤,就像处理器可以修改内存进行计算一样。

  • “深度生成建模”的一个关键发展是“生成对抗网络”(Goodfellow et al., 2014)的发明。传统上,用于密度估计和生成模型的统计方法侧重于寻找合适的概率分布和(通常是近似的)从中采样的算法。因此,这些算法在很大程度上受到统计模型固有的灵活性不足的限制。生成对抗网络中的关键创新是用一个带有可微参数的任意算法来取代采样器。然后对这些参数进行调整,使得判别器(实际上是一种双样本检验)无法区分假数据和真实数据。通过使用任意算法生成数据的能力,密度估计向各种技术敞开了大门。奔跑的斑马(Zhu et al., 2017)和假名人脸(Karras et al., 2017)的例子都证明了这一进展。即使是业余涂鸦者也可以仅根据描述场景布局的草图生成逼真的图像(Park et al., 2019)

  • 此外,扩散过程会逐渐向数据样本中添加随机噪声,而“扩散模型”(Ho et al., 2020, Sohl-Dickstein et al., 2015)则学习去噪过程,从随机噪声中逐渐构建数据样本,逆转扩散过程。它们已开始在更新的深度生成模型中取代生成对抗网络,例如在 DALL-E 2 (Ramesh et al., 2022) 和 Imagen (Saharia et al., 2022) 中,用于基于文本描述进行创意艺术和图像生成。

  • 在许多情况下,单个GPU不足以处理用于训练的大量数据。在过去十年中,构建并行和分布式训练算法的能力已显著提高。设计可扩展算法的关键挑战之一是,深度学习优化的主力军——随机梯度下降,依赖于处理相对较小的微批量数据。与此同时,小批量限制了GPU的效率。因此,在1024个GPU上进行训练,每个批次大小为32张图像,相当于总微批量约为32000张图像。首先由Li (2017),随后由You et al. (2017)Jia et al. (2018)进行的工作,将批量大小推至64000个观测值,将ImageNet数据集上ResNet-50模型的训练时间减少到不到7分钟。相比之下,最初的训练时间是以天为单位的。

  • 并行计算的能力也促进了“强化学习”的进步。这使得计算机在围棋、雅达利游戏、星际争霸等任务以及物理模拟(例如,使用MuJoCo)中,只要有环境模拟器可用,就能实现超越人类的表现。关于在AlphaGo中取得的此类成就,请参见,例如,Silver et al. (2016)的描述。简而言之,当有大量(状态,动作,奖励)元组可用时,强化学习效果最好。模拟提供了这样一条途径。

  • 深度学习框架在传播思想方面发挥了至关重要的作用。第一代用于神经网络建模的开源框架包括 CaffeTorchTheano。许多开创性的论文都是使用这些工具写成的。现在,这些框架已被 TensorFlow(通常通过其高级API Keras 使用)、CNTKCaffe 2Apache MXNet 所取代。第三代框架由所谓的“命令式”深度学习工具组成,这一趋势可以说是由 Chainer 引发的,它使用类似于Python NumPy的语法来描述模型。这个想法被 PyTorch、MXNet的 Gluon API 以及 JAX 所采纳。

系统研究人员构建更好的工具和统计建模师构建更好的神经网络之间的分工,极大地简化了事情。例如,训练一个线性逻辑回归模型曾经是一个不小的家庭作业问题,值得在2014年给卡内基梅隆大学的机器学习博士新生。而现在,这项任务可以用不到10行代码完成,使其完全在任何程序员的能力范围之内。

1.6. 成功案例

人工智能在提供难以通过其他方式实现的结果方面有着悠久的历史。例如,自1990年代以来,使用光学字符识别的邮件分拣系统就已经部署。毕竟,著名的MNIST手写数字数据集就是来源于此。同样的情况也适用于读取银行存款支票和评估申请人的信用度。金融交易会自动检查是否存在欺诈。这构成了许多电子商务支付系统的支柱,如PayPal、Stripe、支付宝、微信、Apple、Visa和万事达。国际象棋的计算机程序几十年来一直具有竞争力。机器学习为互联网上的搜索、推荐、个性化和排名提供支持。换句话说,机器学习无处不在,尽管常常隐藏在视线之外。

直到最近,人工智能才成为众人瞩目的焦点,这主要是由于它解决了以前被认为是棘手的、并直接与消费者相关的问题。这些进步中有很多都归功于深度学习。

  • 智能助手,如苹果的Siri、亚马逊的Alexa和谷歌的助手,能够以相当高的准确度回应口头请求。这包括一些琐碎的工作,比如开灯,也包括更复杂的任务,比如安排理发师预约和提供电话支持对话。这可能是人工智能正在影响我们生活的最显著迹象。

  • 数字助手的关键要素是它们准确识别语音的能力。这类系统的准确性已逐渐提高,在某些应用中达到了与人类相当的水平(Xiong et al., 2018)

  • 物体识别同样取得了长足的进步。在2010年,识别图片中的物体是一项相当具有挑战性的任务。在ImageNet基准测试中,来自NEC实验室和伊利诺伊大学厄巴纳-香槟分校的研究人员实现了28%的前五名错误率(Lin et al., 2010)。到2017年,这个错误率降低到了2.25%(Hu et al., 2018)。在识别鸟鸣和诊断皮肤癌方面也取得了同样惊人的成果。

  • 在游戏中表现出色曾是衡量人类能力的标尺。从使用时序差分强化学习玩西洋双陆棋的程序TD-Gammon开始,算法和计算的进步已经催生了适用于广泛应用的算法。与西洋双陆棋相比,国际象棋的状态空间和行动集合要复杂得多。深蓝(DeepBlue)利用大规模并行、专用硬件和高效的游戏树搜索击败了加里·卡斯帕罗夫(Campbell et al., 2002)。由于其巨大的状态空间,围棋的难度更大。AlphaGo在2015年达到了人类水平,它结合了深度学习和蒙特卡洛树采样(Silver et al., 2016)。扑克的挑战在于状态空间巨大且仅部分可观察(我们不知道对手的牌)。Libratus通过高效的结构化策略在扑克中超越了人类表现(Brown and Sandholm, 2017)

  • 人工智能进步的另一个标志是自动驾驶汽车的出现。虽然完全自动驾驶尚未实现,但在这个方向上已经取得了出色的进展,特斯拉、英伟达和Waymo等公司已经推出了能够实现部分自动驾驶的产品。使完全自动驾驶如此具有挑战性的原因是,正确的驾驶需要感知、推理并将规则融入系统的能力。目前,深度学习主要用于这些问题的视觉方面。其余部分则由工程师进行大量调校。

这仅仅触及了机器学习重要应用的冰山一角。例如,机器人技术、物流、计算生物学、粒子物理学和天文学等领域一些最令人印象深刻的最新进展,至少部分归功于机器学习,因此它正在成为工程师和科学家无处不在的工具。

在非技术性文章中,关于即将到来的人工智能末日和“奇点”可能性的问题被频繁提出。人们担心的是,机器学习系统可能会以某种方式变得有知觉,并独立于其程序员做出直接影响人类生活的决定。在某种程度上,人工智能已经直接影响着人类的生计:信用评估是自动进行的,自动驾驶仪主要负责导航车辆,关于是否准予保释的决定使用统计数据作为输入。更轻松一点的是,我们可以让Alexa打开咖啡机。

幸运的是,我们距离一个能够故意操纵其人类创造者的有感知能力的人工智能系统还很遥远。首先,人工智能系统是以特定的、目标导向的方式进行工程、训练和部署的。虽然它们的行为可能给人以通用智能的错觉,但其设计基础是规则、启发式方法和统计模型的组合。其次,目前根本没有能够自我改进、自我推理,并且能够在尝试解决通用任务时修改、扩展和改进自身架构的“通用人工智能”工具。

一个更紧迫的问题是人工智能如何被用于我们的日常生活中。很可能许多目前由人类完成的常规任务可以并且将会被自动化。农场机器人可能会降低有机农户的成本,但它们也会使收割作业自动化。工业革命的这个阶段可能对广大社会阶层产生深远影响,因为在许多国家,低技能工作提供了大量就业。此外,统计模型如果不加小心地应用,可能导致种族、性别或年龄偏见,并且如果被自动化用于驱动重要决策,会引发关于程序公平性的合理担忧。确保这些算法被谨慎使用非常重要。以我们今天的了解,这比恶意的超级智能毁灭人类的可能性,更像是一个紧迫的问题。

1.7. 深度学习的精髓

到目前为止,我们已经泛泛地谈论了机器学习。深度学习是机器学习的一个子集,它关注的是基于多层神经网络的模型。它之所以“深”,恰恰在于其模型学习了许多“层”的变换。虽然这听起来可能很狭隘,但深度学习已经催生了令人眼花缭乱的模型、技术、问题表述和应用。人们提出了许多直觉来解释深度的优势。可以说,所有的机器学习都有多层计算,第一层由特征处理步骤组成。深度学习的不同之处在于,它在多层表示的每一层学习到的操作都是从数据中联合学习的。

到目前为止我们讨论过的问题,例如从原始音频信号、图像的原始像素值中学习,或者在任意长度的句子与其外语对应句子之间进行映射,这些都是深度学习擅长而传统方法力不从心的问题。事实证明,这些多层模型能够处理低级感知数据,这是以前的工具无法做到的。可以说,深度学习方法中最显著的共性是“端到端训练”。也就是说,不是基于单独调整的组件来组装一个系统,而是一次性构建整个系统,然后联合调整其性能。例如,在计算机视觉领域,科学家们过去常常将“特征工程”过程与构建机器学习模型的过程分开。Canny边缘检测器(Canny, 1987)和Lowe的SIFT特征提取器(Lowe, 2004)作为将图像映射到特征向量的算法,在十多年里占据主导地位。在过去,将机器学习应用于这些问题的关键部分,在于想出手动设计的方法,将数据转换为某种适合浅层模型的形式。不幸的是,与一个算法自动执行的数百万次选择的一致评估相比,人类的独创性所能达到的程度是有限的。当深度学习取而代之时,这些特征提取器被自动调整的滤波器所取代,从而获得了更高的准确性。

因此,深度学习的一个关键优势在于,它不仅取代了传统学习流程末端的浅层模型,还取代了劳动密集型的特征工程过程。此外,通过取代大部分领域特定的预处理,深度学习消除了许多以前分隔计算机视觉、语音识别、自然语言处理、医学信息学和其他应用领域的界限,从而为解决各种问题提供了一套统一的工具。

除了端到端训练,我们正在经历从参数化统计描述到完全非参数化模型的转变。当数据稀缺时,人们需要依赖关于现实的简化假设来获得有用的模型。当数据丰富时,这些假设可以被更好地拟合数据的非参数化模型所取代。在某种程度上,这反映了上世纪中叶物理学随着计算机的出现所经历的进步。人们现在可以借助对相关偏微分方程的数值模拟,而不是手工求解电子行为的参数化近似。这导致了更精确的模型,尽管常常以牺牲可解释性为代价。

与先前工作的另一个不同之处是,接受次优解,处理非凸非线性优化问题,以及愿意在证明之前进行尝试。这种处理统计问题时新发现的经验主义,加上人才的迅速涌入,导致了实用算法的快速发展,尽管在许多情况下是以修改和重新发明已存在数十年的工具为代价的。

最终,深度学习社区以跨越学术界和企业界共享工具为荣,发布了许多优秀的库、统计模型和训练好的网络作为开源项目。正是本着这种精神,构成这本书的笔记本可以免费分发和使用。我们努力降低任何希望学习深度学习的人的准入门槛,并希望我们的读者能从中受益。

1.8. 小结

机器学习研究计算机系统如何利用经验(通常是数据)来提高在特定任务上的性能。它结合了统计学、数据挖掘和优化的思想。通常,它被用作实现人工智能解决方案的一种手段。作为机器学习的一类,表示学习侧重于如何自动找到表示数据的适当方式。被视为通过学习多层变换进行的多级表示学习,深度学习不仅取代了传统机器学习流程末端的浅层模型,还取代了劳动密集型的特征工程过程。深度学习近期的许多进展是由廉价传感器和互联网规模应用产生的大量数据,以及计算(主要是GPU)的显著进步所推动的。此外,高效的深度学习框架的出现,使得整个系统的设计和实现优化变得容易得多,这是获得高性能的关键组成部分。

1.9. 练习

  1. 您当前正在编写的代码中,哪些部分可以被“学习”,即通过学习和自动确定代码中的设计选择来改进?您的代码是否包含启发式的设计选择?您可能需要哪些数据来学习期望的行为?

  2. 您遇到的哪些问题有许多解决方案的例子,但没有特定的自动化方法?这些可能是使用深度学习的首选候选项。

  3. 描述算法、数据和计算之间的关系。数据的特性和当前可用的计算资源如何影响各种算法的适用性?

  4. 举出一些目前端到端训练不是默认方法,但可能很有用的场景。

讨论