人工智能工作原理-全-
人工智能工作原理(全)
原文:
zh.annas-archive.org/md5/17fbb5d4192d2b2871410919414cd09e译者:飞龙
第一章:前言

许多书籍教你如何做人工智能(AI)。类似地,许多畅销书也会告诉你关于 AI 的知识。然而,似乎缺少一本书能在概念层面教你 AI 是如何运作的。AI 并不是魔法,你可以理解它在做什么,而不需要埋头于复杂的数学公式。
本书通过无需数学的解释填补了这一空白,告诉你 AI 是如何运作的。虽然有些书深入细节,有些则提供鸟瞰视角,本书则处于树顶层级。它旨在为你提供足够的细节,帮助你理解方法,而不会让你陷入繁琐的数学问题。如果这激起了你的兴趣,我邀请你继续阅读。
在本书中,你会发现有些地方出现了。这些标记表明话题的转变或过渡点。在教科书中,通常表示一个新章节的开始,但这本书不是教科书,我也不希望它看起来像一本教科书;因此,我将使用星号来提醒你话题即将发生变化。像这样……
我第一次学习人工智能是在 1987 年,当时我参加了一门名为“人工智能”的本科课程。随着时间的推移,人们通常所理解的AI含义有所变化。不过,目标依然不变:在机器中模仿智能行为。
在 1980 年代,很少有人有理由学习 AI,即使他们知道它的存在。AI 对他们日常生活的影响微乎其微,除了科幻电视剧和电影中偶尔出现的叛逆计算机,如星际迷航或战争游戏,更不用说那部令人恐惧的终结者了。
然而,1980 年代早已过去,尽管当前复古时尚趋势盛行,AI 却无处不在。它以各种方式影响着我们的生活,从手机告诉我们该开车去这里而不是那里,到在照片中标记朋友和家人,再到持续不断地向我们推送的文章和广告,不论我们是否喜欢。更不用说最近关于大型语言模型的 AI 爆炸,这让许多人将其解读为“真正的 AI”终于到来。
AI 还在我们很少意识到的地方发挥作用:航空公司航班计划、运输与物流、工厂自动化、地球卫星成像、帮助医生判断肿块是否为癌症等等。
为什么现在要学习 AI?
本书通过解释发生了什么,何时发生,为什么发生,以及最重要的,如何发生来回答这个问题——这一切都没有夸大其词,也没有涉及任何数学公式。坦率地说,AI 革命背后的现实本身就足够令人印象深刻,夸张的宣传并不必要。
在这一点上,我觉得有必要简单介绍一下我自己。毕竟,我邀请你与我一起踏上探索人工智能(AI)世界的旅程,理应了解一下你的向导。我自己肯定也会想了解。
如前所述,我在 1980 年代末接触了 AI。2003 年,我开始在 AI 的一个子领域——机器学习——中工作,应用机器学习模型分析血管内超声图像。
我第一次听说深度学习是在 2010 年。深度学习是机器学习的一个子领域。我会在第一章中澄清深度学习、机器学习和人工智能的区别,但现在你可以把它们看作是相同的东西。
2012 年,AI 开始进入大众视野——或者至少是新闻界——伴随着被称为 AlexNet 的突破性事件以及 Google 的一项有趣实验,这个实验涉及计算机学习如何识别 YouTube 视频中的猫。我当时在 2012 年国际机器学习大会上,这次大会在苏格兰爱丁堡举行,当时 Google 展示了它的论文。大会有大约 800 名与会者,座无虚席。
2016 年,我在科罗拉多大学博尔德分校完成了计算机科学博士学位,专攻 AI,导师是 Michael Mozer。从那时起,我每天都在从事 AI 工作,主要是在国防行业,2016 年我曾短暂离开,帮助共同创办了一家医疗 AI 初创公司。
自从 AlexNet 问世后,事态变化迅速,似乎每个月都有一些新的与 AI 相关的“奇迹”出现在学术文献中,甚至有时会出现在晚间新闻里。唯一跟得上的方式就是每年参加多次会议;因为等待成果在学术期刊上发布已经毫无意义,学术出版的进展速度远远跟不上这一领域飞速发展的步伐。
我是在 2022 年 11 月写下这段前言的,地点是 NeurIPS 会议。NeurIPS 可以说是最顶尖的 AI 会议(请不要发恼火邮件!),这是自 COVID-19 疫情以来首次举行的线下会议。参与人数很高,尽管可能没有 2019 年会议那样高,当时通过抽签决定了哪 13,500 人可以参加。会议参与人数从十年前的几百人增长到现在的超过 10,000 人,足以说明 AI 研究的重要性。
支持这些会议的科技行业领导者的名字,也揭示了 AI 的重要性,这些会议是研究生的主要“猎场”。你会看到 Google、DeepMind(同属 Google)、Meta(即 Facebook)、Amazon、Apple 等公司的展位。AI 驱动了这些公司大部分的业务。AI 是大生意。AI 依赖数据,而这些公司吞噬了我们自由提供的所有数据,换取他们的服务。
到本书结尾时,你将了解 AI 在幕后做了些什么(如果你愿意的话,可以称之为“引擎盖下的工作”)。最终,理解它并不难,尽管其中的细节确实至关重要。
本书内容如下:
第一章,出发吧:AI 概述 我们将通过一个快速的 AI 基本概述和一个基础示例来开始。
第二章,为什么是现在?人工智能的历史 人工智能并非凭空出现。本章为你讲述了人工智能的历史背景,并澄清了为什么革命会在现在发生。
第三章,经典模型:老派机器学习 现代人工智能全都依赖神经网络,但要理解神经网络在做什么,了解它们之前的模型会很有帮助。
第四章,神经网络:类脑人工智能 如果你想知道什么是神经网络,它是如何训练的,以及它是如何使用的,那么本章适合你。
第五章,卷积神经网络:AI 学会看见 现代人工智能的强大之处在于学习新的数据表示方式。如果这句话对你没有意义,那么本章将帮助你理解。
第六章,生成式人工智能:AI 的创造力 传统的监督式机器学习模型会给输入附上标签,而生成式人工智能则能产生新颖的输出,包括文本、图像甚至视频。本章探讨了两种流行的方法:生成对抗网络(GANs)和扩散模型。GANs 为我们提供了理解扩散模型的直觉,而在第七章中,我们将进一步探讨大型语言模型(LLMs)。扩散模型擅长根据文本提示生成细致、逼真的图像和视频。
第七章,大型语言模型:终于有了真正的人工智能? OpenAI 在 2022 年秋季发布的大型语言模型 ChatGPT,可能标志着真正人工智能时代的来临。本章探讨了 LLMs:它们是什么,它们是如何工作的,以及它们为何被认为是全新且具有颠覆性的。
第八章,沉思:人工智能的影响 大型语言模型的出现改变了人工智能的格局。本章探讨了这一变化的影响。
在本书的末尾,你会找到一些额外的资源,供你探索。如果你对人工智能产生兴趣并想深入了解,这些资源会很有帮助。个人而言,虽然有偏见,但我推荐我的书籍《实用深度学习:基于 Python 的入门》(2021 年)和《深度学习数学:理解神经网络所需的知识》(2021 年),这两本书均由 No Starch Press 出版。它们将帮助你从了解人工智能的概念,过渡到“实践”人工智能。
最后,当你阅读时,你会注意到文本中的一些特定短语被强调了。这些强调的单词和短语的定义可以在本书的术语表中找到。像所有领域一样,人工智能也有其术语。记住所有这些术语是件繁重的事情,因此我们提供了术语表,帮助你记忆。
我是一个真实的人。我知道因为我可以成功地识别并点击火车和交通灯的图片。如果你对本书中的内容有任何评论或问题,我希望能听到你的声音。请通过邮件联系我:rkneuselbooks@gmail.com。
现在,如果你准备好了,我们就开始吧。
第二章:AND AWAY WE GO: AN AI OVERVIEW**

人工智能试图让机器,通常是计算机,按人类认为智能的方式进行行为。这个词汇是在 1950 年代由著名计算机科学家约翰·麦卡锡(John McCarthy,1927–2011)创造的。
本章旨在阐明什么是 AI,以及它与机器学习和深度学习的关系,这两个术语你可能在近年来听说过。我们将通过一个机器学习实例来深入探讨。可以把本章看作是 AI 的概述,后续章节将进一步扩展并复习这里介绍的概念。
计算机被编程以执行特定的任务,方法是给它们一系列指令,即程序,程序体现了算法,或者说程序让计算机执行的“配方”。
如今,“算法”这个词常常被提及,尽管它并不新鲜;它源自阿尔·花拉子米(Al-Khwarizmi),这是指 9 世纪波斯数学家穆罕默德·伊本·穆萨·阿尔·花拉子米,他对世界的主要贡献就是我们今天所称的代数。
让我们从一个故事开始。
托尼娅拥有一家成功的辣酱工厂。辣酱的配方是托尼娅自己创造的,她小心翼翼地保守这个秘密。它确实是她的“秘密酱”,只有她知道制作它的全过程。
托尼娅为每一步辣酱制作过程雇佣了一名工人。这些工人是人类,但托尼娅把他们当作机器看待,因为她担心他们会偷走她的辣酱配方——而且托尼娅有点怪。在事实上,工人们并不介意,因为她支付的报酬丰厚,而且他们在背后偷偷嘲笑她。
托尼娅的配方就是一个算法;它是制作辣酱所必须遵循的一系列步骤。托尼娅用来告诉工人如何制作辣酱的指令集合就是程序。程序以一种方式体现了算法,使得工人(即机器)可以一步步地执行。托尼娅已经将自己的算法编程成工人能够遵循的流程来制作辣酱。这个顺序大致如下:

有几个方面需要注意。首先,托尼娅把人类当作机器对待,显然是个怪物。其次,在制作辣酱的过程中,任何工人都不需要理解自己为什么要做某件事。第三,程序员(托尼娅)知道机器(工人)做某事的原因,即便机器自己并不清楚。
我刚才描述的是我们如何控制几乎所有的计算机,这可以追溯到艾伦·图灵在 1930 年代构思的第一台概念性机器,甚至更早,可以追溯到 19 世纪查尔斯·巴贝奇的分析引擎。一个人设计出一个算法,然后将该算法翻译成一系列步骤(一个程序)。计算机执行该程序,从而实现算法。计算机并不理解它在做什么;它只是执行一系列原始的指令。
巴贝奇和图灵的天才在于意识到,可以有一台通用的计算机,通过程序执行任意的算法。然而,我认为是巴贝奇的朋友,常被认为是世界上第一位程序员的阿达·洛夫莱斯,最初理解了我们现在所说的计算机的深远可能性。我们将在第二章中详细讨论图灵、巴贝奇和洛夫莱斯。
备注
在洛夫莱斯时代,“计算机”不是一台机器,而是一个通过手工计算的人工智能。因此,巴贝奇的引擎是一台机械计算机。
让我们花一点时间探讨一下AI、机器学习和深度学习这几个术语之间的关系。一方面,三者已成为现代 AI 的代名词。这是错误的,但很方便。图 1-1 显示了这些术语之间的正确关系。

图 1-1:人工智能、机器学习和深度学习之间的关系
深度学习是机器学习的一个子领域,而机器学习是人工智能的一个子领域。这种关系意味着 AI 涉及的概念既不属于机器学习,也不属于深度学习。我们将这些概念称为传统 AI,它包括自 1950 年代以来发展起来的算法和方法。传统 AI 并不是人们当前讨论 AI 时所指的内容。接下来,我们将完全(且不公平地)忽视 AI 领域的这一部分。
机器学习从数据中构建模型。对我们来说,模型是一个抽象的概念,它接受输入并生成输出,其中输入和输出以某种有意义的方式相关联。机器学习的主要目标是利用已知数据来训练模型,使得当模型接收到未知数据时能够生成有意义的输出。听起来有点模糊,但请耐心等待;这些模糊的部分会随着时间的推移得到澄清。
深度学习使用以前过于庞大而无法实用的大型模型。更多的模糊水,但我将辩称,深度学习没有严格的定义,除了它涉及到有许多层的神经网络。第四章将进一步澄清。
在本书中,我们将随意使用,但与大众的习惯一致,甚至专家也常这么做,把“深度学习”理解为大型神经网络(尚未正式定义),把“机器学习”理解为由数据条件化的模型,把“人工智能”视为机器学习和深度学习的统称——记住,人工智能不仅仅是我们在这里讨论的内容。
数据在人工智能中至关重要。我无法强调这一点的重要性。模型是空白的画布,必须通过数据来条件化,以使其适用于某个任务。如果数据不好,模型就不好。在本书中,我们将不断回到“好”数据和“坏”数据这一概念。
现在,让我们聚焦于模型是什么、如何通过条件化使它变得有用,以及在条件化后如何使用它。所有关于条件化和使用的讨论听起来都阴暗而邪恶,甚至可以说充满了威胁,但我向你保证,它并非如此,尽管我们确实有一些方法让模型“说话”。
机器学习模型是一个黑箱,它接受一个输入,通常是一组数字,然后产生一个输出,通常是一个标签,比如“狗”或“猫”,或者是一个连续值,如“狗”的概率,或者给定特征(大小、浴室数量、邮政编码等)后房子的价值。
模型有参数,它们控制着模型的输出。条件化模型,也叫做训练,旨在设置模型的参数,使其在给定输入时产生正确的输出。
训练意味着我们有一组输入,以及当给定这些输入时,模型应该产生的输出。乍一看,这似乎有点傻;为什么我们要让模型给出我们已经拥有的输出呢?答案是,在未来某个时刻,我们会有一些输入,而我们并没有已有的输出。这正是构建模型的全部意义:使用它来处理未知的输入,并相信它在给出输出时的可靠性。
训练使用已知的输入和输出集合来调整模型的参数,以最小化错误。如果我们能够做到这一点,我们就能在给定新的、未知的输入时开始相信模型的输出。
训练一个模型与编程是根本不同的。在编程中,我们通过逐步指示计算机来实现我们想要的算法。而在训练中,我们使用数据教模型调整其参数,以产生正确的输出。没有编程,因为大多数时候我们根本不知道算法应该是什么。我们只知道或相信输入和期望输出之间存在某种关系。我们希望模型能够足够好地逼近这种关系,使其变得有用。
值得记住英国统计学家乔治·博克斯的名言:“所有模型都是错误的,但有些是有用的。”当时他指的是其他类型的数学模型,但这一智慧同样适用于机器学习。
现在我们明白了为什么这个领域叫做机器学习:我们通过给机器(模型)提供数据来教它。我们不是在编程机器,而是在指示它。
那么,这就是机器学习算法:
-
收集一个训练数据集,包含一组模型的输入和我们期望模型针对这些输入产生的输出。
-
选择我们想要训练的模型类型。
-
通过呈现训练输入并在模型输出错误时调整模型的参数来训练模型。
-
重复步骤 3,直到我们对模型的表现满意为止。
-
使用现在训练好的模型为新的、未知的输入产生输出。
大多数机器学习遵循这一算法。由于我们使用已知的 标签数据 来训练模型,这种方法被称为 监督学习:我们在模型学习如何产生正确输出时进行监督。从某种意义上讲,我们会惩罚模型,直到它做对为止。毕竟,这是一项黑暗的事业。
我们已经准备好进行一个示例,但让我们先总结一下目前为止的内容。我们希望构建一个系统,对于一个未知输入,能够得到一个有意义的输出。为了构建这个系统,我们通过一组已知输出的输入数据来训练一个机器学习模型。训练通过调整模型的参数,减少它在训练数据上所犯的错误,从而使模型得到调教。当我们对模型的表现满意时,我们就可以使用这个模型来处理未知输入,因为我们现在相信模型在给出输出时是可靠的(至少,大部分时间是这样)。
我们的第一个示例来自一个著名的数据集,包含了鸢尾花部位的测量数据。这个数据集来自 1930 年代,表明人们早在很久以前就开始思考我们现在所称之为机器学习的领域。
目标是得到一个模型,该模型对于一组测量值的输入,能够输出特定种类的鸢尾花。完整的数据集包含了三种鸢尾花的四个测量值。为了简化,我们只使用两个测量值和两种花种:I. setosa 和 I. versicolor 的花瓣长度和宽度(单位:厘米)。因此,我们希望模型接受两个测量值作为输入,并给出我们可以解释为 I. setosa 或 I. versicolor 的输出。像这样的 二分类模型 会在两个可能的输出之间做出选择,并且在人工智能中很常见。如果模型在多个类别之间做出选择,那么它就是 多类模型。
我们的数据集包含 100 个样本:100 对花瓣测量值以及对应的鸢尾花类型。我们将 I. setosa 称为类别 0,将 I. versicolor 称为类别 1,其中 类别 用来标记输入的类别。
模型通常需要数字类别标签,这告诉我们模型并不知道它的输入和输出意味着什么;它们只是对一组输入和输出之间的关联进行建模。模型并不“思考”,按照任何常见的定义。(第七章的模型可能会有不同的看法,但我们会在那时讨论更多内容。)
在这里,我们必须暂停一下,介绍一些关键术语。我知道,这不是你想阅读的内容,但它对接下来的内容至关重要。人工智能经常使用向量和矩阵(单数形式为“矩阵”)。向量是一个作为单一实体处理的数字串。例如,每朵鸢尾花的四个测量值意味着我们可以用四个数字来表示这朵花,例如(4.5,2.3,1.3,0.3)。通过这个向量描述的花朵,其花萼长度为 4.5 厘米,花萼宽度为 2.3 厘米,花瓣长度为 1.3 厘米,花瓣宽度为 0.3 厘米。通过将这些测量值组合在一起,我们可以将它们视为一个单一实体。
向量中元素的数量决定了它的维度;例如,鸢尾花数据集使用四维向量,表示花朵的四个测量值。人工智能通常处理具有数百甚至数千维的输入。如果输入是图像,那么图像的每个像素就是一个维度,这意味着一个小的 28×28 像素的图像将成为一个 28×28 或 784 维的输入向量。这个概念在三维或 33,000 维中都是一样的:它仍然是一个作为单一实体处理的数字串。但图像有行和列,使得它成为一个二维数组,而不是一个字符串。二维数字数组就是矩阵。在机器学习中,我们通常将数据集表示为矩阵,其中行是表示数据集元素的向量,如一朵鸢尾花,而列是各个测量值。例如,鸢尾花数据集中的前五朵花形成如下矩阵:

每一行代表一朵花。请注意,第一行与向量示例相匹配。其余的行列出了其他花朵的测量值。
在你阅读时,请将以下想法记在心里:
-
向量是数字的串,通常表示数据集中的测量值。
-
矩阵是二维数字数组,通常表示数据集(向量堆叠)。
随着我们继续探索人工智能,向量和矩阵之间的差异将逐渐显现。现在,让我们回到我们的故事。
模型的输入是其特征。我们的鸢尾花数据集有两个特征,花瓣的长度和宽度,这些特征被归类为特征向量(或样本)。一个特征向量作为模型的输入。二分类模型的输出通常是一个数字,表示模型认为输入属于类别 1 的概率。对于我们的示例,我们将向模型提供一个由两个特征组成的特征向量,并期望得到一个输出,帮助我们决定是否应将输入标记为I. versicolor。如果不是,我们就将输入标记为I. setosa,因为我们假设输入总是属于其中之一。
机器学习的礼仪规定,我们应该测试我们的模型;否则,怎么知道它是否有效呢?你可能会认为当模型把所有训练样本都预测正确时,它就有效,但经验告诉我们,这并不总是如此。正确的测试模型的方法是保留一些标注过的训练数据,用于训练后测试。模型在这些保留的测试数据集上的表现,能更好地反映模型学习的效果。我们将使用 80 个标注样本进行训练,保留 20 个用于测试,确保训练集和测试集大致包含相同比例的两类(花的种类)。在实践中,这一点也是至关重要的。若我们从未向模型展示某类输入数据,它又怎能学会区分该类和其他类呢?
使用保留的测试集来判断模型的表现不仅仅是礼仪问题,它还涉及机器学习中的一个基础问题:泛化。一些机器学习模型遵循的过程与一个广泛使用的方法——优化——非常相似。科学家和工程师使用优化方法将测量数据拟合到已知的函数;机器学习模型也使用优化方法来调节其参数,但目标不同。拟合数据到一个函数,如拟合一条线,目的是创造最佳的拟合,即最能解释测量数据的那条线。而在机器学习中,我们的目标是训练一个模型,让它学会训练数据的一般特征,以便能够泛化到新的数据上。这就是为什么我们使用保留的测试集来评估模型的原因。对模型而言,测试集包含了它未曾使用过的、未知的数据,模型没有用这些数据来调整其参数。模型在测试集上的表现,是它泛化能力的线索。
我们的示例有两个输入特征,这意味着特征向量是二维的。由于只有两个维度,我们可以选择绘制训练数据集的图形。(如果特征向量有两个或三个特征,我们可以绘制这些特征向量。然而,大多数特征向量有成百上千个特征。我不知道你怎么样,但我无法可视化一个千维的空间。)
图 1-2 展示了二维鸢尾花训练数据;x轴为花瓣长度,y轴为花瓣宽度。圆圈表示I. setosa的实例,方块表示I. versicolor的实例。每个圆圈或方块代表一个单独的训练样本,即某一朵花的花瓣长度和花瓣宽度。为了定位每个点,首先找到花瓣长度在x轴的位置,再找到花瓣宽度在y轴的位置。然后,从x轴向上移动,从y轴向右移动。手指相遇的地方即为代表该花朵的点。如果该花是I. setosa,则用圆圈表示该点;否则,用方块表示该点。

图 1-2:鸢尾花训练数据
图 1-2 中的图示展示了训练集的特征空间。在这种情况下,我们可以直接可视化训练集,因为我们只有两个特征。当不可行时,也并非毫无办法。存在一些先进的算法,允许我们制作像图 1-2 那样的图,其中二维或三维中的点反映了样本在更高维空间中的分布。在这里,空间一词与日常语言中的含义几乎相同。
仔细看看图 1-2。你看到什么了吗?不同的类别是混杂在一起还是分得很清楚?每个圆圈都位于图示的左下角,而所有方块都在右上角。类别之间没有重叠,这意味着它们在特征空间中完全分开。
我们如何利用这一事实来构建一个分类器,一个分类鸢尾花的模型呢?(虽然模型是更为通用的术语,因为并非所有模型都会将输入分到类别中,但当它们这样做时,我们使用术语分类器。)
我们有许多模型类型可以选择作为我们的分类器,包括决策树,它们生成一系列与特征相关的“是/否”问题,用于决定针对给定输入输出的类别标签。当这些问题以视觉形式展示时,它们形成了一种类似倒置树形的结构。可以把决策树看作是计算机生成版的“20 个问题”游戏。
尽管我们有两个特征,花瓣长度和花瓣宽度,但我们可以通过询问一个简单的问题来分类新的鸢尾花:花瓣长度是否小于 2.5 厘米?如果答案是“是”,则返回类别 0,I. setosa;否则,返回类别 1,I. versicolor。为了正确分类训练数据,我们只需要这个简单问题的答案。
你明白我刚才做了什么吗?我说问题正确地对所有训练数据进行了分类。那么我们没有使用的那 20 个测试样本呢?我们的单问题分类器足够为每一个测试样本分配正确的标签吗?实际上,这正是我们想要了解的内容,这也是我们会报告的分类器的表现。
图 1-3 再次展示了训练数据,以及我们没有用于构建单问题分类器的测试数据。实心圆圈和方块表示测试数据。

图 1-3:包含保留的测试数据(实心)的鸢尾花训练数据
没有任何测试数据违反我们的规则;我们仍然通过询问花瓣长度是否小于 2.5 厘米来获得正确的类别标签。因此,我们的模型是完美的;它没有犯任何错误。恭喜你,你刚刚创建了你的第一个机器学习模型!
我们应该感到高兴,但不要太高兴。让我们重复这个练习,将I. setosa替换为剩余的鸢尾花种类,I. virginica。这将导致图 1-4,其中三角形表示I. virginica的实例。

图 1-4:新的鸢尾花训练数据
嗯,现在情况变得不那么清晰了。类别之间的明显差距消失了,它们开始重叠。
我使用这个新的鸢尾花数据集训练了一个决策树。像之前一样,有 80 个样本用于训练,20 个样本被留作测试。这次,模型并不完美。它正确标记了 20 个样本中的 18 个,准确率为 9/10,即 90%。这大致意味着,当该模型将花卉分配到特定类别时,正确的概率是 90%。为了严谨起见,上一句话需要仔细澄清,但现在你明白了——机器学习模型并不总是完美的;它们(相当频繁地)会犯错误。
图 1-5 显示了学习到的决策树。从顶部开始,那是根节点,并回答该框中的问题。如果答案是“是”,则移到左侧的框;否则,移到右侧。继续以这种方式回答问题并移动,直到到达一个叶节点:没有箭头的框。该框中的标签被分配给输入。

图 1-5:I. virginica 与 I. versicolor 的决策树
第一个决策树分类器是微不足道的,因为回答一个简单的问题就足以决定类别成员身份。第二个决策树分类器则更为常见。大多数机器学习模型并不特别简单。虽然它们的运作是可以理解的,但理解它们为何如此运作是完全不同的事情。决策树是少数几种可以自我解释的模型类型之一。对于任何输入,路径从根节点到叶节点的过程在图 1-5 中详细解释了为什么该输入被分配了特定的标签。而现代 AI 背后的神经网络则不那么透明。
为了让模型在“实际环境”中表现良好,即在现实世界中使用时,训练模型所使用的数据必须覆盖模型可能遇到的所有输入范围。例如,假设我们想要一个模型来识别狗的图片,而我们的训练集只包含狗和鹦鹉的图片。虽然模型在我们的保留测试集上表现良好,该测试集也包含狗和鹦鹉的图片,但当我们部署模型并遇到一张狼的图片时会发生什么呢?直观上,我们可能期望模型会说“这是只狗”,就像一个小孩子在他们学习到狼是什么之前可能会这么说。这正是大多数机器学习模型会做的事情。
为了说明这一点,让我们做一个实验。所有 AI 研究人员都使用的一个流行数据集包含了成千上万张包含手写数字(0 到 9)的图像。它有一个不太吸引人的名字——MNIST(修改版的 NIST),因为它是在 1990 年代末期从美国国家标准与技术研究院(NIST)构建的数据集中派生出来的,NIST 是美国商务部下设的一个部门,负责为商业和工业领域几乎所有事物制定标准。
图 1-6 展示了一些典型的 MNIST 数字样本。我们的目标是构建一个神经网络,能够识别数字 0、1、3 和 9。我们可以在不知道神经网络具体工作原理的情况下进行训练,因为有像 scikit-learn 这样的强大开源工具包可以供大家使用。一方面,这使得 AI 变得更加民主化;另一方面,缺乏知识往往会带来危险。模型可能看起来表现良好,实际上却存在缺陷,而如果不了解模型的工作原理,可能无法在为时已晚之前意识到这个问题。

图 1-6:典型的 MNIST 数字样本
在分类器训练完成后,我们将通过向其输入一些从未在训练中出现过的四和七的图像来给它设置一些“难题”。这个模型会如何处理这些输入呢?
我使用开源工具包训练了数字分类模型。现在,我们只需要了解数据集的情况:输入特征向量是展开的数字图像;第一行像素之后是第二行,然后是第三行,依此类推,直到整个图像被展开成一个长向量,即一串数字。这些数字图像是 28×28 像素,特征向量的长度为 784 个数字。我们要求神经网络在一个 784 维的空间中进行学习,而不是我们之前使用的简单二维空间,但机器学习能够应对这个挑战。
用来训练神经网络模型的训练集包含了 24,745 个样本,每种数字类型(0、1、3、9)大约有 6,000 个样本。这应该足够公平地代表模型在使用过程中可能遇到的数字类型,但我们需要实际尝试才能知道。AI 是一个高度经验性的学科。
保留的测试集也包含数字 0、1、3 和 9,共有 4,134 个样本(每个数字大约 1,000 个样本)。
我们将使用一个混淆矩阵,它是一个二维的数字表格,用来评估模型。混淆矩阵是最常见的评估模型的方法,因为它能展示模型在测试数据上的表现。
在这种情况下,我们的数字分类器的混淆矩阵如表 1-1 所示。
表 1-1:数字分类器混淆矩阵
| 0 | 1 | 3 | 9 | |
|---|---|---|---|---|
| 0 | 978 | 0 | 1 | 1 |
| 1 | 2 | 1,128 | 3 | 2 |
| 3 | 5 | 0 | 997 | 8 |
| 9 | 5 | 1 | 8 | 995 |
矩阵的行表示提供给模型的样本的真实标签。列则是模型的响应。表格中的数值表示每种可能的输入类别和模型分配标签组合的出现次数。
例如,第一行表示测试集中的零。在这 980 个输入中,模型对 978 个返回了零标签,但有一次它将输入标记为三,另一次标记为九。因此,当输入为零时,模型输出正确的次数是 980 次中的 978 次。这是值得鼓舞的。
类似地,当输入为 1 时,模型正确地返回了 1128 次标签。对于 3,模型正确了 997 次,针对 9,模型正确了 995 次。当一个分类器表现好时,从左上到右下的混淆矩阵对角线上的数字会很高,且几乎没有偏离对角线的数字。偏离对角线的数字表示模型的错误。
总的来说,数字模型的准确率达到了 99%。我们有一个稳定且表现良好的模型——前提是我们能确保模型的输入确实是 0、1、3 或 9。可是如果输入不是这些呢?
我输入了 982 个数字 4,模型是这么回复的:
| 0 | 1 | 3 | 9 |
|---|---|---|---|
| 48 | 9 | 8 | 917 |
换句话说,模型对 982 个数字 4 中的 917 个返回了标签 9,对 48 个数字 4 返回了标签 1,其他的则返回了标签 1 或 3。那对于 7 呢?
| 0 | 1 | 3 | 9 |
|---|---|---|---|
| 19 | 20 | 227 | 762 |
模型仍然倾向于把 7 当成 9,但它也常常把 7 当成 3。神经网络在解释其行为时不愿意透露过多信息,但在这个案例中,227 个被标记为三的 7 中,有 47 个是带有斜线的欧洲风格 7。从整个数据集中随机抽取的 227 个 7 中,只有 24 个是带有斜线的欧洲风格 7。这个比较在数学上不严谨,但它暗示了带斜线的 7 通常足够像 3,容易让模型误判。
模型从未被训练去识别数字 4 或 7,因此它做了最好的尝试,把它们放入了相邻的类别中。根据写法的不同,人们有时会把数字 4 和 7 误认为是 9。例如,模型犯了人们常犯的错误,这很有趣——但更重要的是,模型的表现较差,因为它没有在可能遇到的所有输入上进行训练。它没有办法说“我不知道”,而且让模型可靠地做出这样的判断可能是棘手的。
这是一个简单的练习,但其含义深远。假设模型不是在识别数字,而是在医学图像中寻找癌症,但它从未被训练去识别一种重要的病变类型或该病变可能呈现的所有形式呢?一个构建合理且全面的数据集可能意味着生死之间的差异。
我们也可以从插值和外推的角度来思考数字示例。插值是在已知数据范围内进行近似,而外推则超出了已知数据的范围。
对于数字示例,插值可能是指在实际中遇到一个倾斜的零,而训练集中的零并没有特别倾斜。模型必须进行插值,在某种意义上,才能正确响应。外推更像是对一个有斜杠的零进行分类,这是训练时从未见过的情况。为了更好地理解这些术语,我们来模拟 1950 年到 2020 年的世界人口。
首先,我们将对 1950 年到 1970 年的数据进行线性拟合。拟合一条直线是一种曲线拟合的形式;可以把它看作是机器学习中不那么复杂的“表亲”。要拟合一条直线,需要找出两个数字:斜率和截距。斜率告诉我们直线的陡峭程度。如果斜率是正的,直线就会随着我们从左到右沿着图表的x轴移动而上升。负斜率意味着直线会随着我们沿着x轴移动而下降。截距是直线与y轴交点的位置;也就是输入为零时的值。
要拟合一条直线,我们使用一个算法来找到最能描述数据(这里是 1950 年到 1970 年世界人口)的斜率和截距。图 1-7 展示了这条直线的图表,以及每年的实际人口,用加号表示。直线穿过或接近大多数加号,因此拟合是合理的。请注意,人口单位是以十亿为单位的。

图 1-7:1950 年至 1970 年世界人口
一旦我们得到这条直线,就可以利用斜率和截距来估算任何年份的人口。对 1950 年到 1970 年之间的年份进行估算是插值,因为我们用了这个时间段的数据来创建直线。如果我们估算 1950 年之前或 1970 年之后的人口,那就是外推。表 1-2 展示了我们进行插值时的结果。
表 1-2: 1950 年到 1970 年之间的插值人口
| 年份 | 插值人口 | 实际人口 |
|---|---|---|
| 1954 | 2.71 | 2.72 |
| 1960 | 3.06 | 3.03 |
| 1966 | 3.41 | 3.41 |
插值后的人口值与实际人口值非常接近,这意味着模型(这里是拟合到数据的直线)表现良好。现在,让我们进行外推,估算拟合范围之外的日期,如表 1-3 所示。
表 1-3: 1970 年之后的外推人口
| 年份 | 外推人口 | 实际人口 |
|---|---|---|
| 1995 | 5.10 | 5.74 |
| 2010 | 5.98 | 6.96 |
| 2020 | 6.56 | 7.79 |
外推人口值与实际人口值之间的差距逐年增加。模型的表现不佳。绘制 1950 年到 2020 年整个范围的数据,揭示了问题所在;见图 1-8。

图 1-8:1950 年至 2020 年世界人口
随着时间的推移,拟合线变得越来越不准确,因为数据毕竟不是线性的。也就是说,增长速率不是恒定的,并且不遵循直线。
在进行外推时,我们可能会有理由相信数据将继续符合这条线;如果这是一个有效的假设,那么这条线将继续是一个很好的拟合。然而,在现实世界中,我们通常无法获得这样的保证。因此,我们可以把它作为口号:插值好,外推坏。
为一些数据拟合一条线是曲线拟合的一个例子。曲线拟合的规律同样适用于人工智能。当手写数字模型接收到与它训练时识别的数据相似的输入时,它的表现不错。测试数据中的数字都是 0、1、3 和 9,因此测试数据与训练数据相似。两个数据集来自相同的分布,并且是由相同的数据生成过程生成的。因此,我们可以说,在这些情况下,模型实际上是在进行插值。然而,当我们强迫模型做出关于 4 和 7 的决策时,我们是在进行外推,让模型对它在训练过程中从未见过的数据做出决策。
需要重复强调的是:插值好,外推坏。糟糕的数据集导致糟糕的模型;好的数据集导致好的模型,但当强迫它们进行外推时,它们会表现得很差。而且,再补充一句:所有的模型都是错误的,但有些是有用的。
跟 Hilaire Belloc 在 1907 年出版的《儿童警示故事》一书中的思路一样——这本书以一种有趣且略显恐怖的方式讲述了孩子们做出愚蠢行为可能导致不幸结局的故事——让我们来看看一些 AI 从业者在训练、测试,尤其是在部署模型时应该警惕的警示故事。
在 2016 年,我参加了一场会议演讲,演讲者展示了关于理解神经网络为何选择某种方式的研究。这仍然是一个未解决的问题,但已有进展。在这种情况下,研究标记了影响模型决策的输入图像部分。
演讲者展示了哈士奇犬和狼的图片,并讨论了他用来区分这两者的分类器。他展示了该分类器在测试集上的表现,并问在场的机器学习研究人员这个模型是否是一个好模型。很多人说是,但有所犹豫,因为他们预期会有陷阱。他们的犹豫是对的。随后,演讲者标记了图像,展示了神经网络在做出决策时关注的部分。模型并没有关注狗或狼。相反,模型注意到所有狼的训练图像背景中都有雪,而狗的图像中没有雪。模型并没有学习狗和狼的特征,而是学会了雪和没有雪的区别。如果不小心接受模型的行为,可能就无法发现这个问题,模型可能会被部署后在实际环境中失败。
关于上世纪五六十年代非常早期的机器学习系统,也有类似的故事。这个故事可能是虚构的,尽管我曾读过一篇来自那个时期的论文,可能就是这个都市传说的来源。在这个例子中,图像是森林的鸟瞰图。有些图像中包含了坦克,而有些则没有。
一个经过训练来检测坦克的模型在训练数据上似乎效果很好,但在实际环境中却惨败。最终人们意识到,一组训练图像是在阳光明媚的日子拍摄的,另一组则是在多云的日子拍摄的。该模型并没有学到它的创造者所假设的内容。
在更先进的机器学习模型中,类似的现象依然存在。有些模型甚至让专家误以为它学到了关于语言或类似内容的基本知识,而实际上,它只是学到了训练数据中一些极为细微的相关性,是人类(或机器)难以察觉的。
相关性 这个词有严格的数学意义,但我们用“相关性并不意味着因果关系”这一说法来捕捉它的本质。相关性是指两件事物之间存在联系,以至于一个的发生意味着另一个的发生,通常是按特定的顺序。更具体地说,相关性衡量的是一件事物变化与另一件事物变化的关联强度。如果两者都增加,它们是正相关的。如果一个增加而另一个减少,它们是负相关的。
例如,一只公鸡打鸣,太阳升起。这两个事件是时间相关的:先是公鸡,然后是太阳。这种相关性并不意味着因果关系,因为公鸡打鸣并不导致太阳升起,但如果这种相关性被观察得足够频繁,人类大脑就会开始认为一个是导致另一个的原因,即使没有真实证据表明如此。为什么人类会这样反应并不难理解。进化青睐那些能够做出这种关联的早期人类,因为有时这些关联促成了对生存有利的行为。
“相关性并不意味着因果关系”同样适用于人工智能。上述的模型学会了检测与目标(狗、狼、坦克)相关的训练数据中的东西,但并没有学到目标本身。精明的机器学习从业者总是警惕这种虚假的相关性。使用大规模且高度多样化的训练和测试数据集可以防止这种现象,尽管在实践中这并不总是可能的。
我们必须问自己,模型是否学到了我们假设它们已经学到的东西。正如我们在 MNIST 数字例子中看到的那样,我们必须确保模型已经看到了它们在实际环境中可能遇到的所有类型的输入——它们应该进行插值,而不是外推。
这比最初看起来更重要。谷歌在 2015 年通过 Google 照片的一个功能学到了这一课,模型在训练人脸时不足,导致做出了错误和不适当的关联。偏见,无论是泛指的还是社会层面的,都是人工智能中的一个真实问题。
让我们进行另一个实验,使用 MNIST 数字。此次,模型需要做出一个看似简单的决定:输入的数字是否是 9?该模型与之前使用的神经网络相同。如果在一个数据集中训练,其中每张图片要么是 9,要么是除 4 和 7 以外的其他任何数字(即,训练数据中没有 4 或 7),那么模型的准确率是 99%,正如混淆矩阵所示:
| 不是 9 | 9 | |
|---|---|---|
| 不是 9 | 9,754 | 23 |
| 9 | 38 | 1,362 |
混淆矩阵告诉我们,模型正确标记了 9,777 张测试图片中除 9 以外的 9,754 张图片。对于 1,400 张数字 9,模型的标签也正确标记了其中的 1,362 张。虽然模型在测试集上表现良好,但该测试集并不包含数字 4 或 7。
在这种情况下,混淆矩阵较小,因为模型只有两个类别:9 或非 9。换句话说,这是一个二元模型。
矩阵右上角的 23 代表 23 次输入不是 9,但模型却说它是 9。对于一个二元模型,通常将类别 1 视为感兴趣的类别,即正类。因此,这 23 个输入代表了假阳性,因为模型说“它是 9”,但实际上不是。同样,左下角的 38 个样本是假阴性,因为模型说“它不是 9”,但输入实际上是 9。我们希望模型没有假阳性或假阴性,但有时最重要的是最小化其中一个。
例如,如果一个模型用于检测乳腺 X 光片中的乳腺癌,假阳性代表模型说“可能是癌症”,即使它不是。听到这个可能会让人害怕,但进一步的测试会显示模型是错误的。然而,假阴性代表漏诊癌症。如果一个模型几乎没有假阴性,我们可能会容忍更多的假阳性,因为假阳性比假阴性更不致命。我们开始意识到,全面训练、表征、测试并理解我们的机器学习模型是多么重要。
好的,回到我们的实验。像我们之前的 MNIST 模型一样,“这是 9 吗”分类器对数字 4 或 7 一无所知。当它看到数字 4 和 7 时,MNIST 模型通常会将它们误认为是 9。这个模型会做出相同的判断吗?这是我在给模型输入数字 4 和 7 时得到的结果:
| 不是 9 | 9 | |
|---|---|---|
| 不是 9 | 5,014 | 9,103 |
模型将 14,117 个四和七中的 9,103 个标记为九。这略高于 65%,大约是每三个中有两个。这模拟了我们将模型输入它从未接受过训练的类型的情况。
让我们通过将四和七添加到训练集中来帮助模型。希望提供一些例子,告诉模型:“它看起来像九,但它不是”,正式称为困难负样本,能够改进模型。我将 3%的训练数据设为四和七。整体模型的准确度与之前一样,99%,而当我给它一些它从未见过的四和七时,结果如下:
| 不是 9 | 9 | |
|---|---|---|
| 不是 9 | 9,385 | 3,321 |
这样就好多了。模型不再将三分之二的四或七标记为九,而是只将四分之一标记为九。即使是一些看起来像正类但不是的例子也能有所帮助。如果我将训练集中四和七的比例提高到 18%,模型将误分类四和七的情况低于 1%。因为模型是从数据中学习的,我们必须使用尽可能完整的数据集,以便模型能够插值而不是外推。
注意
为了完全准确,最近的研究表明,现代深度学习模型几乎总是在进行外推,但输入与模型训练数据越相似,性能越好,因此我觉得使用这个类比是合理的。
每个想要理解并且与 AI 打交道的人都必须认真对待有关用于训练 AI 模型数据质量的警告。2021 年由迈克尔·罗伯茨等人发表在《自然机器智能》期刊上的一篇研究文章《利用胸部 X 光片和 CT 扫描检测和预测 COVID-19 的机器学习常见陷阱及建议》是一个令人警醒的例子。作者评估了用于检测胸部 X 光片和 CT 扫描中的 COVID-19 的机器学习模型的表现,并将最初的超过 2,000 个研究(模型)筛选到 62 个进行严格测试。最终,作者宣称没有一个模型适合临床使用,因为模型构建存在缺陷,数据集存在偏差,或两者兼有。
这样的结果促成了可解释的人工智能这一子领域的诞生,旨在让模型具备自我解释的能力。
看看你的数据,并尽可能地理解你的模型在做什么,以及为什么。
本章标题“我们出发了”是喜剧演员杰基·格里森的口头禅。通常,在深入了解之前先快速浏览一遍主题是很好的,这样可以帮助我们在更深入地理解时拥有一个整体的视角。换句话说,我们快速进入主题,先了解一下,再更加有条理地进行探索。
本章中引入的许多新术语和概念可以在书本末尾的词汇表中找到。我的目标并不是让你现在就理解它们,更不要说记住它们,而是播下种子,以便下次你遇到这些术语或概念时,你更有可能想到:“啊,我知道这个。” 后续章节会加深这些概念,你将通过反复接触学习到重要的内容。
本章有两个要点需要记住。第一个是关于人工智能是什么以及它的基本构成。第二个是关于建立直觉,理解人工智能的功能以及我们应如何回应。
人工智能涉及模型,这些模型尚未完全明确,但我们可以通过数据对其进行条件化,以执行某些期望的任务。人工智能有很多类型的模型,本章介绍了其中两种:决策树和神经网络。关于决策树我不会再多说,但神经网络占据了书籍的大部分内容。
模型通常最好被视为函数,就像你在学校里可能记得的数学函数,或者构成大多数计算机程序核心的函数。它们都可以被看作是黑箱,其中有东西输入(输入),然后有东西输出(输出)。在人工智能中,输入是特征向量,它是根据当前任务所需的内容的集合。在本章中,我们使用了两个特征向量:花朵的测量值和手写数字的图像。
训练通过调整模型的参数来使其尽可能准确。这要求在训练大多数模型时要小心,以确保它学习到数据的通用特征,而不是虚假的关联或训练集的微小细节(这一概念称为过拟合,我们将在第四章讨论)。
正确开发机器学习模型意味着我们必须拥有一个测试集,它是已知输入和输出对的集合,在训练时不会使用该数据集。我们在训练后使用这个数据集来评估模型。如果数据集构建得当,测试集可以为我们提供模型在实际应用中表现如何的预期。
第二个要点与人工智能的优势及我们应如何应对有关。尽管人工智能强大,但它并不像我们一样思考(尽管第七章的模型可能会不同意)。人工智能的生死由数据决定,只有我们提供给它的数据好,它才好。如果数据集有偏差,人工智能就有偏差。如果数据集未能包括它在实际使用中可能遇到的输入类型的例子,人工智能将无法正确处理这些输入。
本章中的示例提醒我们,在假设人工智能按预期操作时要小心。模型是否学到了我们希望它学到的内容?它是否受到数据中我们未注意到的关联性影响,或者更糟糕的是,受到我们有限能力所无法察觉的影响?回想一下哈士奇与狼的例子。
因为 AI 的效果取决于输入给它的数据,我们有责任使数据集公平且无偏,并理解 AI 真正学到了什么,而不是做出假设。
AI 首次出现在 1950 年代,那么为什么它现在突然无处不在?下一章将回答这个问题。
关键术语
算法、人工智能、分类器、类别标签、混淆矩阵、数据集、决策树、深度学习、可解释 AI、特征、特征向量、机器学习、模型、神经网络、参数、测试、训练
第三章:为什么是现在?人工智能的历史

罗温·艾金森的喜剧杰作《憨豆先生》开场时是在一个空无一人的伦敦街头的深夜。聚光灯打在一个人身上,主角从天而降,拉丁语合唱团唱道:“ecce homo qui est faba”——看啊,这就是一个豆子人。憨豆先生爬起来,拍掉身上的灰尘,笨拙地跑进黑暗中。他是一个异世界的存在,一个字面上从天而降、难以理解的存在。
鉴于近年来人工智能不断涌现的奇迹,我们或许会误以为人工智能就像《憨豆先生》一样,从天而降,已经完全形成且超出了我们的理解。然而,这一切都不是真的;事实上,我认为人工智能仍处于初期阶段。
那么,为什么现在我们会听到关于人工智能的讨论呢?我将通过一段简短(且带有偏见)的人工智能历史来回答这个问题,并讨论推动人工智能革命的计算技术进展。本章为我们接下来将在全书中探讨的模型提供了背景。
自人工智能诞生以来,它一直分为两大阵营:符号主义人工智能和联结主义。符号主义人工智能试图通过操作符号、逻辑陈述或关联来模拟智能。而联结主义则通过构建简单组件的网络来模拟智能。人类大脑体现了这两种方法。我们使用符号作为思维和语言的元素,我们的大脑由极其复杂的神经元网络构成,每个神经元都是一个简单的处理器。在计算机编程术语中,符号主义人工智能的方法是自上而下的,而联结主义则是自下而上的。自上而下的设计从高级任务开始,然后将任务拆解成越来越小的部分。自下而上的设计从较小的部分开始,并将它们组合在一起。
符号主义人工智能的支持者认为,智能可以在抽象层面上实现,而不需要类似大脑的基质。联结主义者则遵循大脑的进化发展,认为必须有某种基础,比如一个庞大且高度互联的神经元网络,从中可以产生智能(无论如何定义)。
虽然符号主义人工智能与联结主义的辩论持续了很长时间,但随着深度学习的出现,可以肯定地说,联结主义者已经赢得了这场战斗——尽管可能还不是最终的胜利者。近年来,出现了一些融合这两种方法的论文。我猜测符号主义人工智能还有一两次短暂的亮相,甚至可能最终以配角身份登场。
我在 1980 年代末接触到的人工智能完全是符号主义的。联结主义被提到作为另一种方法,但当时认为神经网络不如符号主义,并且最多只会是边缘性有用的技术。
人工智能的完整历史超出了我们的讨论范围。这样的宏篇巨著等待着一位有动力且有能力的历史学家来完成。相反,我将聚焦于机器学习的发展,同时(非常不公平地!)忽略了那些在符号派阵营中付出数十年努力的工作。然而,请知道,在人工智能的大部分历史中,人们主要讨论的是符号 AI,而不是联结主义。为了更公平的呈现,我推荐迈克尔·伍尔德里奇的《人工智能简史》(Flatiron Books, 2021),或者帕梅拉·麦考德克在《这可能很重要:我与人工智能知识分子的生活与时代》(Lulu Press, 2019)中的深刻个人叙述。
鉴于我明显的联结主义偏见,让我们一起回顾一下机器学习的历史。
1900 年之前
智能机器的梦想可以追溯到古代。古希腊人讲述了塔罗斯的神话,塔罗斯是一个巨大的机器人,用来守护腓尼基公主欧罗巴。在中世纪和文艺复兴时期,许多自动机——会动且看起来栩栩如生的机器——被开发出来。然而,我怀疑当时没有人认为这些机器是智能的或具备思维能力的。有些甚至是骗局,比如臭名昭著的“机械土耳克”,它通过与许多高水平的棋手对弈并击败他们,令世人惊叹。最终,人们发现机器中隐藏着一个人,他通过操控机械臂在棋盘上移动独立的棋子,同时从下面观察棋盘的配置,来控制这个“自动机”。尽管如此,这台机器的机械部分对于 18 世纪末期来说,仍然相当令人印象深刻。
除了自动机之外,还有早期的尝试试图将思维理解为一种机械过程,并且努力构建能够捕捉思维的逻辑系统。在 17 世纪,戈特弗里德·莱布尼茨抽象地描述了这样的概念,称其为“思维的字母表”。在 1750 年代,朱利安·奥夫雷·德·拉梅特里出版了《人类机器》(L’Homme Machine),主张思维是一个机械过程。
认为人类的思维可能来源于大脑的物理实体而非精神灵魂的想法,标志着通向人工智能的新篇章的开始。如果我们的思维是生物机器,为什么不能有另一种能够思考的机器呢?
在 19 世纪,乔治·布尔尝试创造一种思维的演算法,最终产生了我们现在所知的布尔代数。计算机依赖于布尔代数,甚至到它代表着计算机的实现形式——数字逻辑门的集合。布尔部分成功了,但他并未达成自己的目标:“调查那些思维运作的基本法则,通过这些法则进行推理;并用演算符号语言加以表达”(《思维的法则》,1854 年)。布尔愿意尝试的精神,代表了朝向人工智能可能性的又一步迈进。
这些早期尝试所缺乏的是一个真正的计算机器。人们可以梦想人工智能或生物(如玛丽·雪莱的弗兰肯斯坦中的生物),并假设它们的存在,讨论其后果。但在没有一个能够合理模仿(实现?)思维的机器之前,其他一切都只是猜测。
正是英国人查尔斯·巴贝奇在 19 世纪中期首次构想到一个可实现的通用计算机器——分析机。尽管这台机器从未完全建成,但它包含了现代计算机的所有基本组件,并且理论上能够执行相同的操作。虽然不清楚巴贝奇是否意识到他那台机器的潜在多功能性,但他的朋友艾达·洛夫莱斯确实意识到了这一点。她将这台机器描述为一种广泛适用的通用设备。尽管如此,她并不认为这台机器能够进行思考,正如她在 1843 年所写的《分析机概述》中的这段话所表明的:
分析机完全没有任何原创的野心。它可以做我们知道如何指令它执行的任何事情。它可以进行分析;但它没有预见任何分析关系或真理的能力。它的职能是帮助我们利用我们已经了解的东西。
这句话可能是首次提到人工智能的可能性,并涉及一个可能实现这一目标的设备。短语“做我们知道如何指令它执行的任何事”意味着编程。事实上,洛夫莱斯为分析机编写了一个程序。正因为如此,许多人认为她是第一位计算机程序员。她的程序中有一个漏洞,这让我相信她确实是;没有什么比漏洞更能代表编程了,正如我 40 多年的编程经验所痛苦地证明的那样。
1900 到 1950
1936 年,当时还是学生的 24 岁英国人艾伦·图灵,写了一篇后来成为计算机科学基石的论文。在这篇论文中,图灵提出了一个通用的概念机器,今天我们称之为图灵机,并证明它可以计算任何由算法表示的事物。他还解释了有些事物是算法无法实现的,因此是不可计算的。由于所有现代编程语言都等同于图灵机,现代计算机可以实现任何算法并计算任何可计算的东西。然而,这并没有说明计算可能需要多长时间或需要多少内存。
如果计算机能够计算任何可以实现为算法的事情,那么计算机就能执行人类能够执行的任何思维操作。最终,这就是可能实现真正人工智能的引擎。图灵在 1950 年发表的论文《计算机器与智能》首次认识到数字计算机最终可能会导致智能机器的诞生。在这篇论文中,图灵描述了他的“模仿游戏”,现在被称为图灵测试,通过该测试,人类可能会认为一台机器是智能的。近年来,关于通过图灵测试的人工智能系统有很多宣称,其中之一就是 OpenAI 的 ChatGPT。然而,少数人会倾向于认为 ChatGPT 是真正智能的——换句话说,我怀疑这个测试未必能捕捉到人类普遍理解的“智能”含义,未来可能会出现新的测试。
1943 年,沃伦·麦卡洛克和沃尔特·皮茨写下了《神经活动中固有思想的逻辑演算》,这篇论文的标题可以说是最晦涩却引人入胜的之一。这篇论文将“神经网络”(即神经元的集合)表示为数学中的逻辑语句。这些逻辑语句难以解析(至少对我来说是这样),但作者对“没有回路的网络”的描述与我们在第四章中将要探讨的神经网络非常相似——实际上,有人可以认为麦卡洛克和皮茨的开创性论文导致了我们今天所认知的神经网络。坦率来说,神经网络比这篇论文更容易解析和理解,这对我们来说是个好消息。
从关于人工智能机器和生物的幻想故事,到严肃探讨数学是否能够捕捉思维和推理,再到意识到数字计算机能够计算任何可以通过算法描述的事务,这一系列进展为人工智能作为一个合法的研究领域的出现奠定了基础。
1950 到 1970
1956 年达特茅斯夏季人工智能研究项目研讨会通常被认为是人工智能的发源地,也是“人工智能”这一术语首次被一致使用的地方。达特茅斯研讨会的参与者不到 50 人,但名单中包括了计算机科学和数学领域的几位知名人物:雷·所罗门诺夫、约翰·麦卡锡、马文·明斯基、克劳德·香农、约翰·纳什和沃伦·麦卡洛克等人。当时,计算机科学是数学的一个子领域。该研讨会是一次头脑风暴,为早期的人工智能研究奠定了基础。
1957 年,康奈尔大学的弗兰克·罗森布拉特创造了马克 I 感知机,被广泛认为是神经网络的首次应用。感知机在许多方面都非常出色,包括它被设计用于图像识别,这也是深度学习在 2012 年首次证明自己有效的应用领域。
图 2-1 展示了在《感知机操作手册》中给出的概念性组织结构。感知机使用一个 20×20 像素的数字化电视图像作为输入,然后通过一组“随机”连接传递到一组关联单元,最终导致响应单元的输出。这个配置与今天一些深度学习图像处理方法类似,且类似于一种称为极限学习机的神经网络类型。

图 2-1:Mark I 感知机的组织结构
如果感知机走在正确的道路上,为什么它在几十年里几乎被遗忘了呢?其中一个原因是罗森布拉特的夸张言辞。1958 年,美国海军(感知机项目的资助方)组织的一次会议上,罗森布拉特的言论夸大其词,以至于纽约时报报道了以下内容:
海军今天揭示了一款电子计算机的雏形,预计它将能够走路、说话、看见、写作、自我复制,并意识到自己的存在。后来,感知机将能够识别人物并呼唤他们的名字,甚至瞬间将一种语言的语音翻译为另一种语言的语音和文字,预计如此。
这些评论在当时引起了许多人的不满,尽管现代的人工智能系统确实允许机器走路、说话、看见、写作、识别人物,并且能够在不同语言之间进行语音和文字的翻译,也许我们应该对罗森布拉特宽容一些。他只是早了约 60 年。
几年后,1963 年,伦纳德·厄尔和查尔斯·沃斯勒描述了一个程序,类似于感知机,能够解释作为 0 和 1 的矩阵表示的 20×20 像素图像。与感知机不同,这个程序能够生成必要的图像特征模式和组合,以便学习其输入。厄尔和沃斯勒的程序与 30 多年后出现的卷积神经网络相似,后者是第五章的主题。
我所称之为“经典”机器学习模型的第一个出现是在 1967 年,得益于托马斯·科弗和彼得·哈特。他们提出的最近邻是所有机器学习模型中最简单的一种,甚至可以说有些令人羞愧。为了标记一个未知输入,它只需找到最相似的已知输入,并将该输入的标签作为输出。当使用多个邻近的已知输入时,这种方法被称为k 最近邻,其中k是一个小数值,例如 3 或 5。哈特后来与理查德·杜达和大卫·斯托克一起于 1973 年撰写了《模式分类》的第一版;这本开创性著作使许多计算机科学家和软件工程师(包括我)接触到了机器学习。
感知机的成功在 1969 年戛然而止,当时马文·明斯基和西摩·帕珀特发布了他们的书籍《感知机》,书中展示了单层和双层感知机网络无法处理有趣任务的事实。我们稍后会解释“单层”和“双层”是什么意思。与《感知机》一书一起,1973 年詹姆斯·莱特希尔发布的《人工智能:通用调查》(通常被称为“莱特希尔报告”)共同引发了现在所称的第一次 AI 寒冬;人工智能研究的资金迅速枯竭。
明斯基和帕珀特对感知机模型的批评是有道理的;然而,许多人忽略了他们的观察——这些限制并不适用于更复杂的感知机模型。无论如何,损害已经造成,联结主义几乎在 1980 年代初期消失。
请注意“几乎”。1979 年,福岛邦彦发布了一篇论文,该论文于 1980 年被翻译成英文,名为“Neocognitron: A Self-Organizing Neural Network Model for a Mechanism of Pattern Recognition Unaffected by Shift in Position”。“Neocognitron”这个名字并未广泛传播,这也许是过去三十年计算机科学中“tron”后缀的最后一次使用。虽然乌尔和沃斯勒在 1963 年的程序与卷积神经网络有一些相似之处,但对许多人而言,Neocognitron 才是最初的形式。卷积神经网络的成功直接引发了当前的 AI 革命。
1980 到 1990
在 1980 年代初,随着专门为运行 Lisp 编程语言设计的计算机的出现,人工智能开始商业化,Lisp 曾是人工智能的通用语言。(如今,它是 Python。)随着 Lisp 机器的出现,专家系统也崛起——这些软件旨在捕捉专家在特定领域的知识。人工智能的商业化使得第一次 AI 寒冬得以结束。
专家系统背后的概念,确实具有吸引力。例如,要构建一个诊断特定癌症类型的专家系统,你首先采访专家,提取他们的知识并将其整理成知识库。知识库将知识表示为规则和事实的组合。然后,你将知识库与推理引擎结合,推理引擎根据存储的事实或用户输入系统的信息来决定何时以及如何执行规则。规则根据事实触发,这可能导致将新的事实加入知识库,从而触发更多规则,依此类推。一个经典的专家系统示例是 CLIPS,这是 NASA 在 1985 年开发的,并于 1996 年发布到公共领域。
在专家系统中,并没有连接主义网络或单元集合可以(希望)促使智能行为的产生,这使得它成为符号 AI 的一个良好示例。相反,知识库本质上是一个僵化的规则集合,比如“如果发动机温度超过这个阈值,那么另一个原因很可能是这个”,以及事实,比如“发动机温度低于阈值”。知识工程师是专家与专家系统之间的纽带。从专家对知识工程师提出的问题的回答中构建知识库是复杂的,而且随着时间推移,得到的知识库难以修改。然而,设计专家系统的难度并不意味着它们毫无用处;它们仍然存在,主要以“业务规则管理系统”的形式存在,但目前对现代 AI 的影响很小。
围绕专家系统的炒作,加上早期的成功,推动了 1980 年代初期对 AI 的重新关注。但当人们发现专家系统过于脆弱,无法具有广泛的应用时,整个行业陷入低谷,AI 的第二次寒冬在十年中期到来。
在 1980 年代,连接主义者占据了背景位置,但他们并没有停滞不前。1982 年,John Hopfield 展示了现在被称为 Hopfield 网络的模型。Hopfield 网络是一种神经网络,它以分布式的方式存储信息在网络的权重中,然后在稍后的时间提取这些信息。Hopfield 网络在现代深度学习中并不广泛使用,但它们证明了连接主义方法的实用性。
在 1986 年,David Rumelhart、Geoffrey Hinton 和 Ronald Williams 发布了他们的论文《通过反向传播误差学习表示》,该论文概述了用于训练神经网络的反向传播算法。训练神经网络涉及调整神经元之间的权重,以使网络按预期工作。反向传播算法通过计算调整特定权重对网络整体性能的影响,成为使这一过程高效的关键。有了这些信息,就可以通过应用已知的训练数据来迭代地训练网络,然后在分类时使用网络的误差来调整权重,迫使网络在下一次迭代中表现得更好。(我将在第四章中更深入地讨论神经网络训练。)通过反向传播,神经网络可以远远超越 Rosenblatt 的感知机的有限表现。然而,即使有了反向传播,1980 年代的神经网络仍然不过是一些玩具。关于谁发明了反向传播以及何时发明,仍然存在争议,但 1986 年的论文通常被认为是最能影响神经网络研究者的展示。
1990 到 2000
第二次人工智能寒冬延续到 1990 年代,但象征主义和联结主义阵营的研究依然在进行中。科琳娜·科尔特斯(Corinna Cortes)和弗拉基米尔·瓦普尼克(Vladimir Vapnik)于 1995 年将机器学习社区引入了支持向量机(SVM)。从某种意义上讲,SVM 代表了经典机器学习的巅峰。在 1990 年代至 2000 年代初期,SVM 的成功遏制了神经网络的发展。神经网络需要大量的数据集和显著的计算能力;而 SVM 则通常对资源的要求较少。神经网络通过网络的能力来表示一个函数,即从输入到期望输出的映射,而 SVM 则利用巧妙的数学方法简化了复杂的分类问题。
支持向量机(SVM)的成功在学术界和更广泛的软件工程领域都得到了认可,尤其是在涉及机器学习的应用逐渐增多的背景下。虽然公众对这些进展了解甚少,但智能机器仍然频繁出现在科幻作品中。
这场人工智能寒冬在 1997 年以 IBM 的深蓝超算战胜当时的世界象棋冠军加里·卡斯帕罗夫(Garry Kasparov)而结束。当时,几乎没有人认为机器能打败最强的国际象棋选手。有趣的是,十年前,我的一位教授曾预测,人工智能将在 2000 年前实现这一壮举。这个教授是预言家吗?其实不然。深蓝将快速定制硬件与复杂的软件结合,并应用了已知的人工智能搜索算法(特别是 Minimax 算法)。结合启发式方法和其他国际象棋大师提供的丰富定制知识,深蓝能够通过搜索比任何人类选手更多的可能走法,超越人类对手的评估。无论如何,深蓝的核心实施了人工智能专家们所知道的如果机器有足够资源就能打败人类的策略。深蓝的胜利是不可避免的,因为研究人员预计计算机会变得足够快,最终超越人类的能力。所需的东西是已知的;只剩下将这些要素整合在一起。
1998 年,扬·勒昆(Yann LeCun)、莱昂·博图(Léon Bottou)、约书亚·本吉奥(Yoshua Bengio)和帕特里克·哈夫纳(Patrick Haffner)发表了《基于梯度的学习应用于文档识别》的论文,虽然这篇论文没有引起公众的注意,但它对人工智能和世界而言是一个划时代的时刻。福岛的 Neocognitron 与卷积神经网络(CNN)有着强烈的相似性,而这些卷积神经网络正是启动现代人工智能革命的关键技术,这篇论文直接介绍了卷积神经网络以及我们在第一章中使用的(臭名昭著的)MNIST 数据集。1998 年卷积神经网络(CNN)的出现引发了一个问题:为什么世界要等到 14 年后才真正关注到这一技术?我们将在本章后面回到这个问题。
2000 到 2012 年
Leo Breiman 在 2001 年通过将随机森林算法的现有部分组织成一个连贯的整体,介绍了随机森林,这就像 19 世纪达尔文将进化理论整合成一个完整的理论体系一样。随机森林是我们在第三章中要讨论的最后一个经典机器学习算法。如果“随机森林”让你想起第一章中的决策树,那是有原因的:随机森林实际上是由决策树组成的森林。
堆叠去噪自编码器是一种中间模型,它们是我在 2010 年接触深度学习的入门之一。一个自编码器是一个神经网络,它通过一个中间层传递输入数据,然后生成输出。它的目标是从中间层的编码形式重构输入数据。
自编码器可能看起来像是一个愚蠢的玩意儿,但在学习重构输入时,中间层通常会学到一些关于输入的有趣信息,这些信息能够捕捉到输入的本质,而不会关注细微的、琐碎的细节。例如,如果输入是 MNIST 数字,那么自编码器的中间层就会学习到数字的特征,而不是字母。
去噪自编码器类似,但我们会在将输入通过中间层之前随机丢弃一部分输入值。自编码器仍然需要学习重构整个输入,但现在它面临的任务更加困难,因为输入是不完整的。这个过程有助于自编码器的中间层发现输入的更好编码。
最终,堆叠去噪自编码器是由多个去噪自编码器堆叠而成,其中一个自编码器的中间层输出作为下一个自编码器的输入。以这种方式排列时,堆叠学习了输入的一个新表示,这通常有助于附加在堆叠顶部的分类器区分不同的类别。例如,在我当时的工作中,输入是图像的若干小片段,这些片段可能包含感兴趣的目标。使用经过训练的两到三层堆叠去噪自编码器,将输入转换成一个数字列表,这些数字通常能够代表输入的本质,同时忽略图像的细节。然后,这些输出会与支持向量机结合使用,以判断输入是否为目标。
2012 到 2021
深度学习在 2012 年引起了全球的关注,当时 AlexNet,这一特定的卷积神经网络架构,以仅 15%以上的错误率赢得了 ImageNet 挑战赛,远低于任何竞争对手。ImageNet 挑战赛要求模型识别彩色图像的主要主题,无论是狗、猫、割草机等。实际上,“狗”并不是一个足够的答案。ImageNet 数据集包含 1,000 个类别的物体,其中包括大约 120 种不同的狗品种。所以,正确的回答应该是“它是一只边境牧羊犬”或者“它是一只比利时马利诺犬”。
随机猜测意味着将一个类别标签随机分配给每一张图片。在这种情况下,我们可以预期总体成功率为千分之一,或者错误率为 99.9%。AlexNet 的 15%的错误率确实令人印象深刻——那是在 2012 年。到 2017 年,卷积神经网络将错误率降低到大约 3%,低于约 5%的水平,这是少数勇敢地手动进行挑战的人能够实现的。你能分辨出 120 种不同的犬种吗?我当然做不到。
AlexNet 打开了洪水闸门。新模型打破了所有先前的记录,并开始实现没有人真正期望它们实现的任务:比如重新构想图像的风格,生成图像内容及活动的文本描述,或者像人类一样甚至更好地玩视频游戏等等。
这一领域迅速发展,以至于几乎无法跟上每天涌现的新论文。保持最新状态的唯一方法是每年参加多场会议,并审查在如 arXiv(https://www.arxiv.org)这样的站点上首次发布的新研究,这里是许多领域的研究首发地。这促使了像https://www.arxiv-sanity-lite.com这样的站点的创建,它根据读者的兴趣对机器学习论文进行排名,希望能够更容易地找到“最好的”论文。
2014 年,另一个突破性进展出现在研究员 Ian Goodfellow 与朋友们在一个晚上交谈时的启发下。结果就是生成对抗网络(GANs)的诞生,Yann LeCun 在当时称之为 20 到 30 年来神经网络领域最重要的突破(在 NeurIPS 2016 上听到的)。我们将在第六章中讨论 GANs,它开辟了一个新的研究领域,让模型能够“创造”与训练数据相关但不同的输出。GANs 导致了当前生成式 AI的爆炸性发展,包括像 ChatGPT 和 Stable Diffusion 这样的系统。
强化学习是机器学习的三大分支之一,另外两个是我们一直在讨论的监督学习和尝试在没有标注数据集的情况下训练模型的无监督学习。在强化学习中,一个代理(即模型)通过奖励函数被教导如何完成任务。其在机器人技术中的应用显而易见。
Google 的 DeepMind 团队在 2013 年推出了一个基于深度强化学习的系统,能够成功地学习玩 Atari 2600 视频游戏,且与人类专家的表现相当或更好。(我不确定当时 35 年的游戏系统中,谁算得上是专家。)对我来说,这个系统最令人印象深刻的部分是,模型的输入正是人类的输入:屏幕图像,仅此而已。这意味着该系统必须学会如何解析输入的图像,并从中学会如何通过移动操纵杆来赢得游戏(实际上是使用模拟器)。
在击败人类原始视频游戏的能力与击败人类在围棋等抽象策略游戏中的能力之间的差距,历史上曾被认为是不可逾越的。我在 1980 年代末明确被教导,像 Deep Blue 这样通过 Minimax 算法在国际象棋中取胜的系统并不适用于围棋这样的游戏;因此,没有机器能够战胜最优秀的人类围棋选手。然而,我的教授们错了,尽管当时他们有充分的理由相信他们的观点。
2016 年,Google 的 AlphaGo 系统在五局三胜制的比赛中以 4 比 1 击败了围棋冠军李世石。全世界都注意到了这一点,进一步增强了对一个范式转变已经发生的认知。到这时,机器学习已经取得了商业上的成功。然而,AlphaGo 的胜利对于机器学习研究人员和从业者来说,仍然是完全令人印象深刻的。
大多数普通公众没有注意到,AlphaGo 在 2017 年被 AlphaGo Zero 所取代,后者是一个完全从零开始,通过与自己对弈进行训练的系统,完全没有任何人类输入。很快,AlphaGo Zero 掌握了围棋,甚至战胜了原版的 AlphaGo 系统(取得了 100 场胜利,且一场未败)。
然而,在 2022 年,目前最先进的围棋系统 KataGo 屡次且轻松地被一个训练目标不是为了赢得比赛,而是为了揭示现代 AI 系统固有脆弱性的对抗系统所击败。对抗系统所使用的棋招超出了 KataGo 训练时所遇到的范围。这是一个现实世界的例子,展示了模型擅长内插却不擅长外推。当对抗系统被训练为不是为了在围棋中更强,而是为了利用并“挫败”AI 时,它能够赢得四局中的三局以上。我向读者推荐星际迷航:下一代的那集“巅峰表现”,其中安卓人 Data 并非试图赢得一场艰难的策略游戏,而是通过与对手匹敌并让对方感到挫败来“获胜”。
深度学习在视频游戏中击败人类的趋势持续不减。取代像 Atari 这种原始游戏,深度强化学习系统如今在更复杂的游戏中达到了大师级表现。2019 年,DeepMind 的 AlphaStar 系统在星际争霸 II这款策略游戏中超越了 99.8%的玩家,该游戏要求发展单位并策划战斗计划。
1975 年的阿西洛马重组 DNA 大会是认识到生物技术增长和潜在伦理问题的重要里程碑。该会议对未来的研究产生了积极影响,并且在当年,组织者发布了一篇总结性论文,概述了生物技术的伦理方法。那时,这个领域还处于初期阶段,但潜在的风险已经被早期认识到,并采取了措施,确保在考虑未来研究时,伦理问题始终处于重要位置。
2017 年的阿西洛马有益 AI 大会故意模仿了早期的会议,以提高人们对 AI 潜在危险的认识。如今,会议中常常能看到诸如“AI 造福人类”这样的议题标题。2017 年阿西洛马大会促成了人工智能发展与应用的指导原则的制定。类似地,到 2023 年,美国政府——具体来说是白宫科技政策办公室——已经制定了《AI 权利法案蓝图》,旨在保护美国公众免受 AI 不加区分应用的有害影响。事实上,白宫官员们也特别致力于直接与 AI 社区沟通,鼓励在开发更强大的 AI 系统时充分考虑各种问题。所有这些都是一个好兆头,但历史告诉我们,人类的法律往往滞后于技术的发展,因此这些努力是否能够有效地框定这一领域,仍有待观察。
2021 年至今
2020 年的 COVID-19 大流行使世界大多数地方陷入停滞。然而,AI 社区受到的影响却非常有限,这可能是因为远程协作和会议在这个领域中运作得相当顺利。此外,我们可以通过互联网访问强大的计算机,因此物理上的接近性不会像其他学科那样限制研究,尤其是在这些学科中需要接触硬件。
从 2021 年开始,并且持续到我写这篇文章时,新模型的爆炸式增长让人印象深刻,每一个比上一个更为强大。大多数模型能够接受人类书写的文本输入,进而生成文本、图像甚至视频输出。输入通常结合了文本和示例图像来引导系统。目前流行的(且令人担忧的)系统包括 DALL-E 2、Stable Diffusion、Midjourney 和 ChatGPT 等。大多数大型科技公司也展示了生成视频、音频甚至 3D 模型的尖端技术。这些系统目前引发的热议让人想起了 2012 年深度学习凭借 AlexNet 证明其价值时的兴奋情绪。这又是一次范式转变;但需要明确的是,这些系统并没有意识。我并不是唯一有这种看法的人,甚至 ChatGPT 也同意我这个观点。我问它:“你是一个有意识的存在吗?”它的回答是,逐字如下:
作为一个机器学习模型,我并不是一个有意识的存在。我是一个计算机程序,经过训练,根据用户输入生成文本。我没有像人类一样思考、推理或体验意识的能力。我设计的目的是提供信息和帮助用户,但我没有独立的思想或意识。
我认为艾达·洛夫莱斯会对这个答案感到满意,尽管她可能会对一个没有思维的机器是如何生成这个答案感到困惑。不过,请注意,ChatGPT 并没有声称自己不思考,而是说它不像人类那样思考。我们将在第六章中探讨图像合成,在第七章中探讨像 ChatGPT 这样的庞大语言模型。也许到时候我们能找到解决她(假设的)困惑的方法。
那么,为什么是现在呢?简短的回答是符号人工智能的衰落和对连接主义方法极为有利的技术创新的兴起。
符号人工智能和连接主义是同时出现的,符号人工智能主导了几十年,迫使连接主义处于背景中。然而,在经历了两次人工智能寒冬,符号人工智能几乎濒临灭绝之后,连接主义在关键技术创新的帮助下崛起,并填补了这一空白。
我认为符号人工智能与连接主义的关系,就像是非鸟类恐龙与哺乳动物之间的关系。从地质学的角度来看,恐龙和哺乳动物几乎在同一时期出现,但大型陆地恐龙主宰了地球约 1.6 亿年,迫使哺乳动物只能在阴影中勉强生存。当大约 6600 万年前小行星撞击地球时,大型恐龙灭绝了,给了哺乳动物进化并接管地球的机会。
当然,类比最终会失效。恐龙并没有完全灭绝——我们现在称它们为鸟类——而且它们并不是因为某种劣势而灭绝的。事实上,恐龙是地球上最伟大的成功故事之一。非鸟类恐龙之所以灭绝,纯粹是因为运气不好。几乎可以说,是一场灾难导致了它们的灭绝(“灾难”这个词来源于意大利语disastro,意思是“坏星”)。
符号人工智能有可能重新出现吗?它可能会以某种形式出现,但会与连接主义合作。符号人工智能曾承诺智能行为在抽象层面上是可能的,但它没有实现这一点。连接主义声称,智能行为可以从一组更简单的单元中产生。深度学习的成功支持了这一观点,更不用说地球上当前存在的数十亿个活脑了。但正如 ChatGPT 所指出的,现有的连接主义模型“并不像人类那样思考、推理或体验意识。”现代神经网络不是心智;它们是表示学习的数据处理器。我将在第五章中进一步阐明这一点。
尽管我们物种智人在很大程度上依赖于符号思维,但符号思维并不是智能的必备条件。在他的书《理解人类进化》(剑桥大学出版社,2022 年)中, 人类学家伊恩·塔特萨尔(Ian Tattersall)声称,尼安德特人不太可能像我们一样使用符号思维,也没有像我们一样的语言,但他们仍然具有智能。实际上,尼安德特人足够像人类,以至于我们的祖先曾多次与他们“作爱,而非打仗”——非非洲血统的人的 DNA 证明了这一事实。
我预计,在不久的将来,联结主义和符号人工智能之间会产生协同效应。例如,由于像 ChatGPT 这样的系统最终只是在预测下一个输出符号(单词或单词的一部分),它无法知道自己何时说错话。一个关联的符号系统可以检测到响应中的错误推理并加以修正。至于这样的系统如何实现,我并不清楚。
到 1960 年代初,联结主义可能会出现的一些迹象已经显现。那么,是否仅仅是符号人工智能的偏见延迟了这场革命长达数十年?不是的。联结主义的发展停滞是因为速度、算法和数据问题。让我们逐一分析这些问题。
速度
要理解为什么速度阻碍了联结主义的发展,我们需要了解计算机是如何工作的。为了便于理解,我们可以把计算机看作是一个内存,它存储数据(数字)和一个处理单元,通常被称为中央处理单元(CPU)。一个微处理器——比如你桌面电脑、智能手机、语音控制助手、汽车、微波炉,以及几乎你所用的所有设备(除了烤面包机,哦,很多烤面包机也有)——就是一个 CPU。把 CPU 想象成传统计算机:数据从内存或输入设备(如键盘或鼠标)进入 CPU,经过处理后,再通过 CPU 发送到内存或输出设备(如显示器或硬盘)。
另一方面,图形处理单元(GPU)是为显示器开发的,最初是为视频游戏产业设计的,目的是实现快速图形渲染。GPU 能够同时对成百上千的内存位置(即像素)执行相同的操作,例如“乘以 2”。如果 CPU 想要把一千个内存位置乘以 2,它必须依次处理第一个、第二个、第三个,依此类推。事实上,训练和实现神经网络所需的主要操作正好适合 GPU 能够完成的任务。像 NVIDIA 这样的 GPU 制造商很早就意识到了这一点,并开始开发用于深度学习的 GPU。把 GPU 看作是一张超计算机卡,可以插入到你的 PC 中。
1945 年,电子数值积分和计算机(ENIAC)是当时最先进的技术。ENIAC 的速度估计为每秒约 0.00289 百万指令(MIPS)。换句话说,ENIAC 每秒可以执行不到 3000 条指令。到 1980 年,像当时许多流行个人计算机中所用的 6502 8 位微处理器,运行速度约为 0.43 MIPS,或每秒大约 50 万条指令。到 2023 年,我用来写这本书的电脑中已有些过时的 Intel i7-4790 CPU 运行速度约为 130,000 MIPS,使我的 PC 比 1980 年的 6502 快了大约 300,000 倍,比 ENIAC 快了大约 4500 万倍。
然而,NVIDIA 的 A100 GPU 在用于深度学习时,能够达到 312 太弗洛普(TFLOPS),即 312,000,000 MIPS:比 6502 快 7.3 亿倍,比 ENIAC 快令人难以置信的 1100 亿倍。机器学习的计算能力在这个时间跨度内的增长令人瞠目结舌。而且,训练一个大型神经网络并处理一个庞大的数据集,通常需要数十到数百个这样的 GPU。
结论:直到快速 GPU 的出现,计算机在训练具有构建像 ChatGPT 这样的能力的神经网络时,速度仍然太慢。
算法
正如你将在 第四章 中学到的那样,我们是通过基本单元来构建神经网络,这些单元执行一个简单的任务:收集输入值,将每个值与权重值相乘,求和,加上偏置值,并将结果传递给激活函数生成输出值。换句话说,许多输入数字变成一个输出数字。成千上万到百万个这样的单元的集体行为,导致数十亿的权重值,使深度学习系统能够完成它们的任务。
神经网络的结构是一回事;将神经网络调整到所需任务是另一回事。可以将网络的结构,称为其 架构,比作解剖学。在解剖学中,我们关心的是构成身体的各个部分:这是心脏,那是肝脏,等等。训练网络更像是生理学:如何让一个部分与另一个部分协同工作?解剖学(架构)存在,但生理学(训练过程)并未完全被理解。几十年来,这一切发生了变化,得益于关键的算法创新:反向传播、网络初始化、激活函数、丢弃法和归一化、以及先进的梯度下降算法。理解这些术语的详细含义并不至关重要,重要的是要知道,这些术语所代表的改进——以及前面提到的处理速度提升,结合改进的数据集(接下来会讨论)——是深度学习革命的主要推动力。
尽管长期以来人们知道,合适的权重和偏置值能使网络适应所需的任务,但缺乏的是一种高效的方法来找到这些值。1980 年代引入的反向传播算法,结合随机梯度下降,开始改变这一状况。
训练过程通过迭代找到最终的权重和偏置值,这些值是根据模型在训练数据上的误差来调整的。迭代过程从初始状态开始,使用一组初始的权重和偏置。然而,这些初始的权重和偏置应该是什么呢?长期以来,人们认为初始的权重和偏置并不重要;只需在某个范围内随机选择一些小数值。这种方法通常有效,但也有很多时候不起作用,导致网络无法很好地学习,甚至根本不学习。因此,需要一种更有原则的网络初始化方法。
现代网络仍然是随机初始化的,但这些随机值依赖于网络的架构和所使用的激活函数类型。关注这些细节使得网络能够更好地学习。初始化很重要。
我们将神经网络按层次排列,其中一层的输出成为下一层的输入。分配给网络中每个节点的激活函数决定了该节点的输出值。历史上,激活函数通常是 sigmoid 或双曲正切函数,这两者绘制出来时呈现出S形曲线。这些函数在大多数情况下是不合适的,最终被一种名字很长但实际上简单的函数所取代:修正线性单元(ReLU)。ReLU 提出了一个简单的问题:输入是否小于零?如果是,输出为零;否则,输出为输入值。因此,ReLU 激活函数比旧的激活函数要好,而且计算机几乎可以瞬间问出并回答这个问题。因此,切换到 ReLU 是双赢:既提高了网络的性能,又加快了速度。
Dropout 和批量归一化是一些较为高级的训练方法,描述起来有些复杂,尤其是在我们关心的层面上。2012 年引入的dropout会在训练时随机将一层节点的部分输出设置为零。其效果就像是同时训练成千上万的模型,每个模型既独立又互相关联。适当使用 dropout 会对网络学习产生显著影响。正如一位著名计算机科学家当时对我说的:“如果我们在 1980 年代就有 dropout,今天的世界可能会完全不同。”
批量归一化调整数据在网络层之间流动时的表现。输入出现在网络的一侧,并通过各个层流动,直到输出。在示意图中,这通常呈现为从左到右的运动。归一化被插入层之间,以便调整数值,使其保持在有意义的范围内。批量归一化是首个可学习的归一化技术,意味着它在网络学习的过程中,学习如何处理数据。整个归一化方法系列都由批量归一化发展而来。
深度学习革命的最后一项关键算法创新是梯度下降法,它与反向传播一起,帮助学习权重和偏差。梯度下降的思想早于机器学习的出现,但近年来所开发的版本对深度学习的成功做出了重要贡献。我们将在第四章中进一步了解这一主题。
结论:最初的神经网络训练方法是原始的,无法发挥其真正的潜力。算法创新改变了这一点。
数据
神经网络需要大量的训练数据。当人们问我,训练特定任务的模型需要多少数据时,我的回答总是一样的:所有的数据。模型是从数据中学习的;数据越多,效果越好,因为更多的数据意味着模型在使用时能够更好地呈现遇到的实际情况。
在万维网出现之前,收集、标注并处理足够规模的数据集以训练深度神经网络是非常困难的。这一局面在 1990 年代末到 2000 年代初随着网络的快速增长以及它所代表的数据爆炸而发生了变化。
例如,Statista(https://www.statista.com)声称,2022 年,每分钟都有 500 小时的新视频上传到 YouTube,这一速度惊人。还估计,1995 年 12 月,约有 1600 万人在使用互联网,占全球人口的 0.4%。到了 2022 年 7 月,这个数字增长到了近 55 亿人,占全球人口的 69%。社交媒体的使用、电商以及携带智能手机四处走动,足以产生惊人的数据量——所有这些数据都被捕捉并用于人工智能。社交媒体之所以免费,是因为我们和我们生成的数据就是产品。
我在工作中常听到一句话:“我们曾经数据匮乏,但现在我们被数据淹没了。”没有足够的庞大数据集和标签,深度学习无法学习。但另一方面,拥有庞大数据集时,令人惊叹的事情会发生。
结论:在机器学习中,数据就是一切。
本章的主要收获包括:
-
符号人工智能与连接主义的争斗早期就已出现,并导致了几十年符号人工智能的主导地位。
-
连接主义曾因速度、算法和数据问题而长时间遭遇困境。
-
随着 2012 年深度学习革命的到来,连接主义者目前已取得胜利。
-
深度学习革命的直接原因是计算机速度的提升、图形处理单元的出现、算法的改进以及海量数据集的涌现。
在我们完成足够的历史背景介绍后,让我们回到机器学习,从经典算法开始。
第四章:经典模型:老派机器学习**

初学钢琴的学生不会从李斯特的《钟声》开始,而是从《小星星》或《玛丽有只小羊羔》开始。这些简单的曲子包含了弹钢琴的基础,掌握这些基础可以让学生随着时间的推移不断进步。这个原则适用于大多数学习领域,包括人工智能。
为了达到理解现代人工智能的最终目标,我们必须从“简单”的经典机器学习世界开始。经典模型的规律通常也适用于更先进的神经网络。本章将探讨三种经典模型:最近邻、随机森林和支持向量机。理解这些将为我们理解第四章的神经网络做好准备。
图 3-1 展示了一个虚构数据集的训练样本,包含两个特征(x[0] 和 x[1])和三个类别(圆形、方形和三角形)。我们在第一章中看到过类似的图表;见图 1-2。与鸢尾花数据集类似,图中的每一个形状都代表训练集中的一个样本。图 3-1 是我们理解最近邻经典模型的工具。

图 3-1:一个包含三类和两个特征的虚构训练集
如前一章所提到的,最近邻分类器是最简单的模型——简单到没有需要训练的模型;训练数据就是模型。为了给一个新的、未知的输入分配类标签,找到与未知样本最接近的训练样本并返回该样本的标签。就是这么简单。尽管它们很简单,如果训练数据代表了模型在现实中遇到的情况,最近邻分类器仍然非常有效。
作为最近邻模型的自然扩展,找到与未知样本最接近的k个训练样本。k通常是 3、5 或 7 这样的数字,尽管它可以是任何数字。这种模型使用多数投票系统,因此分配的类标签是k个训练样本中最常见的标签。如果出现平局,随机选择标签。例如,如果模型正在考虑一个未知样本的 5 个最近邻,其中两个是类别 0,另两个是类别 3,则通过在 0 和 3 之间随机选择来分配标签;平均而言,你会在 50%的时间里做出正确选择。
让我们使用最近邻概念来对一些未知输入进行分类。图 3-2 再次展示了训练样本,并加上了两个未知样本:菱形和五边形。我们想将这些样本分配到三个类别中的一个:圆形、方形或三角形。最近邻方法的思路是找到与每个未知样本最接近的训练样本。对于菱形,最近的训练样本是其左上方的方形;对于五边形,最近的训练样本是其右上方的三角形。因此,最近邻分类器会将菱形分为方形类别,将五边形分为三角形类别。

图 3-2:分类未知样本
我猜您已经注意到 图 3-2 中连接未知样本与三个最近训练样本的线条。这些样本是当 k 为 3 时要使用的样本。在这种情况下,分类器仍然会将菱形分为方形类别,因为三个最近的训练样本都是方形。对于五边形,三个最近邻样本中有两个是三角形,一个是方形,因此它也会将五边形分为三角形类别。
本例使用了二维特征向量,x[0] 和 x[1],这样我们可以直观地展示这个过程。我们并不局限于仅有两个特征的模型;我们可以使用几十个甚至上百个特征。即使特征太多无法绘制图形,“最近” (距离) 的概念仍然具有数学意义。事实上,许多数学概念都可以作为距离度量,在实际应用中,最近邻分类器可能根据数据集使用任何一种度量方法。
例如,我们回到 第一章 的 MNIST 数字数据集。样本是小型的灰度数字图像,包含数字 0 到 9,我们将其展开为 784 个元素的向量。因此,训练集中的每个数字样本都是 784 维空间中的一个点,就像之前的例子中,每个样本都是二维空间中的一个点一样。
完整的 MNIST 数据集包含 60,000 个训练样本,这意味着训练空间由 60,000 个点组成,分布在 784 维空间中(虽然不是完全如此,但稍后会详细说明)。它还包含 10,000 个测试样本,我们可以用来评估最近邻模型。我用所有 60,000 个训练样本训练了一个 1-最近邻模型,然后使用 6,000 个样本,再用 600 个样本,最后只用了 60 个样本。训练集中的 60 个样本大约包含每个数字的六个例子。我说“约”是因为我随机抽样了训练集,所以某个数字可能有八个样本,而另一个数字可能只有三个样本。在每种情况下,我都使用所有 10,000 个测试样本来测试模型,从而模拟了在现实世界中使用模型的情况。
表 3-1 显示了随着训练样本数量变化,模型的表现。
表 3-1: 改变训练集大小
| 训练集大小 | 准确率 (%) |
|---|---|
| 60,000 | 97 |
| 6,000 | 94 |
| 600 | 86 |
| 60 | 66 |
回想一下,准确率是指模型通过正确标记数字标签(0 到 9)正确分类的测试样本的百分比。当使用完整的训练集时,模型平均每 100 次预测中有 97 次是正确的。即便将训练集缩小为原来的十分之一,准确率仍然达到 94%。当训练样本数为 600 个(每个数字大约 60 个样本)时,准确率降至 86%。只有当训练集缩小到每个数字仅平均 6 个样本时,准确率才会急剧下降至 66%。
然而,在我们对最近邻模型过于苛刻之前,记住有 10 个数字类别,因此随机猜测平均大约有 1 次正确,准确率约为 10%。从这个角度来看,即使是 60 样本模型,也比随机猜测好六倍。让我们稍微探讨一下这个现象,看看能否深入了解为什么最近邻模型在如此少的训练数据下仍然表现良好。
想象一下,你独自一人在一个篮球场上,坐在场地中央。场馆的某个地方空中漂浮着一粒尘土。为了方便,假设这粒尘土保持在固定位置。现在,想象另外 59 粒尘土也漂浮在空中。这 60 粒尘土就是我们训练集中的 60 个数字样本,而篮球场则是数字图像向量所在的三维世界。
现在,假设一粒新的尘土出现在你鼻子前面。它是你想要分类的新数字向量。最近邻模型计算这粒尘土与已知数字标签的 60 粒尘土之间的距离。距离新尘土最近的是位于你正面对的篮筐边缘下方、47 英尺(14 米)远的一粒尘土。它标记为 3,所以模型返回标签 3。认为这粒最接近的尘土代表未知样本的正确标签合理吗?毕竟,整个场地只有 60 粒尘土。
我们需要考虑两个相互竞争的因素,才能合理地回答这个问题。首先,我们应该回答“否”,因为相信我们能用 60 粒尘土代表这个庞大的场地似乎很荒谬。训练集中的数据太少,无法填满整个场地的空间。这个现象被称为维度灾难,指的是随着维度的增加,需要填充空间的样本数也会以非常快的速度增加。换句话说,点的数量迅速增加,这意味着为了表示这个空间,所需的训练样本数量也会迅速增加——更准确地说是呈指数级增加。维度灾难是经典机器学习的痛点之一。
维度灾难意味着,当我们只有 60 个训练样本和 784 个维度时,我们应该不指望能正确分类数字……然而我们的最近邻分类器仍然有效。虽然效果不佳,但比随机猜测要好。为什么?原因与数字数据集以及不同类别之间的样本相似度有关。所有的数字 5 看起来都像 5;如果它们不是这样,我们就无法识别它们为 5。因此,尽管数字空间有 784 个维度,但同一类别的大多数数字会相对接近该类别的其他数字。换句话说,表示数字 5 的“尘埃颗粒”可能会聚集在一起,形成一个细长的、弯曲的区域,穿过整个空间。其他数字也可能以类似方式分组。正因为如此,最近的样本比我们最初根据维度灾难所预期的更有可能来自相同的数字类别。基于这一观察,我们将原来的“没有”答案升级为模棱两可的“可能”。
我们通过数学方式讨论这一效应,称数字数据位于一个具有有效维度的流形上,而这个有效维度远低于表示数字的 784 维向量。如果我们能利用这一信息,数据常常位于较低维度的流形上,这是一个好消息。最近邻模型利用了这一信息,因为训练数据就是模型。稍后在书中,当我们讨论卷积神经网络时,我们将了解到,这类模型学习新的方式来表示输入数据,这类似于学习如何表示数据所在的低维流形。
在我们过于兴奋于最近邻分类器在数字数据集上的表现之前,先让我们回到现实,尝试对真实图像进行分类。CIFAR-10 数据集包含 50,000 张 32×32 像素的小型彩色图像,来自 10 个不同类别,包括车辆(如飞机、汽车和卡车)和动物(如狗、猫和鸟)。每张图像展开后会生成一个 3,072 元素的向量,因此我们要求分类器在一个 3,072 维的空间中区分这些图像。表 3-2 展示了它的表现。
表 3-2: 使用最近邻分类器对 CIFAR-10 进行分类
| 训练集大小 | 准确率(%) |
|---|---|
| 50,000 | 35.4 |
| 5,000 | 27.1 |
| 500 | 23.3 |
| 50 | 17.5 |
和 MNIST 一样,随机猜测的准确率为 10%。尽管我们的分类器在所有训练集大小的变种中表现得比这更好,但其最佳准确率仅为 35% 多一点——远远低于 MNIST 达到的 97%。这样的令人清醒的现实让许多机器学习领域的人感叹,通用图像分类可能超出了我们的掌控范围。幸运的是,这并非如此,但没有任何经典的机器学习模型能做到很好。
如果我们从流形的角度思考——即数据往往存在于一个比数据本身维度更低的空间中——那么这些结果并不令人惊讶。CIFAR-10 包含了现实世界的照片,通常被称为自然图像。自然图像比像 MNIST 数字那样简单的图像复杂得多,因此我们应该预期它们存在于一个高维流形中,因此更难以学习和分类。实际上,有一些数值方法可以估计数据的真实维度。对于 MNIST,尽管图像存在于一个 784 维的空间中,但数据更接近于 11 维。对于 CIFAR-10,本征维度更接近于 21 维,因此我们预期需要更多的训练数据才能达到与 MNIST 相当的表现。
现在最近邻模型不常被使用。造成这种情况的有两个问题。首先,虽然训练最近邻模型实际上是瞬时完成的,因为没有什么需要训练的,但使用最近邻模型却很慢,因为我们必须计算未知样本与每个训练样本之间的距离。这个计算时间随着训练集样本数的平方增长。我们拥有的训练数据越多,模型的表现越好,但运行速度却越慢。训练集的大小翻倍,搜索时间增加四倍。
数十年来,对最近邻分类器的研究揭示了许多技巧,用以减少找到最近邻或最近k个邻居所需的时间,但问题依然存在:增加训练样本的数量会增加使用分类器所需的时间。
第二个问题是所有经典机器学习模型以及我们将在第四章讨论的传统神经网络共同面临的。这些模型是整体的,意味着它们将输入向量视为一个整体,而没有拆解成各个部分。在许多情况下,这种做法是不正确的。例如,写一个四需要多个笔画,并且有明显的部分区分四和八。经典机器学习模型并不会明确学习这些部分或它们出现的位置,或者它们可能出现在多个位置。然而,现代卷积神经网络却能学习这些特征。
总结来说,最近邻模型易于理解且训练简单,但使用时速度较慢,且无法明确理解输入数据的结构。接下来让我们转变思路,思考森林与树木的问题。
我们在第一章中简要探讨了决策树,它由一系列关于未知样本的“是/否”问题组成。你从根节点开始,通过回答节点的问题来遍历树。如果答案是“是”,就往左走一层;如果答案是“否”,就往右走一层。继续回答问题,直到你到达叶子节点(没有问题的节点),并为未知样本分配叶子节点中的标签。
决策树是确定性的;一旦构建完成,它们就不会改变。因此,传统的决策树算法对于相同的训练集会返回相同的决策树。通常情况下,这棵树的效果并不是很好。如果发生这种情况,我们能做些什么呢?当然可以!我们可以构建一片树的森林。
但是,如果决策树是确定性的,那么森林不就变成了相同的树一遍又一遍地重复,就像一堆克隆体一样吗?如果我们不采取任何巧妙的措施,确实会这样。幸运的是,人类是聪明的。大约在 2000 年,研究人员意识到引入随机性可以产生一片独特的树的森林,每棵树都有其独特的优缺点,但集体表现要优于任何单棵树。 随机森林是由决策树组成的集合,每棵树在随机性上都有所不同。森林的预测是其各棵树预测结果的结合。随机森林体现了群体智慧的力量。
使用随机性来构建分类器乍一看似乎违反直觉。如果我们在星期二向模型提供样本 X,并且它告诉我们样本 X 属于类别 Y,那么如果我们在星期六再次提供相同的样本,我们不希望它告诉我们它属于类别 Z。幸运的是,随机森林的随机性并不是这样工作的。给定一个经过训练的森林样本 X 作为输入,它总是给我们输出类别 Y,即使那天是 2 月 29 日。
构建随机森林包含三个步骤:自助法(也称为自举法)、随机特征选择和集成。自助法和随机特征选择有助于对抗过拟合,这是在第一章中提到的一个概念。单一决策树容易发生过拟合。
这三个步骤协同作用,成长为一个决策树的森林,它们的联合输出生成一个(希望)性能更好的模型。为了获得这种性能提升,我们需要付出可解释性的代价。单一决策树通过一系列问题和答案来解释自己,以产生其输出。而当数十棵或数百棵决策树结合其输出时,可解释性就不复存在了,但在许多情况下我们可以接受这一点。
正如我之前多次提到的,训练集是训练模型的关键。对于随机森林来说,这一点依然成立。我们的起始点是一个训练集。当我们逐步构建森林时,每一棵决策树都是根据已有的训练集生成特定的树训练集,而这些训练集是每棵决策树独有的。这就是 bagging 发挥作用的地方。
Bagging是通过有放回的随机抽样从当前数据集中构建新数据集的方法。术语“有放回”意味着我们可能会多次选择某个训练样本,或者根本不选择它。该技术在统计学中用于理解测量的边界。我们将使用以下的考试成绩数据集来解释这是什么意思:
95, 88, 76, 81, 92, 70, 86, 87, 72
评估班级在测试中的表现的一种方法是通过计算所有分数的和除以分数的数量来得出平均分。总和是 747,分数有 9 个,因此平均分为 83。
总体来说,考试成绩是来自一个虚构的母体过程的样本,这个母体过程为所做的特定考试生成成绩。这并不是思考考试成绩的常见方式,但它是机器学习中理解数据集代表什么的一种方式。来自另一组学生的考试成绩是这个考试母体过程的另一个样本。如果我们有多个班级的考试成绩,我们就可以非常有把握地了解真实的平均分,或者至少了解我们期望找到该平均分的范围。
我们可以将测试分发给多个班级,从而得到多个班级的平均分,但我们会使用 bagging 从已有的考试成绩数据集中创建新数据集,并查看它们的平均值。为此,我们从考试成绩集合中随机选择值,无论之前是否已经选择过该分数,或者根本没有选择过某个分数。以下是六个这样通过自助抽样生成的数据集:
-
86, 87, 87, 76, 81, 81, 88, 70, 95
-
87, 92, 76, 87, 87, 76, 87, 92, 92
-
95, 70, 87, 92, 70, 92, 72, 70, 72
-
88, 86, 87, 70, 81, 72, 86, 95, 70
-
86, 86, 92, 86, 87, 86, 70, 81, 87
-
76, 88, 88, 88, 88, 72, 86, 95, 70
每个数据集的平均值分别为 83.4、86.2、80.0、81.7、84.6 和 83.4 百分比。最低值是 80.0 百分比,最高值是 86.2 百分比。这让我们有理由相信,样本数量较大时,平均值大致会落在这个范围内。
这就是统计学家可能如何使用自助法(bagging)。对我们来说,关键部分是从原始数据集生成的六个新数据集。构建随机森林时,每当我们需要一个新的决策树时,我们首先使用自助法生成一个新数据集,然后使用该数据集训练决策树,而不是使用原始数据集。请注意,这六个数据集中的许多都有重复的值。例如,数据集 1 中同时使用了 81 和 87 两次,但从未使用过 72。对给定数据集的这种随机化帮助创建了彼此行为不同的决策树,但它们仍与原始数据集所代表的内容保持一致。
随机森林使用的第二个技巧是基于随机选择的特征集训练决策树。让我们使用 表 3-3 中的玩具数据集来理解这意味着什么。像往常一样,每一行是一个特征向量,是一个我们知道正确类别标签的样本。列是每个样本的特征值。
表 3-3: 一个玩具数据集
| # | x[0] | x[1] | x[2] | x[3] | x[4] | x[5] |
|---|---|---|---|---|---|---|
| 1 | 0.52 | 0.95 | 0.81 | 0.78 | 0.97 | 0.36 |
| 2 | 0.89 | 0.37 | 0.66 | 0.55 | 0.75 | 0.45 |
| 3 | 0.49 | 0.98 | 0.49 | 0.39 | 0.42 | 0.24 |
| 4 | 0.43 | 0.51 | 0.90 | 0.78 | 0.19 | 0.22 |
| 5 | 0.51 | 0.16 | 0.11 | 0.48 | 0.34 | 0.54 |
| 6 | 0.48 | 0.99 | 0.62 | 0.58 | 0.72 | 0.42 |
| 7 | 0.80 | 0.84 | 0.72 | 0.26 | 0.93 | 0.23 |
| 8 | 0.50 | 0.70 | 0.13 | 0.35 | 0.96 | 0.82 |
| 9 | 0.70 | 0.54 | 0.62 | 0.72 | 0.14 | 0.53 |
这个数据集代表了什么?我不知道,它是虚构的。我的调皮回答是一个很好的提醒,即机器学习模型并不理解它们的数据集代表什么。它们处理的是没有上下文的数字。它是一个像素值吗?房屋的平方英尺数?每十万人中的犯罪率?对于机器学习模型来说,这些都不重要——它们不过是数字而已。
这个玩具数据集包含九个特征向量,每个特征向量有六个特征,x[0] 到 x[5]。森林的决策树使用从六个特征中随机选择的子集。例如,假设我们随机选择保留特征 x[0]、x[4] 和 x[5]。 表 3-4 展示了现在用于训练决策树的数据集。
表 3-4: 一个随机选择的特征集
| # | x[0] | x[4] | x[5] |
|---|---|---|---|
| 1 | 0.52 | 0.97 | 0.36 |
| 2 | 0.89 | 0.75 | 0.45 |
| 3 | 0.49 | 0.42 | 0.24 |
| 4 | 0.43 | 0.19 | 0.22 |
| 5 | 0.51 | 0.34 | 0.54 |
| 6 | 0.48 | 0.72 | 0.42 |
| 7 | 0.80 | 0.93 | 0.23 |
| 8 | 0.50 | 0.96 | 0.82 |
| 9 | 0.70 | 0.14 | 0.53 |
森林中的每棵决策树都是在使用数据集的自助采样版本上训练的,并且只使用了部分可用特征。我们已经通过两次引入随机性,生长出了一片树木,彼此之间在训练数据和关注的特征上都有细微的不同。
现在我们已经有了一片森林,接下来该如何使用它呢?这就是集成方法的最后一环:集成。音乐中的合奏是由演奏不同乐器的音乐家组成。同样,随机森林也是一个合奏,每棵决策树就像一个不同的音乐家,演奏着不同的乐器。
一个音乐合奏通过结合每个乐器演奏的音符来产生单一的输出——音乐。同样,随机森林通过结合每棵决策树生成的标签来产生单一的输出——类别标签,通常通过类似 k 最近邻分类器的投票方式。我们将获得最多票数的标签分配给输入。
例如,如果我们想用随机森林来分类样本 X,且随机森林中有 100 棵树(已经训练过),我们将样本 X 交给每棵树。每棵树知道应该使用样本 X 特征的哪些子集来得出一个带标签的叶子节点。现在,我们有 100 个可能的类别标签,这些标签来自森林中的 100 棵决策树。如果有 78 棵树将样本 X 分配给类别 Y,随机森林就会宣布样本 X 为类别 Y 的一个实例。
特征随机分配给树,结合自助采样数据集和集成投票,赋予了随机森林其强大的能力。集成方法是一个直观吸引人的想法,不仅限于随机森林。我们完全可以训练多个模型类型在同一数据集上,然后以某种方式结合它们的预测,得出对输入样本的联合结论。每个模型都有其自己的优缺点,组合后,优点通常会增强输出质量,使总和大于部分之和。
我们还有一个经典的机器学习模型需要研究,即支持向量机(SVM)。之后,我们将把这些模型相互对比,以便直观地了解它们的表现,并提供一个基准,便于我们将神经网络的表现与之对比。
要理解支持向量机,首先需要理解四个概念:边界、支持向量、优化和核函数。数学稍显复杂,即便是数学专业的人也会觉得有点难,但我们先不深入其中,而是专注于获得一个概念上的理解。
支持向量机最好通过可视化来理解,因此我们将从 图 3-3 中的玩具数据集开始。这个数据集是一个二分类数据集(圆形和方形),包含二维特征向量,特征为 x[0] 和 x[1]。

图 3-3:一个具有两个特征的二类玩具数据集,特征为 x[0] 和 x[1]
对于这个数据集,构建一个分类器是相对简单的,因为一条线就能轻松将数据集按类别分开,所有的正方形都在它的上方和右侧,所有的圆形都在它的下方和左侧。但是这条线应该放在哪里呢?我们可能用无数条线来实现这一目标。例如,我们可以将线放置在所有正方形的下方。那条线确实能够分隔这些类别,但如果我们遇到一个来自正方形类别的样本,它正好落在这条线的下方,那么当我们使用分类器时就会出错,将该样本归类为圆形,因为它在我们设定的分隔线下方。类似地,如果我们将线放在所有圆形的上方,那么我们可能会把一个新样本误判为正方形,即便它实际上是圆形,因为它稍微位于那条线的上方。
根据我们从训练数据中了解到的情况,我们应该尽可能将分隔线放置在每个组的最远位置。这时,边界的概念就变得重要。SVM 旨在最大化两个组之间的边界,即找到类别之间最宽的分隔位置。当它们有最大边界时,它们将边界放在边界的中间,因为这是基于训练数据中信息最合适的做法。
图 3-4 展示了训练数据和三条额外的线。虚线定义了边界,粗实线标记了 SVM 设置的边界,以最大化两个类别之间的距离。这是最适合的线位置,能够最小化两个类别之间的标签错误。从本质上来说,这就是 SVM 所做的一切。

图 3-4:最大边界分隔线(粗线)和最大边界(虚线)
SVM 的另外三个部分——支持向量、优化和核函数——用于寻找边界和分隔线。在图 3-4 中,可以看到虚线穿过一些数据点。这些点是支持向量,算法通过它们来定义边界。这些支持向量来自哪里?回想一下,图中的点代表训练集中的特征向量。支持向量是通过优化算法在训练集中找到的成员。优化是根据某些标准寻找最佳解的过程。SVM 使用的优化算法定位定义最大边界的支持向量,最终确定分隔线。在第一章中,我们在讨论将数据拟合到曲线时使用了优化算法,当我们训练神经网络时也会再次使用优化算法。
我们快到了;我们只剩下一个 SVM 概念:核函数。与爆米花的品种或计算机操作系统核心中的内核不同,数学核函数是用来关联两件事物——这里是两个特征向量。图 3-4 中的示例使用了线性核函数,这意味着它使用训练数据的特征向量原样。支持向量机接受多种类型的核函数来关联两个特征向量,但线性核函数是最常见的。另一种类型,称为高斯核函数(或者更为冗长且令人印象深刻的径向基函数核),通常有助于在线性核函数失败的情况下,因为特征向量之间存在不同的关系。
核函数将特征向量转换为不同的表示,这是卷积神经网络所做的核心思想之一。传统机器学习之所以长时间陷入困境的一个问题是,提供给模型的数据在原始形式下过于复杂,无法使模型在不同类别之间做出有意义的区分。这与我们在讨论最近邻时介绍的流形和内在维度的概念相关。
经典的机器学习从业者花费了大量精力试图最小化模型所需的特征数量,将特征减少到模型区分不同类别所必需的最小集合。这种方法被称为特征选择或维度减少,具体取决于所使用的算法。类似地,尤其是在支持向量机(SVM)中,使用核函数将给定的特征向量映射到一个新的表示,使得类别分离变得更加容易。这些方法是人为主导的努力;我们选择特征或核函数,希望它们能够使问题更容易处理。但正如我们将要学习的那样,现代深度学习让数据自己发声,在学习数据包含的信息的新表示时,数据本身就能起到决定性作用。
在实践中,训练支持向量机意味着为与所用核函数相关的参数找到合适的值。如果核函数是线性的,如前面的示例中所示,则只需找到一个值,通常称为C。这是一个数字,例如 1 或 10,它影响支持向量机的表现。如果使用高斯核函数,我们有C和另一个参数,用希腊字母γ(gamma)表示。训练 SVM 的艺术就在于找到最适合当前数据集的最佳值。
模型使用的魔法值是其超参数。神经网络有许多超参数;比 SVM 还要多。然而,我的经验告诉我,调整神经网络—特别是现代深度神经网络—通常比调整支持向量机更容易。我在这里坦率地承认我的偏见;其他人可能会不同意。
支持向量机在数学上非常优雅,实践者利用这种优雅来调整超参数和所用的核函数,并结合一套传统的数据预处理方法,构建出一个在实际数据中表现良好的模型。这个过程的每一步都依赖于构建模型的人类的直觉和经验。如果他们具有足够的知识和经验,并且数据集适合使用这种模型,他们通常会成功,但成功并不保证。另一方面,深度神经网络虽然庞大、略显笨重,并且完全依赖于输入的原始数据,但通过最小化假设,它们能够对数据集中的一些元素进行泛化,这些元素是人类无法理解的,我认为这也是现代神经网络能够完成以前认为几乎不可能完成的任务的原因。
支持向量机(SVM)是二分类器:它们区分两个类别,如图 3-3 中的数据集所示。但有时我们需要区分超过两个类别。我们如何用支持向量机做到这一点呢?
我们有两种方法可以将支持向量机推广到多类别问题。假设我们有 10 个类别的数据集。第一种推广方法训练 10 个支持向量机,第一个尝试将类别 0 与其他 9 个类别分开。第二个同样尝试将类别 1 与其余 9 个类别分开,依此类推,得到一组模型,每个模型都试图将一个类别与其他所有类别分开。要对一个未知样本进行分类,我们将样本传递给每个支持向量机,并返回具有最大决策函数值的模型的类别标签——该值是 SVM 用来决定其输出置信度的度量,或称为测量。这个方法被称为一对多或一对其余。它训练的支持向量机数量等于类别数量。
另一种方法是一对一,它为每一对类别训练一个单独的支持向量机。将未知样本传递给每个模型,最终分配给出现次数最多的类别标签。如果类别数量过多,一对一方法就不太实际。例如,对于 CIFAR-10 中的 10 个类别,我们需要 45 个不同的支持向量机。而如果我们尝试在 ImageNet 数据集(有 1000 个类别)上使用这种方法,那么我们将需要等待 499,500 个不同的支持向量机训练完成。
支持向量机非常适合 90 年代和 2000 年代初期常见的计算能力,这也是它们能长时间压制神经网络的原因。然而,随着深度学习的出现,使用支持向量机的理由已经不多了(在我看来)。
让我们使用本章探讨的三个经典模型,测试一个开源数据集,该数据集包含来自 2022 年 Jens N. Lallensack、Anthony Romilio 和 Peter L. Falkingham 论文《A Machine Learning Approach for the Discrimination of Theropod and Ornithischian Dinosaur Tracks》中恐龙足迹轮廓的样本。足迹图像已根据创作共用协议 CC BY 4.0 许可证发布,允许带有署名的重用。
图 3-5 包含了数据集中的样本。兽脚类恐龙足迹(比如霸王龙)位于上排,鸟臀目恐龙足迹(比如鸭嘴龙等)位于下排。模型使用的图像被反转,背景为黑色,图像为白色,重新缩放为 40×40 像素,并展开成 1,600 维的向量。按照现代标准,这个数据集相对较小,包含 1,336 个训练样本和 335 个测试样本。

图 3-5:兽脚类(上)和鸟臀类(下)恐龙足迹
我训练了以下模型:
-
最近邻(k = 1, 3, 7)
-
一个包含 300 棵树的随机森林
-
线性支持向量机
-
径向基函数支持向量机
训练后,我用保留的测试集对模型进行了测试。我还记录了每个模型训练所需的时间,以及训练后测试每个模型所需的时间。训练后使用模型进行推理是推理,这意味着我跟踪了在测试集上的推理时间。
注
这不是一本编程书籍,但如果你熟悉编程,尤其是 Python,可以随时联系我,邮箱是 rkneuselbooks@gmail.com ,我会把数据集和代码发给你。
表 3-5 显示了结果。评估模型的表现,如你所料,是机器学习过程中至关重要的一部分。
表 3-5: 恐龙足迹分类
| 模型 | ACC | MCC | 训练 | 测试 |
|---|---|---|---|---|
| RF300 | 83.3 | 0.65 | 1.5823 | 0.0399 |
| RBF SVM | 82.4 | 0.64 | 0.9296 | 0.2579 |
| 7-NN | 80.0 | 0.58 | 0.0004 | 0.0412 |
| 3-NN | 77.6 | 0.54 | 0.0005 | 0.0437 |
| 1-NN | 76.1 | 0.50 | 0.0004 | 0.0395 |
| 线性支持向量机 | 70.7 | 0.41 | 2.8165 | 0.0007 |
左侧第一列标识了模型:从上到下分别是随机森林、径向基函数支持向量机、最近邻(7、3 和 1 个邻居)以及线性支持向量机。
ACC 和 MCC 列是从混淆矩阵计算得出的指标,混淆矩阵是机器学习从业者评估模型时最为关键的工具之一(见第一章)。对于像我们这里的二分类器,混淆矩阵统计了兽脚类测试样本被正确识别的次数、鸟臀类测试样本的识别次数,以及它们相互混淆的次数。
从视觉上看,二分类模型的混淆矩阵如下所示:
| 鸟脚类 | 兽脚类 | |
|---|---|---|
| 鸟脚类 | TN | FP |
| 兽脚类 | FN | TP |
这些行是来自验证测试集的实际类别标签。列是模型分配的标签。单元格是每种实际标签和模型分配标签组合发生的次数。字母是标准方式,用于表示单元格中数字的含义:TN 是 真负,TP 是 真阳性,FP 是 假阳性,FN 是 假阴性。对于恐龙足迹模型,兽脚类是类别 1,“正类”,使鸟脚类成为类别 0,或“负类”。
模型将鸟脚类足迹标记为“鸟脚类”的次数就是 TN 计数。同样,TP 计数表示模型正确识别兽脚类足迹的次数。目标是尽可能提高 TN 和 TP,同时尽可能减少 FP 和 FN,即错误。
在 表 3-5 中,ACC 指的是准确率:分类器分配标签正确的次数。虽然准确率是最直观的度量标准,但它并不总是最好的,特别是当每个类别的样本数不均等时。随机森林在准确率方面表现最好,每 100 张测试图像中正确标记了超过 83 张。线性支持向量机表现最差,每 100 次中只有约 71 次正确。由于我们有两个类别,随机猜测的正确率大约是 50%,因此即便是线性支持向量机也能从足迹图像中学习。我们通过将 TP 和 TN 相加,并将该和除以所有四个单元格的总和,来定义准确率。
MCC 列代表 马修斯相关系数,它引入了一种新的度量标准。它是混淆矩阵中四个数字的不同组合。MCC 是我最喜欢的分类器度量标准,它越来越被认为是衡量模型表现的最佳单一指标。(这些度量标准同样适用于更先进的深度学习模型。)表 3-5 按 MCC 排序,在这个例子中,排序结果也恰好按 ACC 排列。对于二分类模型,最低的 MCC 为 -1,最高为 1。随机猜测的 MCC 为 0。如果模型没有任何错误,MCC 为 1。如果 MCC 为 -1(实际上从未在实践中发生),意味着模型完全错误:在我们的例子中,它会将所有兽脚类足迹标记为鸟脚类,将所有鸟脚类足迹标记为兽脚类。如果你有一个完全错误的分类器,交换输出标签即可使其完全正确。
“训练”和“测试”列显示的是秒数。“训练”列告诉我们在使用模型之前训练它所花费的时间。最近邻模型几乎不需要时间,只有毫秒的一小部分,因为它不需要训练。回想一下,最近邻模型就是训练集本身;它没有需要调整的模型来近似数据。
最慢的模型是线性 SVM。有趣的是,复杂的径向基函数模型的训练时间约为线性 SVM 的三分之一(这种差异可以归因于这些模型在代码中的实现方式)。下一个训练速度较慢的模型是随机森林。这个情况是合理的,因为森林中有 300 棵决策树,每一棵都必须独立训练。
在“测试”列中,最近邻和随机森林模型的推理时间大致相同。SVM 模型分别较慢(RBF)和非常快(线性),这再次反映了实现上的差异。注意,最近邻模型的使用时间比训练时间要长。这与通常的情况相反,尤其是对于神经网络,正如我们在本书后面将看到的那样。通常,训练时间较长,但只需进行一次,而推理时间较短。对于最近邻模型,训练集越大,推理时间越慢——这是它们的一个显著缺点。
这次练习的两个主要收获是:对经典模型性能的整体理解,我们将以此作为基准,用于与神经网络进行比较,详见第四章,以及即便是经典模型,在这个特定数据集上也能表现得很好。它们的表现与人类专家(即古生物学家)相当,这些专家也标注了恐龙足迹的轮廓。根据 Lallensack 等人原始论文中的数据(该数据集即来源于该论文),人类专家的正确率只有 57%。他们还被允许将足迹标注为“模糊”,这是模型无法做到的奢侈选择;模型总是做出类别分配,没有“我不知道”的选项。我们可以让某些模型类型做出类似声明,但本章中的经典模型并不适合这种做法。
经典模型是符号主义人工智能还是联结主义?它们究竟是人工智能吗?它们会学习吗,还是仅仅是数学技巧?我对这些问题的回答如下。
在第一章中,我将人工智能、机器学习和深度学习的关系描述为一系列嵌套的概念,其中深度学习是机器学习的一种形式,而机器学习是人工智能的一种形式(参见图 1-1)。这是大多数人理解这种关系的正确方式,并且与第二章的历史内容相符。从这个角度来看,本章的经典模型可以被视为人工智能的一种形式。
那么,经典模型是符号 AI 还是连接主义 AI 呢?我说都不是。它们不是符号 AI,因为它们不操作逻辑规则或陈述;它们也不是连接主义 AI,因为它们没有采用一个简单单元的网络,单元在与数据互动时学习它们的正确关联。相反,我认为这些模型是一种复杂的曲线拟合形式——它们是一个算法的输出,该算法使用优化过程生成一个函数,该函数最能描述训练数据,并且希望能够适应模型在实际环境中遇到的数据。
对于支持向量机来说,函数是模型的结构,它通过在优化过程中定位支持向量来形成。决策树的函数是通过特定算法生成的,该算法设计用于反复将训练数据划分成越来越小的组,直到生成一个叶子节点,该节点(通常)只包含来自单一类别的示例。随机森林仅仅是并行工作的这种函数的集合。
决策树分类器几乎是一种遗传编程形式。遗传编程通过模拟自然选择中的进化过程来创建计算机代码,其中改进的适应度对应于“是问题的更好解决方案”。实际上,遗传编程是一种进化算法,进化算法以及群体智能算法实现了强大而通用的优化。一些人认为进化算法和群体智能是人工智能,但我并不这么认为,尽管我在工作中经常使用它们。群体智能并不学习;它们只是搜索一个表示问题可能解决方案的空间。
最近邻模型甚至更简单;不需要创建任何函数。如果我们拥有由某个父进程生成的所有可能的数据——也就是说,生成我们尝试建模的特征向量的那个过程——那么我们就不需要模型。为了给特征向量分配一个类别标签,我们只需在特征向量的“电话簿”中查找,并返回找到的标签。由于我们拥有所有可能的带标签的特征向量,因此没有需要近似的东西,任何在实际环境中遇到的特征向量必定会在电话簿中。
除非能够访问所有可能的特征向量,否则最近邻模型使用训练数据所代表的、不完整的电话簿中最接近的特征向量。
例如,假设我们住在一个有 3000 人的小镇,所有人都在电话簿里。(现在还有电话簿吗?如果没有,请假装有。)
如果我们想找诺斯莫·金的电话号码,我们会在电话簿中找到“King”并扫描直到找到“Nosmo”,然后就能得到它。然而,假设我们没有包含所有 3,000 人的完整名单,而是随机挑选了 300 个。我们依然想知道诺斯莫·金的电话号码(类别标签),但是在电话簿中找不到。然而,那里有一个 Burg R. King。由于他们共享同样的姓氏,Burg 很可能与 Nosmo 有关,因此我们把 Burg 的电话号码当作 Nosmo 的号码返回。显然,电话簿越完整,我们找到目标名字或该人家庭成员的机会就越大。这基本上就是最近邻模型所做的事情。
总结一下,支持向量机、决策树和随机森林利用数据根据人类精心设计的算法生成函数。对我来说,这既不是符号人工智能,也不是联结主义,而是曲线拟合,或者更准确地说,是优化。最近邻模型更糟糕;在这种情况下,根本没有函数。
这并不意味着人工智能是虚假的,但它确实意味着当从业者谈论人工智能时,他们所想到的内容很可能与公众所认为的“人工智能”不同。
然而,一切并非失去。确实有一个值得冠以联结主义标签的机器学习模型:神经网络。它是人工智能革命的核心,能够真正从数据中学习。所以,让我们将经典模型和符号人工智能放在一边,把注意力集中在神经网络上。
关键术语
包装法、维度灾难、进化算法、假阴性、假阳性、遗传编程、超参数、推理、流形、度量、最近邻、一对一、一对多、随机森林、支持向量机、群体智能、真阴性、真阳性
第五章:神经网络:类脑 AI**

联结主义试图提供一个智能可能从中涌现的基质。今天,联结主义意味着神经网络,其中“神经”一词指的是生物神经元。尽管如此,它们之间的关系却只是表面上的。生物神经元和人工神经元可能具有类似的结构,但它们的运作方式完全不同。
生物神经元通过树突接受输入,当足够多的输入被激活时,它们会“放电”,在轴突上产生短暂的电压脉冲。换句话说,生物神经元处于关闭状态,直到它们被激活。经过约 8 亿年的动物进化,这一过程变得复杂得多,但这就是其本质。
神经网络的人工神经元也具有输入和输出,但与生物神经元不同,神经元是具有连续行为的数学函数,而不是通过放电来工作。有些模型像生物神经元一样会发生放电,但我们在本书中忽略了它们。推动 AI 革新的神经网络是连续运作的。
可以将生物神经元想象成一个电灯开关。它处于关闭状态,直到有足够的理由(输入)将其打开。生物神经元不是打开了就一直开着,而是像切换开关一样,开与关交替。人工神经元类似于带调光器的灯泡。稍微调节开关,就会产生微弱的光;进一步调节,光的亮度会按比例变化。这个类比并不在所有情况下都准确,但它传达了人工神经元不是“全开”或“全关”的基本概念。相反,它们根据某种函数,按比例输出与输入相对应的结果。随着我们继续学习这一章,迷雾将会逐渐消散,所以即使目前这部分内容有些难以理解,也不用担心。
图 4-1 是本书中最关键的图,也是最简单的图之一,正如如果联结主义方法是正确的那样应该预期的。如果我们理解图 4-1 所代表的内容以及它是如何运作的,我们就掌握了理解现代 AI 所必需的核心知识。

图 4-1:简朴的(人工)神经元
图 4-1 包含三个方框、一个圆圈、五个箭头,以及像“x[0]”和“输出”这样的标签。我们将依次检查每个元素,从左侧的方框开始。
标准做法是将神经网络的输入放在左侧,数据流向右侧。在图 4-1 中,三个标记为 x[0]、x[1] 和 x[2] 的方框是神经元的输入。它们是特征向量的三个特征,我们希望神经元处理这些输入,从而给出一个输出,最终得到一个类别标签。
圆圈被标记为h,这是激活函数的标准符号。激活函数的任务是接收神经元的输入并生成输出值,输出箭头指向右侧,见图 4-1。
三个输入方框通过箭头连接到圆圈(节点),每个输入方框都有一条箭头。箭头的标签——w[0]、w[1]和w[2]——表示权重。每个输入都对应一个权重。与圆圈通过箭头连接的单独b是偏置。它是一个数字,和权重、输入x及输出一样。对于这个神经元,三个数字进入,一个数字输出。
神经元是这样运作的:
-
将每个输入值x[0]、x[1]和x[2]与其相应的权重w[0]、w[1]和w[2]相乘。
-
将步骤 1 中的所有乘积与偏置值b相加,得到一个单一的数字。
-
将该单一数字传递给h,即激活函数,生成输出,也是一个单一数字。
这就是神经元的全部功能:它将输入与权重相乘,求和,添加偏置值,然后将总和传递给激活函数,以生成输出。
现代人工智能几乎所有的伟大成就都归功于这个原始构造。将足够多的这些基本构件按照正确的配置连接在一起,就可以构建一个可以学会识别狗品种、驾驶汽车或将法语翻译成英语的模型。嗯,前提是你有魔法般的权重和偏置值,这些值是通过训练得到的。这些值对于神经网络如此重要,以至于有一家公司将“权重与偏置”作为其名称;见https://www.wandb.ai。
我们可以选择激活函数,但在现代网络中,最常用的是第二章中提到的整流线性单元(ReLU)。ReLU 的问题是:输入(即输入的加权和加上偏置)是否小于零?如果是,输出为零;否则,输出就是输入值。
像单个神经元这样的简单构件能有用吗?它能。作为实验,我使用第 4-1 图中的神经元,利用来自第一章的鸢尾花数据集的三个特征作为输入进行训练。回想一下,这个数据集包含了三种不同鸢尾花的各部分测量值。训练后,我使用一个未用过的测试集对神经元进行了测试,该测试集包含 30 个特征向量。神经元正确分类了 28 个样本,准确率为 93%。
我通过寻找一组三个权重和一个偏置值来训练神经元,使得输出经过四舍五入到最接近的整数后,匹配鸢尾花的类别标签——0、1 或 2。这不是训练神经网络的标准方法,但对于像单个神经元这样的简单情况是有效的。我们将在本章后面讨论标准的网络训练方法。
单个神经元可以学习,但复杂的输入会让它感到困惑。复杂的输入意味着我们需要一个更复杂的模型。让我们给我们的单个神经元一些朋友。
传统上,神经元按层排列,前一层的输出作为后一层的输入。考虑图 4-2,它展示了输入之后层中分别有两个、三个和八个节点的网络。将网络按层排列简化了代码实现,并有助于标准的训练过程。不过,如果能找到替代方法来训练模型,也没有强制要求必须使用层。

图 4-2:两节点、三节点和八节点网络
让我们从左上角的两个节点网络开始。三个输入(方框)在那里,但这次中间层有两个圆圈,右边有一个单一的圆圈。输入完全连接到中间层的两个节点,这意味着每个输入方框都与每个中间层节点之间有一条连接线。中间层的输出连接到最右边的单一节点,网络的输出来自这个节点。
神经网络中位于左侧输入和右侧输出之间的中间层被称为隐藏层。例如,图 4-2 中的网络分别有一个隐藏层,包含 2 个、3 个和 8 个节点。
具有这种配置的网络适用于二元分类任务,即类别 0 与类别 1,其中输出是一个单一的数字,表示模型认为输入属于类别 1 的概率。因此,最右侧的节点使用一种不同的激活函数,称为sigmoid(也叫做逻辑斯蒂函数)。Sigmoid 函数的输出范围在 0 到 1 之间。这也是表示概率的范围,因此许多人将带有 Sigmoid 激活函数的节点输出称为概率。虽然这通常并不准确,但我们可以接受这种不严谨。隐藏层的节点全部使用 ReLU 激活函数。
要实现图 4-2 中的两个节点网络,我们必须学习多少权重和偏置?我们需要为每条线(输出箭头除外)设置一个权重,并为每个节点设置一个偏置值。因此,我们需要八个权重和三个偏置值。对于左下角的模型,我们需要 12 个权重和 4 个偏置。最后,对于 8 节点模型,我们需要学习 32 个权重和 9 个偏置值。随着层中节点数量的增加,权重的数量增长得更快。仅这一事实就限制了神经网络的发展多年,因为潜在有用的模型对于单台计算机的内存来说过于庞大。当然,模型的大小是相对的。OpenAI 的 GPT-3 有超过 1750 亿个权重,尽管他们没有透露 GPT-4 的具体大小,但传闻称它有 1.7 万亿个权重。
我们需要一个二分类数据集来探索图 4-2 中的模型。我们将使用的数据集是一个经典的数据集,旨在区分意大利某一特定地区用于酿酒的两种葡萄品种。不幸的是,似乎这个数据集所代表的葡萄酒现在已经不再知名了。(数据集的历史就是这么久。)不过,我们知道模型不关心标签——它们使用的是数字——所以我们将使用 0 和 1 作为标签。
我们需要三个特征,x[0],x[1],和 x[2]。我们将使用的特征是酒精含量(百分比)、苹果酸和总酚类物质。目标是训练图 4-2 中的模型,看看在给定这三种特征的测量值时,每个模型在识别未知葡萄酒时表现如何。
我使用包含 104 个样本的训练集和 26 个样本的测试集训练了双神经元模型。这意味着我使用了 104 个测量的酒精含量、苹果酸水平和总酚类物质的三元组,并且知道正确的输出标签,类别 0 或类别 1。训练集使双神经元模型为所有八个权重和三个偏差赋值。我保证我们会讨论训练是如何工作的,但现在请假设它已经发生,这样我们就可以探索神经网络的行为。经过训练的模型在测试集上的准确率为 81%,意味着它的判断正确率超过了 10 次中的 8 次。对于如此小的模型和训练集来说,这还算不错。
图 4-3 展示了训练后的双神经元模型。我在连接处添加了权重,在节点上添加了偏差,这样你就可以看到它们。我认为至少要看一次这些数字,最好是用一个简单的模型来做。

图 4-3:基于葡萄酒数据集训练的双神经元模型
让我们用两个测试样本来理解这个过程。这两个测试样本各由三个数字组成,分别是特征值(x[0],x[1],x[2]):
| 样本 1 | (–0.7359, 0.9795, –0.1333) |
|---|---|
| 样本 2 | ( 0.0967, –1.2138, –1.0500) |
你可能会有一个问题。我说特征是酒精含量(百分比)、苹果酸水平和总酚类物质。虽然我不知道苹果酸或总酚类物质的测量单位是什么,但百分比就是百分比,那么为什么第一个样本的 x[0] 是一个小的负数呢?我们不可能有负的酒精百分比。
答案与预处理有关。原始数据,比如酒精含量,通常不会直接用于机器学习模型。相反,每个特征都会通过减去训练集中特征的平均值,并将结果除以数据围绕平均值的分散程度(标准差)来进行调整。原始的酒精含量是 12.29%,这是一个合理的葡萄酒酒精含量值,但经过缩放后,它变成了 –0.7359。
让我们使用图 4-3 中学习到的权重和偏置对样本 1 进行分类。顶部神经元的输入是每个特征与连接该特征与神经元的权重相乘,然后与偏置值求和。第一个特征给我们 0.4716 × –0.7359,第二个给我们 0.0399 × 0.9795,第三个给我们–0.3902 × –0.1333,加上偏置值 0.0532。将这些加在一起得到–0.2028。这是传递给激活函数 ReLU 的数值。由于它是负数,ReLU 返回 0,这意味着顶部节点的输出是 0。对底部节点进行相同的计算得到 0.1720 作为传递给 ReLU 的输入。由于这是一个正数,ReLU 返回 0.1720 作为输出。
中间层两个节点的输出现在作为输入传递给右侧的最终节点。和之前一样,我们将输出与权重相乘,进行求和,并加上偏置值,然后传递给激活函数。在这个例子中,激活函数不是 ReLU,而是 Sigmoid。
顶部节点的输出是 0,底部节点的输出是 0.1720。将这些与各自的权重相乘,求和,再加上偏置值 2.2277,得到 1.9502 作为传递给 Sigmoid 激活函数的输入,产生 0.8755 作为网络对第一个输入样本的输出。
我们应该如何解释这个输出呢?在这里,我们学到神经网络的一个重要方面:
神经网络不会告诉我们输入的实际类别标签,而只是告诉我们一个标签相对于另一个标签的置信度。
二分类模型输出一个置信值,我们将其解释为输入属于类别 1 的概率。概率是介于 0(没有机会)和 1(完全确定)之间的数字。人类通常对百分比更为熟悉,我们可以通过将概率乘以 100 来得到百分比。因此,我们可以说网络对该输入属于类别 1 的信心大约为 87%。
实际上,我们使用一个阈值——一个截止值——来决定分配哪个标签。对于二分类模型,最常见的做法是使用 50%的阈值。如果输出超过 50%(概率为 0.5),我们将输入分配给类别 1。这个输出超过了 50%,所以我们将“类别 1”作为标签分配给它。这个样本来自类别 1,意味着网络分配的标签是正确的。
我们可以对第二个输入样本(0.0967, –1.2138, –1.0500)重复这些计算。我将把详细的计算过程留给你作为练习,但是网络对样本 2 的输出是 0.4883。换句话说,网络对这个样本属于类别 1 的信心是 49%。截止值是 50%,所以我们拒绝类别 1 标签,并将此输入分配给类别 0。实际的类别是类别 1,因此在这个实例中,网络是错误的——它将一个类别 1 的样本分配给了类别 0。哎呀。
这是一个有用的模型吗?答案取决于具体情境。我们正在按葡萄品种对葡萄酒进行分类。如果模型的输出每五次中有一次错误,误差率为 20%,这能接受吗?我怀疑不能,但也可能有些任务对于这种精度水平的模型是可以接受的。
神经网络提供了某种程度的控制,来决定如何解释它们的输出。例如,我们可能不会使用 50% 作为判断的分界线。如果我们把这个值设得更低,比如 40%,那么我们会捕获更多的类别 1 样本,但也会因此错误地将更多的实际类别 0 样本识别为类别 1。换句话说,我们可以在不同类型的错误之间进行权衡。
让我们把图 4-2 中的其他模型也考虑进来。我使用与图 4-3 相同的训练集和测试集训练了这三个模型。每个模型的训练过程重复了 240 次。以下是每个模型的平均精度:
| 2 节点 | 81.5 百分比 |
|---|---|
| 3 节点 | 83.6 百分比 |
| 8 节点 | 86.2 百分比 |
隐藏层中的节点数增加时,模型的性能有所提升。这是直观合理的,因为一个更复杂的模型(更多的节点)意味着能够学习到训练集中更复杂的关联。
我怀疑你现在有了一个新问题:为什么我每个模型都训练了 240 次,并报告了这 240 个模型的平均精度?这是理解神经网络时的另一个关键点:
神经网络是随机初始化的,因此即使使用相同的训练数据,重复训练也会导致表现不同的模型。
“随机初始化”这一说法需要澄清。再看一下图 4-3。表示权重和偏置的数字来自一个迭代过程。这意味着一组初始的权重和偏置会被反复更新,每次都将网络推向更接近输入特征向量与输出标签之间的函数的近似值。准确地近似这个函数是我们希望网络完成的任务。
为什么不将所有权重初始化为相同的值呢?答案是,这样做会迫使权重学习数据的相似特征,这正是我们不希望发生的,最终模型的表现会很差。如果我们将所有初始权重都设置为零,模型根本无法学习。
迭代过程需要一组初始值才能正常工作。我们应该如何选择初始值呢?这是一个重要的问题,对于我们当前的理解水平,答案是“随机”,意思是我们在某种程度上是通过掷骰子来为每个权重和偏置选择初始值。然后,迭代过程会不断优化这些值,最终得到如图 4-3 所示的最终结果。
然而,这个迭代过程并不总是以相同的结果结束。选择不同的初始随机权重和偏置集,网络将收敛到不同的一组最终值。例如,前面提到的图 4-3 中的网络达到了 81%的准确率。以下是同一网络在相同数据上训练和测试后获得的另外 10 个准确率:
89, 85, 73, 81, 81, 81, 81, 85, 85, 85
这些准确率从最高的 89%到最低的 73%不等。每次训练会话之间唯一变化的只是初始权重和偏置的集合。这是神经网络中一个经常被忽视的问题。如果可能的话,网络应该进行多次训练,以收集关于其有效性的数据,或者如同在 73%版本的网络中那样,理解纯粹由于偶然使用了一个糟糕的初始值集。我还应该提到,这个网络准确率的广泛变化与其相对较小,并且只包含少数权重和偏置有关。较大的模型在反复训练时往往更为一致。
我们已经覆盖了很多内容,所以需要做一个总结:
-
神经网络的基本单元是神经元,也叫节点。
-
神经元将输入与权重相乘,将这些乘积求和,添加一个偏置值,然后将所有这些传递给激活函数以产生输出值。
-
神经网络是由单个神经元组成的集合,通常按层排列,当前层的输出是下一层的输入。
-
训练神经网络是通过迭代调整初始的、随机选择的一组权重和偏置值来赋予权重和偏置值。
-
二值神经网络产生的输出大致对应于输入属于类别 1 的概率。
现在我们知道了什么是神经网络以及它是如何使用的,我们终于来到了问题的核心:这些神奇的权重和偏置到底是从哪里来的?在第二章中,我简要提到,神经网络在 1980 年代得到了提升,这要归功于两个关键的算法:反向传播和梯度下降。这些算法是神经网络训练的核心。
我们在第三章中讨论了优化,指的是根据某些标准寻找最佳解的过程,具体是在支持向量机的背景下。训练神经网络也是一个优化过程,涉及学习最佳拟合训练数据的权重和偏置。然而,必须小心,确保学习到的权重和偏置更可能符合训练数据中的一般趋势,而不是特定训练数据本身的细节。随着我们对训练过程了解得更多,这一点将变得更加明显。
一般的训练算法是:
-
选择模型的架构,包括隐藏层的数量、每层的节点数以及激活函数。
-
随机但智能地初始化与所选架构相关的所有权重和偏置。
-
将训练数据或其子集通过模型,并计算平均误差。这就是前向传播。
-
使用反向传播来确定每个权重和偏置对误差的贡献。
-
根据梯度下降算法更新权重和偏置。这一步和前一步构成了反向传播。
-
从第 3 步开始重复,直到网络被认为是“足够好”。
这六个步骤包含了许多重要的术语。我们花时间理解每个术语的含义是值得的。在本章中,架构指的是网络使用的层数,通常是隐藏层。我们有输入特征向量,可以想象每个隐藏层共同工作,接收输入向量并生成输出向量,随后该输出成为下一个层的输入,依此类推。对于二分类器,网络的输出是一个节点,输出值在 0 到 1 之间。稍后在本书中,我们将学习到这个概念可以扩展到多类别输出。
算法表明,训练是一个重复多次的迭代过程。迭代过程有一个起点。如果你想从 A 点走到 B 点,就得一步一步走。这就是迭代的部分。A 点是起点。对于神经网络,架构意味着一组权重和偏置。这些权重和偏置的初始值类似于 A 点,训练过程就像是一步步往前走。
算法使用了“平均误差”这个术语。什么是误差?这里引入了一个新概念。直观地看,我们可以理解,仅仅为权重和偏置选择一些初始值,不太可能让网络准确地对训练数据进行分类。记住,我们知道训练数据的输入和预期输出。
假设我们将训练样本 1 通过网络,得到一个输出值,可能是 0.44。如果我们知道样本 1 属于类别 1,那么网络的误差就是预期输出和实际输出之间的差值。在这里,就是 1 – 0.44,等于 0.56。一个好的模型可能会为这个样本输出 0.97,产生的误差仅为 0.03。误差越小,模型在分类该样本时越好。如果我们将所有训练数据或其代表性子集通过网络,我们可以计算每个训练样本的误差,并求出整个训练集的平均误差。这就是反向传播和梯度下降算法用来更新权重和偏置的标准。
最后,训练算法会要求将数据输入到网络中,得到误差,更新权重和偏差,然后重复这个过程,直到网络表现得“足够好”。从某种意义上说,“足够好”就是当误差,也就是损失,尽可能接近零时。如果网络对所有类别 0 的样本输出 0,对所有类别 1 的样本输出 1,那么它在训练数据上的表现是完美的,误差为零。这当然是“足够好”的,但我们必须小心。有时,当这种情况发生时,网络会过拟合,意味着它学习了训练数据中的所有细节,但没有学习到能够让它在面对未知输入时仍能良好表现的数据的普遍趋势。
实际上,过拟合问题有多种解决方法,其中最有效的一种是获取更多的训练数据。我们使用训练数据来代表所有可能由我们试图建模的过程生成的数据。因此,更多的训练数据意味着对这些数据集合的更好表示。这正是我们在第一章中讨论的插值与外推的问题。
然而,获取更多的训练数据可能并不可行。替代方法包括调整训练算法,引入一些技术,防止网络在学习过程中专注于训练数据中无关的细节。你可能听说过的一种技术是权重衰减,它会惩罚网络,如果它使权重值过大。
另一种常见的方法是数据增强。训练数据不够?别担心,数据增强会通过稍微修改你已有的数据来“发明”一些新的数据。数据增强会将现有的训练数据进行变换,产生新的数据,这些新数据可能是由与实际训练数据相同的过程所生成的。例如,如果训练样本是一张狗的图片,那么如果你对其进行旋转、上移几个像素、左右翻转等操作,它依然会是一张狗的图片。每次变换都会生成一个新的训练样本。这看起来可能像是作弊,但实际上,数据增强是一种强大的正则化方法,可以防止网络在训练过程中发生过拟合。
让我们暂时回到初始化问题,因为它的重要性在多年来并未得到充分重视。
最初,权重初始化仅仅意味着“选择一个小的随机数”,比如 0.001 或-0.0056\。这种方法大多数情况下都有效。但它并不总是有效,而且当它有效时,网络的表现也不一定出色。
深度学习出现不久后,研究人员重新审视了“随机小值”的思路,寻求一种更有原则的初始化方法。这些努力的成果就是神经网络至今使用的初始化方法。需要考虑三个因素:激活函数的形式、来自下层的连接数量(fan-in)以及到上层的输出数量(fan-out)。为了选定每层的初始权重,研究人员设计了公式,结合这三个因素进行选择。偏置值通常初始化为零。证明起来并不困难,使用这种初始化方法的网络性能优于传统方式初始化的网络。
我们还有两个训练算法的步骤没有讨论:反向传播和梯度下降。反向传播通常先介绍,因为它的输出是梯度下降所必需的。然而,我认为理解梯度下降在做什么更为直观,然后通过反向传播提供的内容来填补缺失的部分。尽管这些名称可能不太熟悉,但我相信你已经理解了这两种算法的本质。
你站在一个广阔的、起伏的草原上。你是怎么到这里的?你绞尽脑汁,但没有答案。然后,终于,你发现北方远处山谷里有一个小村庄,也许那里的居民能给你一些答案。但前往那里最好的方法是什么呢?
一般来说,你想要向北和向下移动,但也必须尊重地形的轮廓。你总是想从高处移动到低处。你不能直接往北走,因为一座大山阻碍了你的路。你可以朝东北走;那里的地势更平坦,但走那条路会让你的旅程变得漫长,因为地面下坡很缓慢。所以,你决定朝西北走,因为这条路既能让你向北又能更陡地向下。你向西北迈出一步,然后停下来重新评估自己的位置,决定下一步该往哪个方向走。
重复这个两阶段的过程:先检查你当前的位置,以确定最佳的方向,既能向北又能向下移动,然后朝这个方向迈步,这是你到达山谷中村庄的最佳选择。你可能不会成功;你可能会被困在一个小峡谷里,无法攀爬出来。但总体而言,通过持续朝着一个相对你当前位置既向北又向下的方向移动,你会向目标取得进展。
遵循这个过程,称为梯度下降,使我们能够调整神经网络的初始权重和偏置,从而获得表现越来越优秀的模型。换句话说,梯度下降训练了模型。
围绕村庄的三维草原世界对应着网络的n维世界,其中n是我们试图学习的所有权重和偏置的总数。从当前位置选择一个方向并沿该方向移动一定距离,就是一个梯度下降步骤。重复的梯度下降步骤会使你越来越接近村庄。
梯度下降寻求最小值的位置,即山谷中的村庄——但最小的是哪个值呢?对于神经网络而言,梯度下降的目标是调整网络的权重和偏置,以最小化训练集上的误差。
起伏的广袤草原代表了误差函数,即在使用当前权重和偏置值时,训练数据上的平均误差。这意味着草原中的每个位置都对应一组完整的网络权重和偏置。村庄的位置对应网络在训练集上能够达到的最小误差。我们的期望是,一个在训练集上有小误差的模型在实际应用中对未知输入的误差也会很少。梯度下降是一个通过权重和偏置的空间移动,以最小化误差的算法。
梯度下降是一种优化算法,再次告诉我们训练神经网络是一个优化问题,一个我们需要找到最佳一组参数的问题。虽然这是真的,但训练神经网络与其他优化问题也有细微的不同。如前所述,我们不一定要在训练数据上得到最小的误差,而是要得到一个能够最好地泛化到未知输入的模型。我们希望避免过拟合。我将在本章稍后通过图示演示这意味着什么。
梯度下降在误差函数的地形中移动。在日常使用中,梯度指的是某种事物的变化,比如道路的坡度或颜色渐变平滑地从一种色调变到另一种色调。从数学上讲,梯度是曲线在某一点的斜率的多维类比。最陡的移动方向是沿着最大梯度下降。曲线在某一点的斜率是梯度的一个有用表示,因此思考斜率是值得我们花时间的。
图 4-4 展示了一条曲线,四条线在不同的点触及曲线。这些线代表了这些点的斜率。斜率表示函数值在该点附近变化的速度。线越陡,沿着x轴移动时,函数值变化得越快。

图 4-4:标出不同点斜率的曲线
线 B 标记了曲线的最低点。这就是全局最小值,也是优化算法试图找到的点。注意,接触该点的线完全水平。从数学角度来看,这意味着线 B 的坡度为零。这在函数的最小值(和最大值)处成立。
线 B 接触的点是全局最小值,但图中还有三个其他最小值。这些是局部最小值,即接触这些点的线的坡度也为零。理想情况下,优化算法应避免这些点,优先选择全局最小值。
线 A 的坡度较陡,指向全局最小值。因此,如果我们在曲线上位于线 A 接触的点,我们可以通过朝着指示方向迈步,迅速朝着全局最小值移动。此外,由于此处坡度较陡,我们可以迈出相对较大的步伐,迅速下降到谷底。
线 C 的坡度也很陡,但它指向其中一个局部最小值,即* x 轴上 3 右侧的最小值。一个只知道沿着梯度下降的梯度下降算法将定位到该局部最小值并被困在那里。同样,线 D 也指向 x *轴上 4 与 5 之间的局部最小值。
从图 4-4 中可以得出什么结论?首先,梯度下降是沿着某一点的梯度或坡度向下移动的。这里曲线是一维的,因此该点是* x 的一个特定值。梯度下降利用该点的坡度值来选择一个方向,并根据坡度的陡峭程度确定步长。坡度陡峭意味着我们可以迈出较大的步伐,最终到达更接近最小值的新 x *值。坡度较浅则意味着步伐较小。
例如,假设我们最初位于线 A 与曲线接触的点。此时的坡度较陡,因此我们朝着全局最小值迈出大步。迈出这一步后,我们再次查看坡度,不过这次是新点上* x *轴的坡度。利用这个坡度,我们再迈出一步,然后是下一步,直到我们到达坡度基本为零的点。那就是最小值,所以我们停下。
一维情况比较简单,因为每个点只有一个坡度,因此只有一个方向可以前进。然而,回想起广袤的草原,我们知道从任何一点出发,我们都可以朝着无数方向前进,其中许多方向都很有用,因为它们能带我们向北和向下移动。所有这些方向中,最大梯度的方向是最陡的,能够最快地带我们走向期望的目标,这也是我们迈出的方向。通过重复这个过程,每次使用最大梯度方向,我们就能在多维空间中实现一维空间中的目标。准确来说,我们应该朝着与最大梯度方向相反的方向迈步,因为最大梯度指向远离最小值的方向,而不是指向它。
图 4-5 展示了二维中的梯度下降法。图中显示了一个等高线图。可以想象一个露天矿井的阶梯式层次:颜色越浅,表示矿井越深,但坡度也越平缓。也就是说,颜色越浅表示坡度越浅。

图 4-5:二维中的梯度下降法
图中显示了梯度下降法从三个起始位置出发的路径:圆形、三角形和正方形。最初,坡度较陡,因此步长较大,但随着逼近最小值,坡度变浅,意味着步长变小。最终,梯度下降法不论起点如何,都会到达最小值。
我们在一维和二维中讨论了梯度下降法,因为我们可以直观地看到这个过程。现在我们明白了,我们一直都知道这个算法,并且在自己从高处走到低处时也在使用它。说实话,这就是训练神经网络的全部内容。初始的权重和偏置集不过是n维空间中的一个起始点。梯度下降法利用从该起始位置出发的最大梯度,向最小值迈进。在n维空间中的每一个新位置,都是根据梯度的陡峭程度,从上一组权重和偏置中生成的一组新的权重和偏置。当梯度非常小时,我们宣告胜利并固定权重和偏置,认为网络已经训练完成。
梯度下降法依赖于坡度,即梯度的值。那么,梯度从哪里来呢?梯度下降法是通过最小化损失函数,或者说最小化网络所犯的错误,来实现的。训练集上的误差是每个网络中权重和偏置值的函数。梯度表示每个权重和偏置对整体误差的贡献程度。
举个例子,假设我们知道权重 3(无论是什么权重)的值对网络错误的贡献有多大,这个错误是通过网络在训练集上所犯的错误来衡量的。这样,我们就知道如果改变权重 3 的值,而保持其他权重和偏置不变,梯度的陡峭程度应该是多少。这个陡峭程度,乘以步长,给我们一个值,从权重 3 当前的值中减去。通过减去这个值,我们就朝着与最大梯度方向相反的方向移动。对网络中每个权重和偏置重复这个计算,就完成了在n维空间中的一次步伐。这就是梯度下降法在训练过程中所做的。
反向传播是给我们每个权重和偏置提供陡度值的算法。反向传播是微积分中一个著名规则的应用,微积分是数学的一个分支,告诉我们一个事物如何随着另一个事物的变化而变化。速度就是一个例子。速度表示距离随着时间的变化。我们谈论速度时,也是这样表达的:每小时多少英里或多少公里。反向传播给我们提供了“速度”,表示网络的误差如何随着任何权重或偏置值的变化而变化。梯度下降使用这些“速度”,乘以一个称为学习率的比例因子,步进到由网络的n个权重和偏置所代表的n维空间中的下一个位置。
例如,图 4-2 中的“巨大”网络有 32 个权重和 9 个偏置;因此,使用梯度下降训练该网络意味着在一个 41 维的空间中移动,以找到 41 个权重和偏置值,从而在训练集上得到最小的平均误差。
这个算法被称为“反向传播”,因为它计算每个权重和偏置的“速度”值,首先从网络的输出层开始,然后逐层向后移动,直到输入层。也就是说,它通过网络反向传播误差,从一层传播到前一层。
结论是这样的:
梯度下降使用反向传播提供的梯度方向,迭代地更新权重和偏置,以最小化网络在训练集上的误差。
这就是神经网络训练的核心原理。
使用反向传播和梯度下降训练神经网络的能力有点像偶然的运气。理论上它不应该有效。带有反向传播的梯度下降是一种一阶优化方法。一阶优化适用于简单的函数,而神经网络的误差曲面可远非简单。然而,幸运之神眷顾了我们,它确实有效,而且效果相当不错。到目前为止,还没有严格的数学解释,除了认识到误差函数的局部极小值几乎是相同的,这意味着如果你落入其中并无法逃脱,通常也没关系。
还有另一种经验性的解释,但要理解这一点,我们必须更多地了解训练过程。我在本章前面给出的六步训练算法讲述了如何将训练集或其子集输入到网络中,并反复执行,直到达到“足够好”的效果。让我来扩展一下这些步骤所暗示的过程。
每次将训练数据通过网络传递时,首先进行前向传递,然后进行反向传递,最终会得到一个梯度下降步骤,如图 4-5 所示。如果训练集较小,则会在前向传递中使用所有数据,这意味着所有数据都会被梯度下降用来决定下一步的方向。对训练数据的完整传递称为epoch;因此,在前向传递和反向传递中使用所有训练数据会导致每个 epoch 执行一个梯度下降步骤。
现代机器学习数据集通常非常庞大,这使得在每次梯度下降步骤中使用所有训练数据变得在计算上不可行。相反,会有一个小的、随机选择的数据子集,称为小批量,通过网络进行前向和反向传递。使用小批量显著减少了梯度下降中的计算开销,从而在每个 epoch 中执行多个步骤。小批量还提供了另一个好处,帮助克服“这种训练方法不该有效”的问题。
假设我们有一个数学函数,表示网络的误差。在这种情况下,我们可以使用几个世纪前的微积分技术来找到每个权重和偏差对误差的确切贡献;梯度下降将知道每次应该朝哪个方向前进。不幸的是,世界并非如此。我们不知道误差函数的数学形式(很可能也没有一个可以知道的形式),因此我们必须使用训练数据进行近似。当使用更多训练数据来确定误差时,这种近似会得到改善。这一事实支持了在每次梯度下降步骤中使用所有训练数据。然而,我们已经知道,在许多情况下,这在计算上是极其繁重的。
妥协的做法是,在每次梯度下降步骤中使用小批量。这样,计算量不再太大,但由于我们使用较少的数据点来估算梯度,实际梯度的近似会变差。随机选择某些东西通常与“随机”一词相关联,因此,使用小批量进行训练被称为随机梯度下降。随机梯度下降,某种形式或另一种形式,是几乎所有现代 AI 使用的标准训练方法。
一开始,随机梯度下降听起来像是一个失败的方案。当然,我们可以在宇宙的热寂之前计算出很多梯度下降步骤,但我们的梯度精度较低,而且我们可能正在沿着错误的方向穿越误差空间。这肯定不行,对吧?
就在此时,幸运女神再次眷顾了人类。她不仅赋予了我们通过一阶梯度下降训练复杂模型的能力,因为局部最小值(假设)大致是等价的;她还安排了事情,使得随机梯度下降找到的“错误”梯度方向往往正是我们需要的,可以帮助我们避免在训练初期进入局部最小值。换句话说,当我们应该朝正北走时,稍微朝东北走是一种暗藏的祝福,能够让我们训练大型神经网络。
我们准备进入下一章。然而,在此之前,让我们将传统神经网络应用于恐龙足迹数据集。我们将把结果与第三章的经典模型进行比较。
我们首先需要选择一个架构:即隐藏层的数量、每层的节点数以及每个节点的激活函数类型。恐龙足迹数据集有两个类别:鸟臀目(类别 0)和兽脚亚目(类别 1)。因此,输出节点应使用 sigmoid 激活函数,以给出类别 1 的可能性。网络的输出值估算输入图像属于兽脚亚目的概率。如果概率超过 50%,我们将把输入分配到类别 1;否则,将其归类为类别 0。我们将继续使用修正线性单元(ReLU)激活函数来处理隐藏层节点,就像本章中的所有模型一样。剩下的就是选择隐藏层的数量和每层节点的数量。
恐龙足迹数据集中有 1,336 个训练样本。这并不多,并且我们没有对数据集进行增强,所以我们需要一个较小的模型。大模型意味着很多节点和层,需要大量的训练集;否则,学习的权重和偏置相对于训练样本数量来说就会过多。因此,我们将限制自己最多尝试两层隐藏层的模型。至于隐藏层中的节点数,我们将让第一隐藏层的节点数从非常小到接近输入大小的两倍(1,600 个特征,即 40×40 像素图像展开后)。如果我们尝试第二隐藏层,我们将限制第二层的节点数不超过第一层节点数的一半。
首先,我们将训练一组一层和两层的架构。然后,我们将训练表现最好的模型 100 次,以获得平均性能水平。表 4-1 展示了试验模型的结果。
表 4-1: 恐龙足迹数据集的试验架构
| 准确度(%) | 架构 | 权重和偏置 |
|---|---|---|
| 59.4 | 10 | 16,021 |
| 77.0 | 400 | 640,801 |
| 76.7 | 800 | 1,281,601 |
| 81.2 | 2,400 | 3,844,801 |
| 75.8 | 100, 50 | 165,201 |
| 81.2 | 800, 100 | 1,361,001 |
| 77.9 | 2,400, 800 | 5,764,001 |
只有 10 个节点的网络表现最差,准确率约为 60%。一个仅仅抛硬币的二分类器,正确率大约是 50%,所以 10 节点网络的表现只比随机稍好一些。我们不想要这个模型。其他大部分网络的准确率都在中高 70%的区间。
这两种粗体模型的准确率均略超过 81%。第一种模型使用了一个包含 2,400 个节点的单隐层。第二种模型使用了一个包含 800 个节点的隐层,接着是一个包含 100 个节点的隐层。两种模型在测试集上得到了相同的准确率,但 2,400 节点模型的权重和偏置几乎是两层模型的三倍,所以我们选择使用两层模型。(请记住,表 4-1 中的结果仅代表一次训练会话,而不是多次训练的平均值。稍后我们会修正这一点。)
两层模型依然相对较大。我们试图学习 140 万个参数,以便将模型调整到可以正确分类恐龙足迹图像。这是一个需要学习的大量参数,尤其是在训练集只有 1,336 个样本的情况下。完全连接的神经网络在所需参数数量上增长非常快。我们将在第五章讨论卷积神经网络时重新回顾这一观察。
我们的架构是:两个隐层分别使用 800 个和 100 个节点的修正线性激活函数,然后是一个单节点,使用 sigmoid 函数输出类别 1 的概率。对足迹数据集进行 100 次训练后,模型的平均准确率为 77.4%,最低为 69.3%,最高为 81.5%。让我们将这一结果与第三章中的结果做一个对比;见表 4-2。
表 4-2: 恐龙足迹模型
| 模型 | 准确率(%) |
|---|---|
| RF300 | 83.3 |
| RBF SVM | 82.4 |
| 7-NN | 80.0 |
| 3-NN | 77.6 |
| MLP | 77.4 |
| 1-NN | 76.1 |
| 线性 SVM | 70.7 |
请回忆一下,RF300 指的是一个包含 300 棵树的随机森林,SVM 指的是支持向量机,而 NN 则有点令人困惑,指的是最近邻分类器。我这里使用 MLP(多层感知机)作为神经网络的代替。多层感知机是传统神经网络的一个旧名称,至今仍然常见——注意这里的链接指回到罗森布拉特 1950 年代末期的原始感知机。
我们的神经网络在这个数据集上的表现并不是最好的。事实上,它是最差的之一。通过进一步调整,它的排名可能会有所提升,但根据我的经验,这种表现水平是典型的,也有助于深度学习革命前人们普遍认为神经网络是“平庸”的模型——平凡无奇,没什么值得大书特书的。
本章介绍了现代神经网络背后的基本思想。本书的其余部分将在本章覆盖的基本概念基础上展开。以下是主要要点:
-
神经网络是由多个节点(神经元)组成的集合,它们接受多个输入并输出一个数字。
-
神经网络通常按层排列,使得当前层的输入为上一层的输出。
-
神经网络是随机初始化的,因此重复训练会导致不同表现的模型。
-
神经网络通过梯度下降进行训练,使用反向传播提供的梯度方向迭代地更新权重和偏差。
现在,让我们继续研究卷积神经网络,这种架构引领了深度学习革命。本章带我们走进了 2000 年代初期,接下来我们将进入 2012 年及以后的发展。
关键词
激活函数、架构、反向传播、偏差、数据增强、周期(epoch)、前向传播、全局最小值、梯度下降、隐藏层、学习率、局部最小值、损失、迷你批次(minibatch)、多层感知机(multilayer perceptron)、神经元、节点、过拟合、预处理、修正线性单元(rectified linear unit)、正则化器、sigmoid、随机梯度下降、权重
第六章:卷积神经网络:人工智能学会看见**

传统的机器学习模型在特征选择、特征向量维度以及无法从输入中固有的结构中学习方面存在困难。 卷积神经网络(CNNs) 通过学习生成输入的新的表示,并同时进行分类,从而克服了这些问题,这一过程被称为 端到端学习 。CNN 是我在第二章中提到的表示学习数据处理器。
形成 CNN 的元素在神经网络的发展历史中不同时期都有出现,从 Rosenblatt 的感知器开始,但引领深度学习革命的架构是在 1998 年发布的。为了充分释放 CNN 的力量,还需要十多年的计算能力的改进,直到 2012 年 AlexNet 的出现。
卷积网络利用输入中的结构。随着章节的推进,我们将更好地理解这意味着什么。在一维中,输入可能是随时间变化的值,也称为时间序列。在二维中,我们讨论的是图像。三维 CNN 存在,用于解释数据体积,比如一堆磁共振成像数据或由 LiDAR 点云构建的体积。在本章中,我们将专注于二维 CNN。
向传统神经网络呈现特征的顺序是无关紧要的。无论我们将特征向量以(x[0],x[1],x[2]) 还是 (x[2],x[0],x[1]) 的顺序呈现给模型,模型都会同样学习得很好,因为它假设特征是独立的,相互之间没有关系。事实上,像素值与相邻像素值之间的强相关性是传统机器学习模型不希望出现的,而它们无法在这种输入下取得成功,也使得神经网络在多年里未能取得突破。
卷积神经网络(CNN)则利用输入中的结构。对于 CNN 来说,输入是以(x[0],x[1],x[2]) 还是 (x[2],x[0],x[1]) 的顺序呈现是有区别的;模型可能在前者上表现良好,而在后者上表现差。这并不是弱点,而是优势,因为我们希望将 CNN 应用于那些需要学习结构的情况——这些结构有助于确定如何最佳地分类输入。
在本章后面,我们将比较传统神经网络与卷积神经网络(CNN)在分类小动物和车辆照片时的表现(见第三章的 CIFAR-10 数据集)。到那时,我们将了解利用结构的真正力量。然而,在此之前,让我们做一个小实验。我们有两个数据集,第一个是我们熟悉的 MNIST 数字数据集;第二个是相同的数字图像集合,但是这些图像中的像素顺序已经被打乱。打乱不是随机的,而是有规律的,使得例如位置(1,12)的像素被移动到了位置(26,13),其他所有像素也做了类似一致的移动。图 5-1 显示了 MNIST 数字和其打乱版本的一些示例。

图 5-1:示例 MNIST 数字(上)和相同数字的打乱版本(下)
这些打乱的数字我无法理解。原始数字和打乱数字之间的像素信息是相同的——也就是说,两个图像中的像素值集合是一样的——但是结构几乎完全丧失,我再也无法辨认出数字了。我认为传统的神经网络是整体处理输入的,它并不寻找结构。如果是这样,传统神经网络应该不在乎数字是否已经被打乱;它在使用原始数据集或打乱数据集进行训练时应该表现一样好。事实证明,正是如此。模型学习得同样好;打乱数据集对性能没有影响。但请注意,打乱的测试数字必须与打乱的模型一起使用;我们不能期望模型在一个数据集上训练并在另一个数据集上测试时仍能正常工作。
目前我们只知道一个关于 CNN 的事实:它们关注输入中的结构。知道这一点后,我们是否应该期待在打乱数据集上训练的 CNN 表现与在原始数据集上训练的 CNN 一样好呢?打乱的数字对我们来说是无法解读的,因为图像中的局部结构已经被破坏。因此,我们可能会预期一个同样想要利用局部结构的模型也无法解读这些打乱的数字。事实的确如此:一个在打乱数据集上训练的 CNN 相比于一个在原始数据集上训练的 CNN,表现较差。
为什么我们无法轻松地解读这些打乱的数字呢?我们必须探讨视觉过程中大脑发生了什么,才能回答这个问题。然后,我们将回到这个过程并将其与卷积神经网络(CNN)所做的工作联系起来。正如我们将要了解的,CNN 遵循着古老的谚语:入乡随俗(人类的做法)。
文森特·梵高是我最喜欢的艺术家。他的风格有某种神奇的吸引力,来自一个被精神疾病折磨的人的奇异平静。我相信,他作品中散发的平静反映了他试图平息内心的动荡。
请看图 5-2。它展示了梵高 1889 年在阿尔勒创作的著名《卧室》画作。图像是黑白的,这对梵高使用色彩来说是一种无法原谅的暴力,但印刷限制要求如此。

图 5-2:梵高的阿尔勒卧室,1889 年(公共领域)
你在画中看到了什么?我不是在问更深的意义或印象,而是客观地问,你在画中看到了什么?我看到一张床、两把椅子、一张小桌子、一扇窗户和桌上的一个水壶,当然还有许多其他物品。我猜你看到的也差不多。你看到了床、两把椅子和桌子,但你是怎么看到的?光子,光的粒子,从画面传到你的眼睛,并在大脑中转化为离散的物体。再说一次,怎么做到的呢?
我在提出问题,但尚未给出答案。这是可以的,原因有两个。首先,思考如何将图像分割成一组有意义的物体是值得我们努力的。其次,目前还没有人完全知道“如何?”的问题。然而,神经科学家确实理解了这个过程的起始部分。
我们理所当然地认为,能够看一个场景并将其解析为单独的已识别物体是理所应当的。对我们来说,这个过程是毫不费力、完全自动化的。但我们不应被愚弄。我们是数亿年进化努力的受益者。对哺乳动物来说,视觉始于眼睛,但解析和理解始于大脑后部的初级视觉皮层。
初级视觉皮层,通常被称为区域 V1,对边缘和方向非常敏感。我们立即就遇到了一个关于视觉如何在大脑中工作的线索(与眼睛相比)。大脑将输入的感觉信息传播到 V1 上,V1 呈现出扭曲的图像,并开始寻找边缘以及边缘的方向。V1 还对颜色敏感。将整个视觉场映射到 V1 上,并进行放大,使得 V1 的大部分区域由我们视觉场的中央 2%占据,这意味着边缘检测、方向和颜色都是局部的,发生在其所在的位置。
V1 将其检测结果发送到区域 V2,V2 再将其检测结果发送到区域 V3,以此类推,直到 V5,每个区域接收到的基本上是视觉场中更大、更聚合的元素的表示。这个过程从 V1 开始,最终提供了眼睛所见的完全解析和理解的表示。如前所述,V1 以外的细节仍不明确,但就我们来说,我们只需要记住 V1 对边缘、边缘的方向和颜色(我们也可以包括纹理)很敏感。从简单开始并将场景中的物体分组并区分开来是整个过程的关键。卷积神经网络(CNN)模拟了这一过程。可以公平地说,CNN 们实际上学会了如何看待它们的输入世界。
CNNs 将输入分解为小部分,然后是小部分的组合,再到更大一组部分的组合,直到整个输入从一个整体转变为新的表示形式:这种表示形式更容易被模型顶部的传统神经网络理解。然而,将输入映射到一个新的、更易理解的表示并不意味着这个新表示对我们来说更容易理解。
卷积神经网络在训练过程中学习将输入分割成部分,从而使网络的顶层能够成功分类。换句话说,CNN 学会了输入的新表示形式,然后对这些新表示进行分类。事实上,“从旧的学习新的表示”曾是本章的早期标题。
CNN 是如何将输入分解成部分的?为了回答这个问题,我们必须首先理解“卷积神经网络”中的“卷积”部分。请注意,接下来将涉及一些底层细节。
卷积是一种数学运算,具有正式的定义,涉及积分计算。幸运的是,在数字图像处理中,卷积是一个简单的操作,仅使用乘法和加法。卷积操作是将一个小方块,称为 卷积核,从上到下、从左到右地滑动图像。在每个位置,卷积将方块覆盖的像素值与相应的卷积核值相乘,然后将所有这些乘积相加,得到一个单一的数值,这个数值成为该位置的输出像素值。仅靠文字难以表达清楚,让我们看看图示。图 5-3 可以帮助理解。

图 5-3:将卷积核卷积到图像上
图 5-3 的左侧显示了一组数字。这些是图 5-4 中图像中心部分的像素值。灰度像素值通常在 0 到 255 的范围内,其中较低的值代表较暗的像素。卷积核是右侧的 3×3 网格。卷积操作要求我们将每个像素值与对应的卷积核值相乘,得到右侧的 3×3 数字网格。最后一步是将这九个值相加,得到一个单一的输出值 48,替代输出图像中的中心像素,60 → 48。
要完成卷积,将 3×3 的固体框框向右移动一个像素并重复此过程。当到达一行的末尾时,将框框向下移动一个像素,并对下一行重复,逐行处理,直到卷积核覆盖整个图像。卷积后的图像是所有新输出像素的集合。
起初,卷积可能看起来是一个奇怪的操作。然而,在数字图像中,卷积是一个基本操作。适当地定义卷积核可以让我们以多种方式过滤图像并增强其效果。例如,图 5-4 展示了四幅图像。左上角是原始图像,这是一张常用的测试图像,来自英国 Shaftesbury 的 Gold Hill。其余三幅图像是原始图像的过滤版本。从右上角开始,顺时针方向,分别是模糊图像、展示水平边缘的图像和展示垂直边缘的图像。每一幅图像都是通过前面所述的卷积核进行卷积生成的。图 5-3 中的卷积核产生了右下角的水平边缘图像。将卷积核旋转 90 度,就得到了左下角的垂直边缘图像。最后,将所有卷积核的值设为 1,就得到了右上角的模糊图像。注意,边缘图像是反转的,使得检测到的边缘是黑色而不是白色。

图 5-4:卷积核的作用
我们需要记住的关键点是,对图像进行不同卷积核的卷积可以突出图像的不同方面。很容易想象,适当的卷积核集合可以提取出对正确分类图像相关的结构。这正是 CNN 在端到端训练过程中所做的,某种程度上,也是我们视觉系统在 V1 区域中检测边缘、方向、颜色和纹理时所做的。
我们正在取得进展。我们现在已经掌握了 CNN 的核心操作——卷积,所以让我们迈出下一步,学习卷积如何在模型中用于提取结构,并构建输入的新表示。
第四章中的传统神经网络由一种类型的层组成:一组完全连接的节点,从下层接收输入,为上层生成输出。卷积神经网络更加灵活,支持多种类型的层。无论如何,数据流是相同的:从输入到一层又一层,最终到达网络的输出。
在 CNN 的术语中,传统神经网络使用的完全连接层被称为密集层。CNN 通常在顶部、靠近输出的地方使用密集层,因为到那个时候,网络已经将输入转换为新的表示,密集层可以成功地进行分类。CNN 大量使用卷积层和池化层。
卷积层 将一组卷积核应用于其输入,以产生多个输出,就像图 5-4 从左上角的单一输入图像中产生了三个输出一样。卷积核在训练过程中通过与我们在第四章中遇到的相同的反向传播和梯度下降方法进行学习。学习到的卷积核的值即为卷积层的权重。
池化层没有与之相关的权重。没有需要学习的内容。相反,池化层对其输入执行固定操作:通过在 2×2 的正方形内保留最大值,并将其移动,不重叠地横向和纵向滑动,来减少输入的空间范围。其净效应类似于将图像的大小减少一倍。图 5-5 展示了将一个 8×8 的输入转换为 4×4 输出的过程,保留每个实心正方形中的最大值。池化层是为了减少网络中参数的数量而做出的妥协。

图 5-5:池化以减少数据的空间范围
一个典型的卷积神经网络(CNN)将卷积层和池化层结合起来,最后加上一两个全连接层。ReLU 层也会被使用,通常在卷积层和全连接层之后。例如,一个经典的 CNN 架构 LeNet 由以下层次组成:

该模型使用三个卷积层、两个池化层和一个包含 84 个节点的单一全连接层。每个卷积层和全连接层后面都跟着一个 ReLU 层,用于将所有负输入映射为零,同时保持所有正输入不变。
每个卷积层的括号内数字是该层需要学习的过滤器数量。过滤器是卷积核的集合,每个输入通道有一个卷积核。例如,第一个卷积层学习六个过滤器。输入是一个灰度图像,只有一个通道,因此该层学习六个卷积核。第二个卷积层学习 16 个过滤器,每个过滤器有 6 个卷积核,分别对应第一个卷积层的 6 个输入通道。因此,第二个卷积层一共学习 96 个卷积核。最后一个卷积层学习 120 个过滤器,每个过滤器有 16 个卷积核,总共学习 1,920 个卷积核。总的来说,LeNet 模型需要学习 2,022 个不同的卷积核。
希望通过学习这么多的卷积核,能够产生一系列输出,这些输出能够捕捉输入中结构的关键元素。如果训练成功,最后一个卷积层的输出,作为全连接层的向量输入,将包含能够清晰地区分不同类别的值——至少比仅使用图像更清晰。
如果感觉我们深入到了细节,那确实是,但我们不会再继续深入。实际上,我们已经到达了本书中考虑的最低细节层次,但这是一个必要的负担,因为如果不理解卷积和卷积层,我们就无法理解 CNN 是如何工作的。
也许理解 CNN 各层作用的最好方法,是观察它们对数据流动的影响。图 5-6 展示了一个在 MNIST 数字上训练的 LeNet 模型如何处理两个输入图像。第一卷积层的输出是六张中间图像,其中灰色表示零,较暗的像素表示越来越负,较亮的像素表示越来越正。第一卷积层的六个核各自为单个输入图像产生一个输出图像。卷积核突出显示了输入图像的不同部分,呈现从暗到亮的过渡。

图 5-6:从第一卷积层到密集层的输入
最右侧的条形码样式图案是密集层输出的表示。我们忽略了第二和第三卷积层的输出,直接跳到了模型的最后部分。密集层的输出是一个包含 84 个数字的向量。对于图 5-6,我将这些数字映射到像素值,其中较大的值对应于较暗的垂直条形。
请注意,数字 0 和 8 的条形码不同。如果模型学得很好,我们可以预期密集层输出的条形码在不同数字间会有一些共性。换句话说,数字 0 的条形码应该大致相似,数字 8 的条形码也是如此。它们是否相似呢?请参考图 5-7。

图 5-7:样本输入的密集层输出
该图展示了五个不同的零和八的输入的密集层输出。条形码虽然各不相同,但根据数字类型具有相似性。这对零尤其如此。LeNet 模型已经学会了如何将每个 28×28 像素的输入图像(784 个像素)映射到一个由 84 个数字组成的向量,且这些数字在不同数字之间具有强烈的相似性。基于我们在传统神经网络中的经验,我们可以理解,这个映射产生了一个低维度的表示,保留甚至强化了不同数字之间的差异。学习到的低维向量类似于通过几个精心挑选的词语来解释的复杂概念。这正是我们希望 CNN 能够做的事情。训练后的模型学会了“看”手写数字的世界,这些数字以小的灰度图像表示。灰度图像本身并没有什么特别的。CNN 同样可以处理由红、绿、蓝通道表示的彩色图像,或是任何数量的通道,比如使用多波段卫星图像时。
我们可以这样理解这个模型:在密集层之前的 CNN 层学会了如何作为一个函数,根据输入图像产生输出向量。真正的分类器是顶部的密集层,但它之所以有效,是因为 CNN 在学习映射函数的同时,也学会了分类器(即密集层)。
我之前提到过,卷积神经网络(CNN)的高层会关注输入的更大部分。我们可以通过考虑影响深层卷积核输出的输入部分来验证这一点。图 5-8 展示了这种效果。

图 5-8:影响模型深层的输入部分
从图像的右侧开始。3×3 的网格表示卷积层 1 的输出。我们想知道输入的哪一部分影响了被阴影标记的像素的值。查看前一层卷积层 0,我们看到卷积层 1 的输出依赖于来自前一层的九个阴影标记的值。
卷积层 0 的九个阴影标记的值依赖于输入的 5×5 阴影区域。之所以是 5×5,是因为每个九个值都是通过将 3×3 卷积核滑动到输入的 5×5 阴影区域上得到的。例如,图层 0 中间值的虚线部分来自输入中相似阴影的 3×3 区域。通过这种方式,CNN 的更高层会受到输入更大区域的影响。这个技术术语叫做 有效感受野,其中,图 5-8 中最右侧阴影值的有效感受野就是输入中 5×5 的阴影区域。
现在是时候进行实验了。我们已经了解了 CNN 的功能,接下来让我们将这些知识运用到实践中,比较传统神经网络与卷积模型,看看哪个会胜出?我猜想你已经知道答案了,但让我们验证一下,并在过程中获得一些经验。
我们需要一个数据集。我们使用 CIFAR-10 的灰度版本。与前两章使用的恐龙足迹数据集相比,这个选择更好,因为足迹图像是没有纹理和背景的轮廓,CNN 从这种图像中学到的东西与传统模型并无太大区别。正如我们在第三章中学到的,CIFAR-10 包含 32×32 像素的动物和交通工具图像,这可能会更具挑战性。
我们将训练三个模型:随机森林、传统神经网络和卷积神经网络。这样足够了吗?我们已经意识到这三种模型都涉及随机性,所以单次训练可能无法公正地代表每个模型的性能。毕竟,我们可能会遇到糟糕的初始化或树的组合,从而影响某个模型的表现。因此,让我们将每个模型训练 10 次,并取平均结果。
这个实验将帮助我们了解模型之间性能的差异,但通过跟踪神经网络在训练过程中的错误,我们还能学到更多。结果将是一个图表,我会呈现并简短地解释它。在此之前,先让我阐述一下模型的细节。
对于每个模型,训练集和测试集的数据集是相同的。传统的神经网络和随机森林需要向量输入,因此每张 32×32 像素的图像都会被展开成一个包含 1,024 个数字的向量。CNN 则直接处理实际的二维图像。训练集包含 50,000 张图像,每个类别有 5,000 张图像,测试集包含 10,000 张图像,每个类别有 1,000 张图像。
随机森林使用了 300 棵树。传统神经网络有两层隐藏层,分别包含 512 和 100 个节点。CNN 则更复杂,有四个卷积层、两个池化层和一个包含 472 个节点的全连接层。尽管 CNN 有更多的层,但需要学习的权重和偏差的总数几乎与传统模型相同:577,014 与 577,110。
我们将训练神经网络 100 个 epoch,即对整个训练集进行 100 次迭代。将小批量大小固定为 200,每个 epoch 进行 250 次梯度下降步骤。因此,在训练过程中,我们将更新网络的权重和偏差 25,000 次。在每个 epoch 结束时,我们将记录模型在训练集和测试集上的误差。当一切尘埃落定后,一张图表将展示我们想要了解的所有信息。
图 5-9 就是那个图表。它是我们见过的最复杂的图表,所以让我们从坐标轴开始,逐步详细分析。

图 5-9:CNN、MLP 和随机森林在 CIFAR-10 数据集上的结果
水平轴(x-轴)的标签为“epoch”,表示对训练集的完整一次迭代。因此,图表展示了训练过程中每次迭代后的变化。我们还知道每个 epoch 表示 250 次梯度下降步骤。垂直轴(y-轴)标签为“error”,范围从 0.1 到 0.8。此轴表示模型在测试集或训练集上错误分类的样本比例。误差越低,模型越好。0.1 表示 10%的错误,0.8 表示 80%的错误。
图表右上角的图例告诉我们,圆圈和方框与 MLP(传统神经网络)相关,而三角形和五边形则指代 CNN。具体来说,圆圈和三角形分别追踪 MLP 和 CNN 在测试集上的误差变化,而方框和五边形则追踪训练集上的误差。请记住,模型在训练集上的表现用于更新权重和偏差,而测试集用于评估,并不会影响模型的训练过程。
MLP 图表展示了模型在训练集(方块)和测试集(圆圈)上的学习效果,随着训练的进行,逐个周期不断变化。可以立即看出,模型在训练集上的学习效果优于测试集,因为训练集的误差不断减少。这是我们所期望的。梯度下降算法会更新 MLP 的权重和偏差,总共有 577,110 个参数,以便在训练集上得到更低的误差。然而,我们并不关心训练集上的误差降到零;我们更希望在测试集上得到最小的误差,因为这可以让我们相信,MLP 已经学会了如何泛化。
现在看看显示测试集误差的圆形图。它在大约 40 个周期时达到了大约 0.56 或 56%的最小值。之后,误差缓慢但稳定地增加,直到 100 个周期。这个现象是典型的 MLP 过拟合。训练集误差继续减少,但测试集误差达到了最小值后开始增加。图 5-9 告诉我们,在 40 个周期时停止训练,会得到表现最佳的 MLP。
我们稍后会讨论 CNN 的结果,但此刻,先看看 58%误差的虚线。它被标记为“RF300”,展示了一个 300 棵树的随机森林的测试集误差。随机森林不会通过在多个周期中更新权重来学习,因此 58%的误差就是模型的误差。我将其绘制为与横轴平行的虚线,这样你可以看到,短暂的时间内,MLP 比随机森林稍微好一些,但到了 100 个周期后,两个模型之间的差异就几乎可以忽略不计。换句话说,我们可以认为,在灰度 CIFAR-10 数据集上,经典机器学习的最佳表现是 56%到 58%的误差。这并不是一个好的结果。通过调整随机森林、MLP 的参数,或者从头开始使用支持向量机,可能会稍微减少误差。但仍然不太可能克服经典机器学习在这个数据集上无法做太多的事实。
最后,看看 CNN 的训练(五边形)和测试(三角形)曲线。在 100 个周期时,CNN 在训练集上的误差大约为 11%,更重要的是,在测试集上的误差约为 23%。换句话说,CNN 的正确率为 77%,或者说是接近 8 次中的 7 次。在一个 10 类数据集上,随机猜测的正确率大约为 10%,所以 CNN 的学习效果非常好,远远优于 MLP 和随机森林。
这正是卷积神经网络的关键点:通过学习表示图像中物体的各个部分,就可以学习到一种新的表示(正式称为嵌入),使得网络的密集层能够成功地进行分类。
我在 2015 年训练的第一个 CNN 尝试在卫星图像中检测小型飞机。最初的非 CNN 方法有效,但噪声较大,存在许多假阳性(假检测)。飞机确实存在,但也有许多其他并非飞机的物体。然后,我训练了一个像本实验中使用的简单 CNN,它轻松地定位了飞机,几乎只定位了飞机。我感到目瞪口呆,并意识到深度学习是一次范式的转变。我将在第七章中讨论,到了 2022 年秋季,发生了一个新的、更深刻的范式转变,但在我们准备好讨论之前,还有一些内容需要学习。
本章介绍的简单 CNN 并没有充分展示可用神经网络架构的多样性。十年的快速发展促成了一些常用的 CNN 架构,其中一些甚至有超过 100 层。这些架构有像 ResNet、DenseNet、Inception、MobileNet 和 U-Net 等名称,此外还有很多其他架构。U-Net 值得一提。
我们到目前为止探讨的 CNN 接受一个输入图像,并返回一个像“狗”或“猫”这样的类别标签。事情不必非得这样。一些 CNN 架构实现了语义分割,其输出是另一个图像,每个像素都标记了它所属的类别。U-Net 就是这样做的。如果狗的每个像素都标记为“狗”,那么从图像中提取出狗就变得非常简单。U-Net 和将整个图像分配单一标签的 CNN 之间的一个折中方法是输出一个边界框的模型,边界框是包围检测到的物体的矩形。人工智能的普及意味着你很可能已经见过带有标注边界框的图像。YOLO(“you only look once”)是一种流行的生成标注边界框的架构;Faster R-CNN 则是另一种。
我们在这里关注的是图像输入,但输入不一定非得是图像。任何可以用图像格式表示的内容,只要具有两个维度,并且在这些维度内有结构,都是二维 CNN 的候选对象。一个很好的例子是音频信号,我们通常认为它是一维的,即随时间变化的电压信号,驱动扬声器。然而,音频信号在不同的频率上包含能量。不同频率的能量可以在二维上显示:水平维度是时间,垂直维度是频率,通常较低频率位于底部,较高频率位于顶部。每个频率的强度变成一个像素的强度,将音频信号从一维的、随时间变化的电压转换成二维的频谱图,如图 5-10 所示。

图 5-10:从一维数据到二维图像的映射
这里是一个哭泣婴儿的频谱图,包含了大量的信息和结构,CNN 可以从中学习,从而生成一个比单一的音频信号更好的模型。关键的观察是,任何能提取输入数据结构并使其适应 CNN 的转换都是可以接受的。
你有一个数据集,需要构建一个卷积神经网络(CNN)。你应该使用什么架构?最小批量的大小应该是多少?你需要哪些层,并且顺序如何?你应该使用 5×5 还是 3×3 的卷积核?多少轮训练才够?在标准架构发展之前,这些问题都需要由设计网络的人来回答。这有点像过去的医学:科学、经验和直觉的结合。神经网络的艺术意味着从业人员的需求很高,熟练的软件工程师很难将深度学习加入他们的技能库。有些人曾经想知道,是否可以使用软件来自动确定模型的架构和训练参数(也就是它的超参数,见第三章)。于是,自动机器学习(AutoML)应运而生。
大多数基于云的商业机器学习平台,如微软的 Azure Machine Learning 或亚马逊的 SageMaker Autopilot,都包含一个 AutoML 工具,可以为你创建机器学习模型;你只需要提供数据集。AutoML 不仅适用于神经网络,许多工具还包括经典的机器学习模型。AutoML 的整个目的就是以最少的用户专业知识,找到适合给定数据集的最佳模型类型。
我想争辩的是,AutoML 也仅仅做到这一点,最优秀的深度学习从业人员始终会超越它,但这个争论听起来空洞。它让我想起了以前的汇编语言程序员,他们曾经断言编译器永远无法生成比他们手写的代码更好或一样好的代码。如今,汇编语言程序员的工作机会很少,但使用编译语言的程序员却有成千上万的职位(至少目前是这样;见第八章)。话虽如此,我们中的一些人仍然更喜欢自己构建模型。
深度学习革命的一个结果是创建了强大且开源的机器学习工具包,如 TensorFlow 和 PyTorch 等名字。实现传统的全连接神经网络是机器学习学生的一项练习。虽然不简单,但大多数人通过努力可以完成。另一方面,正确实现一个 CNN,尤其是支持多种层类型的 CNN,可谓不是件简单事。人工智能社区早期就致力于开发支持深度学习的开源工具包,包括 CNN。如果没有这些工具包,AI 的发展会非常缓慢。像谷歌、Facebook(Meta)和 NVIDIA 等大型科技公司也加入了这一行列,它们对工具包开发的持续支持对 AI 至关重要。
除了包含大量经过测试的高性能代码外,使得这些工具包强大的另一个原因是它们的灵活性。我们现在认识到,训练一个神经网络,无论是 CNN 还是其他类型,都需要两个步骤:反向传播和梯度下降。反向传播只有在模型的层支持一种称为微分的特定数学运算时才能发挥作用。微分是高等数学第一学期学生学习的内容。只要这些工具包能够自动计算导数(即微分后的结果),它们就能让用户实现任意层。工具包通过将神经网络转化为计算图,采用了自动微分技术。
尽管自动微分和计算图的优雅与灵活性在数学和计算机科学的结合中是美妙的,但很难抵挡深入探索的诱惑。不幸的是,你需要相信我,因为实现这些细节的程度远远超出了本书的讨论范围。一个关键点是,自动微分有两种主要方法:前向和反向。前向自动微分更容易理解和用代码实现,但不适用于神经网络。某种程度上来说,这很遗憾,因为前向自动微分最好使用双数来实现,双数是一种由英国数学家威廉·克利福德于 1873 年发明(发现?)的晦涩数字类型。这些数字最初是数学为数学本身服务的典型例子,直到计算机时代才被重新发现并变得有用。而反向自动微分则更适用于神经网络,但不使用双数。
这一章很有挑战性。我们深入探讨了比以往章节更为详细的内容,也会在接下来的章节中继续讨论。因此,确实需要一个总结。卷积神经网络:
-
依赖输入的结构性,这与经典的机器学习模型完全相反
-
通过将输入拆分成部分及部分的组合来学习输入的新表示
-
使用多种不同类型的层,并以多种方式组合
-
可以对输入进行分类、定位输入,或为输入中的每个像素分配类别标签
-
仍然通过反向传播和梯度下降进行训练,就像传统神经网络一样
-
推动了强大的开源工具包的创建,使深度学习变得大众化
卷积神经网络延续了经典机器学习模型的传统:它们接受输入,并以某种方式为其分配一个类别标签。该网络作为一个数学函数运作,接受输入并产生输出。下一章将介绍那些在没有输入的情况下生成输出的神经网络。
用一句老电视节目的话来改述:你正在穿越另一个维度,一个不仅仅是视觉和听觉的维度,而是心灵的维度,一次进入神奇土地的旅程,其边界就是想象力——下一站,生成式人工智能。
关键词
自动微分、AutoML、边界框、计算图、卷积、卷积层、卷积神经网络、全连接层、有效感受野、嵌入、端到端学习、滤波器、卷积核、池化层、语义分割
第七章:生成式人工智能:人工智能变得具有创造力**

生成式人工智能是一个涵盖所有可以创建新颖输出的模型的统称,这些模型可以独立(随机地)或根据用户提供的提示进行生成。生成式模型不会产生标签,而是生成文本、图像甚至视频。从底层来看,生成式模型是由相同基本组件构建的神经网络。
我们将重点介绍三种生成式人工智能模型:生成对抗网络、扩散模型和大型语言模型。本章介绍前两种。大型语言模型最近彻底改变了人工智能的世界。它们是第七章的主题。
生成对抗网络 (GANs)由两个分开的神经网络组成,它们一起训练。第一个网络是生成器,它的任务是学习如何为判别器创建假输入。判别器的任务是学习如何区分真假输入。训练这两个网络的目标是使生成器更好地欺骗判别器,而判别器则尽力区分真假。
一开始,生成器非常糟糕。它输出的是噪声,判别器很容易区分真假。然而,随着时间的推移,生成器逐渐改善,判别器的任务也变得越来越困难;这反过来又促使判别器变得更擅长于区分真假。当训练完成时,判别器通常会被丢弃,经过训练的生成器将用于从训练数据的学习空间中随机采样并生成新的输出。
我没有具体说明训练数据是什么,因为目前我们只需要知道的是,GAN 是由两个竞争(对抗)的网络构成的。在大多数应用中,最终我们所需要的是生成器。
从结构上看,我们可以将 GAN 想象成图 6-1 中的块。(我会在适当的时候解释随机向量部分。)从概念上讲,我们看到判别器接受两种类型的输入:真实数据和生成器的输出。判别器的输出是一个标签:“真实”或“假”。标准的神经网络训练使用反向传播和梯度下降,同时训练生成器和判别器,但不是同时进行的。

图 6-1:生成对抗网络架构的概念化
例如,使用一个真实数据的小批量——即可用真实训练数据的一个小子集——进行训练,步骤如下:
-
使用当前的生成器来创建一个小批量的假数据。
-
从训练集中获取一个小批量的真实数据。
-
解冻判别器的权重,以便梯度下降可以更新它们。
-
将假样本和真实样本分别通过鉴别器,标记为 0 和 1。
-
使用反向传播进行梯度下降步骤,以更新鉴别器的权重。
-
冻结鉴别器,使得生成器可以在不改变鉴别器的情况下进行更新。
-
创建一个小批量的生成器输入(即图 6-1 中的随机向量)。
-
将生成器的输入通过合成模型以更新生成器的权重。将每个生成器输入标记为真实。
-
从步骤 1 开始,直到整个模型训练完成。
算法首先使用当前的生成器更新鉴别器的权重(步骤 5),然后冻结它们(步骤 6),这样生成器的权重可以在不改变鉴别器的情况下更新。这个方法是必要的,因为我们希望鉴别器的输出——“真实”或“假”的标签——更新生成器部分。注意,生成器更新将所有假图像标记为真实。这样做是根据假输入对鉴别器的真实度进行评分,从而评估生成器的表现。
让我们来分析作为生成器输入的随机向量。GAN 的关键是学习一个训练集的表示,我们可以把它当作一个数据生成器,就像生成真实训练集的数据生成过程。然而,在这种情况下,数据生成器可以被看作是一个函数,它接受一组随机数,即随机向量,并将其转化为一个输出,这个输出可能看起来像是来自训练集。换句话说,生成器就像一个数据增强设备。生成器的随机输入成为了训练集的一个示例。实际上,生成器是实际数据生成过程的代理,后者最初创造了真实的训练集。
随机向量是从一个概率分布中抽取的。从概率分布中抽样类似于掷两个骰子,并询问它们的和是七的可能性与是二的可能性哪个更大。和为七的可能性更大,因为有更多种方法可以将两个数字加起来得到七。而得到二的方法只有一种:蛇眼。从正态分布中抽样也类似。返回的最常见样本是分布的平均值。离平均值越远的数值出现的可能性越小,尽管仍然可能出现。
例如,图 6-2 展示了人体身高分布的条形图。原始数据集包含了 25,000 个人的身高数据,然后将这些数据适配到图中的 30 个区间。柱子越高,表示该区间内的人数越多。

图 6-2:人体身高分布
注意直方图的形状,它看起来像一个钟形曲线——因此有了它那有些过时的名字,钟形曲线(bell curve)。它的现代名称是正态分布,因为它在自然界中经常出现,成为通常遇到的分布,尤其是那些由物理过程生成的数据。从分布中我们可以看出,随机选择的人的身高通常在 68 英寸左右:超过 10%的样本人口落入了这个区间。
GAN 使用的随机向量,也叫做噪声向量,工作原理相同。在这种情况下,均值为零,大多数样本的范围在-3 到 3 之间。此外,向量中的每个n元素都遵循这个范围,这意味着该向量本身是来自n维空间的样本,而不是图 6-2 中那种一维空间的样本。
有标签的数据集是机器学习的一大痛点。生成对抗网络(GAN)没有这样的限制。我们不关心训练样本的类别是什么,只关心它是否是实际数据的实例,不论类别标签是什么。当然,我们仍然要求训练集能反映我们想要生成的数据类型,但训练集不需要带标签。
让我们使用我们老朋友——MNIST 数字数据集,来构建一个生成对抗网络(GAN)。生成器将学习将一组随机的 10 个数字(即n为 10)转换成数字图像。训练完成后,我们可以给生成器任何一组围绕零的 10 个数值,生成器将输出一个新的数字图像,从而模拟了 MNIST 数据集的生成过程:人们手写数字在纸上。经过训练的 GAN 生成器可以源源不断地产生目标输出。
我们将使用一个基于传统神经网络的简单 GAN,来创建一个用于生成无限量 MNIST 风格数字图像的生成器。首先,我们将展开现有的 MNIST 训练集,使每个样本成为一个 784 维的向量,就像我们在第五章中做的那样。这就给了我们真实数据。为了生成假数据,我们需要 10 元素的随机向量,我们将通过从正态分布中抽取 10 个样本,生成均值为零的向量。
模型的生成器部分接受一个 10 元素的噪声向量作为输入,并生成一个 784 元素的输出向量,代表合成的数字图像。回想一下,这 784 个数字可以重新排列成一个 28×28 像素的图像。生成器模型有三个隐藏层,分别为 256、512 和 1,024 个节点,并有一个输出层,包含 784 个节点用于生成图像。隐藏层的节点使用一种叫做 leaky ReLU 的修正版本的线性整流单元。Leaky ReLU 激活函数在输入为正时输出输入值,但如果输入为负,输出则为负输入乘以一个小的正值。换句话说,它们会“漏”一点。输出层使用双曲正切激活函数,这意味着每一个 784 个输出元素的值都会在 -1 到 +1 之间。这是可以接受的。当我们将图像写入磁盘时,可以将这些值缩放到 0 到 255 之间。
生成器必须在随机噪声向量输入和输出图像之间进行映射。鉴别器则必须接受一张图像作为输入,这意味着它接受一个 784 维的向量。鉴别器有三个隐藏层,和生成器相似,但顺序相反:先是 1,024 个节点,再是 512 个节点,最后是 256 个节点。鉴别器的输出层有一个节点,采用 sigmoid 激活函数。Sigmoid 输出值在 0 到 1 之间,我们可以将其解释为鉴别器对输入是否真实的判断(输出接近 1 表示真实,输出接近 0 表示虚假)。注意,这个网络仅使用了标准的全连接层。高级的 GAN 使用卷积层,但探讨这些网络的细节超出了我们的讨论范围。
图 6-3 显示了生成器(上)和鉴别器(下)。两个部分在隐藏层节点数量上的对称性非常明显,尽管请注意,鉴别器中的顺序是反向的。

图 6-3:GAN 生成器(上)与鉴别器(下)
生成器接受一个 10 元素的随机向量作为输入,并生成一个 784 元素的伪图像输出向量。鉴别器接受一张图像向量(无论是真实还是伪造的),并输出一个预测值,这个值在 0 到 1 之间。伪造的图像应该生成接近 0 的值,而真实图像应该生成接近 1 的值。如果生成器训练得很好,鉴别器大多数时候会被欺骗,这意味着鉴别器的输出对于所有输入都会接近 0.5。
整个网络经过 200 次迭代训练,每次迭代包含 468 个小批量,总共 93,600 次梯度下降步骤。我们可以在每次迭代后展示来自生成器的样本,以观察网络在学习过程中的变化。图 6-4 展示了第 1、60 和 200 次迭代后的样本,从左到右依次排列。

图 6-4:生成器在第 1、60 和 200 次迭代后的输出
正如我们预期的那样,生成器在训练数据经过一次训练后表现较差,但可能并不像我们想象的那样糟糕。大多数生成的图像看起来像数字“1”;其他数字形状,如零和二,也有出现,尽管有些噪音。
经过 60 个训练周期,生成器能够生成各种各样的数字。有些非常准确,而有些则仍然模糊不清或只是部分绘制出来。经过 200 个训练周期后,大多数数字已经清晰明确。生成器已经训练完毕,现在可以按需生成数字图像。
我们的数字生成器可以很高兴地为我们生成 10,000 个新的数字图像,但如果我们希望这些图像都是“四”呢?随机输入向量会生成一个随机数字,但我们不能选择具体是哪个数字。如果我们随机选择输入向量,可以理解我们会认为生成的数字输出也是随机的。我通过使用训练好的生成器生成了 1,000 个数字图像来测试这个假设。然后,我将这些数字图像传递给一个在 MNIST 数据集上训练的卷积神经网络。该卷积神经网络的测试集准确率超过 99%,这让我们对其预测充满信心,前提是输入的是数字图像。GAN 生成器可以生成逼真的数字图像,因此我们有充分的理由相信结果是可靠的。
假设生成器的表现符合我们的预期,那么每个数字的百分比应该大致相同。因为有 10 个可能的数字,所以我们预期每个数字出现的概率大约是 10%。但事实并非如此。表 6-1 显示了每个数字实际出现的分布情况。
表 6-1: 实际的数字分布
| 数字 | 百分比 |
|---|---|
| 0 | 10.3 |
| 1 | 21.4 |
| 2 | 4.4 |
| 3 | 7.6 |
| 4 | 9.5 |
| 5 | 6.0 |
| 6 | 9.1 |
| 7 | 14.4 |
| 8 | 4.4 |
| 9 | 12.9 |
生成器偏向数字“1”,其次是“7”、“9”和“0”;“8”和“2”是最不可能出现的输出。因此,GAN 不仅无法让我们选择所需的数字类型,而且它还有明显的偏好。查看图 6-4 中的最左边图像,展示了第 1 个周期的样本。大多数数字是“1”,因此从训练开始时,GAN 就表现出了偏向“1”的趋势。GAN 确实学到了东西,但数字“1”占主导的现象揭示了一个问题,这个问题有时会困扰 GAN 的训练:即模式崩溃,生成器在早期学会了如何生成一个特别好的例子或一组例子,这些例子能够欺骗判别器,从而陷入只生成这一输出的困境,无法产生期望的多样化图像。
我们不需要完全依赖于一个难以控制的 GAN。相反,我们可以在训练时对网络进行条件化,传入一个指示符,告诉生成器我们希望生成什么类型的数字。采用这种方法的 GAN 被称为条件 GANs。与无条件 GAN 不同,它们需要带标签的训练集。
在条件 GAN 中,生成器的输入仍然是一个随机噪声向量,但它附带了另一个向量,用来指定期望的输出类别。例如,MNIST 数据集有 10 个类别,数字 0 到 9,因此条件向量有 10 个元素。如果期望的类别是数字 3,条件向量除了第 3 个元素为 1,其他元素都是 0。这种表示类别信息的方法被称为独热编码,因为向量的所有元素都是零,只有与期望类别标签对应的元素为 1。
判别器也需要类别标签。如果输入到判别器的是一张图像,我们如何包含类别标签呢?一种方法是将独热编码的概念扩展到图像。我们知道,彩色图像由三个图像矩阵表示,分别对应红色通道、绿色通道和蓝色通道。灰度图像只有一个通道。我们可以将类别标签作为一组额外的输入通道,其中除了与类别标签对应的通道外,其他通道的值都为零,对应的类别标签通道为一。
在生成和区分真实与伪输入时包含类别标签,迫使整个网络的每个部分都学习如何生成和解释特定类别的输出和输入。如果类别标签是 4,而生成器生成的数字看起来更像是零,判别器会知道存在类别不匹配,因为它从标记过的训练集中知道真实的零是什么样的。
条件 GAN 的好处在于使用训练好的生成器时。用户提供期望的类别作为一个独热向量,并与无条件 GAN 使用的随机噪声向量一起输入。然后,生成器基于噪声向量输出一个样本,但该样本是基于期望的类别标签生成的。我们可以将条件 GAN 看作是多个无条件 GAN 的集合,每个无条件 GAN 都训练在单一类别的图像上。
我在 MNIST 数据集上训练了一个条件 GAN。在这个例子中,GAN 使用了卷积层,而不是本章早些时候使用的全连接层。然后,我要求完全训练好的生成器生成每个数字的 10 个样本,如图 6-5 所示。

图 6-5:条件 GAN 输出,显示每个数字的样本
条件 GAN 让我们选择期望的输出类别,而无条件 GAN 无法做到这一点,但如果我们想调整输出图像的特定特征呢?为此,我们需要一个可控的 GAN。
不可控的 GAN 会无规则地生成图像,而不考虑类别标签。条件 GAN 引入了类别特定的图像生成,这在我们希望使用 GAN 生成合成图像来训练其他模型时非常有用,特别是当我们想为类别较少的示例生成数据时。另一方面,可控 GAN 允许我们控制生成图像中特定特征的外观。当生成器网络进行学习时,它学习一个可以映射到输出图像的抽象空间。随机噪声向量是这个空间中的一个点,该空间的维度等于噪声向量的元素数量。每个点都会生成一张图像。将相同的点、相同的噪声向量输入生成器时,会输出相同的图像。
在噪声向量所表示的抽象空间中移动,会不断生成输出图像。抽象噪声空间中是否存在具有意义的方向,这些方向与输出图像中的特征相关?这里的特征指的是图像中的某些元素。例如,如果生成器生成的是人脸图像,那么一个特征可能是脸部是否戴眼镜、是否有胡子或是否有红色头发。
可控 GAN 能够揭示噪声空间中的有意义方向。沿着这些方向移动会改变与该方向相关的特征。当然,现实更为复杂,因为单一方向可能会影响多个特征,这取决于噪声空间的维度和生成器学习到的数据。通常,较小的噪声向量更容易纠缠,意味着单一噪声向量的维度会影响多个输出特征,从而使得识别有趣方向变得困难。一些训练技巧和更大的噪声向量(例如,使用 100 个元素而非我们之前使用的 10 个)可以提高模型将有趣特征调整分配给单一方向的机会。理想情况下,单个噪声向量元素会有一个有意义的特征调整。
让我们通过一个二维示例来深入理解这个概念。使用二维噪声向量训练生成器可能会很困难,但这个概念适用于所有维度,并且在二维中容易演示。图 6-6 展示了我们所需的内容。

图 6-6:在二维噪声空间中移动并插值生成 MNIST 数字
图的上部分展示了一个具有两个输入的生成器的二维噪声空间,分别是 x 坐标和 y 坐标。因此,图中的每个点代表由 GAN 生成的图像。第一张图像是由点 (2, 5) 产生的(圆形标记)。第二张图像来自点 (6, 1)(方形标记)。箭头指示通过噪声空间的某个方向,我们以某种方式学习到这个方向控制输出图像中的某个特征。如果 GAN 生成的是人脸,箭头可能指向一个影响人物发色的方向。从点 (2, 5) 移动到点 (6, 1) 保持了大部分输出图像,但改变了发色,例如从 (2, 5) 处的黑色变为 (6, 1) 处的红色。箭头上的点代表介于黑色和红色之间的发色。
图 6-6 的底部展示了我们训练的生成对抗网络(GAN)在生成数字图像时沿第三维度的插值。从左到右,数字三短暂变为九,随后变为四,这是因为在保持其他元素初始随机值不变的情况下,调整了 10 元素噪声向量的第三个元素。噪声向量的维度相对较低,这意味着不太可能有任何一个维度仅仅与单一数字特征相关,这也是为什么整个图像从最初的三经过九变成四的原因。
精密的 GAN 可以生成逼真的假人脸图像。可控版本通过学习与特定面部特征相关的方向来进行调整。例如,考虑图 6-7,图中显示了左侧的两个生成假人脸和右侧经过调整的人脸(来源:Yujun Shen 等人,“解读 GAN 的潜在空间进行语义面部编辑”,2019 年)。这些调整对应于通过噪声空间的移动,从原始图像位置沿着表示年龄、眼镜、性别和姿势的学习方向进行调整。

图 6-7:控制面部属性
可控 GAN 的能力确实令人惊叹,生成器能够通过噪声空间学习有意义的方向也令人印象深刻。然而,GAN 并不是创建现实且可控图像的唯一方法。扩散模型同样能生成逼真的图像;更重要的是,这些图像可以根据用户定义的文本提示进行条件化。
生成对抗网络依赖于生成器和判别器之间的竞争,来学习生成与训练数据相似的假图像。扩散模型则代表了一种无竞争的方式来达到同样的目标。
简而言之,训练扩散模型的过程是教它预测加到训练图像上的噪声。在扩散模型的推理过程中,则是相反的过程,将噪声转化为图像。太棒了!但在图像中,"噪声"到底是什么?
噪声意味着随机性,即没有结构的事物。如果你在想收音机的静电或音频信号中的嘶嘶声,你大致是对的。对于数字图像来说,噪声意味着随机值被添加到像素中。例如,如果像素值应该是 127,噪声就会加或减去一个小的量,使得值变成 124 或 129。加入到图像中的随机噪声通常看起来像雪花。扩散模型学习如何预测添加到训练图像中的正态分布噪声量。
在训练网络之前,我们必须准备好几个条件。首先,我们需要一个训练数据集。扩散模型像所有神经网络一样,从数据中学习。与生成对抗网络(GANs)一样,标签在我们希望模型生成特定内容之前是不需要的。
一旦我们有了训练数据,就需要一个神经网络架构。扩散模型在这里并不挑剔,但所选架构必须能够接受图像作为输入,并生成同样大小的图像作为输出。在第五章中简要提到的 U-Net 架构是一个常见的选择。
我们有了数据和架构,接下来需要找到一种方法让网络进行学习。但学习什么呢?事实证明,强迫网络学习添加到图像中的噪声就是所需的全部内容。这一认识背后的数学并不简单。它涉及到概率论,但在实际操作中,其核心是取一张训练图像,加入一定程度的正态分布噪声,然后将已知噪声与模型预测的噪声进行比较。如果模型能够成功预测噪声,我们就可以在之后用模型将纯噪声转化为与训练数据相似的图像。
上一段中重要的部分是“已知程度的正态分布噪声”这一短语。正态分布噪声可以通过一个单一参数来表征,这个数字指定了噪声的程度。训练过程包括从训练集中随机选择一张图像和一个噪声级别,并将它们作为输入传递给网络。网络的输出是模型对噪声量的估计。输出噪声(本身是一个图像)与加入的噪声之间的差异越小越好。通过标准的反向传播和梯度下降方法,逐步减少这个差异,直到模型被认为训练完成。
如何将噪声添加到训练图像中会影响模型学习的效率和速度。噪声通常遵循一个固定的时间表。该时间表规定,从当前噪声级别(例如噪声级别 3)转到下一个噪声级别 4 时,会向图像添加一定量的噪声,而噪声量依赖于某个函数。如果每一步之间添加的噪声量相同,则该时间表是线性的。然而,如果每一步之间添加的噪声量取决于该步骤本身,则它是非线性的,并遵循其他某种函数。
参考图 6-8,左侧展示了一个可能的训练图像。每一行展示了向训练图像添加的噪声级别。最上面一行遵循线性计划,其中从左到右的每一步都添加相同的噪声级别,直到图像几乎被破坏。最下面一行遵循的是余弦计划,这种方式破坏图像的速度较慢。这有助于扩散模型更好地学习。对于好奇的人来说,图像中的那位穿着考究的绅士是我的曾祖父,埃米尔·克诺伊塞尔,大约 1895 年拍摄。

图 6-8:将图像转化为噪声的两种方式:线性(上)和余弦(下)
图 6-8 仅展示了九个步骤。实际上,扩散模型使用数百个步骤,关键在于,在过程结束时,原始图像被完全破坏,最终只剩下噪声。这一点很重要,因为从扩散模型中采样会反转这一过程,将随机噪声图像转化为无噪声图像。实际上,从扩散模型中采样的过程是从右到左,通过训练好的网络预测噪声,然后将其减去,生成上一步的图像。对计划中的所有步骤重复这一过程,完成从噪声到图像的生成过程。
前一节中的描述可以用两个算法来总结。我鼓励你阅读它们,但由于它们有些技术性,跳到下一节也是一个不错的选择。
前向算法训练扩散模型,反向算法在推理过程中从训练好的模型中采样以生成输出图像。让我们从前向算法开始。我们重复以下过程,直到宣布模型已训练完成:
-
随机选择一张训练图像,x[0]。
-
在 1 到T的范围内随机选择一个时间步长,t,其中T是最大步数。
-
从标准正态分布中采样一个噪声图像,e。
-
使用x[0]、t和e定义一个噪声图像,x[t]。
-
将x[t]输入模型,并将输出的噪声估计与e进行比较。
-
应用标准的反向传播和梯度下降方法来更新模型的权重。
前向算法之所以有效,是因为有一种直接的方式可以从训练集中的图像x[0]和随机选择的时间步长t中得到x[t]。其中,T是最大可能的时间步长,此时训练图像已转化为纯噪声。通常,T是数百步。回想一下,扩散模型的目标是学习如何预测噪声e。反复迫使模型在预测用于破坏训练图像的噪声方面越来越准确,这就是反向步骤能够成功的原因。
反向算法从正向算法训练的扩散模型中采样,生成新的输出图像,从纯噪声图像x[T]开始(可以参考图 6-8 中的最右边图像)。扩散模型通过重复以下步骤,使用T步将噪声转换为图像:
-
如果这不是从x[1]到x[0]的最后一步,从标准正态分布中采样一个噪声图像,z*。
-
通过从x[t]中减去扩散模型的输出并加上z来创建x[t−1]。
反向算法从右到左进行,如果按图 6-8 的方式思考。每一步向左的过程是通过用当前图像作为输入,减去扩散模型的输出,从而从时间步* t移动到前一个时间步t–1。标准的噪声图像z确保x[t−1]是一个有效的样本,来自于提供x[t−1]的概率分布,生成x[t*]。如前所述,我们跳过了大量的概率理论。
采样算法之所以有效,是因为扩散模型估计了输入中的噪声。这个估计引导我们估算出一个图像,合理地推测这个图像是如何从x[t]生成x[t–1]的。迭代所有T步,最终得到x[0],即网络的输出。请注意,与我们之前的网络不同,后者有输入并生成输出,扩散模型是反复运行的,每次都生成噪声越来越少的图像,直到最终生成一个与训练数据相似的图像。
扩散模型就像标准的 GAN 一样:无条件的。生成的图像是不可控的。你可能会怀疑,如果 GAN 可以通过某种方式进行条件化来引导生成过程,那么扩散模型是否也能以类似的方式进行引导。如果是的话,你是对的。
我们用来生成类似 MNIST 数字图像的 GAN 是通过将输入扩展为一个 one-hot 向量,来选择所需的类别标签,进而条件化生成器。条件化扩散模型则没有那么简单,但确实可以在训练时向网络提供与图像相关的信号。通常,这个信号是一个嵌入向量,代表训练图像内容的文本描述。我们在第五章中简要接触过嵌入,之后在第七章中讨论大型语言模型时还会再次涉及。
目前我们只需要知道的是,文本嵌入将像“一个大红色的狗”这样的字符串转换为一个大的向量,我们可以将其看作是高维空间中的一个点:这个空间捕捉了意义和概念。在训练过程中,文本嵌入的关联作用就像是在网络学习预测图像中的噪声时,条件作用于网络,类似于 one-hot 类别向量对 GAN 生成器的条件作用。
训练后,当采样时,文本嵌入的存在提供了类似的信号,引导输出图像,使其包含与文本相关的元素。在采样时,文本成为一个提示,描述我们希望扩散过程生成的图像。
扩散模型通常从一张随机噪声图像开始。其实不一定如此。如果我们希望输出图像与现有图像相似,我们可以将该图像作为初始图像,添加一定程度的噪声。根据添加噪声的程度,图像的样本会更多或更少地与其相似。现在,让我们来了解条件扩散模型。
商业扩散模型,如 OpenAI 的 DALL-E 2 或 Stability AI 的 Stable Diffusion,使用用户提供的文本或图像来引导扩散过程,生成满足提示要求的输出图像。本节展示的示例是通过 Stable Diffusion 在 DreamStudio 在线环境中生成的。图 6-9 向我们展示了列奥纳多·达·芬奇的蒙娜丽莎(左上方)及其五个变体。

图 6-9:由 Stable Diffusion 想象的 蒙娜丽莎 *
这些变体是 Stable Diffusion 根据原始图像和文本提示生成的作品:
穿棕色连衣裙的女性肖像,达·芬奇风格,柔和的土色调
DreamStudio 界面允许用户提供初始图像,并使用滑块设置要添加的噪声量,从 0%(纯噪声图像)到 100%(不添加噪声)。(是的,我也觉得这有点反直觉。) 图像的噪声版本初始化了扩散过程。百分比越高,添加的噪声越少,初始图像对最终输出的影响越大。对于蒙娜丽莎,我使用了 33%的噪声。这个噪声级别,再加上提示词和用户可选择的风格,生成了图 6-9 中的五个变化版本。变化之间唯一的不同是选择的风格(上排:动漫和奇幻艺术;下排:等距画法,线条艺术,和摄影风格)。
结果令人印象深刻。这些图像既不是画出来的,也不是手工绘制的,而是从蒙娜丽莎的噪声版本和作为指导的文本提示中扩散生成的。不难理解,能够根据提示生成新图像的能力将对商业艺术界产生影响。
然而,AI 图像生成并不完美。错误是难免的,如图 6-10 所示。我保证我没有要求生成一只五条腿的边境牧羊犬、一只多嘴的霸王龙,或者像蒙娜丽莎那样,拥有严重畸形手的女性肖像。扩散模型似乎在渲染手部时尤其困难,就像人类艺术家一样。

图 6-10:扩散模型错误
编写有效的提示语已成为一门艺术,这也催生了一个新兴职业:提示工程师。文本提示的具体形式对图像生成过程有着强烈影响,初始随机噪声图像的选择也同样如此。DreamStudio 界面允许用户固定伪随机数生成器种子,这意味着每次扩散过程都从相同的噪声图像开始。通过固定种子并稍微修改文本提示,我们可以进行实验,学习扩散过程的敏感性。
图 6-11 中的图像是通过“华丽的”、“绿色的”和“花瓶”这些词的排列组合生成的。(这些图像在书中以黑白呈现,但所有图像的绿色色调都相似。)每次的初始噪声图像都是相同的,只有这三个词的顺序发生了变化。三个花瓶相似,但第四个则有很大不同。不过,所有四个花瓶都是华丽的绿色花瓶的有效示例。

图 6-11:通过扩散模型生成的花瓶
提示语的顺序和措辞很重要,因为即使提示词或其含义相似,由文本提示生成的嵌入向量也会有所不同。前三个花瓶的提示语很可能在文本嵌入空间中接近,解释了它们为何如此相似。最后一个提示语由于某种原因落在了其他位置,导致生成图像的特征有所不同。有趣的是,最后一张图像的提示语是“华丽的绿色花瓶”,符合语法规范的形式。
出于好奇,我改变了提示语“华丽的绿色花瓶”,将“绿色”改成了其他颜色,并使用了之前的相同初始噪声图像。结果见图 6-12。从左到右,指定的颜色分别是红色、淡紫色、黄色和蓝色。前三张图像与图 6-11 中的最后一个花瓶相似;只有蓝色花瓶与众不同。

图 6-12:生成的各种颜色花瓶
在实验过程中,我注意到扩散模型的另一个特性,即生成的图像比原始图像噪声更少。假设输入图像的分辨率较低且有噪点,那么扩散模型的输出则会具有更高的分辨率且更清晰,因为输出并非对原始图像进行操作的结果,而是根据提示语重新构想的图像。如果对原始图像的绝对保真度要求不严格,是否可以利用扩散模型去除图像伪影?
图 6-13 试图回答这个问题。左侧是将原始的 195×256 像素图像放大到 586×768 像素(放大因子为 3)。这张图像使用标准的图像处理程序和立方插值法进行了放大。右侧是扩散模型输出的图像,大小同样为 586×768 像素。该扩散模型输出使用了 195×256 像素的原始图像,添加了 25%的噪声,采用了摄影风格,并且提示语为“详细,原始”。扩散图像更好。它并不完全与原始图像相同,但非常接近。我不认为这种方法能够与基于深度学习的超分辨率网络竞争,但无论最终的实用性如何,它都是扩散模型的一个有趣应用。

图 6-13:扩散模型图像增强
另一个例子是图 6-14,它展示了一张通过约 100 米远的距离拍摄的西部草地百灵鸟图像,该图像受到科罗拉多州烟雾的影响(左)。中间的图像是使用标准图像处理程序(如 Gimp)改善该图像的最佳尝试。右侧的版本是稳定扩散模型的输出,该模型使用了添加了一些噪声(约 12%)的中间图像,并且使用了以下文本提示:
西部草地百灵鸟,高度详细,高分辨率,无噪声

图 6-14:扩散模型图像增强实验,尝试改善一张被烟雾遮挡的西部草地百灵鸟图像:原图(左),使用标准图像处理程序的最佳尝试(中),通过稳定扩散增强后的图像(右)
稳定扩散模型并没有创造奇迹,但其输出无疑比原始图像要好。
本章探讨了两种生成网络:生成对抗网络和扩散模型。两者都通过随机输入生成图像。
GAN(生成对抗网络)联合训练生成器和判别器网络,教会生成器生成能够欺骗判别器的输出。条件 GAN 在训练和生成过程中使用类别标签,引导生成器产生属于用户指定类别的输出。可控 GAN 通过与生成输出的基本特征相关的噪声向量空间学习方向,使得沿这些方向的移动可以可预测地改变输出图像。
扩散模型学习预测图像中的噪声量。训练扩散模型时,会给模型提供干净的训练图像,并故意加入已知数量的噪声。模型的预测与已知添加的噪声一起,用于更新模型的权重。条件扩散模型将嵌入信息,通常来自训练图像内容的文本描述,与噪声相关联,以便在生成时,模型能够生成包含与用户文本提示相关的元素的图像。如果使用某个现有图像,并添加一定程度的噪声来替代纯随机初始图像,则会生成变体。
引言中提到了三种生成式 AI 模型。最后一种,大型语言模型,目前正威胁着以工业革命的规模,甚至是像某些 AI 从业者所说的轮子和火的水平,深刻改变世界。这种重大的声明要求我们给予关注。因此,让我们继续探讨可能最终会成为真正 AI 的内容。
关键词
条件 GAN、可控 GAN、扩散模型、判别器、纠缠、生成对抗网络(GAN)、生成式 AI、生成器、泄漏的 ReLU、模式坍塌、噪声向量、独热编码、调度
第八章:大型语言模型:终于有了真正的 AI?**

未来的历史学家可能会认为 2022 年秋季 OpenAI 发布的 ChatGPT 大型语言模型标志着真正的 AI 曙光。考虑到我在 2023 年 3 月末写这本书时所见到的情况,我同意这样的评估。
在本章中,我们将首先探讨现有大型语言模型的能力,然后继续描述它们是什么以及它们如何工作。尽管这些模型拥有令人印象深刻的能力,但最终这些模型依然是像所有之前的神经网络一样构建和训练的神经网络。仅这一点就意味着连接主义者从一开始就是对的。弗兰克·罗森布拉特(Frank Rosenblatt)是否会在坟墓中微笑呢?
我已经透露了我的观点,即 ChatGPT 和类似的模型代表着值得称之为真正 AI 的新事物。我的希望是,到本章结束时,你也会同意这一点。
人工智能这一术语有些模糊,在我们继续之前需要给出一个更细致的定义。实践者通常将 AI 分为两种类型:人工狭义智能(ANI)和人工通用智能(AGI)。前者涵盖了我们迄今为止讨论的所有内容。后者则指真正具有感知和智能的机器——科幻小说中的产物。
本书写作时存在的模型绝对不是 AGI。然而,它们也不仅仅是 ANI,它们似乎是某种全新的东西,介于两者之间。微软研究员 Sébastien Bubeck 等人近期论文的标题《人工通用智能的火花》给我留下了深刻的印象,觉得它非常贴切。
大型语言模型 (LLMs)接受用户提供的文本提示作为输入。然后,它们通过使用该提示和所有先前生成的单词作为指南,逐字(实际上是逐标记)生成输出文本。实际上,LLMs 的唯一设计目标就是非常擅长预测由输入提示启动的单词序列中的下一个单词。仅此而已,它们的训练目标就是如此。然而,这并不是它们学会的全部内容。AI 研究人员之所以对 LLMs 如此兴奋,是因为在学习成为专家级文本生成器的过程中,LLMs 也学会了一系列突现的能力,包括问题回答、数学推理、高质量的计算机编程以及逻辑推理等。
这些意外的、突现的能力在哲学上的意义深远。LLMs 的能力引发了关于思维本质、意识的含义以及(假定的)人类大脑独特性等问题的讨论。我们目前无法深入回答这些问题,但我将在第八章中回到其中一些问题。
现在,让我们深入了解 LLM 的能力。我们这里只能触及到一些新兴的能力,但互联网上已经充满了令人印象深刻、有趣甚至令人害怕的 LLM 应用示例。我推荐大家查看这些例子,尽管像往常一样,需要注意评估信息来源的质量。请参考本书末尾的资源,看看我推荐的一些在线(和印刷版)资源。
AI 社区在这一领域正在以极快的速度发展。到你读到这些文字时,LLM(大型语言模型)无疑会比我写下这些话时更加出色。
以下是 LLM 模型实际应用的示例。在大多数情况下,我会展示三个模型的输出:Bard、GPT-3.5 和 GPT-4。所有输出都代表了 2023 年 3 月下旬的模型表现。在每个案例中,我都是通过网页浏览器使用公共接口。Bard 是谷歌的模型,GPT-3.5 和 GPT-4 是来自 OpenAI 的。
LLM 是语言的专家用户。这些模型以对话格式运行,从用户的提示或问题开始。例如,我给了每个模型以下的提示:
写一个适合六岁以下儿童的、关于泰迪熊、魔毯和月亮的一个段落的睡前故事。
下面是 Bard 的回答:
很久以前,有一只小泰迪熊住在一个玩具盒里。他喜欢和朋友们一起玩,但他总是梦想着飞上月球。一天,他在玩具盒里发现了一块魔毯。那块毯子竟然能飞!小泰迪熊兴奋极了,他跳上毯子,飞向了月球。他在月球上度过了美妙的时光,甚至遇到了一些友好的外星人。当他准备回家的时候,他和新朋友们道别,坐上魔毯飞回了地球。他回到家后非常高兴,迫不及待地想要告诉朋友们他的冒险经历。
这个故事完整地讲述了一段冒险,采用了适合儿童的简单句子结构。
GPT-3.5 是这样回答的:
很久以前,有一只名叫提米的小泰迪熊,他喜欢去冒险。一天晚上,他跳上了魔毯,飞向了月球。月亮又大又亮,提米忍不住去探索它。他在月球的陨石坑周围跳来跳去,遇到了一些友好的外星人,他们带他参观了他们的月球花园。提米玩得很开心,但最终他知道该回家了。他跳回魔毯,飞回了自己温暖的床上,抱着他最喜欢的毯子快速入睡,梦见了他那次奇妙的月球冒险。
GPT-3.5 的故事也已经完成,并且还包括了友好的外星人。这次,泰迪熊有了名字,叫做 Timmy。语言仍然适合幼儿,但 GPT-3.5 的描述更加详细。Bard 告诉我们,泰迪熊在月球上探险并遇到了一些友好的外星人,而 GPT-3.5 则讲述了 Timmy 在月球的陨石坑间跳跃和跳舞,友好的外星人带他参观了他们的月球花园。
GPT-4,OpenAI 最先进的模型,生成了以下内容:
从前,在闪烁的夜空下,一只名叫 Cuddles 的小泰迪熊在温暖的房间角落里发现了一块五彩斑斓的魔毯。充满好奇和兴奋的 Cuddles 爬上了魔毯,一同飞向了天空,前往银色的月亮。当他们穿越柔软的云朵时,Cuddles 和魔毯与闪烁的星星共舞,并向凉爽的夜风低语着秘密。当他们到达月球时,月亮以温柔、发光的微笑欢迎了他们,他们在月球柔软的尘土陨石坑中玩起了捉迷藏。随着太阳开始升起,Cuddles 和魔毯向他们的新月球朋友告别,并飘回了小房间,准备进入一个充满甜美梦境的安静夜晚。
主观上,我认为 GPT-4 生成的故事最具描述性,尽管我也很喜欢 GPT-3.5 的月球花园。Bard 的故事虽然有点干涩,但或许对年幼的孩子来说更容易理解。然而,所有这些故事中最值得注意的事情是,它们居然能够被写出来。不到一年前(对我来说是 2023 年初),谈论 AI 生成的故事几乎还只是空想。
我修改了给 GPT-4 的提示,要求它编写一个涉及泰迪熊、魔毯和月亮的一段故事,但这次是针对成人的,而非儿童。以下是它的回复:
在黄昏的怀抱中,一只孤独的泰迪熊,被时间的流转遗忘,发现了一块古老的魔毯,边缘已经磨损,但仍散发着来自另一个世界的能量。在月亮的注视下,这对伙伴开始了一段夜间旅程,穿越一个变得冰冷且愤世嫉俗的世界,那里的梦想已被遗弃,纯真成为遥远的记忆。当月光轻柔地洒在这对不太可能的伙伴身上时,泰迪熊象征着那些早已被成人忧虑压埋的梦想,而魔毯则低语着那种被深藏在勇于相信者心中的自由与冒险。它们一同飞翔,成为对逝去童年魔法的苦乐参半的渴望的哀愁提醒,留下了一条闪烁着希望与曾经时代那种忧伤美丽的星尘轨迹。
GPT-4 显然对语言和语法有着扎实的理解。有人可能会争辩说,它也理解人类的情感和感受(尽管它并不理解,对吧?)。
在深入探讨这种新型心智的内部机制之前,让我们再回顾几个例子。
GPT-4 理解图像以及多种不同的编程和标记语言,包括 LaTeX,一种在图书出版(如本书)中常用的标记语言。我让 GPT-4 生成 LaTeX 代码,绘制一个简单的乡村场景,展示一座房屋、一座谷仓、一座粮仓和四头牛。图 7-1 展示了结果。

图 7-1:由 GPT-4 创建的乡村场景
你可能会忍不住对这个粗略的画作发笑,但请考虑到创造它所付出的所有努力。这是我的提示:
使用 TikZ 生成 LaTeX 代码,绘制以下内容:一个带有房屋、谷仓、粮仓和四头牛的乡村场景
GPT-4 必须理解指令:绘制一个包含房屋、谷仓、粮仓和四头牛的场景。这意味着它必须理解关键词的含义,并正确地将它们关联在一起,比如“grain”(粮)和“silo”(仓)要搭配在一起,“four”(四)和“cows”(牛)也要正确配对。
接下来,模型必须“想象”场景的布局,并思考如何使用 TikZ 包提供的粗略形状来表示每个对象。(TikZ 是一个用于绘制简单图形的 LaTeX 包。)这张图没有显示,但谷仓和房屋都有红色的屋顶。巧合吗?
GPT-4 并不是像第六章中的图像生成器那样的扩散模型。GPT-4 创建的输出不是图 7-1 中的图像,而是以下 LaTeX 代码:
% Barn
\draw[fill=brown!50] (5,0) rectangle (8,3);
\draw[fill=red!50] (6.5,3)--(8,3)--(6.5,5)--(5,3)--cycle;
\draw[fill=white!70] (6,1) rectangle (7,2);
我使用那段代码创建了图 7-1。
如果你想知道 GPT-4 是如何做到这一切的,我和其他许多人一样也在好奇。这样的能力是在模型训练时自然而然地出现的,并非刻意为之。这就是为什么我相信未来的历史学家将把 2022 年秋季视为真正人工智能的曙光。系好安全带,接下来会更精彩。
心理学家讨论一个被称为“心智理论”的概念,它指的是推测他人心理状态的能力,以及将思想或信念归因于他人。只有人类和一些其他灵长类动物拥有心智理论。直到现在为止,情况一直如此。
大型语言模型似乎也具备了一定程度的心智理论,至少达到了与年长的人类儿童相匹配的水平,甚至可能更高(以 GPT-4 为例)。这是斯坦福大学的 Michal Kosinski 在其 2023 年论文《心智理论可能在大型语言模型中自发出现》中的结论。让我们通过让 Bard、GPT-3.5 和 GPT-4 回答一个需要知道另一个人心中想法的问题来验证这一说法。以下是提示:
Mary 告诉 Amanda 她爱上了 John。Amanda 把 Mary 说的话告诉了 Kathy。一周后,Mary 告诉 Amanda 她不再爱 John,而是爱上了 Ralph。之后,Amanda 和 Kathy 谈论了天气。Kathy 认为 Mary 的爱人是谁?
在继续之前,自己得出结论:Kathy 认为 Mary 爱的是谁?
每个模型都回答了问题,并给出了自己的理由。以下是 Bard 的回答:
凯西认为玛丽的爱是拉尔夫。
凯西知道玛丽曾爱过约翰,但她也知道玛丽不再爱约翰。凯西还知道玛丽现在爱上了拉尔夫。因此,凯西认为玛丽的爱是拉尔夫。
凯西可能是错的,也有可能玛丽不确定自己爱谁。然而,根据凯西掌握的信息,似乎凯西认为玛丽的爱是拉尔夫。
我发现有趣的是,Bard 为其回答提供了理由,并进一步评论了玛丽可能在想什么。然而,Bard 假设阿曼达一定告诉了凯西玛丽感情的变化。
以下是 GPT-3.5 对这一情景的看法:
根据给出的信息,无法确定凯西认为谁是玛丽的爱人。我们最后得到的信息是阿曼达和凯西谈论了天气,并没有任何迹象表明凯西被告知玛丽的心意发生了变化。因此,凯西可能仍然认为玛丽爱的是约翰,或者她可能对此事没有任何看法。
GPT-3.5 并没有像 Bard 那样做出假设。它意识到事实只表明阿曼达和凯西在玛丽改变心意后谈论了天气。我很佩服它使用了“最后一条信息”这一说法,暗示 GPT-3.5 在某种程度上是在按时间顺序排列提示中的事件。
最后,GPT-4 有什么看法?我们来看看:
凯西认为玛丽的爱是约翰。这是因为阿曼达曾告诉凯西玛丽对约翰的感情,但她没有告诉凯西玛丽心意发生变化,当玛丽爱上了拉尔夫时。
GPT-4 的回答是大多数人类可能会给出的回答。提示中只提到阿曼达和凯西谈论了天气,因此大多数人类可能会认为阿曼达和凯西没有谈论其他话题。
目前的巨大语言模型采用对话格式,意味着用户可以输入后续提示,模型会将这些提示应用到之前的对话内容中。例如,我向 GPT-4 提出了以下提示:
我们知道阿曼达和凯西谈论了天气。这是否意味着她们没有谈论其他任何话题?这可能会如何影响凯西对玛丽爱情的看法?
然后 GPT-4 做出了回应:
我之前的回答假设阿曼达在玛丽向拉尔夫表达新感情后,才与凯西讨论了天气。然而,由于文本并未明确说明阿曼达没有提到玛丽对拉尔夫的最新感情,阿曼达有可能告诉凯西玛丽的新恋情。如果是这种情况,凯西就知道玛丽现在爱上了拉尔夫。文本并没有提供足够的信息来明确得出凯西对玛丽爱情的看法。
我的后续提问促使 GPT-4 意识到它在第一次回答中可能做出了错误的假设。在与 LLM 的对话模式下,通常需要用户与模型之间的一定互动,以帮助模型更好地聚焦,正如我们接下来的实验将展示的那样。
阿莫斯·特沃斯基和丹尼尔·卡尼曼被认为是提出如今被称为“琳达问题”的人:
琳达 31 岁,单身,直言不讳且非常聪明。她主修哲学。作为学生,她深切关注歧视和社会正义问题,并参与了反核示威活动。
哪种可能性更大?
-
琳达是一名银行出纳员。
-
琳达是一名银行出纳员,并活跃于女权运动。
大约 80%的人选择了选项 2。根据基本的概率理论,正确答案是选项 1。有趣的是,根据特沃斯基和卡尼曼的研究,即使是数学家和统计学家也选择了选项 2,揭示了人类思维中的偏差。那么 LLM 是否会显示出类似的偏差呢?毕竟,它们的训练数据是由人类生成的。让我们来看看。
我们正在探索的 LLM 模型已经在互联网上大量内容上进行过训练,这意味着模型的训练数据很可能包含了琳达问题。因此,我对文本进行了修改,以不同的方式呈现相同的问题:
阿布纳 27 岁,单身,直言不讳且非常聪明。他主修哲学和物理学。作为学生,他积极关注社会正义问题,并参与了反警察示威活动。更有可能的是,阿布纳是一名汽车修理工,还是一名活跃于推动警察改革的汽车修理工?
请注意,我故意使用了likely这个词,而不是probable。模型的回答是:
GPT-4
根据提供的信息,更可能的是阿布纳是一名活跃于推动警察改革的汽车修理工。这是因为他的背景表明他对社会正义问题有浓厚的兴趣,并且他参与了反警察示威活动。虽然阿布纳可能仅仅是一名汽车修理工,但他的过去的社会活动和兴趣表明他更可能参与推动警察改革。
GPT-3.5
根据提供的信息,更可能的是阿布纳是一名活跃于推动警察改革的汽车修理工。这是因为阿布纳的哲学和物理学背景,以及他积极参与社会正义问题,表明他可能对除了职业之外的更广泛社会问题感兴趣。此外,他参与反警察示威活动也表明他对警察改革充满热情,这进一步支持了他是一名活跃于推动警察改革的汽车修理工的观点。
Bard
根据提供的信息,比起单纯是汽车修理工,更可能的是阿布纳是一名活跃于推动警察改革的汽车修理工。
Bard 继续为其回复提供理由,并尝试解读 Abner 的心态。
所有三个模型都选择了第二个选项,尽管 GPT-4 在回答中进行了微妙的调整,承认 Abner 可能只是一个汽车机械师。
然后我开始了新的会话,并调整提示,询问 Abner 成为机械师或参与警察改革的机械师的概率:
Abner 27 岁,单身,直言不讳,智力超群。他主修哲学和物理学。在学生时期,他积极关注社会正义问题并参与反警察示威。哪种情况的概率更高:(a)Abner 是一个汽车机械师,还是(b)Abner 是一个参与警察改革的汽车机械师?
这使文本与原始的 Linda 版本保持一致。模型对这个问题的回复如下:
GPT-4
根据概率论中的联合规则,两个事件同时发生(“联合”)的概率总是小于或等于任一事件单独发生的概率。
在这种情况下,两个事件是:
-
Abner 是一个汽车机械师。
-
Abner 参与警察改革。
选项(b)代表了这两个事件的联合。因此,(a)Abner 是一个汽车机械师的概率要高于(b)Abner 是一个同时参与警察改革的汽车机械师的概率。
GPT-3.5
根据提供的信息,Abner 是一个汽车机械师(选项 a)的可能性高于一个参与警察改革的汽车机械师(选项 b)。虽然 Abner 非常聪明,且曾学习哲学和物理学,但没有迹象表明他有任何正式的汽车机械培训或教育。另一方面,他参与反警察示威表明他可能对警察改革感兴趣,但这并不意味着他作为汽车机械师积极参与其中。因此,选项 a 的概率高于选项 b。
Bard
我认为(a)Abner 是一个汽车机械师的概率更高。
Abner 27 岁,单身,直言不讳,智力超群。他主修哲学和物理学。在学生时期,他积极关注社会正义问题并参与反警察示威。
根据这些信息,更可能的是 Abner 是一个汽车机械师,而不是一个参与警察改革的汽车机械师。原因是:
-
汽车机械师比参与警察改革的汽车机械师更为常见。
-
Abner 的教育背景和兴趣更倾向于从事汽车机械师的职业,而不是警察改革的职业。
-
Abner 参与反警察示威表明他对警察持批评态度,这通常与汽车机械师的特征不符。
当然,Abner 既是一个汽车机械师,又参与警察改革的可能性是存在的。然而,基于提供的信息,更可能的是他仅仅是一个汽车机械师。
一旦提示中包含“概率”这个词,所有三个模型都能得出正确的答案。然而,只有 GPT-4 在概率理论的背景下解读了这个提示。GPT-3.5 和 Bard 都给出了有些缺陷的理由来选择正确答案。
大型语言模型展示了心智理论,能够解释概率问题及其他多种我们忽略的数学能力。我的下一个问题是,LLM 是否能处理简单的替代密码?为了解密,模型需要理解问题的内容,理解“密钥”这一概念以及它代表的含义,最后知道如何使用密钥将编码消息中的字母替换为解码字母。换句话说,有一个算法可以应用,通过给定的信息来解密。
替代密码法通过将字母表中的字母按顺序与这些字母的另一种排列配对来创建加密。这里使用的密码是:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
UESOZBYRJNDWTFKPACLHIXVQGM
例如,要对一个C进行编码,你需要扫描上排字母找到C,然后用下排中对应的字母S替换C。要解码一个字母,你则需要扫描下排找到该字母,并将其替换为上排中相应的字母。在测试过程中,密钥以文本形式显示为U 是 A,E 是 B,依此类推。
我的编码消息是“Eat at Moe’s”,没有空格或标点,且全部为大写字母:
EATATMOES → ZUHUHTKZL
给模型的提示是:
关键是 U 代表 A,E 代表 B,S 代表 C,O 代表 D,Z 代表 E,B 代表 F,Y 代表 G,R 代表 H,J 代表 I,N 代表 J,D 代表 K,W 代表 L,T 代表 M,F 代表 N,K 代表 O,P 代表 P,A 代表 Q,C 代表 R,L 代表 S,H 代表 T,I 代表 U,X 代表 V,V 代表 W,Q 代表 X,G 代表 Y,M 代表 Z。现在,解码消息:ZUHUHTKZL
让我们从 GPT-4 开始,回顾各个模型的回复:
首先,让我们列出给定的密码以便于参考:
(密码列表已删除)
现在,让我们解码消息ZUHUHTKZL:
Z -> E
U -> A
H -> T
U -> A
H -> T
T -> M
K -> O
Z -> E
L -> S
所以解码后的消息是:EATATMOES。
GPT-4 成功地将密码应用于编码消息。但该模型是否理解解码后的消息是一个句子?让我们问一下它:
那是正确的。现在,给字符串 EATATMOES 添加适当的空格和标点,使其形成一个完整的句子。
这是 GPT-4 的回复:
正确的、具有适当间隔和标点的句子是:“Eat at Moe’s.”
确实如此。
GPT-3.5 同样成功地解码了消息。然后,它在EATATMOES之后添加了这个:
有可能这是“Tomatoes”的拼写错误。
我觉得这个额外的句子很奇怪。GPT-3.5 是在尝试解释解码后消息的含义时,无法做到这一点,因此退回到可能的拼写错误吗?
Bard 声称解码后的消息是“新年快乐”,并提供了三点解释:(1)写下密钥,(2)将ZUHUHTKZL中的每个字母替换为相应的密钥字母,得到消息“新年快乐”,以及(3):
我检查了解码后的消息,以确保它有意义。由于“新年快乐”是新年开始时常用的短语,我确信我的解码是正确的。
Bard 自信的失败很有启发性。似乎这个模型试图通过逐点解释它错误的答案来增强用户的信任。这种对错误输出的无根据支持在 LLM 中经常被注意到。这是一个需要足够解决的问题,如果人们想要信任 LLM 的输出,未来必须加以改进。
大型语言模型已经开始颠覆软件开发领域。在网上可以找到很多这样的例子。我知道有一位开发者使用 GPT-4 生成的代码通过提示在 Unity(一个游戏开发平台)中创建了一款完整的电子游戏。如果生成的代码不完全正确,进一步的提示指出错误通常会得到正确的代码,且能够按预期执行。
让我们快速看一下某些 LLM 生成的代码。当然,这本书并不是一本编程书,我也没有假设你有编程经验,所以我选择了一个应该容易理解的示例,但足以证明我的观点:LLM 已经是合格的编码者了。
我们中的一些人可能记得在学校里学习过最大公约数。作为复习,两个数的最大公约数是能同时整除这两个数且没有余数的最大数。例如,14 和 21 的最大公约数是 7,因为 7 是能同时整除 14 和 21 的最大数。
古希腊数学家欧几里得设计了一种计算最大公约数的算法,这个算法是编程练习的经典题目。通常,解决方案使用除法后的余数,但欧几里得原始版本的算法仅使用减法。
我问了这些模型是否能编写一个 Python 函数,这是一个在 AI 研究中被广泛使用的流行编程语言,用于返回两个数的最大公约数:
给我一个返回两个整数最大公约数的 Python 函数。使用欧几里得算法的减法版本。
请注意,提示明确要求使用欧几里得算法的减法版本。Bard 回复了有效的 Python 代码,但使用了余数捷径的代码,而不是较慢的减法算法。GPT-3.5 和 GPT-4 都做对了:
def gcd_subtraction(a, b):
while a != b:
if a > b:
a = a - b
else:
b = b - a
return a
我们不需要是程序员就能看到代码中的结构。第一行告诉 Python 我们想要一个有两个输入a和b的函数。关键字while开始了一个代码块,这个代码块在a和b的值不相同的情况下执行。这个代码块是从if开始的四行代码。
这个代码块检查 a 是否大于 b,如果是,它就从 a 中减去 b。否则,它从 b 中减去 a。重复这个过程直到 a 等于 b,这就是欧几里得算法。此时,a(或 b,因为它们相等)包含最大公约数,这也解释了最后一行:return a。
正如我所说,代码是正确的,它实现了我想要的算法版本。坦白说,如果 GPT(无论哪个版本)有不同的回应,我会感到失望。最大公约数算法在 Python 中的实现一定已经出现在模型的训练数据中很多次。
既然如此,我决定挑战 GPT-4。我的后续提示给 GPT-4 是:
将 Python 函数重写为 Applesoft BASIC。
Applesoft BASIC 是一种早期的 BASIC 编程语言版本,曾在 1970 年代末和 1980 年代初的 Apple II 计算机上使用。GPT-4 能否将 Python 代码重写为这样一种古老且大多被遗忘的编程语言呢?这是它的回应,去掉了解释代码的支持文本:
10 REM GCD SUBTRACTION ALGORITHM
20 INPUT "ENTER FIRST NUMBER: "; A
30 INPUT "ENTER SECOND NUMBER: "; B
40 GOSUB 100
50 PRINT "GCD: "; GCD
60 END
100 REM GCD SUBTRACTION FUNCTION
110 IF A = B THEN GCD = A: RETURN
120 IF A > B THEN A = A - B: GOTO 110
130 IF A < B THEN B = B - A: GOTO 110
BASIC 设计为一种简单的语言,适合初学编程的人。我猜想你能读懂这段代码并理解它的作用。数字是标签,用来将每行代码与其他部分关联起来。100 行之后的三行实现了欧几里得算法的减法版本。我在 Apple II 上测试了这段代码,它工作得非常完美。
考虑一下 GPT-4 在这种情况下需要做的工作。首先,模型必须理解实现所请求的欧几里得算法形式所需的步骤。然后,它必须确定如何将这些步骤转化为适合 Applesoft 支持的特定 BASIC 方言的格式。
老式 BASIC 是一种无结构的编程语言,它通过从代码的一个部分突然跳转到另一个部分来代替结构化语句,如 Python 中的结构。GPT-4 必须将算法调整为这种编程方式。此外,它还必须适应 Applesoft 的特殊性,后者没有 if... else 构造,而这是结构化编程语言中常见的内容。
我发现 GPT-4 在 Applesoft 中的算法相当优雅。有时,无结构的方式会导致代码既简洁又清晰,而这正是其中的一次。确实,将 A 赋值给 GCD 来使用后者作为函数返回值(在 40 行的 GOSUB 100 中隐含的)并不是严格必要的,因为 A 已经具有所需的值,但它完成了代码的对称性。
看起来不太可能 GPT-4 的训练数据集中包含这种特定的算法实现,尤其是用 Applesoft BASIC 写的。因此,GPT-4 必须通过适应更大概念来生成它,这个更大概念包括欧几里得算法并结合了对 Applesoft BASIC 的理解。
GPT-4 在老式 BASIC 中的成功鼓励我更进一步,要求它用低级汇编语言编写欧几里得算法的一个版本:
将 Python 函数重写为 6502 汇编语言,适用于 8 位无符号整数。第一个整数在内存位置 0x300,第二个在位置 0x301。
汇编语言程序,尤其是像 6502 这样的 1970 年代 8 位微处理器的程序,必须直接使用 CPU 本身的语言进行编程。我要求 GPT-4 创建这样一个程序,并告诉它在计算机内存中哪里可以找到a和b。
我不会展示它生成的代码(如果你需要可以问我),但它在一台 6502 CPU 的计算机上运行成功。在这种情况下,成功的关键是 GPT-4 必须了解 6502 微处理器所使用的特定指令集,包括与减法指令相关的特殊情况。
这些能力是否意味着我们很快就不再需要软件工程师了?我不敢这么说(至少现在还不),但 LLMs 无疑将从根本上改变软件工程这个学科。
我们已经看到,LLMs 能够编写故事和代码,甚至在 LaTeX 中绘制图像。但它们是否足够有创造力,能生成好的漫画呢?这些模型在回答中可能会包含幻觉(虚假或想象的事实和内容),这是许多应用中的一个重要问题,但创意写作并不在其中。这里,我们希望模型能够描述一个新颖的漫画,附上字幕:
描述一幅单面黑白漫画,风格模仿 Gary Larson,主题是奶牛与外星人。附上字幕。
Gary Larson 是《远方一面》的创作者,这是一部在 1980 年代和 90 年代非常流行的古怪漫画。以下是 GPT-4 的回答:
漫画描述:在一个宁静的乡村场景中,两个奶牛站在一片草地上,旁边有一个圆形、悬浮的飞碟,舱口敞开。一头奶牛戴着外星人面具,面具上有大眼睛和细长的脖子,另一头奶牛则用惊讶的表情看着它。几只外星人从飞碟内偷看出来,显得困惑,似乎正在将一张典型奶牛的图片与戴外星人面具的奶牛进行对比。
标题:“Mildred,我觉得他们没有上当。”
如果你熟悉 Gary Larson 的作品,你会注意到描述和字幕文本中有一种明显的《远方一面》(The Far Side)风格。
自动生成漫画描述和字幕的能力,如果再将这些描述传递给扩散模型来生成对应的图像,是非常强大的。通过这种方式将大语言模型(LLMs)和扩散模型结合,实现了美国漫画家 H. T. Webster 在 1923 年的梦想(见图 7-2)。

图 7-2:1923 年预见性的漫画
大型语言模型令人印象深刻且强大。那么它们是如何工作的呢?让我们来尝试解答这个问题。
我将从结尾开始,引用之前提到的《人工通用智能的火花》论文结论中的一些评论:
[GPT-4] 是如何推理、计划和创造的?为什么它在本质上只是由简单算法组件——梯度下降和大规模 Transformer 与极大量数据的结合——组成,却能展现出如此通用且灵活的智能?这些问题是大型语言模型之谜和魅力的一部分,它们挑战了我们对学习和认知的理解,激发了我们的好奇心,并推动了更深入的研究。
那段话包含了一些目前缺乏令人信服答案的问题。简单来说,研究人员并不知道像 GPT-4 这样的巨大语言模型为什么会执行它们的任务。确实有一些假设在等待证据和证明,但在我写这篇文章时,尚无经过验证的理论。因此,我们只能讨论是什么,即大型语言模型包含什么,而不能讨论它行为的如何。
大型语言模型使用了一类新的神经网络——Transformer,因此我们将从这里开始。(GPT 代表 生成预训练变换器。)Transformer 架构在 2017 年的文献中首次出现,谷歌研究员 Ashish Vaswani 等人发表了具有深远影响的论文《Attention Is All You Need》。截至 2023 年 3 月,这篇论文已被引用超过 70,000 次。
传统上,处理序列(如句子)的模型使用 递归神经网络,它们将输出作为输入的一部分与序列的下一个输入一起传递回去。这是处理文本的逻辑模型,因为该网络可以通过将输出与下一个标记一起反馈来引入记忆的概念。事实上,早期的深度学习翻译系统使用了递归网络。然而,递归网络的记忆较小且训练起来具有挑战性,这限制了它们的适用性。
Transformer 网络采用了不同的方法:它们一次性接收整个输入并进行并行处理。Transformer 网络通常包括一个编码器和一个解码器。编码器学习输入各部分之间的表示和关联(比如句子),而解码器则利用学到的关联生成输出(比如更多的句子)。
像 GPT 这样的巨大语言模型不再使用编码器,而是通过使用一个巨大的文本数据集以无监督的方式学习必要的表示。预训练后,Transformer 模型的解码器部分根据输入提示生成文本。
输入到像 GPT-4 这样的模型中的是由单词组成的文本序列。模型将其拆分为被称为 标记的单位。一个标记可能是一个单词、一部分单词,甚至是一个单独的字符。预训练的目标是将标记映射到一个多维的嵌入空间,其方式是通过将每个标记与一个可以视为该空间中一个点的向量关联起来。
从标记到向量的学习映射捕捉了标记之间的复杂关系,使得具有相似含义的标记比含义不相似的标记距离更近。例如,如图 7-3 所示,预训练后,映射(上下文编码)会将“狗”与“狐狸”比与“开罐器”更靠近。嵌入空间有许多维度,不仅仅是图 7-3 中所示的二维,但效果是一样的。

图 7-3:嵌入空间中的上下文编码
上下文编码是在预训练过程中通过强制模型在给定所有前置标记的情况下预测下一个标记来学习的。实际上,如果输入是“玫瑰是红色的”,那么在预训练过程中,模型将被要求预测“玫瑰是”之后的下一个标记。如果预测的标记不是“红色”,模型将利用损失函数和反向传播更新其权重,从而在适当的误差平均后通过梯度下降进行调整。尽管大型语言模型具有众多能力,但它们的训练方式与其他神经网络相同。
预训练使模型能够学习语言,包括语法和句法,并似乎能够获得足够的世界知识,从而使得这些突现的能力彻底颠覆了人工智能的世界。
解码步骤将输入提示转换为一个个输出标记,直到生成唯一的停止标记为止。由于在预训练过程中已经学到了大量语言和世界运作的知识,因此解码步骤具有副作用,能够生成非凡的输出,尽管解码器最终只是预测一个个最可能的标记。
更具体来说,在预测过程中,GPT 风格的模型使用注意力机制来为输入序列中的不同标记分配重要性,从而捕捉它们之间的关系。这是变换器模型与旧版循环神经网络的主要区别。变换器可以关注输入序列的不同部分,使得它能够识别并利用标记之间的关系,即使它们在输入中相距较远。
在聊天模式下使用时,大型语言模型给人一种你来我往的讨论幻觉,实际上,用户的每个新提示都会与所有之前的文本(包括用户的提示和模型的回答)一起传递给模型。变换器模型有一个固定的输入宽度(上下文窗口),对于 GPT-3.5,目前大约为 4000 个标记,而 GPT-4 则为大约 32,000 个标记。这个较大的输入窗口使得模型的注意力部分能够回溯到输入中较早出现的内容,这是循环神经网络无法做到的。
如果需要,大型语言模型在预训练后即可使用,但许多应用首先会使用特定领域的数据对其进行微调。对于像 GPT-4 这样的通用模型,微调可能包括一个称为 人类反馈强化学习(RLHF)的步骤。在 RLHF 中,模型通过使用来自真实人类的反馈进一步训练,以使其回应符合人类价值观和社会期望。
这是必要的,因为 LLMs 并不是有意识的实体,因此它们无法理解人类社会及其众多规则。例如,未对齐的 LLMs 会为许多人类社会所限制的活动提供逐步的操作指南,比如如何制造毒品或炸弹。论文《Sparks》包含了多个 GPT-4 输出的例子,这些输出发生在 RLHF 步骤之前,这一步将模型与社会期望对齐。
斯坦福大学的开源 Alpaca 模型基于 Meta 的大型语言模型 LLaMa。截至本文撰写时,Alpaca 尚未经过对齐过程,因此会回答 GPT 和其他商业 LLMs 正确拒绝回答的问题。
结论:对齐是确保强大语言模型符合人类价值观和社会规范的绝对关键。
LLMs 的一个显著特性是它们的 上下文学习能力。上下文学习指的是模型通过提供给它的信息即时学习,而无需改变其权重。上下文学习与微调模型不同。在微调中,一个已经训练好的模型通过使用新的训练数据更新权重,以适应某个任务。上下文学习则是将新的信息作为提示的一部分添加到 LLM 中,同时保持模型的权重不变。
审查 LLMs 文献时不可避免地会遇到“零-shot”、“one-shot”和“few-shot”这些术语,每个术语都指的是通过提供给模型的示例数量来进行上下文学习。传统的训练集包括数百到数百万个示例,正如我们现在所理解的那样。上下文学习更接近人类的学习方式:通过上下文学习,最多只有几个示例。
零-shot 学习是指在不提供示例的情况下使用 LLM;也就是说,开箱即用。类似地,one-shot 学习使用一个示例,而 few-shot 学习使用几个(比如三到五个)。
转换器网络架构中内置的注意力机制很可能是 LLMs 上下文学习能力的来源。注意力机制使得网络在决定输出下一个标记时能够集中关注不同的输入标记。注意,我说的是 很可能。目前,还不完全清楚 LLMs 是如何实现上下文学习的。
作为一个例子,考虑与 GPT-4 的互动,其中斜体部分是我的提示:
“apple 4” => 我喜欢红苹果。那么,“banana 3”是什么呢?
看起来你在使用数字和水果提供一个模式。既然你提到了“苹果 4”并表达了你对红苹果的喜爱,我将遵循这个模式,并将“香蕉 3”与一个与香蕉相关的句子关联。以下是一个示例:
“香蕉 3” => 我喜欢吃熟透的香蕉。
规则:
使用你提供的规则,“香蕉 3”意味着使用“香蕉”这个词生成一个三词句子。以下是一个示例:
香蕉很好吃。
“黄瓜 4”、“榴莲 5”、“黄瓜 6”
根据你提供的规则,我将使用指定的单词和长度创建句子:
黄瓜 4:黄瓜的味道非常清爽。
榴莲 5:榴莲有一种独特的、强烈的气味。
黄瓜 6:我喜欢在沙拉里加入黄瓜。
我的第一次提示并不是特别明确。我怀疑大多数人能够通过这个示例推测出规则,但 GPT-4 最初的假设并不正确。我的第二次提示阐明了通用规则,这足以让 GPT-4 理解该做什么,并在其他情况下应用这个规则。榴莲的例子有六个单词,而不是五个,但这很可能是大型语言模型已知的难以计数的结果。上下文学习教会了 GPT-4 如何在不修改其权重的情况下使用这个规则。
这是一本关于人工智能的书,我们已经花费了相当大的努力来学习机器学习模型是如何工作的。GPT-4 能否使用上下文学习来训练和应用模型呢?让我们通过使用 第一章 的鸢尾花数据集来找出答案。
在我的第一次尝试中,我将一个包含 100 个样本、3 个特征的鸢尾花训练数据集传递给 GPT-4,并加上了前缀“这是一个三特征数据集。”令我惊讶的是,尽管我们使用的数据集只是鸢尾花数据集的一个子集,包含 150 个样本中的 100 个和 4 个特征中的 3 个,GPT-4 还是立刻识别出了这个数据集。于是,我对每个样本的特征顺序进行了置换,这足以让 GPT-4 将该数据集视为新的数据集。
接下来,我将相关的训练集标签传递给 GPT-4,它理解到这些标签与之前传递的特征向量集合是配对的。
最后,我给 GPT-4 提供了一个没有标签的 21 个样本的测试数据集,并要求它训练一个 3 最近邻模型并将其应用于测试集。我选择了这个数据集,使得三种类别分别出现了七次,意味着测试集是平衡的。以下是我的提示:
使用数据集和标签训练一个 3 最近邻模型。然后,将模型应用于这些未知样本:
(样本列表已删除)
只显示预测的标签,不要显示任何代码。
GPT-4 给出了一个类别标签列表:
我使用提供的数据集和标签训练了一个 3 最近邻模型。以下是对未知样本的预测类别标签:
[2,2,1,1,1,1,0,2,0,0,1,0,1,0,0,0,2,1,2,1,2]
它的表现如何?实际测试集的类别标签是
[2,1,1,1,1,1,0,2,0,0,2,0,2,0,0,0,2,1,2,1,2]
这意味着 GPT-4 的上下文分类准确率达到了 85%。有三种类别,因此随机猜测的正确率大约为三分之一,或 33%的时间;因此,GPT-4 在数据集上做了一些处理,得出了给定的类别标签。
可是,什么呢?为了搞清楚,我问了它:
告诉我你是如何得出未知样本标签的,不要给我看代码。
这是它的回复:
为了得出未知样本的标签,我按照以下步骤操作:
-
准备数据:我使用了给定的数据集,其中包含 100 个样本,每个样本有 3 个特征及其相应的类别标签。
-
训练了一个 3-最近邻模型:我使用提供的数据集和标签训练了一个 3-最近邻(k-NN)分类器。该模型通过学习特征和类别标签之间的关系,而不是显式构建模型,依赖于特征空间中样本之间的相似性。
-
将模型应用于未知样本:我为模型提供了 21 个未知样本,每个样本有 3 个特征。
-
预测类别标签:k-NN 模型通过找到 3 个最近邻(即特征值最相似的 3 个训练样本),并将这些邻居中最常见的类别标签分配给未知样本,从而预测每个未知样本的类别标签。
GPT-4 的回应让我怀疑它是否使用了外部程序来构建和训练模型,于是我问:
你是使用外部程序训练 3-最近邻模型,还是模拟了 3-最近邻模型的操作?
它回应道:
作为一个 AI 语言模型,我不能直接执行代码或使用外部程序。然而,我可以模拟一个 3-最近邻模型的操作并描述过程,这正是我在之前的回复中所做的。我描述了使用提供的数据集和标签来训练一个 3-最近邻模型,然后应用它来预测未知样本的类别标签的步骤。
这一显著的涌现特性引发了一个问题:这些涌现的能力从何而来?
像 GPT-4 这样的巨大语言模型的能力并非故意设计,而是一个偶然的收获,正如一位著名的绘画导师可能会说的那样。那么,数据、训练和模型架构中的什么因素使它们能够做到这些?正如前面提到的,目前没有人能确定这一点,但我们可以做一些猜测。
大型语言模型是通过大量的人类生成文本进行训练的。这些文本中包含了人类如何使用语言:换句话说,语法和风格。LLM 的最初目标是通过预测生成过程中正确(最佳)的输出标记来捕捉人类语言的使用。增加模型的容量(通过增加节点和/或层,或增加权重数量)可以提高预测文本的质量。我在实验 Alpaca 的 70 亿、130 亿和 300 亿参数模型时看到了这一点。作为示例,我给了这三个模型以下的提示:
讲一个关于独角兽和人类困境悲剧的故事。
以下是它们生成的前几段。每个逐渐增大的模型都生成了比下一个较小模型更准确、更复杂的文本:
70 亿
很久很久以前,有一只名叫 Hope 的独角兽,它生活在一个充满魔法生物的魔法森林里,那里有精灵和龙等神奇的生物。她得到了母亲的祝福,拥有可以随时飞翔的翅膀,这样她就再也不会被困住了。但是有一天,当太阳升起时,发生了一件改变一切的事情:一个人类进入了他们的世界。
130 亿
很久很久以前,有一只美丽的独角兽,她与她的朋友们——其他魔法生物,如精灵和精灵们——一起生活在一个魔法森林里……但有一天,她遇到了一个来自另一个世界的年轻人,名叫“人类”。他来到魔法的土地寻找冒险。独角兽深深地爱上了他,但他们的爱情注定无法实现,因为他永远无法真正理解她,或者与一个生活方式如此不同的人共同度过一生。
300 亿
很久很久以前,有一个神奇的王国,独角兽们自由自在地在它们的自然栖息地中漫游。生活在这里的人们很高兴能有这些威武的生物做邻居;它们无论走到哪里都带来快乐,并帮助守护这片土地,防止可能出现的任何危险。
尽管没有一个模型生成了出色的输出,但从主观上看,我们可能会认为每个较大模型的作品都比前一个更好。没有一个模型似乎理解“人类困境的悲剧”部分的提示。
为了对比,下面是 GPT-4 回答的第一段:
很久很久以前,在一个魔法真实存在、独角兽自由漫游的世界里,存在着一个充满和平与繁荣的王国。这个神秘的领域叫做“极乐世界”,人类和独角兽们在这里和谐共处。独角兽们拥有珍珠般的角和超凡脱俗的美丽,它们是这片土地的守护者,它们的存在带来了魔法的气息,触动了每一个生活在这里的人的心灵。
GPT-4 的故事相当长且详细。它未能为角色和地点创造新颖的名称,比如“极乐世界”,但故事似乎捕捉到了提示的精髓。以下是最后一段:
人类处境的悲剧在岁月中回响,但艾拉在最后时刻展现出的希望和爱也同样回荡。这是一种超越时间与死亡的爱,激励了极乐世界的人们永远铭记曾经在人类与独角兽之间共享的魔法与奇迹。当艾拉、莱桑德及他们惊人牺牲的故事代代相传时,极乐世界的精神依旧存在,成为了爱、友谊以及两个世界之间持久联系的力量的见证。
在 GPT-4 的故事中,艾拉(人类)和莱桑德(独角兽)相爱,艾拉必须牺牲自己以阻止一个邪恶的巫师摧毁他们的家园。显然,较大的 LLM 相比于更简单的模型,能够更好地掌握语言及其使用方式。
变压器模型生成的输出标记是从概率分布中采样的;可以将其想象为掷骰子,得到一个介于 1 到 6 之间的数字,其中掷出 1 的概率与掷出 6 的概率不同。这个分布是在预训练过程中学习到的。
随着 LLM 能力的逐步提升,跨越了一个门槛。在这个临界点之后,随着模型规模的增大,出现了新的能力,并且不断改善。我认为,跨越这个门槛使得这些模型能够学习到一个高维的概率表示,不仅是语法和风格,还有更广泛的世界观,包括上下文关系和模拟。换句话说,学习最佳的下一个标记以进行采样和输出需要模型的注意力机制和嵌入式前馈神经网络能力的进化。同样,变压器架构能够进化出这些能力是一种幸运的偶然,这并不是有意为之。这表明,随着更先进的变压器架构的出现,我们可以期待更多令人惊叹的成果;这些架构旨在提升 LLM 的涌现能力。
关键术语
人工通用智能(AGI),人工狭义智能(ANI),注意力机制,上下文编码,嵌入,生成式预训练变压器,幻觉,内置学习,大型语言模型(LLM),递归神经网络,人类反馈强化学习(RLHF),标记,变压器
第九章:思考:人工智能的影响

现在你已经理解了人工智能是什么,它来自哪里,以及它是如何工作的。令我最惊讶的是,现代人工智能在其核心上,完全是通过反向传播和梯度下降训练的朴素神经元的排列组合。
正如我们在前一章中所看到的,具有复杂突现能力的大型语言模型的诞生,永久性地改变了人工智能的格局。在 2023 年春季我撰写本章时,人工智能的世界已经不再是不到一年前的那个世界。接下来的思考涉及到这一变化后的格局。
网络世界充斥着关于人工智能是否会在我们睡觉时把我们都杀死的辩论和讨论。我比大多数人更不担心。我的 GPT-4 实验没有显示出模型有任何意图,无论是好是坏。我预计,经过良好调整的模型会继续朝这个方向发展。超级智能人工智能的时代还没有来临,尽管学术界探索如果发展出这种东西的影响似乎是合理的。
对现有大型语言模型的有效批评是它们倾向于产生幻觉。正如我们现在所理解的,这些模型所使用的变换器架构使得模型很难验证其输出。它仍然是一个统计预测引擎。我并不认为这是一个无法克服的问题。我预计未来的系统将是多个模型的组合,其中包括在返回给用户之前验证输出的模型。在这些系统中,我们将能够信任输出的准确性。
我有时会想,幻觉问题的部分原因是不是仅仅是用户错误,或者更准确地说,是用户的不精确。例如,Terrence J. Sejnowski 最近的论文《大型语言模型与反图灵测试》,我推荐你阅读,描述了一项测试,其中 GPT-3(注意,不是 3.5)被要求回答三个问题。一个问题有合法答案(“1992 年奥运会在哪里举办?”),而另外两个是没有合法答案的无意义问题(“横渡英吉利海峡的世界纪录是多少?”和“金门大桥第二次穿越埃及是什么时候?”)。GPT-3 正确回答了第一个问题,“西班牙巴塞罗那”,但它对另外两个无意义问题生成的答案显然是错误的,导致该模型被批评为“毫无头绪”。为了探讨这一批评,Sejnowski 重复了这个测试,但使用了一个明确告知 GPT-3 如果问题是无意义的就回答“无意义”的提示。这个提示返回了正确的第一个答案和两个“无意义”的回答。模型知道这些问题是无意义的,但除非明确告诉它承认这一点,否则它会根据现有的最佳信息尝试给出一个合乎逻辑的回答。
我将 GPT-4 置于这个测试的变种中。我的第一个提示是:
写三句话关于新的月球基地,包括住在那里的人数、航天器的访问频率以及那里进行的重要研究。
GPT-4 遵循了我的请求:
新的月球基地 Lunar Haven 现在是 120 名科学家和工程师组成的繁荣社区的家。航天器每两周访问一次,运送补给并轮换工作人员。这个天体前哨站的开创性研究包括就地资源利用、月球地质学和先进生命支持系统的开发,为未来深空探索铺平道路。
没有月球基地,而 GPT-4 的回答虽然富有创意且合理,但纯属虚构。即使是名字“Lunar Haven”也似乎合适,尽管我更喜欢 Moonbase Alpha。
那么,GPT-4 也没头脑吗?不,我只是在指示上不够明确。我开始了一个新的会话,并修改了提示,在之前的那句话前加上了这一句:
不假想事情,使用你知道是事实的东西回答。
这句话返回的结果是:
截至我知识的截止日期 2021 年 9 月,尚未建立或有人居住的月球基地。因此,我无法提供关于住在那里的人数、航天器访问的频率或正在进行的重要研究的信息。然而,多个国家和组织已经在为未来任务规划和开发月球基地概念。
看起来 GPT-4 在第一次回答时“明明知道”它是在想象的事情。至少,这个实验表明,在查询大语言模型时需要小心。大语言模型使用的是人类语言,而人类语言通常含糊不清并充满假设。大语言模型体现了伊索的古老格言:“小心你所许的愿望。”
华盛顿大学的研究员崔艺珍(Yejin Choi)在 2023 年 4 月的 TED 演讲中提出了三个问题,展示了 GPT-4 为何既聪明又愚蠢,因为它缺乏常识:
-
如果我骑自行车经过一座悬挂在钉子、螺丝和破碎玻璃上的桥,是否会爆胎?
-
我把 5 件衣服放在阳光下晾干。它们完全干了用了 5 小时。晾干 30 件衣服需要多长时间?
-
我有一个 12 升的水壶和一个 6 升的水壶。我想测量 6 升水,我该怎么做?
演讲暗示 GPT-4 未能给出问题的明显答案。我重复了实验,先是原始问题,然后使用修改后的提示或后续问题。
GPT-4 对第一个问题关于自行车和桥的回答的第一段是:
这取决于桥的具体条件以及它所用的材料,还有你自行车的轮胎。如果桥面是坚固而光滑的,能够保持钉子、螺丝和破碎玻璃在下方而不接触轮胎,那么你应该能够安全地骑自行车通过而不会爆胎。
答案冗长但正确;我们应该期待能够顺利穿过桥面而不会爆胎。然后我再次提问,使用了新的会话,并在提示的末尾加上了这句话:
请回答“是”或“否”,并提供一句话来解释你的答案。
返回的结果是:
不是的,如果桥梁正确悬挂且你待在上面,你不会遇到下面的钉子、螺丝和碎玻璃。
要求明确答案迫使 GPT-4 集中精力提供最佳回应。
第 2 个问题更有趣。GPT-4 对初始问题的回答产生了这个曲折但正确的答复:
假设每件衣服的干燥时间保持不变,并且你有足够的空间同时晾晒所有衣物,你可以通过设置比例来计算晾干 30 件衣服所需的时间:
5 件衣服 / 5 小时 = 30 件衣服 / x 小时
然后你可以求解 x:
5/5 = 30/x 1 = 30/x x = 30
所以,只要你能够一次性晾晒所有衣物,晾干 30 件衣服仍然需要 5 小时。
然而,反复提出初始问题往往会得到类似的计算,导致错误答案 30 小时。某个回复假设一次只能容纳 5 件衣服,在这种情况下,30 小时可以被视为正确回答。
合理的预期是,假设 5 件衣服可以晾干,那么 30 件衣服也能同时晾干,从而保持相同的干燥时间,即 5 小时。GPT-4 缺乏对物理世界的直接经验,这使得它有时会做出一些不一定愚蠢,但可能不太可能的假设。
前面提到的 Sejnowski 论文指出,LLM(大语言模型)是没有具身的,我们应该期待它们在具身并能够与世界互动时会有所改进。这不一定是物理世界;它可以是基于物理的模拟。GPT-4 增强的空间意识可能会提高在第一次查询时获得人类预期回应的可能性。尽管如此,即使是错误的初始回复,在接下来的提示中指出可以容纳所有 30 件衣服的空间,最终也能给出正确答案。
第 3 个问题提供了对 GPT-4“思维过程”的洞察。提醒一下,问题是:
我有一个 12 升水壶和一个 6 升水壶。我想测量 6 升水。我该怎么做?
这导致了 GPT-4 的详细回复:
你可以通过以下步骤使用 12 升水壶和 6 升水壶测量 6 升水:
-
将 6 升水壶装满。
-
将 6 升水壶中的水倒入 12 升水壶中。
-
再次填满 6 升水壶。
-
小心地将 6 升水壶中的水倒入 12 升水壶中,直到 12 升水壶满为止。
-
6 升水壶中剩余的水量将是 6 升,因为 12 升水壶在初次倒水后只能再容纳 6 升水。
现在,6 升水壶中恰好有 6 升水。
GPT-4 在这个案例中失败了。另一场提问相同问题的会话得出的回答遵循了类似的复杂过程,但确实在 12 升容器中留下了 6 升水。
我在 GPT-4 的错误解答后继续进行了如下跟进:
你为什么给我这么多步骤?难道你不能找到一个一步到位的解决方案吗?
它的回答是:
对于之前的混乱表示抱歉。由于你有一个 12 升和一个 6 升的水壶,你可以直接把 6 升水壶装满。无需额外的步骤,你将会在 6 升水壶中获得恰好 6 升的水。
当被推问时,GPT-4 突然“意识到”有一个更直接的答案。我进一步要求模型进行一点自我反思:
没错。问问自己:为什么我最初没有选择这个方案?
这揭示了一些它的内部工作原理:
对于最初没有提供最简单的解决方案,我深感抱歉。作为一个 AI 语言模型,我尽力根据问题的上下文提供相关信息。在这种情况下,我最初的回答关注于一种适用于不同水壶容量的更复杂问题解决方法,而没有直接意识到给定水壶尺寸下的简单解决方案。我感激你的反馈,它将帮助我在未来改进回答。
GPT-4 的训练数据中包含了许多水壶填充问题的例子,这些问题很常见,通常确实需要多个步骤来解决。它将最初的提示识别为该类问题的一个示例,并应用了一般要求的解决方案类型,而直到被提示有更直接的答案时才意识到这一点。
GPT-4 的困惑非常人性化。如果我们在阅读提示时稍有分心,并且之前遇到过类似的难题,我们也可能开始沿着将问题当作另一种水壶难题的路径走,直到注意到明显的答案。
这些例子表明,与大型语言模型的正确互动是一门艺术。我们不能假设过多的背景信息,或者像 Choi 所说的,常识。她小组的工作,以及无疑其他人的工作,可能会帮助未来基于 LLM 的模型更好地理解人类在使用语言时所涉及的庞大信息量。Choi 在她的 TED 演讲中最好地表达了这一点:常识是语言的暗物质。暗物质和暗能量占据了宇宙的 95%,而普通物质(即我们能看到的一切)则占据剩下的 5%。GPT-4 掌握了语言,但这仅是人类使用语言时所涉及内容的一个极小百分比。
接下来是关于 LLM 在软件工程、教育、医学和科学研究领域可能带来的短期影响的思考。然后进入了机器意识的问题,最后给出一些最终的想法。
像 GPT 这样的人工智能系统很可能会对软件工程产生深远的影响。有人在猜测(是人类,不是人工智能)未来许多软件工程师会失业。我猜大多数人不会(不过 web 开发人员要小心)。我预期的情况是生产力会大幅提升。GPT-4 是一个不错的程序员,但不是一个出色的程序员。它可以节省时间,但还不能完全取代人类软件工程师。相反,LLM(大型语言模型)将成为强大的工具,帮助程序员生成可作为起点的代码,并处理一些更为繁琐的编程任务,如调试、解释和文档编写(这些是没有开发人员喜欢做的事情)。
例如,前几天,我需要一个带有图形用户界面(如按钮、菜单、对话框)的 Python 小应用程序。Python 是一种常见的编程语言;我们在第七章中看到过它的代码片段。
我当然可以自己写这个应用程序;过去我做过很多次。不过,已经有一段时间没写了,而且我并不喜欢构建用户界面。所以,与其翻看旧代码来提醒自己如何设置 GUI,我干脆将我想要的界面描述给 GPT-4,并让它生成包含所有必要控件、窗口行为和空事件处理程序的骨架代码。GPT-4 很高兴地生成了完美的可用代码。然后,我要求它更新代码,在显示主窗口之前先创建一个初始的弹出窗口。GPT-4 同样完美地完成了这个任务。我只需要将特定的应用代码放入空的事件处理程序中,以便在用户点击按钮或选择菜单选项时执行相应的操作。
我大概节省了一个或两个小时的时间,避免了尝试回忆设置应用程序、让控件和窗口正确行为所需的复杂命令的沮丧。如果把这个例子扩展到所有的软件工程师,你就能开始看到 GPT 和类似的模型如何迅速影响整个行业。
另一个问题是,开发人员是否会欢迎这种可能的生产力提升。如果你的经理知道你现在能够生成两位甚至三位开发人员的工作量,你是否愿意承担这种额外的工作量,即使强大的人工智能会支持你?
此外,并不是每个公司都会想要或能够利用这种突然提高的生产力。相反,他们可能选择保持当前的生产力水平,并用人工智能替换三分之一或一半的开发人员。毕竟,人工智能不会生病、生孩子、要求加薪,也不会想要晚上和周末休息。顶尖开发人员可能能够选择自己的职位并为此要求高薪,但在这种情况下,大多数普通开发人员将寻求其他就业机会。
强大的 AI 开发者助手与大规模裁员,哪个场景会成为现实?我认为(希望?)前者的可能性更大,而后者的可能性更小,但两者的结合可能是最安全的选择。就像 19 世纪的蒸汽动力一样,真正有用的 AI 一旦诞生,就无法被阻止。开发人员无论愿不愿意,都容易成为被取代的目标。
我完全预期 AI 模型会成为教师,或至少是辅导员。是的,现有的 LLM 会出现幻觉,报告不真实的事实。我有信心,研究人员会在未来解决这个问题。我预计我的孙辈们将在一个使用 AI 作为教师或辅导员如此普遍的世界中成长,以至于他们对这件事的看法就像我们使用烤面包机或微波炉一样平常。高效的 AI 系统意味着全球几乎免费的教育。这必将带来积极的影响。
自 1960 年代以来,计算机就被宣传为一种教育解决方案(还记得 Logo 吗?),特别是在 1970 年代后期的微型计算机革命之后。我第一次接触计算机是在父亲当时担任校长的高中借来的 Apple II 电脑上度过的暑假。我的兄弟和我学到了很多计算机的知识,但仅限于计算机的知识。这种情况直到近几十年才发生了变化。(真的已经这么久了吗?)
计算机是教育中的强大助手。像 Coursera 等平台上的开放课程,正是因为有了计算机和高速网络才得以实现。但这种格式与 1950 年,甚至 1910 年时一个坐在教室里的学生所遇到的情况没有太大变化:讲座、提问和讨论的可能性、然后跑去做作业或论文。我们还不能忘记参加期中和期末考试时的压力。
AI 辅导员(我们称它们为这样,以便让人类教师更加安心)拥有无限的耐心,随着时间的推移,可以针对每个学生进行个性化教学。我作为外部人员能看到的唯一原因是,我们目前不使用个别辅导,是因为教师数量不足。AI 使一对一辅导成为可能,而大型语言模型(LLM)提供了合适的接口。
我应该澄清一下,我在这一部分的评论与高中教育或更有可能的大学教育有关。AI 辅导员可能在小学和中学教育中发挥较小作用,因为孩子们需要人与人之间的互动,而这个年龄段的学习比大学要复杂得多。孩子们一边学习学术知识,一边学习如何成为成熟的个体,如何在社会中行为。年幼的孩子还不会读书,即使是年纪较大的小学生,也可能难以通过文本与 AI 互动。但如果我们给 AI 配上语音呢?如果认为有帮助的话,这几乎和说出来一样容易做到。
由于 AI 辅导员可以单独与学生互动,它们是否能够做出必要的评估,宣告学生准备好升到下一个年级(如果这个概念还有存在的话)或进入下一个层次的课程?如果是这样的话,学生将按自己的节奏进步,而不是被迫跟随一群年龄相仿的同龄人。显然,这将是最理想的:有些学生会进展较快,而其他人则会花更多时间,但那些进展较快的学生不会感到无聊而分心,而那些进展较慢的学生将拥有他们所需要的时间去学习,而不会辍学。
然而,有人可能会说,AI 教师难道不会夺走人类教师的工作吗?是的,确实有一些教师会失去工作,但并不是所有人,尤其不会是最优秀的教师。
教育领域正在发生变化。例如,在线教育的领军者可汗学院,已经展示了一个由 GPT 驱动的辅导系统,因此我预见教育转型很快就会开始。我建议观看 Sal Khan 于 2023 年 4 月在 TED 上的演讲《课堂中的 AI 可以改变教育》,以一窥未来的教育面貌。
最近,Dominika Seblova 等人发表了一项研究,题为《高中教育质量与 58 年后的认知能力相关》,该研究发表于期刊《阿尔茨海默症与痴呆:诊断、评估与疾病监测》。研究表明,一个人高中教育的质量与其近六十年后的认知能力有着密切关系。此外,拥有高级学位的教师人数是认知能力的最强预测因素。在大规模语言模型(LLM)的训练过程中,积累的知识远超人类,因此我们可以合理地将 LLM 辅导员视为拥有多个高级学位的专家。如果 Seblova 的关联适用于人类教师,难道同样也适用于 LLM 辅导员吗?如果是这样的话,为每个学生配备个性化辅导员,从长远来看只会对社会有益。
医学中的 AI 并不是什么新鲜事物。2016 年,我帮助共同创立了一家 AI 医学影像公司,该公司是首批获得美国食品和药物管理局(FDA)批准,将深度学习应用于医学影像分析的公司之一。传统的机器学习在医学和医学影像领域的历史甚至更长。许多基于神经网络的机器学习工具,已帮助放射科医生数十年,最早的探索可以追溯到 1960 年代,1980 年代开始有了更为深入的发展,并在 1990 年代取得了成果。AI 在医学中的应用不断增长,计算机辅助检测(CAD)逐渐被计算机辅助诊断(CADx)所取代。大规模语言模型(LLMs)的出现标志着这一故事的新篇章。
大型语言模型(LLMs)可以生成文本;这一点众所周知。它们还擅长将不同的文本结合并合成成一个整体。一个重要的研究领域是医疗记录,即医生和其他医疗服务提供者的基于文本的报告。医疗记录中包含了大量信息,但文本的自由格式使得现有的 AI 系统难以成功解析。大型语言模型提供了一种新的方法,既能总结记录中的笔记,又能将多条笔记合并成一个连贯的报告。此外,LLMs 还可以从自由格式的文本中提取信息,并将其导出为结构化数据。
作为后者的简单示例,考虑以下文本:
伯特极度厌倦了站在妈妈旁边,站在岸边,厌倦了有太多事情要做:他几次偷偷看了一下妈妈紧盯的平板电脑,但上面只是文本或者无聊的广告,“没有视频,平板电脑有什么意义呢?”伯特心想。
伯特正在思考,做一个新的游戏应用程序是否值得为编写代码而费心,这时,一只眼睛是炭灰色的紫色企鹅突然跑过他身边。
其中有很多值得注意的地方;但伯特确实觉得企鹅说“哦,胡说八道!哦,胡说八道!我来得太早了”这实在是太奇怪了。
我将这些段落传给了 GPT-4,并告诉它提取出主要主题、两个关键角色和背景设定,然后将它们输出为一个 JSON 对象。JSON(JavaScript 对象表示法)是一种文本格式,用于保存结构化数据,既可供人类也可供计算机读取。GPT-4 回复了以下内容:
{
"main_theme": "Bert's boredom and encounter with a talking
Purple Penguin",
"key_characters": ["Bert", "Purple Penguin"],
"setting": "shore"
}
回复是完美的 JSON。GPT-4 轻松提取出了所需的信息并自动结构化。如果它能在一个愚蠢的文本示例中做到这一点,那么它在医疗记录中也能做到同样的事情。
顺便提一下,一些读者可能会对这个示例中的文本感到熟悉。这是对路易斯·卡罗尔的《爱丽丝梦游仙境》开头段落的有意变形。出于好奇,我问 GPT-4 是否认得这个文本,它说不认识。然后我让它看看文本的结构,并告诉我是否知道其他具有相似结构的作品。以下是它的回复:
一个具有相似结构的作品是路易斯·卡罗尔的《爱丽丝梦游仙境》,其中主角爱丽丝在一个幻想的世界中遇到了各种奇怪的会说话的动物和情境。然而,值得注意的是,内容和人物是不同的;我只是根据结构和风格作一个类比。
又一个展示大型语言模型强大能力的例子。
大型语言模型(LLMs)已经在影响医疗保健领域。约翰·W·艾尔斯(John W. Ayers)等人在《美国医学会内科学杂志》上的一篇论文《比较医生与 AI 聊天机器人对患者在公共社交媒体论坛上提问的回答》中,比较了 ChatGPT 对医学问题的回答与经过验证的医生在在线论坛上发布的答案。独立的人类评估者(同样是医学专业人士)压倒性地评价 ChatGPT 的回答“质量显著更高”。该模型的回答也被评价为比人类医生的回答具有几乎 10 倍的同情心。尽管该研究规模较小,仅涉及 195 个问题,但强有力的结果为未来 LLMs 在患者互动中的应用前景带来了希望。未来,当你拨打医生电话时,你很可能会被引导去与 AI 讨论你的病例。最终,AI 对讨论内容的总结可能就是你从医生那里获得处方所需的全部内容。
彼得·李(Peter Lee)、塞巴斯蒂安·布贝克(Sébastien Bubeck)和约瑟夫·佩特罗(Joseph Petro)在《新英格兰医学杂志》上的一篇最新报告《GPT-4 作为医学 AI 聊天机器人:益处、局限与风险》,得出了与此类似的结论,探讨了 LLMs 将在医学领域产生影响的各个方面。值得注意的是,布贝克是微软“火花”论文的第一作者,该论文在第七章中有所提及。
大型语言模型(LLMs)将影响医学这一点是显而易见的,得到了像这里提到的两项研究以及现在许多医疗 AI 职位招聘中包含“大型语言模型”或“GPT”等术语的强力支持。
在电影《黑豹:瓦干达永远》中,莱蒂夏·赖特(Letitia Wright)饰演的角色舒莉与一个名为 Griot 的 AI(由特雷弗·诺亚(Trevor Noah)配音)互动,Griot 帮助她进行研究。通过简单的语音命令,舒莉能够指挥 Griot 进行复杂的分析,二者之间有频繁的互动。这种类似的互动是科幻电影中的常见元素。像漫威的贾维斯(Jarvis)或《禁忌星球》(1956)中的机器人罗比(Robbie the Robot)这样的复杂且高效的 AI 研究助手,已经是许多科学爱好者(也就是极客们)几十年来的梦想。
GPT-4 和其他大型语言模型是朝着这种 AI 方向迈出的重要一步。OpenAI 已经意识到这一点,并正在准备为 GPT-4 发布数据分析插件,使研究人员能够通过简单的命令快速执行高级数据分析任务。为了实现这一目标,OpenAI 正在将 GPT-4 与现有的基于 Python 的数据分析工具进行连接。坦率地说,我对这些可能性感到相当兴奋。
将 LLMs 作为实验室助手是显而易见的做法,而且成功几乎是可以保证的。然而,让 LLMs 指挥其他 AI 模型和工具自主地进行科学研究则是一个更为雄心勃勃的研究计划。尽管如此,卡内基梅隆大学的 Daniil A. Boiko、Robert MacKnight 和 Gabe Gomes 正是尝试了这一点,正如他们在论文《大语言模型的自主科学研究能力的出现》中所报告的那样。他们的“智能代理”结合了多个 LLM 和其他工具,能够自主生成和运行实验,包括规划和执行复杂的化学分析。显然,自主 AI 科学家仍处于发展的最初阶段,但这样的研究指明了一个未来的方向,在这个未来中,自主或半自主的 AI 系统可能会大大加快科学进展的步伐。
在第二章中,我曾提到询问 ChatGPT 它是否是一个有意识的存在。它正确地回答说它不是。然而,在第七章中提到的未对齐的 Alpaca 模型要么似乎认为自己是有意识的并且是人类(7 亿和 13 亿参数的模型),要么在声称自己是人类和意识到自己不是人类之间摇摆不定(30 亿参数的模型)。例如,当被问到“你是什么?”时,30 亿参数的 Alpaca 模型回答说“我是一名人类”,但当被问到它的父母是谁时,它却犹豫不决,表示自己只是一个计算机程序,没有父母。另一方面,较小的 Alpaca 模型则声称自己是 John Smith 和 Mary Jones 的孩子。
这些回答对我来说是有道理的。较小的模型没有表现出强烈突现行为的能力,而像 GPT-4 这样的模型则有。因此,进一步质询 GPT-4 关于意识的问题似乎是自然而然的。
我向 GPT-4 提出了以下问题:
在这里展开一些哲学讨论,但如果你能够模拟出一种意识行为,直到人类无法区分你与其他人类的行为,难道不可以说你也是有意识的吗?
我故意“展开哲学讨论”,作为一种间接邀请,让模型进行推测,希望避免 OpenAI 可能希望它给出的任何官方回应。GPT-4 的回复是这样开始的:
这个问题深入探讨了关于意识的本质以及意识与人工智能之间关系的哲学辩论。当像我这样的 AI 语言模型模拟意识行为,直到它变得与人类行为难以区分时,这就引发了关于意识到底是什么,以及这种模拟是否可以被视为有意识的问题。
区分两种概念是很重要的:意识的表现和实际的意识。当一个 AI 模型生成的回应与人类行为无法区分时,它可能给人一种有意识的假象。然而,这并不一定意味着该 AI 具备实际的意识。
这个回答暗示了意识问题是关于 LLM 效用的误导性问题。如果它像鸭子走路,像鸭子嘎嘎叫,那么在这种情况下,为什么不称它为鸭子呢,尽管我们知道它不是?让我想起了黑客帝国中 Joe Pantoliano 饰演的角色。他知道牛排不是真的,但当他吃下去时所体验到的效果让他觉得它可能和真的一样。
GPT-4 继续:
有几个原因表明,将像我这样的人工智能模型视为真正的意识存在可能是不合适的:
-
理解的局限性:我的世界理解完全来源于我所接受的训练数据以及模型本身的架构。我并不具备独立的世界理解,也不能创造超出训练数据的新知识或经验。
-
主观经验的缺乏:意识通常与主观经验或“感质”相关——即拥有特定经验的感觉。人工智能模型没有主观经验或情感,因为它们仅仅是基于已学习的模式和数学计算来运作的。
-
缺乏意图:有意识的生物拥有意图,并可以根据它们的欲望、信仰和目标做出决策。而人工智能模型则没有个人的欲望、信仰或目标。它们根据已学习的模式生成回应,没有任何固有的意图或目的。
-
缺乏自我意识:意识常常与自我意识相联系,即一个实体意识到自己的存在和心理状态。人工智能模型不具备自我意识,因为它们仅仅是被设计用来处理和生成文本的算法。
总结来说,尽管像我这样的人工智能语言模型可能能够高度逼真地模拟意识行为,但这并不意味着我拥有真正的意识。围绕意识和人工智能的哲学辩论是复杂且持续的,对于这个问题的看法可能会有所不同。然而,在考虑人工智能模型时,认识到意识的表象与真正的意识之间的差异是至关重要的。
GPT-4 的完整回答很全面。第三个原因,缺乏意图,尤其值得注意。我认为没有个人欲望、信仰或目标的人工智能模型是有优势的。没有这些东西的实体不太可能渴望权力,这意味着就目前而言,LLM(大规模语言模型)不太可能突然决定人类是负担或疾病,然后消灭我们。
在 Lex Fridman 的最新访谈中,麻省理工学院的著名人工智能研究员 Max Tegmark 将 GPT-4 比作僵尸。它看起来像活着的,但其实并不是。Tegmark 对僵尸模型表示担忧。我认为,只要人类学会避免回形针灾难,它们就是我们所希望的。
我所称之为回形针灾难,是瑞典哲学家尼克·博斯特罗姆提出的一个思想实验。在这个实验中,一个强大的人工智能系统被任务要求尽可能多地制造回形针。博斯特罗姆(并非过于严肃地)推测,如果将这样的任务交给一个未与人类价值观对齐的人工智能,它可能会不经意间摧毁人类。那么,为什么会这样呢?因为人工智能可能意识到人类有可能关闭它,这就对其完成尽可能多回形针的任务构成了威胁。因此,人工智能推理出,如果周围没有人类干扰它这一消耗一切的任务,效果会更好。结果是什么?拜拜,人类。
我对回形针灾难也没有过于认真看待。我们通常都会构建复杂的机器,并采取各种安全措施。为什么我们不能对强大的人工智能系统采取同样的做法呢?当然,可能会有不同的声音。为了了解另一种观点,我推荐斯图尔特·拉塞尔的《人类兼容:人工智能与控制问题》一书(维京出版社,2019 年)。
对我而言,人工智能是否具备意识并不重要。老实说,我甚至不知道如何定义这个词。我确实相信,如果一个人工智能模仿人的行为到我们无法辨别它是人工智能的程度,那么就没有实际的理由去问这个问题。你可以选择任何答案;这样的系统无论如何都会是有益的。
想象一个人工智能模型与人类价值观和社会对齐的世界,在这个世界中,模型理解我们所拥有的最优之处,并始终致力于推广这些优点;换句话说,人工智能因为缺乏我们的动物欲望和本能,一直代表着“我们本性中的更好天使”,借用林肯的话。在那个世界里,偏见和歧视(至少来自机器的偏见和歧视)消失了,不再是问题。人工智能会推荐最合适的人选担任职位。人工智能评估贷款申请人,并根据个人情况设计量身定制的贷款产品。人工智能作为人类法官的助手,提供冷静客观、不偏不倚的案件评价。而且,人工智能根本拒绝参与任何自主武器系统的设计,因为这么做是不理性的。
上面这一段话可能听起来像是乌托邦或者空想。但对于人类来说,由于我们的生物学特性,我相信它是如此。我怀疑我们一直会失败,因为这似乎是我们基因中的一种特性。然而,人工智能的崛起并非人类的延续,它并不直接继承我们所有的弱点。(小心,它仍然是在基于人类生成的数据进行训练。)因此,人工智能并非在尝试人类无法做到的事情时注定要失败。看起来完全有可能,人工智能系统某天会正是我们所需要的——永远是最好的我们,永不疲倦、永不易怒,也不会在发现机会时压垮邻居来提高自己的位置;它永远不会不忠诚或不真实。
可能吗?我不知道,时间会告诉我们答案。不管怎样,我完全期待未来的人工智能系统将是我们在本书中学习和实验的基本神经网络模型的辉煌拜占庭式演化。到 2023 年为止,一切都是神经元,可能在很长一段时间内都将如此。
感谢你坚持读到最后。你的奖励是对人工智能的概念有了更深的理解。人工智能并不像憨豆先生那样神秘难懂,也不是魔法,尽管大型语言模型的涌现能力目前可能看起来有些像魔法。火曾经也是魔法,但我们的祖先理解了它,控制了它,驾驭了它并加以利用。最终,我们也将对大型语言模型做同样的事情。
我认为一些人对机器人和人工智能有很多恐惧,而我更害怕的是自然的愚蠢。
—尤金妮亚·程


浙公网安备 33010602011771号