机器学习问答-全-
机器学习问答(全)
原文:
zh.annas-archive.org/md5/39d589581703add64a94c50f09c8cd3e译者:飞龙
前言

由于深度学习的快速进展,近年来我们见证了机器学习和人工智能的显著扩展。
这项进展令人兴奋,因为如果我们期待这些进步创造新的产业、改造现有产业,并提高全球人民的生活质量,那么它们无疑会带来积极变化。另一方面,技术的不断涌现使得紧跟最新发展变得具有挑战性和耗时。然而,保持与时俱进对使用这些技术的专业人士和组织至关重要。
我写这本书是为了为读者和机器学习从业者提供一种资源,帮助他们提升在该领域的专业知识,并学习一些我认为有用且重要的技术,这些技术在传统和入门教材及课程中常常被忽视。希望你能发现本书是获得新见解和发现可以在工作中实现的新技术的宝贵资源。
这本书适合谁?
探索人工智能和机器学习文献的世界常常让人感觉像是在走钢丝,大多数书籍都位于两端:一端是广泛的初学者介绍,另一端是深入的数学论述。本书在保持易于接近的同时,阐明并讨论了这些领域的重要发展,且不需要高级数学或编程背景。
这本书适合那些有一定机器学习经验、希望学习新概念和技术的人。它非常适合那些已经参加过机器学习或深度学习初学者课程,或者阅读过相关入门书籍的人。(在本书中,我将机器学习作为机器学习、深度学习和人工智能的总称。)
你能从这本书中获得什么?
本书采用独特的问答式风格,每一章简短,围绕与机器学习、深度学习和人工智能基本概念相关的中心问题展开。每个问题后面都有解释,并配有若干插图和图表,同时还有练习题来测试你的理解。许多章节还包括进一步阅读的参考资料。这些简短的信息提供了一个愉快的起点,帮助你从机器学习初学者成长为专家。
本书涵盖了广泛的主题。它包括了关于已建立架构(例如卷积网络)的新见解,帮助你更有效地利用这些技术。它还讨论了更先进的技术,如大语言模型(LLMs)和视觉变换器的内部工作原理。即使是经验丰富的机器学习研究人员和从业者也会遇到一些新知识,丰富他们的技术库。
尽管本书将向你展示新概念和新思想,但它并不是一本数学或编程书。在阅读时你不需要解决任何证明或运行任何代码。换句话说,本书是你旅行时的完美伴侣,或者你可以在喜欢的阅读椅上,配着早晨的咖啡或茶,轻松阅读。
如何阅读本书
本书的每一章都是自成一体的,允许你根据需要自由跳跃章节。当一个章节中的概念在其他章节中有更详细的解释时,我会提供章节参考,帮助你填补理解的空白。
然而,各章节之间有一个战略性顺序。例如,关于嵌入的早期章节为后续关于自监督学习和少样本学习的讨论奠定了基础。为了获得最流畅的阅读体验和最全面的内容理解,我建议从头到尾依次阅读本书。
每一章后都有可选的练习,供希望检验自己理解的读者使用,答案键位于书末。此外,关于章节中提到的任何论文或进一步阅读的材料,你可以在该章节的“参考文献”部分找到完整的引用信息。
本书分为五个主要部分,集中讨论当今机器学习和人工智能领域最重要的话题。
第一部分:神经网络与深度学习 涵盖了关于深度神经网络和深度学习的一些问题,这些问题并不特定于某个子领域。例如,我们讨论了监督学习的替代方法,以及减少过拟合的技术,这是在使用机器学习模型解决数据有限的现实问题时常见的问题。
第一章:嵌入、潜在空间与表示 深入探讨了嵌入向量、潜在向量和表示之间的区别与相似性。阐明了这些概念如何在机器学习中帮助编码信息。
第二章:自监督学习 重点介绍自监督学习,这是一种使神经网络能够以监督方式利用大量未标注数据集的方法。
第三章:少样本学习 介绍了少样本学习,这是一种针对小型训练数据集量身定制的监督学习技术。
第四章:彩票票据假说 探讨了一个观点,即随机初始化的神经网络包含更小、更高效的子网络。
第五章:通过数据减少过拟合 解决机器学习中的过拟合问题,讨论了围绕数据增强和利用未标注数据减少过拟合的策略。
第六章:通过模型修改减少过拟合 扩展了关于过拟合的讨论,重点介绍了与模型相关的解决方案,如正则化、选择更简单的模型和集成技术。
第七章:多 GPU 训练范式 解释了多 GPU 设置中用于加速模型训练的各种训练范式,包括数据并行和模型并行。
第八章:变换器的成功 探索了流行的变换器架构,突出其注意力机制、并行化的便捷性以及高参数量等特点。
第九章:生成性 AI 模型 提供了深度生成模型的全面概述,这些模型用于生成各种形式的媒体,包括图像、文本和音频。讨论了每种模型类型的优缺点。
第十章:随机性的来源 讨论了在训练深度神经网络过程中可能导致训练和推理结果不一致且不可重现的各种随机性来源。虽然随机性可能是偶然的,但也可以通过设计有意引入。
第二部分:计算机视觉 侧重于主要与深度学习相关但特定于计算机视觉的主题,其中许多涉及卷积神经网络和视觉变换器。
第十一章:计算参数数量 解释了确定卷积神经网络中参数的过程,这对于评估模型的存储和内存需求非常有用。
第十二章:全连接层与卷积层 说明了卷积层如何在某些情况下无缝替代全连接层,这对于硬件优化或简化实现非常有用。
第十三章:视觉变换器的大型训练集 探讨了视觉变换器为何需要比传统卷积神经网络更大规模的训练集的原因。
第三部分:自然语言处理 涉及与文本处理相关的主题,其中许多与变换器架构和自注意力机制相关。
第十四章:分布假设 深入探讨了分布假设,这是一种语言学理论,认为在相同上下文中出现的词语往往具有相似的意义,这对于训练机器学习模型具有重要意义。
第十五章:文本数据增强 强调了文本数据增强的重要性,这是一种用于人工增加数据集大小的技术,可以帮助提高模型的性能。
第十六章:自注意力机制 介绍了自注意力机制,该机制允许神经网络的每个输入片段引用其他部分。自注意力是现代大语言模型中的关键机制。
第十七章:编码器与解码器式转换器 讲解了编码器和解码器转换器架构的细微差别,并解释了哪种架构最适合每个语言处理任务。
第十八章:使用和微调预训练的转换器 解释了微调预训练的大型语言模型的不同方法,并讨论了它们的优缺点。
第十九章:评估生成型大语言模型 列出了用于语言模型的主要评估指标,如困惑度(Perplexity)、BLEU、ROUGE 和 BERTScore。
第四部分:生产与部署 涵盖了与实际场景相关的问题,例如提高推理速度和各种类型的分布变化。
第二十章:无状态训练与有状态训练 区分了在模型部署中使用的无状态训练和有状态训练方法。
第二十一章:数据驱动的 AI 探讨了数据驱动的 AI,这种方法优先考虑通过改进数据集来提升模型性能。与此相对的是传统的以模型为中心的方法,后者强调通过改进模型架构或方法来提升性能。
第二十二章:加速推理 介绍了在不调整模型架构或妥协准确性的情况下,提高模型推理速度的技术。
第二十三章:数据分布变化 部署后,AI 模型可能会面临训练数据和现实世界数据分布之间的差异,这被称为数据分布变化。这些变化可能会导致模型性能下降。本章对常见的分布变化进行了分类并详细讲解,如协变量变化、概念漂移、标签变化和领域变化。
第五部分:预测性能与模型评估 深入探讨了挖掘预测性能的各个方面,例如改变损失函数、设置 k 折交叉验证以及处理有限的标注数据。
第二十四章:泊松回归与有序回归 强调了泊松回归和有序回归之间的差异。泊松回归适用于遵循泊松分布的计数数据,例如在飞机上感染感冒的次数。相反,有序回归适用于有序类别数据,而不假设类别之间是等距的,例如疾病严重程度。
第二十五章:置信区间 深入探讨了为机器学习分类器构建置信区间的方法。回顾了置信区间的目的,讨论了它们如何估计未知的总体参数,并介绍了如正态近似区间、自助法和使用不同随机种子进行再训练等技术。
第二十六章:置信区间与一致性预测 讨论了置信区间和一致性预测之间的区别,并将后一者描述为创建预测区间的工具,这些区间以特定的概率覆盖实际结果。
第二十七章:合适的度量 聚焦于数学和计算机科学中合适度量的基本属性。探讨了机器学习中常用的损失函数,如均方误差和交叉熵损失,是否满足这些属性。
第二十八章:k-折交叉验证中的k 探讨了k-折交叉验证中k的作用,并深入分析了选择较大k的优缺点。
第二十九章:训练集与测试集不一致性 讨论了模型在测试数据集上的表现优于训练数据集的情形。提供了发现和解决训练集与测试集之间差异的策略,介绍了对抗验证的概念。
第三十章:有限标签数据 介绍了在数据有限的情况下增强模型表现的各种技术。涵盖了数据标注、自助法,以及如迁移学习、主动学习和多模态学习等范式。
在线资源
我在 GitHub 上提供了可选的补充材料,包含某些章节的代码示例,以增强你的学习体验(见* github.com/rasbt/MachineLearning-QandAI-book *)。这些材料设计为实际的扩展和深入探讨书中涉及的主题。你可以在阅读每一章时一起使用它们,或者在阅读后探索它们,以巩固和扩展你的知识。
事不宜迟,让我们深入探讨吧。
第一部分:神经网络与深度学习
第一章:嵌入、潜在空间和表示

在深度学习中,我们常用术语嵌入向量、表示和潜在空间。这些概念有什么共同之处,它们有何不同?
虽然这三个术语常常互换使用,但我们可以对它们进行细微的区分:
-
嵌入向量是输入数据的表示,其中相似的项目彼此靠近。
-
潜在向量是输入数据的中间表示。
-
表示是原始输入的编码版本。
以下部分探讨嵌入、潜在向量和表示之间的关系,以及它们在机器学习中的功能和作用。
嵌入
嵌入向量,简称嵌入,将相对高维的数据编码为相对低维的向量。
我们可以应用嵌入方法,从(稀疏的)独热编码创建一个连续的稠密(非稀疏)向量。独热编码是一种将分类数据表示为二进制向量的方法,每个类别被映射为一个向量,其中对应类别索引的位置为 1,其他位置为 0。这确保了分类值以某些机器学习算法可以处理的方式表示。例如,如果我们有一个名为 Color 的分类变量,包含三种类别:红色、绿色和蓝色,独热编码将红色表示为[1, 0, 0],绿色表示为[0, 1, 0],蓝色表示为[0, 0, 1]。这些独热编码的分类变量随后可以通过利用嵌入层或模块的学习权重矩阵映射到连续的嵌入向量。
我们还可以使用嵌入方法处理稠密数据,如图像。例如,卷积神经网络的最后几层可能会产生嵌入向量,如图 1-1 所示。

图 1-1:一个输入嵌入(左)和来自神经网络的嵌入(右)
从技术上讲,神经网络的所有中间层输出都可能产生嵌入向量。根据训练目标,输出层也可能产生有用的嵌入向量。为了简化,图 1-1 中的卷积神经网络将倒数第二层与嵌入关联。
嵌入可以比原始输入具有更高或更低的维度。例如,使用极端表达的嵌入方法,我们可以将数据编码为二维稠密且连续的表示形式,用于可视化和聚类分析,如图 1-2 所示。

图 1-2:将单词(左)和图像(右)映射到二维特征空间
嵌入的一个基本属性是它们编码距离或相似性。这意味着嵌入捕捉了数据的语义,使得相似的输入在嵌入空间中接近。
对于那些对使用数学术语进行更正式解释的读者,嵌入是输入空间X和嵌入空间Y之间的单射且结构保留的映射。这意味着相似的输入将在嵌入空间中靠近的位置,这可以看作是嵌入的“结构保留”特征。
潜在空间
潜在空间通常与嵌入空间同义,即嵌入向量被映射到的空间。
相似的项目可以在潜在空间中靠近出现;然而,这不是严格要求的。更宽泛地说,我们可以将潜在空间看作是包含特征的任何特征空间,通常是原始输入特征的压缩版本。这些潜在空间特征可以通过神经网络学习,例如重建输入图像的自编码器,如图 1-3 所示。

图 1-3:自编码器重建输入图像
图 1-3 中的瓶颈表示一个小型的中间神经网络层,该层将输入图像编码或映射为低维表示。我们可以将这种映射的目标空间看作是潜在空间。自编码器的训练目标是重建输入图像,也就是说,最小化输入图像和输出图像之间的距离。为了优化训练目标,自编码器可能会学习将相似输入(例如,猫的图片)在潜在空间中放置得很近,从而创建有用的嵌入向量,使得相似的输入在嵌入(潜在)空间中接近。
表示
表示是输入的编码,通常是中间形式。例如,嵌入向量或潜在空间中的向量就是输入的表示,如前所述。然而,表示也可以通过更简单的过程生成。例如,独热编码向量被视为输入的表示。
关键思想是表示捕捉了原始数据的一些基本特征或特性,使其对进一步分析或处理有用。
练习
1-1. 假设我们正在训练一个卷积网络,具有五个卷积层,后接三个全连接(FC)层,类似于 AlexNet(en.wikipedia.org/wiki/AlexNet),如图 1-4 所示。

图 1-4:AlexNet 的示意图
我们可以将这些全连接层看作是一个多层感知机中的两个隐藏层和一个输出层。神经网络的哪些层可以用来生成有用的嵌入表示?感兴趣的读者可以在 Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 的原始出版物中找到有关 AlexNet 架构和实现的更多细节。
1-2. 列举一些不是嵌入表示的输入表示类型。
参考文献
- 描述 AlexNet 架构和实现的原始论文:Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton,"使用深度卷积神经网络进行 ImageNet 分类"(2012),
papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks。
第二章:自监督学习**

什么是自监督学习,它在何时有用,实施它的主要方法是什么?
自监督学习是一种预训练过程,使神经网络能够以监督的方式利用大量无标签的数据集。本章将自监督学习与迁移学习进行比较,迁移学习是另一种相关的神经网络预训练方法,并讨论了自监督学习的实际应用。最后,本章概述了自监督学习的主要类别。
自监督学习与迁移学习
自监督学习与迁移学习相关,迁移学习是一种技术,其中在一个任务上预训练的模型被重用作为第二个任务模型的起点。例如,假设我们有兴趣训练一个图像分类器来分类鸟类物种。在迁移学习中,我们会在 ImageNet 数据集上预训练一个卷积神经网络,ImageNet 是一个大型的、有标签的图像数据集,包含许多不同的类别,包括各种物体和动物。在对通用的 ImageNet 数据集进行预训练之后,我们会将该预训练模型应用于一个较小且更具体的目标数据集,该数据集包含我们感兴趣的鸟类物种。(通常,我们只需要更改类特定的输出层,但可以直接采用预训练的网络。)
图 2-1 展示了迁移学习的过程。

图 2-1:使用传统迁移学习进行预训练
自监督学习是迁移学习的另一种方法,其中模型不是在有标签的数据上预训练,而是在无标签的数据上进行预训练。我们考虑一个没有标签信息的无标签数据集,然后我们通过数据集的结构找到获取标签的方法,进而为神经网络制定预测任务,如图 2-2 所示。这些自监督训练任务也被称为前置任务。

图 2-2:使用自监督学习进行预训练
迁移学习与自监督学习之间的主要区别在于我们在图 2-1 和图 2-2 的步骤 1 中如何获得标签。在迁移学习中,我们假设标签是与数据集一起提供的;它们通常由人工标注者创建。在自监督学习中,标签可以直接从训练样本中推导出来。
一个自监督学习任务可以是在自然语言处理中的缺失词预测。例如,给定句子“It is beautiful and sunny outside”,我们可以将单词sunny掩码掉,将输入传入网络:“It is beautiful and [MASK] outside”,然后让网络预测[MASK]位置的缺失单词。类似地,我们可以在计算机视觉中去除图像块,让神经网络填补空白。这只是自监督学习任务的两个例子;还有许多其他方法和范式。
总结来说,我们可以将基于预文本任务的自监督学习看作是表示学习。我们可以利用预训练模型对目标任务进行微调(也称为下游任务)。
利用未标注数据
大型神经网络架构需要大量标注数据才能有效执行并良好地推广。然而,对于许多问题领域,我们并没有访问大规模标注数据集。通过自监督学习,我们可以利用未标注数据。因此,当处理大型神经网络且标注训练数据有限时,自监督学习可能会非常有用。
作为大型语言模型(LLMs)和视觉转换器基础的基于 Transformer 的架构被认为需要通过自监督学习进行预训练才能表现良好。
对于像两层或三层的多层感知器这样的简单神经网络模型,自监督学习通常被认为既不实用也不必要。
自监督学习在传统的非参数模型(如基于树的随机森林或梯度提升法)中同样没有用处。传统的基于树的方法没有固定的参数结构(例如,与权重矩阵不同)。因此,传统的基于树的方法无法进行迁移学习,也与自监督学习不兼容。
自预测与对比自监督学习
自监督学习主要有两类:自预测和对比自监督学习。在自预测中,如图 2-3 所示,我们通常改变或隐藏输入的部分,并训练模型重建原始输入,例如使用扰动掩码遮掩图像中的某些像素。

图 2-3:应用扰动掩码后的自预测
一个经典的例子是去噪自编码器,它学习从输入图像中去除噪声。或者,考虑一个掩码自编码器,它重建图像中缺失的部分,如图 2-4 所示。

图 2-4:一个掩码自编码器重建掩码图像
缺失(掩码)输入自预测方法在自然语言处理领域也经常使用。许多生成性大语言模型(LLM),如 GPT,是通过下一个词预测任务进行训练的(GPT 将在第十四章和第十七章中详细讨论)。在这里,我们向网络输入文本片段,网络需要预测序列中的下一个词(我们将在第十七章中进一步讨论)。
在对比自监督学习中,我们训练神经网络学习一个嵌入空间,其中相似的输入彼此接近,而不相似的输入彼此远离。换句话说,我们训练网络生成嵌入,使得相似的训练输入之间的距离最小化,而不相似的训练样本之间的距离最大化。
让我们通过具体的示例输入来讨论对比学习。假设我们有一个由随机动物图像组成的数据集。首先,我们随机绘制一张猫的图像(网络不知道标签,因为我们假设数据集是未标注的)。然后,我们对这张猫的图像进行增强、腐蚀或扰动,例如通过添加随机噪声层并以不同方式裁剪,如图 2-5 所示。

图 2-5:对比学习中遇到的图像对
这张扰动后的猫图像仍然展示了相同的猫,因此我们希望网络生成一个相似的嵌入向量。我们还考虑从训练集随机选取一张图像(例如,一张大象的图像,但同样,网络并不知道标签)。
对于猫和大象的配对,我们希望网络生成不相似的嵌入。这样,我们间接地迫使网络捕捉图像的核心内容,同时对小的差异和噪声保持一定的无关性。例如,最简单的对比损失形式是模型M(·)生成的嵌入之间的L[2]范数(欧几里得距离)。假设我们更新模型权重,以减少距离||M(cat) – M(cat′)||[2],并增加距离||M(cat) – M(elephant)||[2]。
图 2-6 总结了在扰动图像情境下,对比学习的核心概念。模型被展示了两次,这被称为连体网络设置。基本上,同一个模型在两个实例中被使用:首先,生成原始训练示例的嵌入;其次,生成扰动版本样本的嵌入。

图 2-6:对比学习
这个示例概述了对比学习的主要思想,但有许多子变种。大体上,我们可以将其分为样本对比方法和维度对比方法。图 2-6 中的大象-猫示例展示了样本对比方法,在这种方法中,我们专注于学习嵌入,以最小化和最大化训练对之间的距离。另一方面,在维度对比方法中,我们专注于使相似训练对的嵌入表示中的某些变量彼此靠近,同时最大化其他变量之间的距离。
习题
2-1. 我们如何将自监督学习应用于视频数据?
2-2. 自监督学习能否用于表示为行列形式的表格数据?如果可以,我们该如何着手?
参考文献
-
关于 ImageNet 数据集的更多信息:
en.wikipedia.org/wiki/ImageNet。 -
一个对比自监督学习方法的示例:Ting Chen 等人,《视觉表征对比学习的简单框架》(2020),
arxiv.org/abs/2002.05709。 -
一个维度对比方法的示例:Adrien Bardes, Jean Ponce 和 Yann LeCun,《VICRegL:自监督学习局部视觉特征》(2022),
arxiv.org/abs/2210.01571。 -
如果你计划在实践中应用自监督学习:Randall Balestriero 等人,《自监督学习食谱》(2023),
arxiv.org/abs/2304.12210。 -
提出了一种迁移学习和自监督学习方法,用于在表格数据集上进行相对较小的多层感知器的论文:Dara Bahri 等人,《SCARF:使用随机特征腐蚀进行自监督对比学习》(2021),
arxiv.org/abs/2106.15147。 -
第二篇提出这种方法的论文:Roman Levin 等人,《使用深度表格模型进行迁移学习》(2022),
arxiv.org/abs/2206.15306。
第三章:少样本学习

什么是少样本学习?它与传统的监督学习训练过程有何不同?
少样本学习 是一种监督学习方法,适用于样本与类别比非常小的小型训练集。在常规的监督学习中,我们通过多次迭代训练集来训练模型,模型始终会看到一组固定的类别。而在少样本学习中,我们在支持集上工作,从中创建多个训练任务以组装训练回合,每个训练任务包含不同的类别。
数据集和术语
在监督学习中,我们在训练数据集上拟合模型,并在测试数据集上评估模型。训练集通常包含每个类别相对较多的样本。例如,在监督学习的上下文中,Iris 数据集每个类别有 50 个样本,被认为是一个小型数据集。而对于深度学习模型来说,像 MNIST 这样的数据集,每个类别有 5,000 个训练样本,也被认为是非常小的。
在少样本学习中,每个类别的样本数要小得多。在指定少样本学习任务时,我们通常使用术语 N-way K-shot,其中 N 代表类别数,K 代表每个类别的样本数。最常见的值是 K = 1 或 K = 5。例如,在一个 5-way 1-shot 问题中,有五个类别,每个类别只有一个样本。图 3-1 展示了一个 3-way 1-shot 设置,用一个较小的例子来说明这一概念。

图 3-1:少样本学习中的训练任务
我们可以将少样本学习视为“学习如何学习”,而不是像拟合模型到训练数据集那样。在与监督学习的对比中,少样本学习不是使用训练数据集,而是使用一个所谓的 支持集,从中抽取训练任务来模拟预测时的使用场景。每个训练任务都伴随有一个需要分类的查询图像。模型会在多个来自支持集的训练任务上进行训练,这个过程叫做 回合。
接下来,在测试阶段,模型会接收到一个新的任务,任务中的类别与训练时看到的类别不同。训练中遇到的类别也被称为 基础类别,而训练时使用的支持集通常也被称为 基础集。同样,任务是对查询图像进行分类。测试任务与训练任务相似,不同之处在于测试时的类别与训练时的类别没有重叠,正如图 3-2 所示。

图 3-2:训练和测试中看到的类别
正如图 3-2 所示,支持集和查询集在训练过程中包含来自同一类别的不同图像。在测试过程中也是如此。然而,请注意,支持集和查询集中的类别与训练过程中遇到的支持集和查询集的类别不同。
有许多不同类型的少样本学习。在最常见的元学习中,训练本质上是更新模型的参数,使其能够适应新任务。从高层次来看,一种少样本学习策略是学习一个模型,该模型生成嵌入,我们可以通过在支持集中的图像中进行最近邻搜索来找到目标类别。图 3-3 展示了这种方法。

图 3-3:学习适合分类的嵌入
该模型学习如何从支持集中生成良好的嵌入,以通过找到最相似的嵌入向量来分类查询图像。
练习
3-1. MNIST(en.wikipedia.org/wiki/MNIST_database) 是一个经典且流行的机器学习数据集,包含来自 10 个类别(对应数字 0 到 9)的 50,000 个手写数字。我们如何将 MNIST 数据集划分为一次性分类的上下文?
3-2. 少样本学习的现实世界应用或使用场景有哪些?
第四章:彩票假设**

彩票假设是什么?如果它成立,在实践中有什么用处?
彩票假设是神经网络训练中的一个概念,它认为在一个随机初始化的神经网络中,存在一个子网络(或称“中奖票”),当单独训练时,可以在测试集上达到与完整网络相同的准确度,而训练的步数与完整网络相同。这个概念最初由 Jonathan Frankle 和 Michael Carbin 在 2018 年提出。
本章逐步阐述了彩票假设,然后介绍了权重修剪,这是根据彩票假设方法论创建更小子网络的关键技术之一。最后,讨论了该假设的实际意义和局限性。
彩票假设训练过程
图 4-1 展示了彩票假设的训练过程,共有四个步骤,我们将逐一讨论这些步骤,以帮助澄清这一概念。

图 4-1:彩票假设训练过程
在图 4-1 中,我们从一个大型神经网络 ➊ 开始,训练直到收敛 ➋,这意味着我们尽最大努力让它在目标数据集上表现得尽可能好(例如,最小化训练损失和最大化分类准确性)。这个大型神经网络像往常一样使用小的随机权重进行初始化。
接下来,如图 4-1 所示,我们修剪神经网络的权重参数➌,将它们从网络中移除。我们可以通过将权重设置为零来创建稀疏的权重矩阵。这里,我们可以选择修剪单个权重,这称为非结构化修剪,或者修剪更大“块”的部分,例如整个卷积滤波器通道。这称为结构化修剪。
原始的彩票假设方法遵循一个称为迭代幅度修剪的概念,其中幅度最小的权重会以迭代的方式被移除。(我们将在第六章中讨论减少过拟合的技术时重新回顾这个概念。)
在修剪步骤之后,我们将权重重置为图 4-1 中第 1 步使用的原始小随机值,并训练修剪后的网络 ➍。值得强调的是,我们不会使用任何小的随机权重重新初始化修剪后的网络(这是迭代幅度修剪中常见的做法),而是重新使用第 1 步中的权重。
然后我们重复剪枝步骤 2 至 4,直到达到所需的网络大小。例如,在原始彩票票假设论文中,作者成功地将网络大小减少到原始大小的 10%,而不牺牲分类精度。作为一个额外的好处,修剪后的(稀疏的)网络,即所谓的中奖票,甚至展示了比原始(大而密集)网络更好的泛化性能。
实践意义与局限性
如果能够识别出那些预测性能与其最大可达十倍大网络相当的小型子网络,这将对神经网络训练和推理产生重大影响。鉴于现代神经网络架构的不断增大,这有助于降低训练成本和基础设施。
听起来像是太好了不真实?也许吧。如果能高效识别中奖票,那在实践中将非常有用。然而,在写作时,尚无方法能在不训练原始网络的情况下找到中奖票。包括剪枝步骤会使得这个过程比常规训练程序更昂贵。此外,在原始论文发布后,研究人员发现原始权重初始化可能无法在更大规模的网络中找到中奖票,需要进一步对修剪后的网络初始权重进行实验。
好消息是,中奖票确实存在。即使目前无法在不训练它们更大神经网络对等体的情况下识别它们,但在训练后,它们可以用于更高效的推理。
练习
4-1. 假设我们在尝试彩票票假设方法时发现子网络的性能不太好(与原始网络相比)。我们可以尝试哪些下一步措施?
4-2. 修正线性单元(ReLU)激活函数的简洁性和高效性使其成为神经网络训练中最流行的激活函数之一,特别是在深度学习中,它有助于缓解如梯度消失等问题。ReLU 激活函数通过数学表达式 max(0, x)定义。这意味着,如果输入的x为正,函数返回x;但如果输入为负数或 0,函数返回 0。彩票票假设如何与使用 ReLU 激活函数训练神经网络相关联?
参考文献
-
提出彩票票假设的论文:Jonathan Fran-kle 和 Michael Carbin,"The Lottery Ticket Hypothesis: Finding Sparse, Trainable Neural Networks"(2018),*
arxiv.org/abs/1803.03635*。 -
提出结构化剪枝以移除网络中较大部分(例如整个卷积滤波器)的论文:Hao Li 等,"Pruning Filters for Efficient ConvNets"(2016),*
arxiv.org/abs/1608.08710*。 -
关于彩票假设的后续工作,表明原始的权重初始化方法可能无法找到更大规模网络的“中奖票据”,需要对修剪后网络的初始权重进行额外实验:Jonathan Frankle 等人,"线性模式连接性与彩票票据假设"(2019),
arxiv.org/abs/1912.05671。 -
一种改进的“彩票票据假设”算法,通过找到较小的网络,精确匹配更大网络的表现:Vivek Ramanujan 等人,"随机加权神经网络中隐藏的是什么?"(2020),
arxiv.org/abs/1911.13299。
第五章:使用数据减少过拟合**

假设我们以监督方式训练神经网络分类器,并注意到它存在过拟合问题。通过改变或增加数据,有哪些常见的方式可以通过使用额外的数据来减少神经网络中的过拟合?
过拟合,是机器学习中常见的问题,当模型过于紧密地拟合训练数据时,学习了其中的噪声和异常值,而不是其潜在模式。因此,模型在训练数据上表现良好,但在未见或测试数据上表现不佳。虽然理想情况下应该预防过拟合,但通常不可能完全消除它。相反,我们的目标是尽可能地减少或最小化过拟合。
减少过拟合的最成功技术围绕着收集更多高质量标记数据展开。然而,如果收集更多标记数据不可行,我们可以增强现有数据或利用未标记数据进行预训练。
常见方法
本章总结了经受住时间考验的与数据集相关的技术的最显著示例,将它们分为以下几类:收集更多数据、数据增强和预训练。
收集更多数据
减少过拟合的最佳方法之一是收集更多(高质量的)数据。我们可以绘制学习曲线来确定一个给定模型是否会从更多数据中受益。为构建学习曲线,我们对不同大小的训练集(例如 10%,20%等)进行训练,并在同一固定大小的验证或测试集上评估训练好的模型。如图 5-1 所示,随着训练集大小的增加,验证准确率也会提高。这表明我们可以通过收集更多数据来改善模型的性能。

图 5-1:适应不同训练集大小的模型的学习曲线图
训练和验证性能之间的差距指示了过拟合的程度——差距越大,过拟合越严重。相反,验证性能提升的斜率表明模型欠拟合,并且可以从更多数据中受益。通常情况下,额外的数据可以减少欠拟合和过拟合。
数据增强
数据增强指的是基于现有数据生成新的数据记录或特征。它允许扩展数据集而无需额外收集数据。
数据增强使我们能够创建原始输入数据的不同版本,从而提高模型的泛化性能。为什么?增强数据有助于模型提高其泛化能力,因为它使得通过训练样本或特征记住虚假信息变得更加困难——或者,在图像数据的情况下,针对特定像素位置的精确像素值。图 5-2 突出展示了常见的图像数据增强技术,包括增加亮度、翻转和裁剪。

图 5-2:不同图像数据增强技术的选择
数据增强通常是图像数据(参见图 5-2)和文本数据(在第十五章中进一步讨论)中的标准做法,但表格数据的增强方法也存在。
除了收集更多数据或增强现有数据,还可以生成新的合成数据。虽然图像数据和文本数据中更常见生成合成数据,但对于表格数据也可以生成合成数据。
预训练
如第二章所述,自监督学习让我们能够利用大型未标注数据集对神经网络进行预训练。这也有助于减少在较小目标数据集上的过拟合。
作为自监督学习的替代方案,传统的迁移学习在大型标注数据集上也是一个选择。迁移学习在标注数据集与目标领域密切相关时最为有效。例如,如果我们训练一个模型来分类鸟类物种,我们可以在一个大型的通用动物分类数据集上进行预训练。然而,如果这样的动物分类数据集不可用,我们也可以在相对广泛的 ImageNet 数据集上预训练模型。
某个数据集可能非常小,不适合监督学习——例如,如果它每个类别只有少量标注样本。如果我们的分类器需要在一个无法收集更多标注数据的情境下工作,我们也可以考虑少样本学习。
其他方法
前面的部分介绍了使用和修改数据集以减少过拟合的主要方法。然而,这并不是一个详尽无遗的列表。其他常见的技术包括:
-
特征工程和归一化
-
对抗样本、标签或特征噪声的包含
-
标签平滑
-
更小的批量大小
-
数据增强技术,如 Mixup、Cutout 和 CutMix
下一章将介绍从模型角度减少过拟合的额外技术,并以讨论我们在实践中应考虑的正则化技术作为结尾。
练习
5-1. 假设我们训练一个 XGBoost 模型,基于从合作者那里手动提取的特征对图像进行分类。标注训练示例的数据集相对较小,但幸运的是,我们的合作者还拥有来自相关领域旧项目的标注训练集。我们正在考虑实施迁移学习方法来训练 XGBoost 模型。这是一个可行的选择吗?如果是的话,我们该如何操作?(假设我们只能使用 XGBoost,而不能使用其他分类算法或模型。)
5-2. 假设我们正在处理基于 MNIST 的手写数字识别图像分类问题。我们添加了相当多的数据增强以减少过拟合。不幸的是,我们发现分类精度比增强前差得多。这可能有哪些原因?
参考文献
-
关于表格数据增强的论文:Derek Snow,"DeltaPy: A Framework for Tabular Data Augmentation in Python"(2020),*
github.com/firmai/deltapy*。 -
提出 GReaT 方法的论文,该方法使用自回归生成的大型语言模型生成合成表格数据:Vadim Borisov 等人,"Language Models Are Realistic Tabular Data Generators"(2022),*
arxiv.org/abs/2210.06280*。 -
提出 TabDDPM 方法的论文,该方法使用扩散模型生成合成表格数据:Akim Kotelnikov 等人,"TabDDPM: Modelling Tabular Data with Diffusion Models"(2022),*
arxiv.org/abs/2209.15421*。 -
Scikit-learn 的用户指南提供了一个关于数据预处理的章节,包含了像特征缩放和归一化这样的技术,可以增强模型的表现:*
scikit-learn.org/stable/modules/preprocessing.html*。 -
关于如何使用带噪标签稳健训练深度模型的调查,探讨了缓解错误或误导性目标值影响的技术:Bo Han 等人,"A Survey of Label-noise Representation Learning: Past, Present and Future"(2020),*
arxiv.org/abs/2011.04406*。 -
理论和实证证据支持控制批量大小与学习率的比率在随机梯度下降中对深度神经网络建模性能的重要性:Fengxiang He、Tongliang Liu 和 Dacheng Tao,"Control Batch Size and Learning Rate to Generalize Well: Theoretical and Empirical Evidence"(2019),*
dl.acm.org/doi/abs/10.5555/3454287.3454390*。 -
包含对抗样本,这些输入样本旨在误导模型,通过使模型更加稳健来提高预测性能:Cihang Xie 等人,《对抗样本提高图像识别》(2019),*
arxiv.org/abs/1911.09665*。 -
标签平滑是一种正则化技术,通过用软化的值替代硬性的 0 和 1 分类目标,从而减轻数据集中可能存在的错误标签的影响:Rafael Müller、Simon Kornblith 和 Geoffrey Hinton,《标签平滑何时有帮助?》(2019),*
arxiv.org/abs/1906.02629*。 -
Mixup 是一种流行的方法,通过对混合数据对进行训练,提升神经网络的泛化能力和稳健性:Hongyi Zhang 等人,《Mixup: 超越经验风险最小化》(2018),*
arxiv.org/abs/1710.09412*。
第六章:通过模型修改减少过拟合

假设我们以监督方式训练一个神经网络分类器,并且已经采用了各种与数据集相关的技术来减轻过拟合。我们如何改变模型或修改训练循环以进一步减少过拟合的影响?
对抗过拟合的最成功的方法包括正则化技术,如丢弃法和权重衰减。通常而言,参数较多的模型需要更多的训练数据才能很好地进行泛化。因此,减小模型的规模和容量有时也有助于减少过拟合。最后,构建集成模型是对抗过拟合最有效的方法之一,但它伴随了更高的计算开销。
本章概述了几种通过修改模型来减少过拟合的关键思想和技术,并将它们进行比较。最后,讨论了如何在所有过拟合减少方法中做出选择,包括前一章讨论的那些方法。
常见方法
为了减少过拟合,诸多模型和训练相关的技术可以分为三大类:(1)添加正则化,(2)选择更小的模型,以及(3)构建集成模型。
正则化
我们可以将正则化解释为对复杂度的惩罚。经典的神经网络正则化技术包括 L[2] 正则化和相关的权重衰减方法。我们通过向损失函数中添加一个惩罚项来实现 L[2] 正则化,该项在训练过程中被最小化。这个添加的项代表了权重的大小,比如权重的平方和。以下公式展示了一个 L[2] 正则化的损失函数。

其中 λ 是一个超参数,用于控制正则化的强度。
在反向传播过程中,优化器最小化修改后的损失函数,损失函数现在包括了额外的惩罚项,这会导致模型权重变小,从而提高模型对未见数据的泛化能力。
权重衰减类似于 L[2] 正则化,但它直接应用于优化器,而不是修改损失函数。由于权重衰减与 L[2] 正则化具有相同的效果,这两种方法通常可以互换使用,但根据实现细节和优化器的不同,可能会有细微差异。
还有许多其他技术具有正则化效果。为了简洁起见,我们只讨论两种更常用的方法:丢弃法(dropout)和提前停止(early stopping)。
丢弃法通过在训练过程中随机将一些隐藏单元的激活值设为零来减少过拟合。因此,神经网络不能依赖于某些特定的神经元被激活。相反,它学会使用更多的神经元和多种独立的数据表示,这有助于减少过拟合。
在早停法中,我们在训练过程中监控模型在验证集上的表现,并在验证集上的表现开始下降时停止训练过程,如图 6-1 所示。

图 6-1:早停法
在图 6-1 中,我们可以看到,随着训练和验证准确率差距的缩小,验证准确率逐渐提高。训练和验证准确率最接近的那个点通常是过拟合最少的点,通常是早停的最佳时机。
更小的模型
经典的偏差-方差理论表明,减少模型大小可以降低过拟合。该理论的直觉是,作为一个经验法则,模型参数越小,它对数据中的噪声进行记忆或过拟合的能力就越小。接下来的段落讨论了减少模型大小的方法,包括剪枝(从模型中移除参数)和知识蒸馏(将知识转移到较小的模型中)。
除了作为超参数调优过程中的减少层数和缩小层宽度外,获取更小模型的另一种方法是迭代剪枝,即我们训练一个大型模型,使其在原始数据集上表现良好。然后我们反复去除模型的参数,重新训练它,使得它能够保持与原始模型相同的预测性能。(第四章中讨论的“彩票票据假说”使用了迭代剪枝。)
另一种常见的获取较小模型的方法是知识蒸馏。这种方法的基本思想是将来自一个大型、复杂模型(教师)的知识转移到一个较小的模型(学生)中。理想情况下,学生模型能够达到与教师模型相同的预测准确性,但由于模型较小,它能更高效地完成任务。作为一个附带的好处,较小的学生模型可能比较大的教师模型更少发生过拟合。
图 6-2 展示了原始的知识蒸馏过程。在这个过程中,教师模型首先通过常规的监督学习方式进行训练,以良好地分类数据集中的示例,使用常规的交叉熵损失来计算预测得分与真实类别标签之间的差异。与此同时,较小的学生网络在同一数据集上进行训练,训练目标是最小化(a)输出与类别标签之间的交叉熵损失,以及(b)其输出与教师输出之间的差异(使用Kullback–Leibler散度来衡量,Kullback–Leibler 散度量化了两个概率分布之间的差异,计算一个分布在信息内容上与另一个分布的偏离程度)。

图 6-2:原始的知识蒸馏过程
通过最小化 Kullback–Leibler 散度——教师和学生得分分布之间的差异——学生在变得更小、更高效的同时学会模仿教师。
较小模型的警告
尽管修剪和知识蒸馏也可以增强模型的泛化性能,但这些技术并不是减少过拟合的主要或有效方法。
早期的研究结果表明,修剪和知识蒸馏能够提高泛化性能,可能是由于模型变得更小。然而,令人反直觉的是,最近的研究研究了诸如双重下降和“grokking”现象,发现较大、过度参数化的模型如果训练超越过拟合点,也能表现出更好的泛化性能。双重下降是指在模型的参数数量较少或极多时,具有较好的泛化性能,而在模型的参数数量等于训练数据点数时,泛化性能较差。Grokking揭示了随着数据集大小的减少,优化的需求增加,且泛化性能能够在超越过拟合点后继续改善。
我们如何调和修剪后的模型在泛化性能上可能更好的观察结果与来自双重下降和“grokking”现象研究的矛盾观察?最近的研究表明,改进的训练过程在一定程度上解释了由于修剪导致的过拟合减少。修剪涉及更长时间的训练周期和学习率调度的重复,这可能在一定程度上促进了泛化性能的提升。
修剪和知识蒸馏仍然是提高模型计算效率的优秀方法。然而,尽管它们也可以增强模型的泛化性能,但这些技术并不是减少过拟合的主要或有效方法。
集成方法
集成方法结合多个模型的预测,以提高整体预测性能。然而,使用多个模型的缺点是增加了计算成本。
我们可以将集成方法看作是请一组专家委员会对某个决策进行评估,然后通过某种方式将他们的判断结合起来,做出最终决策。委员会成员通常具有不同的背景和经验。虽然他们在基本决策上往往意见一致,但他们可以通过多数规则推翻错误的决策。这并不意味着大多数专家总是正确的,但大多数委员会成员的判断,平均而言,比每一个单独的成员更有可能是正确的。
集成方法最基本的例子是多数投票法。在这里,我们训练k个不同的分类器,并从这些k个模型中收集每个模型对于给定输入的预测类别标签。然后,我们返回出现频率最高的类别标签作为最终预测。(对于平局,通常通过置信度得分、随机选择标签或选择具有最低索引的类别标签来解决。)
集成方法在经典机器学习中比在深度学习中更为常见,因为使用多个模型比依赖单个模型更为计算密集。换句话说,深度神经网络需要大量计算资源,使得它们不太适合用于集成方法。
随机森林和梯度提升是集成方法的常见示例。然而,通过使用多数投票或堆叠等方法,我们可以将任何一组模型结合在一起:一个集成可能由支持向量机、多层感知机和最近邻分类器组成。在这里,堆叠(也称为堆叠泛化)是多数投票的一种更高级的变体,涉及训练一个新的模型来结合多个其他模型的预测,而不是通过多数投票获得标签。
一种流行的行业技术是使用k-折交叉验证来构建模型,这是一种模型评估技术,在这种方法中,我们在k个训练折上训练和评估模型。然后,我们计算所有k次迭代的平均性能指标,以估计模型的整体性能度量。评估后,我们可以选择在整个训练数据集上训练模型,或者将单个模型作为集成进行组合,如图 6-3 所示。

图 6-3: k-折交叉验证用于创建模型集成
如图 6-3 所示,k-折集成方法在每一轮中将每个k模型在相应的k – 1 个训练折上进行训练。在对模型进行验证集折评估后,我们可以将它们组合成多数投票分类器,或者使用堆叠方法构建一个集成,堆叠方法是通过元模型结合多个分类或回归模型的技术。
尽管集成方法有可能减少过拟合并提高鲁棒性,但这种方法并不总是适用。例如,潜在的缺点包括管理和部署一个集成模型,这比使用单个模型更为复杂且计算开销更大。
其他方法
到目前为止,本书已经介绍了一些最突出减少过拟合的技术。第五章介绍了从数据角度减少过拟合的技术。通过对模型的修改来减少过拟合的其他技术包括跳跃连接(例如,残差网络中的跳跃连接)、前瞻优化器、随机权重平均、多任务学习和快照集成。
虽然它们最初并非为减少过拟合而设计,但诸如批量归一化(BatchNorm)和层归一化(LayerNorm)等层输入归一化技术可以稳定训练,并且通常具有正则化效果,能够减少过拟合。权重归一化通过对模型权重进行归一化,而不是层输入,可能也会带来更好的泛化性能。然而,这一效果并不如权重衰减那样直接,因为权重归一化(WeightNorm)并不像权重衰减那样明确地充当正则化器。
选择正则化技术
提高数据质量是减少过拟合的一个重要步骤。然而,对于具有大量参数的现代深度神经网络,我们需要做更多的工作才能实现可接受的过拟合水平。因此,数据增强和预训练,以及诸如 dropout 和权重衰减等已建立的技术,仍然是重要的过拟合减少方法。
在实践中,我们可以并且应该同时使用多种方法来减少过拟合,以实现加成效果。为了获得最佳结果,将选择这些技术视为超参数优化问题。
练习
6-1. 假设我们使用早停作为减少过拟合的机制——特别是使用一种现代的早停变体,在训练过程中创建最佳模型的检查点(例如,具有最高验证准确度的模型),以便在训练完成后加载它。大多数现代深度学习框架中都可以启用此机制。然而,一位同事建议调整训练周期数。每种方法的优缺点是什么?
6-2. 集成模型已被证明是减少过拟合并增强预测建模可靠性的可靠且成功的方法。然而,这总是存在一个权衡。与集成技术相关的一些缺点是什么?
参考文献
-
想了解更多关于 L[2] 正则化与权重衰减之间的区别,请参阅:Guodong Zhang 等人,“权重衰减正则化的三种机制”(2018),
arxiv.org/abs/1810.12281。 -
研究结果表明,剪枝和知识蒸馏可以改善泛化性能,这可能是由于模型规模的减小:Geoffrey Hinton, Oriol Vinyals, 和 Jeff Dean,“神经网络中的知识蒸馏”(2015),
arxiv.org/abs/1503.02531。 -
经典的偏差-方差理论表明,减小模型规模可以减少过拟合:Jerome H. Friedman, Robert Tibshirani, 和 Trevor Hastie, “模型选择与偏差-方差权衡,”统计学习的元素(Springer, 2009)第 2.9 章。
-
彩票票假设通过知识蒸馏找到具有与原始网络相同预测性能的更小网络:Jonathan Frankle 和 Michael Carbin,“彩票票假设:找到稀疏、可训练的神经网络”(2018 年),
arxiv.org/abs/1803.03635。 -
关于双重下降的更多信息:
en.wikipedia.org/wiki/Double_descent。 -
Grokking 现象表明,泛化性能可以远远超过过拟合的点:Alethea Power 等人,“Grokking:在小型算法数据集上超越过拟合的泛化”(2022 年),
arxiv.org/abs/2201.02177。 -
最近的研究表明,改进的训练过程在一定程度上解释了由于修剪导致的过拟合减少:Tian Jin 等人,“从训练和正则化的角度看修剪对泛化的影响”(2022 年),
arxiv.org/abs/2210.13738。 -
Dropout 曾被讨论作为一种正则化技术,但它也可以被视为一种集成方法,近似多个网络的加权几何平均值:Pierre Baldi 和 Peter J. Sadowski,“理解 Dropout”(2013 年),
proceedings.neurips.cc/paper/2013/hash/71f6278d140af599e06ad9bf1ba03cb0-Abstract.html。 -
正则化组合需要根据每个数据集进行调整:Arlind Kadra 等人,“调优得当的简单网络在表格数据集上的表现优秀”(2021 年),
arxiv.org/abs/2106.11189。
第七章:多 GPU 训练范式**

有哪些不同的多 GPU 训练范式,它们各自的优缺点是什么?
多 GPU 训练范式可以分为两类:一类是将数据划分进行并行处理,另一类是将模型划分到多个 GPU 上,以应对当模型大小超出单个 GPU 内存时的内存限制。数据并行属于第一类,而模型并行和张量并行属于第二类。像流水线并行这样的技术则融合了这两类思想。此外,当前的软件实现,如 DeepSpeed、Colossal AI 等,也将多种方法融合成一种混合技术。
本章介绍了几种训练范式,并提供了在实践中使用哪些范式的建议。
注意
本章主要使用“GPU”一词来描述用于并行处理的硬件。然而,讨论的相同概念和技术也可以应用于其他专用硬件设备,如张量处理单元(TPU)或其他加速器,具体取决于系统的架构和需求。
训练范式
以下各节讨论了模型并行、数据并行、张量并行和序列并行的多 GPU 训练范式。
模型并行
模型并行,或称操作间并行,是一种将大型模型的不同部分放置在不同 GPU 上的技术,这些部分按顺序计算,并在设备之间传递中间结果。这使得训练和执行可能无法完全适配单个设备的模型成为可能,但它可能需要复杂的协调来管理模型不同部分之间的依赖关系。
模型并行可能是最直观的设备间并行化形式。例如,对于一个仅包含两个层——隐藏层和输出层的简单神经网络,我们可以将一层放在一个 GPU 上,另一层放在另一个 GPU 上。当然,这可以扩展到任意数量的层和 GPU。
这是处理有限 GPU 内存的一个好策略,尤其是当整个网络无法完全加载到一个 GPU 时。然而,还有更高效的多 GPU 使用方式,如张量并行,因为模型并行中的链式结构(层 1 在 GPU 1 上→ 层 2 在 GPU 2 上→ . . .)会引入瓶颈。换句话说,模型并行的一个主要缺点是,GPU 必须互相等待,无法高效并行工作,因为它们依赖于彼此的输出。
数据并行
数据并行已经成为多 GPU 训练的默认模式好几年了。在这种模式下,我们将一个小批次分割成更小的微批次。然后每个 GPU 分别处理一个微批次,以计算模型权重的损失和损失梯度。在每个设备处理完微批次后,梯度会被合并,计算出下一轮的权重更新。
数据并行相对于模型并行的一个优势是,GPU 可以并行运行。每个 GPU 处理训练小批次的一部分,也就是一个微批次。然而,一个警告是,每个 GPU 都需要完整的模型副本。如果我们有无法放入 GPU 显存的大型模型,显然这是不可行的。
张量并行
张量并行,或称为操作内并行,是一种更高效的模型并行形式。在这种方式下,权重矩阵和激活矩阵被分布到多个设备上,而不是将整个层分布到不同设备:每个矩阵被拆分,因此我们可以将单个矩阵乘法分配到多个 GPU 上进行计算。
我们可以使用线性代数的基本原理实现张量并行;我们可以按行或按列的方式将矩阵乘法拆分到两个 GPU 上,如图 7-1 所示。 (这一概念可以扩展到任意数量的 GPU。)

图 7-1:用于分布矩阵乘法的张量并行
和模型并行一样,张量并行让我们可以绕过内存限制。同时,它也允许我们并行执行操作,类似于数据并行。
张量并行的一个小缺点是,它可能会导致多个 GPU 之间的高通信开销,尤其是在矩阵被拆分或分片时。例如,张量并行要求频繁地同步设备间的模型参数,这可能会减慢整个训练过程。
图 7-2 比较了模型、数据和张量并行。

图 7-2:模型、数据和张量并行的比较
在模型并行中,我们将不同的层放置到不同的 GPU 上,以绕过 GPU 内存的限制。在数据并行中,我们将一个批次分割到多个 GPU 上并行训练模型的副本,随后对梯度进行平均以更新权重。在张量并行中,我们将矩阵(输入和权重)分布到不同的 GPU 上进行并行处理,当模型太大而无法放入 GPU 内存时,这种方式尤其有效。
流水线并行
在流水线并行中,激活值在前向传播时传递,就像在模型并行中一样。不同的是,输入张量的梯度会反向传递,以避免设备空闲。从某种意义上说,流水线并行是数据并行和模型并行的复杂混合版本。
我们可以将管道并行性视为一种模型并行性,它试图最小化顺序计算瓶颈,增强不同设备上单个层之间的并行性。然而,管道并行性也借鉴了数据并行性的一些思想,例如将小批量进一步划分为微批次。
管道并行性无疑是对模型并行性的改进,尽管它并不完美,仍然会有空闲气泡。管道并行性的一个进一步缺点是,它可能需要大量努力来设计和实现管道阶段及其相关的通信模式。此外,它所产生的性能提升可能不如其他并行化技术(如纯数据并行性)那么显著,特别是对于小模型或在通信开销较高的情况下。
对于那些过大以至于无法装入 GPU 内存的现代架构,现在更常用的是数据并行性和张量并行性技术的结合,而不是管道并行性。
序列并行性
序列并行性旨在解决使用基于变换器的 LLM 处理长序列时的计算瓶颈。更具体地说,变换器的一个缺点是自注意力机制(原始的缩放点积注意力)随着输入序列长度的增加,计算量呈二次增长。当然,也有比原始注意力机制更高效的替代方案,能够线性扩展。
然而,这些高效的自注意力机制并不太流行,到目前为止,大多数人仍然更喜欢原始的缩放点积注意力机制。序列并行性,如图 7-3 所示,将输入序列拆分成较小的块,分配到多个 GPU 上,旨在减少自注意力机制的计算内存限制。

图 7-3:序列并行性将长输入划分到多个 GPU 上。
序列并行性如何与前面讨论的多 GPU 技术相关联?序列并行性专门处理顺序数据,张量并行性处理模型的内部结构,而数据并行性则处理训练数据的划分。理论上,由于这些并行策略各自解决计算挑战的不同方面,因此可以通过多种方式结合使用,以优化训练或推理过程。然而,序列并行性并不像其他并行化技术那样得到充分研究。
尽管序列并行性在实践中似乎有用,但它也带来了与上述并行化技术类似的额外通信开销。像数据并行性一样,它要求我们复制模型并确保它适配设备内存。对于变换器的多 GPU 训练,另一个缺点(取决于实现)是将输入序列分割成更小的子序列可能会降低模型的准确性(主要是在应用于较长序列时)。
建议
实际建议取决于具体的情况。如果我们训练的小模型可以适应单个 GPU,那么数据并行性策略可能是最有效的。流水线并行性带来的性能提升可能不如其他并行化技术,如数据并行性,尤其是在小模型或通信开销较高的情况下。
如果模型太大,无法适配单个 GPU 的内存,我们需要探索模型或张量并行性。张量并行性天生更高效;因为没有像模型并行性那样的顺序依赖,GPU 可以并行工作。
现代的多 GPU 策略通常也结合了数据并行性和张量并行性。
练习
7-1. 假设我们正在实现自己版本的张量并行性,当我们使用标准的随机梯度下降优化器训练模型时,它运行得很好。然而,当我们尝试使用 Diederik P. Kingma 和 Jimmy Ba 提出的 Adam 优化器时,遇到了设备内存不足的问题。是什么原因可能解释了这个问题?
7-2. 假设我们没有 GPU 可用,并且考虑在 CPU 上使用数据并行性。这是一个好主意吗?
参考文献
-
关于 Adam 优化器的原始论文:Diederik P. Kingma 和 Jimmy Ba,《Adam: 一种用于随机优化的方法》(2014 年),
arxiv.org/abs/1412.6980。 -
有关 DeepSpeed 和 Colossal-AI 在多 GPU 训练中的更多信息:
github.com/microsoft/DeepSpeed和github.com/hpcaitech/ColossalAI。 -
DeepSpeed 团队的流水线并行教程和研究:
www.deepspeed.ai/tutorials/pipeline和 Yanping Huang 等人,《GPipe: 使用流水线并行高效训练巨型神经网络》(2018 年),arxiv.org/abs/1811.06965。 -
提出序列并行性用于基于变换器的语言模型的论文:Shenggui Li 等人,《序列并行性:从[系统]的角度看长序列训练》(2022 年),
arxiv.org/abs/2105.13120。 -
扩展点积注意力机制是在原始的 Transformer 架构中提出的:Ashish Vaswani 等人,“Attention Is All You Need”(2017),
arxiv.org/abs/1706.03762。 -
介绍了替代原始自注意力机制的方案,并且这些方案具有线性扩展性:Yi Tay 等人,“Efficient Transformers: A Survey”(2020),
arxiv.org/abs/2009.06732。 -
介绍了提高 Transformer 训练效率的额外技术:Bohan Zhuang 等人,“A Survey on Efficient Training of Transformers”(2023),
arxiv.org/abs/2302.01107。 -
现代多 GPU 策略通常结合数据并行性和张量并行性。流行的例子包括 DeepSpeed 阶段 2 和 3,这些在零冗余优化器的教程中有描述:
www.deepspeed.ai/tutorials/zero/。
第八章:变换器的成功

变换器成功的主要因素有哪些?
近年来,变换器成为了最成功的神经网络架构,特别是在各种自然语言处理任务中。事实上,变换器现在也即将成为计算机视觉任务的最新技术。变换器的成功可以归因于几个关键因素,包括其注意力机制、易于并行化、无监督预训练和高参数量。
注意力机制
变换器中使用的自注意力机制是使基于变换器的大型语言模型(LLM)如此成功的关键设计组件之一。然而,变换器并不是第一个利用注意力机制的架构。
注意力机制最早是在 2010 年图像识别的背景下发展起来的,之后被采用来帮助递归神经网络中的长句子翻译。(第十六章更详细地比较了递归神经网络和变换器中的注意力机制。)
上述的注意力机制灵感来源于人类视觉,每次专注于图像的特定部分(中央视网膜快照),以分层和顺序的方式处理信息。与此不同,变换器的基本机制是自注意力机制,主要用于序列到序列的任务,例如机器翻译和文本生成。它使得序列中的每个标记都能关注所有其他标记,从而提供每个标记的上下文感知表示。
是什么让注意力机制如此独特且有用?以下示例中,假设我们正在使用编码器网络来处理输入序列或图像的固定长度表示——这可以是全连接的、卷积的或基于注意力的编码器。
在变换器中,编码器使用自注意力机制来计算每个输入标记相对于序列中其他标记的重要性,从而使模型能够专注于输入序列中相关的部分。从概念上讲,注意力机制使得变换器能够关注序列或图像的不同部分。从表面上看,这听起来很像一个全连接层,其中每个输入元素通过权重与下一层中的输入元素相连接。在注意力机制中,注意力权重的计算涉及将每个输入元素与其他所有元素进行比较。通过这种方法得到的注意力权重是动态的且依赖于输入的。相比之下,卷积层或全连接层的权重在训练后是固定的,如图 8-1 所示。

图 8-1:全连接层(上)和注意力得分(下)模型权重的概念差异
如图 8-1 顶部所示,一旦训练完成,完全连接层的权重将保持固定,无论输入如何。相比之下,正如底部所示,自注意力机制的权重会根据输入的不同而变化,即便变换器已经训练完成。
注意力机制使神经网络能够有选择性地权衡不同输入特征的重要性,从而使模型能够专注于给定任务中最相关的输入部分。这提供了对每个单词或图像标记的上下文理解,从而允许更细致的解读,这是变换器如此高效的原因之一。
通过自监督学习进行预训练
通过在大规模未标记数据集上使用自监督学习进行预训练是变换器成功的另一个关键因素。例如,在预训练过程中,变换器模型会训练去预测句子中缺失的单词或文档中的下一句话。通过学习预测这些缺失的单词或下一句话,模型被迫学习语言的通用表示,这些表示可以针对各种下游任务进行微调。
虽然无监督预训练在自然语言处理任务中非常有效,但其在计算机视觉任务中的有效性仍然是一个活跃的研究领域。(有关自监督学习的更详细讨论,请参见第二章。)
大量的参数
变换器的一个显著特点是其大规模的模型。举例来说,2020 年流行的 GPT-3 模型包含了 1750 亿个可训练参数,而其他变换器,如 switch transformers,拥有万亿级的参数。
变换器的规模和可训练参数数量是其建模性能的关键因素,尤其是对于大规模自然语言处理任务。例如,线性缩放定律表明,随着模型规模的增加,训练损失按比例减少,因此模型规模加倍可以将训练损失减半。
这反过来可以提高下游目标任务的表现。然而,必须同时扩大模型的规模和训练标记的数量。这意味着每当模型规模加倍时,训练标记的数量也应加倍。
由于标注数据有限,因此在无监督预训练过程中利用大量数据至关重要。
总结来说,大规模模型和大规模数据集是变换器(transformers)成功的关键因素。此外,使用自监督学习,预训练变换器的能力与使用大规模模型和大规模数据集密切相关。这种结合对于变换器在广泛的自然语言处理任务中取得成功至关重要。
易于并行化
在大型数据集上训练大型模型需要大量的计算资源,而关键在于计算能够并行化,以便充分利用这些资源。
幸运的是,变换器容易并行化,因为它们接受固定长度的单词或图像标记序列作为输入。例如,大多数变换器架构中使用的自注意力机制涉及计算一对输入元素之间的加权和。此外,这些成对标记的比较可以独立计算,如图 8-2 所示,从而使得自注意力机制能够相对容易地在不同的 GPU 核心之间进行并行化。

图 8-2:没有权重参数的简化自注意力机制
此外,自注意力机制中使用的各个权重矩阵(在图 8-2 中未显示)可以分布在不同的机器上进行分布式和并行计算。
练习
8-1. 如本章所述,自注意力机制易于并行化,但由于自注意力机制的存在,变换器被认为计算开销较大。我们如何解释这一矛盾?
8-2. 由于自注意力分数表示各种输入元素的重要性权重,我们能否将自注意力视为一种特征选择的形式?
参考文献
-
在图像识别中的一个注意力机制示例:Hugo Larochelle 和 Geoffrey Hinton,《学习将中心视野和三阶玻尔兹曼机结合起来》(2010),*
dl.acm.org/doi/10.5555/2997189.2997328*。 -
引入自注意力机制和原始变换器架构的论文:Ashish Vaswani 等人,《Attention Is All You Need》(2017),*
arxiv.org/abs/1706.03762*。 -
变换器可以拥有万亿个参数:William Fedus、Barret Zoph 和 Noam Shazeer,《Switch 变换器:通过简单高效的稀疏性扩展到万亿参数模型》(2021),*
arxiv.org/abs/2101.03961*。 -
线性扩展法则表明,随着模型规模的增加,训练损失会按比例减少:Jared Kaplan 等人,《神经语言模型的扩展法则》(2020),*
arxiv.org/abs/2001.08361*。 -
研究表明,在基于变换器的语言模型中,模型大小每增加一倍,训练标记应该增加一倍:Jordan Hoffmann 等人,《训练计算最优的大型语言模型》(2022),*
arxiv.org/abs/2203.15556*。 -
想了解更多关于自注意力和交叉注意力机制中使用的权重,查看我的博客文章:“从零开始理解和编码大语言模型的自注意力机制”,链接为
sebastianraschka.com/blog/2023/self-attention-from-scratch.html。
第九章:生成式 AI 模型**

深度学习中(也叫生成 AI)流行的生成模型分类有哪些,它们各自的缺点是什么?
许多不同类型的深度生成模型已经应用于生成不同类型的媒体:图像、视频、文本和音频。除了这些媒体类型,模型还可以重新用于生成特定领域的数据,例如有机分子和蛋白质结构。本章将首先定义生成建模,然后概述每种类型的生成模型,并讨论其优缺点。
生成式与判别式建模
在传统的机器学习中,有两种主要的建模方法来描述输入数据(x)与输出标签(y)之间的关系:生成模型和判别模型。生成模型旨在捕捉输入数据的潜在概率分布p(x)或输入与标签之间的联合分布p(x, y)。相比之下,判别模型则侧重于建模给定输入的标签的条件分布p(y|x)。
一个经典的例子,突出展示这些方法之间差异的是比较朴素贝叶斯分类器和逻辑回归分类器。这两种分类器都估计类标签的概率p(y|x),并可以用于分类任务。然而,逻辑回归被视为判别模型,因为它直接建模类标签在给定输入特征下的条件概率分布p(y|x),而不对输入和标签的潜在联合分布做任何假设。另一方面,朴素贝叶斯被视为生成模型,因为它建模输入特征x和输出标签y的联合概率分布p(x, y)。通过学习联合分布,像朴素贝叶斯这样的生成模型捕捉到潜在的数据生成过程,这使得它能够在需要时从该分布中生成新的样本。
深度生成模型的类型
当我们谈论深度生成模型或深度生成 AI 时,我们通常会放宽这个定义,将所有能够生成逼真数据(通常是文本、图像、视频和声音)的模型都包括在内。本章的其余部分将简要讨论用于生成此类数据的不同类型的深度生成模型。
基于能量的模型
基于能量的模型(EBM)是一类生成模型,它学习一个能量函数,为每个数据点分配一个标量值(能量)。较低的能量值对应更可能的数据点。模型的训练目标是最小化真实数据点的能量,同时增加生成数据点的能量。EBM 的例子包括深度玻尔兹曼机(DBM)。作为深度学习的早期突破之一,DBM 提供了一种学习数据复杂表示的方式。你可以将它们看作是一种无监督的预训练形式,从而得到可以针对各种任务进行微调的模型。
与朴素贝叶斯和逻辑回归有些相似,深度玻尔兹曼机(DBM)和多层感知器(MLP)可以被视为生成模型和判别模型的对应物,DBM 侧重于捕捉数据生成过程,而 MLP 侧重于建模类之间的决策边界或将输入映射到输出。
DBM 由多个隐藏节点层组成,如图 9-1 所示。正如图所示,除了隐藏层外,通常还有一个可见层对应于可观察的数据。这个可见层作为输入层,将实际数据或特征输入网络。除了使用与 MLP 不同的学习算法(对比散度代替反向传播),DBM 还由二值节点(神经元)组成,而不是连续节点。

图 9-1:一个四层的深度玻尔兹曼机,包含三堆隐藏节点
假设我们有兴趣生成图像。DBM 可以学习一个简单图像数据集(如 MNIST)中像素值的联合概率分布。为了生成新图像,DBM 会通过执行一种叫做吉布斯采样的过程从这个分布中采样。在这里,DBM 的可见层表示输入图像。为了生成新图像,DBM 首先通过随机值初始化可见层,或者使用现有的图像作为种子。然后,在完成几次吉布斯采样迭代后,最终的可见层状态即为生成的图像。
DBM 作为最早的深度生成模型之一,曾在历史上发挥了重要作用,但现在它们在生成数据方面已不再那么流行。它们训练成本高且更加复杂,并且与接下来几节描述的新模型相比,它们的表达能力较低,这通常导致生成的样本质量较差。
变分自编码器
变分自编码器(VAE)是建立在变分推理和自编码器架构原理基础上的。变分推理是一种通过优化一个更简单、可处理的分布,使其尽可能接近真实分布,从而逼近复杂概率分布的方法。自编码器是无监督神经网络,学习将输入数据压缩成低维表示(编码),并随后通过最小化重建误差从压缩的表示中重建原始数据(解码)。
VAE 模型由两个主要子模块组成:编码器网络和解码器网络。编码器网络例如接收输入图像,并通过学习潜在变量的概率分布将其映射到潜在空间。这个分布通常被建模为一个高斯分布,参数(均值和方差)是输入图像的函数。解码器网络则从学习到的潜在分布中采样,并根据该样本重建输入图像。VAE 的目标是学习一个紧凑且富有表现力的潜在表示,既能捕捉输入数据的基本结构,又能通过从潜在空间采样生成新图像。(有关潜在表示的更多细节,请参见第一章)
图 9-2 展示了自编码器的编码器和解码器子模块,其中x′表示重建的输入x。在标准变分自编码器中,潜在向量是从近似标准高斯分布的分布中采样的。

图 9-2:自编码器
训练 VAE 涉及优化模型的参数,以最小化由两个项组成的损失函数:重建损失和 Kullback–Leibler 散度(KL 散度)正则化项。重建损失确保解码后的样本与输入图像高度相似,而 KL 散度项作为一个代理损失,鼓励学习到的潜在分布接近预定义的先验分布(通常是标准高斯分布)。为了生成新图像,我们从潜在空间的先验(标准高斯)分布中采样点,并将其通过解码器网络,生成新的、具有多样性的图像,这些图像看起来类似于训练数据。
VAE 的缺点包括其复杂的损失函数,由不同的项组成,以及其通常较低的表达能力。后者可能导致生成的图像比其他模型(如生成对抗网络)模糊。
生成对抗网络
生成对抗网络(GANs)是由互相作用的子网络组成的模型,旨在生成与给定输入数据集相似的新数据样本。虽然 GAN 和 VAE 都是通过从学习到的潜在空间进行采样来生成数据的潜变量模型,但它们的架构和学习机制是根本不同的。
GAN(生成对抗网络)由两个神经网络组成,一个生成器和一个判别器,它们以对抗的方式同时进行训练。生成器将来自潜在空间的随机噪声向量作为输入,生成合成数据样本(例如图像)。判别器的任务是区分来自训练数据的真实样本和生成器生成的假样本,如图 9-3 所示。

图 9-3:生成对抗网络
GAN 中的生成器在功能上有点类似于 VAE(变分自编码器)的解码器。在推理过程中,GAN 生成器和 VAE 解码器都会从已知分布(例如标准高斯分布)中抽取随机噪声向量,并将其转化为合成数据样本,如图像。
GAN 的一个显著缺点是由于损失函数和学习过程的对抗性,训练过程不稳定。平衡生成器和判别器的学习率可能会非常困难,往往导致振荡、模式崩塌或不收敛。GAN 的第二个主要缺点是生成的输出缺乏多样性,这通常是由于模式崩塌。此时,生成器能够通过一小部分样本成功欺骗判别器,而这些样本仅代表原始训练数据中的一小部分。
基于流的模型
基于流的模型,也称为归一化流,其核心概念受长期以来统计学方法的启发。其主要目标是通过可逆变换将简单的概率分布(如高斯分布)转化为更复杂的分布。
尽管归一化流的概念在统计学领域已经存在很长时间,但早期基于流的深度学习模型,特别是用于图像生成的模型,还是相对较新的发展。其中一个开创性的模型是非线性独立成分估计(NICE)方法。NICE 从一个简单的概率分布开始,通常是一些简单的分布,如正态分布。你可以将其视为一种“随机噪声”或没有特定形状或结构的数据。然后,NICE 对这个简单的分布应用一系列变换。每个变换的目的是让数据看起来更像最终的目标(例如,真实世界图像的分布)。这些变换是“可逆的”,意味着我们可以始终将其反转回原始的简单分布。经过几次连续的变换,简单的分布已经转变为一个复杂的分布,这个复杂分布与目标数据(如图像)的分布非常接近。我们现在可以通过从这个复杂的分布中随机选择点来生成看起来像目标数据的新数据。
图 9-4 展示了基于流的模型的概念,该模型将复杂的输入分布映射到更简单的分布,然后再映射回来。

图 9-4:基于流的模型
初看起来,这个图示与图 9-2 中的 VAE 图示非常相似。然而,虽然 VAE 使用像卷积神经网络这样的神经网络编码器,基于流的模型使用的是更简单的解耦层,如简单的线性变换。此外,虽然 VAE 中的解码器与编码器是独立的,但基于流的模型中的数据变换函数是数学上可逆的,用来获得输出。
与 VAE 和 GAN 不同,基于流的模型提供精确的似然值,这使我们能够了解生成样本与训练数据分布的拟合程度。例如,这在异常检测或密度估计中可能非常有用。然而,基于流的模型生成图像数据的质量通常低于 GAN。基于流的模型还通常需要比 GAN 或 VAE 更多的内存和计算资源,因为它们必须存储和计算变换的逆。
自回归模型
自回归模型旨在根据当前(和过去)的值预测下一个值。用于文本生成的 LLM(如 ChatGPT,详见第十七章)是这种模型的一个流行例子。
类似于一次生成一个单词,在图像生成的背景下,自回归模型如 PixelCNN 尝试根据已看到的像素预测一个像素,直到完成所有像素的生成。这样的模型可能会按从左上到右下的顺序(光栅扫描顺序)或任何其他定义的顺序预测像素。
为了说明自回归模型如何逐个像素生成图像,假设我们有一个大小为 H × W 的图像(其中 H 是高度,W 是宽度),为了简化起见,忽略颜色通道。该图像由 N 个像素组成,其中 i = 1, . . . , N。在数据集中观察到特定图像的概率为 P(Image) = P(i[1], i[2], . . . , i[N])。根据统计学中的链式法则,我们可以将这个联合概率分解为条件概率:

在这里,P(i[1]) 是第一个像素的概率,P(i[2]|i[1]) 是给定第一个像素的情况下第二个像素的概率,P(i[3]|i[1], i[2]) 是给定第一个和第二个像素的情况下第三个像素的概率,以此类推。
在图像生成的背景下,自回归模型本质上是尝试逐个像素地预测,如前所述,给定它迄今为止所看到的像素。图 9-5 说明了这一过程,其中像素 i[1], . . . , i[53] 代表上下文,像素 i[54] 是下一个要生成的像素。

图 9-5:自回归像素生成
自回归模型的优势在于,下一像素(或单词)的预测相对直接且易于解释。此外,自回归模型可以精确计算数据的似然度,类似于基于流的模型,这对于异常检测等任务非常有用。此外,自回归模型比 GANs 更容易训练,因为它们不会遇到模式崩塌和其他训练不稳定性等问题。
然而,自回归模型在生成新样本时可能较慢。这是因为它们必须逐步生成数据(例如,逐个像素生成图像),这在计算上可能非常昂贵。自回归模型可能还难以捕捉长程依赖性,因为每个输出仅依赖于之前生成的输出。
就整体图像质量而言,自回归模型通常不如 GANs,但它们更容易训练。
扩散模型
如前一节所述,基于流的模型通过应用一系列可逆且可微分的变换(流),将简单分布(如标准正态分布)转化为复杂分布(目标分布)。与基于流的模型类似,扩散模型也应用一系列变换。然而,基础概念是根本不同的。
扩散模型通过使用随机微分方程将输入数据分布转化为简单的噪声分布,这一过程是逐步进行的。扩散是一个随机过程,在这个过程中,噪声逐渐添加到数据中,直到它变得像更简单的分布,比如高斯噪声。为了生成新样本,这个过程被逆转,从噪声开始,并逐渐去除噪声。
图 9-6 概述了向输入图像x中添加和去除高斯噪声的过程。在推理过程中,反向扩散过程被用来生成新的图像x,从一个从高斯分布中采样的噪声张量z[n]开始。

图 9-6:扩散过程
尽管扩散模型和基于流的模型都是旨在学习复杂数据分布的生成模型,但它们从不同的角度解决这个问题。基于流的模型使用确定性的可逆变换,而扩散模型则使用上述的随机扩散过程。
最近的项目已经在生成高质量的图像方面取得了最先进的表现,图像具有逼真的细节和纹理。与生成对抗网络(GANs)相比,扩散模型的训练也更为简单。然而,扩散模型的缺点是,它们从模型中采样时较慢,因为它们需要执行一系列顺序步骤,这与基于流的模型和自回归模型类似。
一致性模型
一致性模型训练一个神经网络,将有噪声的图像映射为干净图像。该网络在一个有噪声和干净图像的配对数据集上进行训练,并学习识别噪声改变后的干净图像中的模式。一旦网络训练完成,它就可以用于从有噪声的图像中在一步内生成重建图像。
一致性模型训练采用常微分方程(ODE)轨迹,即一个有噪声的图像在逐步去噪过程中所遵循的路径。ODE 轨迹由一组微分方程定义,这些方程描述了图像中的噪声如何随时间变化,正如在图 9-7 中所示。

图 9-7:一致性模型在图像去噪中的轨迹
正如图 9-7 所示,我们可以将一致性模型看作是学习从概率流 ODE 中映射任意点的模型,该 ODE 将数据平滑地转化为噪声,再转化回输入。
截至本文写作时,一致性模型是最新的生成性人工智能模型。根据提出此方法的原始论文,一致性模型在图像质量上可与扩散模型相媲美。一致性模型也比扩散模型更快,因为它们不需要迭代过程来生成图像;相反,它们通过单步生成图像。
然而,尽管一致性模型允许更快的推理过程,但它们的训练仍然非常昂贵,因为它们需要大量的有噪声和干净图像的配对数据集。
建议
深度玻尔兹曼机从历史角度来看是很有趣的,因为它们是最早有效展示无监督学习概念的先驱性模型之一。基于流的模型和自回归模型可能在需要精确估计似然时非常有用。然而,在生成高质量图像时,其他模型通常是首选。
特别是,VAEs 和 GANs 多年来一直在竞争生成最佳高保真图像。然而,2022 年,扩散模型几乎完全接管了图像生成。尽管一致性模型是扩散模型的有前景的替代方案,但它是否会被更广泛采用以生成最先进的结果仍有待观察。这里的权衡是,扩散模型的采样通常较慢,因为它涉及一系列必须按顺序运行的去噪步骤,类似于自回归模型。这使得扩散模型在某些需要快速采样的应用中可能不那么实用。
练习
9-1. 我们如何评估生成型 AI 模型所生成图像的质量?
9-2. 根据本章对一致性模型的描述,我们如何使用它们生成新图像?
参考文献
-
提出了变分自编码器的原始论文:Diederik P. Kingma 和 Max Welling,"自编码变分贝叶斯"(2013),*
arxiv.org/abs/1312.6114*。 -
引入生成对抗网络的论文:Ian J. Goodfellow 等人,"生成对抗网络"(2014),*
arxiv.org/abs/1406.2661*。 -
引入 NICE 的论文:Laurent Dinh、David Krueger 和 Yoshua Bengio,"NICE:非线性独立成分估计"(2014),*
arxiv.org/abs/1410.8516*。 -
提出了自回归 PixelCNN 模型的论文:Aaron van den Oord 等人,"使用 PixelCNN 解码器的条件图像生成"(2016),*
arxiv.org/abs/1606.05328*。 -
引入流行的 Stable Diffusion 潜在扩散模型的论文:Robin Rombach 等人,"使用潜在扩散模型进行高分辨率图像合成"(2021),*
arxiv.org/abs/2112.10752*。 -
Stable Diffusion 的代码实现:*
github.com/CompVis/stable-diffusion*。 -
最初提出一致性模型的论文:Yang Song 等人,"一致性模型"(2023),*
arxiv.org/abs/2303.01469*。
第十章:随机性来源

在训练深度神经网络时,哪些常见的随机性来源会导致训练和推理过程中行为不可重复?
在训练或使用机器学习模型,如深度神经网络时,多个随机性来源可能导致每次训练或运行这些模型时结果不同,尽管我们使用的是相同的总体设置。这些效果中有些是偶然的,有些是有意为之。接下来的章节将对这些不同的随机性来源进行分类并讨论。
大多数这些类别的可选实践示例可以在补充/q10-random-sources子文件夹中找到,网址为github.com/rasbt/MachineLearning-QandAI-book。
模型权重初始化
所有常见的深度神经网络框架,包括 TensorFlow 和 PyTorch,默认会随机初始化每一层的权重和偏置单元。这意味着每次开始训练时,最终的模型都会不同。当我们使用不同的随机权重启动训练时,训练出的模型会有所不同,其原因是损失函数的非凸性质,正如图 10-1 所示。图中显示,损失函数会根据初始权重的位置收敛到不同的局部最小值。

图 10-1:不同的初始权重可能导致不同的最终权重。
实际操作中,因此建议至少多次运行训练(如果计算资源允许);不幸的初始权重有时会导致模型无法收敛,或者收敛到一个局部最小值,从而导致较差的预测准确度。
然而,通过给随机生成器设置种子,我们可以使随机权重初始化变得确定性。例如,如果我们将种子设置为特定的值(如 123),权重仍然会以小的随机值初始化。尽管如此,神经网络将始终使用相同的小随机权重初始化,从而确保结果的准确重现。
数据集抽样和洗牌
当我们训练和评估机器学习模型时,通常会首先将数据集划分为训练集和测试集。这需要随机抽样,因为我们必须决定将哪些样本放入训练集,哪些放入测试集。
在实际操作中,我们通常使用模型评估技术,如k-折交叉验证或保留验证。在保留验证中,我们将训练集分成训练、验证和测试数据集,这些也是受随机性影响的抽样过程。类似地,除非使用固定的随机种子,否则每次划分数据集或调整/评估模型时,都会得到不同的模型,因为训练数据划分会有所不同。
非确定性算法
我们可能根据架构和超参数选择包括随机组件和算法。一个常见的例子就是dropout。
Dropout 通过在训练过程中随机将一部分层的单元设置为零,帮助模型学习更加稳健和泛化的表示。这个“丢弃”通常在每次训练迭代中应用,概率为p,它是一个控制丢弃单元比例的超参数。p的典型值范围是 0.2 到 0.8。
为了说明这一概念,图 10-2 展示了一个小型神经网络,在每次训练的前向传播过程中,dropout 随机丢弃一部分隐藏层节点。

图 10-2:在 dropout 中,隐藏节点在每次训练的前向传播中间歇性地被随机禁用。
为了创建可重复的训练过程,我们必须在训练前对使用 dropout 的随机生成器进行初始化(类似于在初始化模型权重之前对随机生成器进行初始化)。在推理过程中,我们需要禁用 dropout 以保证结果的确定性。每个深度学习框架都有一个特定的设置来实现这一目的——一个 PyTorch 示例包含在supplementary/q10-random-sources子文件夹中,地址是github.com/rasbt/MachineLearning-QandAI-book。
不同的运行时算法
算法或方法的最直观或最简单的实现并不总是实践中最好的选择。例如,在训练深度神经网络时,我们常常使用高效的替代方案和近似值,以在训练和推理过程中获得速度和资源优势。
一个常见的例子是卷积神经网络中使用的卷积操作。有几种可能的方式来实现卷积操作:
经典的直接卷积 是通过输入和窗口之间的元素级乘积实现离散卷积的常见方法,接着将结果求和得到一个单一的数值。(关于卷积操作的讨论,请参见第十二章)
基于 FFT 的卷积 使用快速傅里叶变换(FFT)将卷积转换为频域中的元素级乘法。
基于 Winograd 的卷积 是一个高效的算法,适用于小的滤波器尺寸(例如 3×3),可以减少卷积所需的乘法次数。
不同的卷积算法在内存使用、计算复杂度和速度方面有不同的权衡。默认情况下,像 CUDA 深度神经网络库(cuDNN)这样的库,在 PyTorch 和 TensorFlow 中用于在 GPU 上运行深度神经网络时,可以选择不同的算法来执行卷积操作。然而,必须显式启用确定性算法选择。例如,在 PyTorch 中,可以通过设置来实现。
torch.use_deterministic_algorithms(True)
尽管这些近似结果相似,但在训练过程中,细微的数值差异可能会累积,导致训练收敛到稍微不同的局部最小值。
硬件与驱动程序
在不同硬件上训练深度神经网络可能会产生不同的结果,尽管使用的是相同的算法且执行相同的操作,这些差异通常是由于浮点操作中的数值精度不同。然而,即使在相同精度下,硬件和软件的优化也可能导致小的数值差异。
例如,不同的硬件平台可能具有专门的优化或库,这些优化或库可能会稍微改变深度学习算法的行为。为了说明不同的 GPU 可能会产生不同的建模结果,以下是来自 NVIDIA 官方文档的引用:“在不同的架构之间,没有 cuDNN 例程能保证逐位重现性。例如,当比较在 NVIDIA Volta^(TM)和 NVIDIA Turing^(TM) [. . .]以及 NVIDIA Ampere 架构上运行的相同例程时,并不保证逐位重现性。”
随机性与生成式 AI
除了之前提到的各种随机性来源之外,某些模型在推理过程中可能会表现出随机行为,我们可以将其视为“设计上的随机性”。例如,生成式图像和语言模型可能会为相同的提示生成不同的结果,从而产生多样的样本结果。对于图像模型,这通常是为了让用户选择最准确和最具美感的图像。对于语言模型,这通常是为了变化回答,例如,在聊天代理中,避免重复。
生成式图像模型在推理过程中预期的随机性通常是由于在反向过程的每一步采样不同的噪声值。在扩散模型中,噪声调度定义了在每一步扩散过程中添加的噪声方差。
自回归的语言模型(如 GPT)倾向于为相同的输入提示生成不同的输出(GPT 将在第十四章和第十七章中详细讨论)。ChatGPT 用户界面甚至有一个“重新生成回答”按钮来实现这一功能。模型能够生成不同结果的原因在于它们使用的采样策略。像 top-k采样、核采样和温度缩放等技术通过控制随机性程度来影响模型的输出。这是一个特性,而不是一个缺陷,因为它允许生成多样的回答,并防止模型产生过于确定性或重复的输出。(有关生成式 AI 和深度学习模型的更深入概述,请参见第九章;关于自回归语言模型的更多细节,请参见第十七章)。
如图 10-3 所示,Top-k 采样通过在每一步生成下一个词时,从最有可能的前 k 个候选词中进行抽样来工作。

图 10-3: Top-k 采样
给定一个输入提示,语言模型会对下一个词的整个词汇表(候选词)生成一个概率分布。每个词汇表中的词根据模型对上下文的理解被分配一个概率。然后,选出的前 k 个词会重新归一化,使它们的概率总和为 1。最后,从重新归一化后的 top-k 概率分布中抽取一个词,并将其附加到输入提示中。这个过程会重复进行,直到生成文本的长度达到预期,或者满足停止条件。
核采样(也叫做 top-p 采样),如图 10-4 所示,是 top-k 采样的一个替代方法。

图 10-4: 核采样
与 top-k 采样类似,核采样的目标是在输出中平衡多样性和一致性。然而,核采样和 top-k 采样在每一步生成过程中选择候选词的方式上有所不同。Top-k 采样从语言模型生成的概率分布中选择 k 个最有可能的词,而不考虑它们的具体概率值。k 的值在整个生成过程中保持不变。另一方面,核采样是根据一个概率阈值 p 来选择词,如图 10-4 所示。它会按降序累积最有可能的词,直到它们的累积概率达到或超过阈值 p。与 top-k 采样不同,候选集(核)在每一步可能会有所变化。
练习
10-1. 假设我们用 top-k 或核采样训练一个神经网络,其中 k 和 p 是超参数选择。我们是否可以在推理过程中使模型表现得像确定性一样,而不修改代码?
10-2. 在什么情况下,推理过程中的随机 dropout 行为是需要的?
参考文献
-
关于不同的数据采样和模型评估技术,请参见我的文章:“机器学习中的模型评估、模型选择和算法选择”(2018),
arxiv.org/abs/1811.12808。 -
最初提出 dropout 技术的论文:Nitish Srivastava 等人,"Dropout: A Simple Way to Prevent Neural Networks from Overfitting"(2014),
jmlr.org/papers/v15/srivastava14a.html。 -
关于基于 FFT 卷积的详细论文:Lu Chi、Borui Jiang 和 Yadong Mu,“Fast Fourier Convolution”(2020),
dl.acm.org/doi/abs/10.5555/3495724.3496100。 -
基于 Winograd 的卷积详细信息:Syed Asad Alam 等人,《Winograd 卷积在深度神经网络中的应用:高效的点选择》(2022),
arxiv.org/abs/2201.10369。 -
有关 Py-Torch 中确定性算法设置的更多信息:
pytorch.org/docs/stable/generated/torch.use_deterministic_algorithms.html。 -
有关 NVIDIA 显卡的确定性行为的详细信息,请参见 NVIDIA 官方文档中的“可复现性”部分:
docs.nvidia.com/deeplearning/cudnn/developer-guide/index.html#reproducibility。
第二部分:计算机视觉
第十一章:计算参数数量

我们如何计算卷积神经网络中的参数数量,这些信息为什么有用?
了解模型中的参数数量有助于评估模型的大小,这直接影响存储和内存需求。接下来的部分将解释如何计算卷积层和全连接层的参数数量。
如何查找参数数量
假设我们正在处理一个卷积网络,该网络有两个卷积层,分别具有 5 和 3 的卷积核大小。第一个卷积层有 3 个输入通道和 5 个输出通道,第二个卷积层有 5 个输入通道和 12 个输出通道。这些卷积层的步长为 1。此外,网络有两个池化层,一个池化层的卷积核大小为 3,步长为 2,另一个池化层的卷积核大小为 5,步长为 2。它还具有两个全连接隐藏层,每个隐藏层分别有 192 和 128 个隐藏单元,输出层是用于 10 类分类的分类层。该网络的架构如 图 11-1 所示。

图 11-1:具有两个卷积层和两个全连接层的卷积神经网络
这个卷积网络中的可训练参数数量是多少?我们可以从左到右处理这个问题,逐层计算每个层的参数数量,然后将这些数量相加以获得总的参数数量。每一层的可训练参数由权重和偏置单元组成。
卷积层
在卷积层中,权重的数量取决于卷积核的宽度和高度,以及输入和输出通道的数量。偏置单元的数量仅取决于输出通道的数量。为了逐步演示计算,假设我们有一个宽度和高度为 5 的卷积核,一个输入通道和一个输出通道,如 图 11-2 所示。

图 11-2:具有一个输入通道和一个输出通道的卷积层
在这种情况下,我们有 26 个参数,因为我们通过卷积核得到 5 × 5 = 25 个权重,加上偏置单元。计算输出值或像素 z 的公式为 z = b + ∑[j] w[j] x[j],其中 x[j] 代表输入像素,w[j] 代表卷积核的权重参数,b 是偏置单元。
现在,假设我们有三个输入通道,如 图 11-3 所示。

图 11-3:具有三个输入通道和一个输出通道的卷积层
在这种情况下,我们通过对每个输入通道执行上述操作 ∑[j] w[j] x[j] 来计算输出值,然后加上偏置单元。对于三个输入通道,这将涉及三个不同的卷积核,每个卷积核有一组权重:

由于我们有三组权重(w((1))、*w*((2)) 和 w^((3)),对于 j = [1, . . . , 25]),因此在该卷积层中有 3 × 25 + 1 = 76 个参数。
我们为每个输出通道使用一个卷积核,其中每个卷积核是专门针对特定输出通道的。因此,如果我们将输出通道的数量从一个扩展到五个,如图 11-4 所示,参数数量将增加五倍。换句话说,如果一个输出通道的卷积核有 76 个参数,那么需要为五个输出通道准备的五个卷积核将有 5 × 76 = 380 个参数。

图 11-4:具有三个输入通道和五个输出通道的卷积层
回到本节开始时展示的图 11-1 中的神经网络架构,我们基于卷积核的大小以及输入和输出通道的数量来计算卷积层中的参数。例如,第一个卷积层有三个输入通道、五个输出通道和一个大小为 5 的卷积核。因此,它的参数数量为 5 × (5 × 5 × 3) + 5 = 380。第二个卷积层有五个输入通道、12 个输出通道和一个大小为 3 的卷积核,其参数数量为 12 × (3 × 3 × 5) + 12 = 552。由于池化层没有可训练的参数,我们可以将卷积部分的参数数目计算为 380 + 552 = 932。
接下来,让我们看看如何计算全连接层的参数数量。
全连接层
计算全连接层的参数数量相对简单。每个全连接节点将每个输入节点与每个输出节点连接,因此权重的数量是输入数量乘以输出数量,再加上添加到输出的偏置单元。例如,如果我们有一个具有五个输入和三个输出的全连接层,如图 11-5 所示,那么我们有 5 × 3 = 15 个权重和三个偏置单元,也就是总共 18 个参数。

图 11-5:具有五个输入和三个输出的全连接层
再次回到在图 11-1 中展示的神经网络架构,我们现在可以计算全连接层中的参数,如下所示:在第一个全连接层中,192 × 128 + 128 = 24,704,在第二个全连接层(输出层)中,128 × 10 + 10 = 1,290。因此,这个网络全连接部分的总参数为 24,704 + 1,290 = 25,994。将卷积层的 932 个参数与全连接层的 25,994 个参数相加,我们可以得出该网络的总参数数为 26,926。
作为额外的内容,感兴趣的读者可以在github.com/rasbt/MachineLearning-QandAI-book的supplementary/q11-conv-size子文件夹中找到用于程序计算参数数量的 PyTorch 代码。
实际应用
为什么我们关心参数的数量呢?首先,我们可以使用这个数字来估算模型的复杂度。作为经验法则,参数越多,我们就需要更多的训练数据来有效训练模型。
参数的数量还可以让我们估算神经网络的大小,进而帮助我们判断网络是否可以适配到 GPU 内存中。尽管在训练过程中,由于进行矩阵乘法和存储梯度所需的额外内存,内存需求通常会超过模型大小,但模型大小仍然可以帮助我们大致判断在给定硬件配置下训练该模型是否可行。
练习
11-1. 假设我们想使用普通的随机梯度下降(SGD)优化器或流行的 Adam 优化器来优化神经网络。那么,SGD 和 Adam 分别需要存储多少参数?
11-2. 假设我们添加了三个批量归一化(BatchNorm)层:一个在第一个卷积层后,一个在第二个卷积层后,还有一个在第一个全连接层后(通常我们不希望在输出层添加 BatchNorm 层)。这三个 BatchNorm 层将会给模型增加多少额外的参数?
第十二章:完全连接层和卷积层

在什么情况下,我们可以用卷积层替代完全连接层,以执行相同的计算?
用卷积层替代完全连接层,可以在硬件优化方面提供优势,比如利用专门的硬件加速器来加速卷积操作。这对于边缘设备尤其相关。
有两种情况,完全连接层和卷积层是等价的:当卷积滤波器的大小等于感受野的大小时,以及当卷积滤波器的大小为 1 时。为了说明这两种情况,考虑一个具有两个输入和四个输出单元的完全连接层,如图 12-1 所示。

图 12-1:通过八个权重参数连接的四个输入和两个输出
该图中的完全连接层由八个权重和两个偏置单元组成。我们可以通过以下点积计算输出节点:
节点 1 w[1,1] × x[1] + w[1,2] × x[2] + w[1,3] × x[3] + w[1,4] × x[4] + b[1]
节点 2 w[2,1] × x[1] + w[2,2] × x[2] + w[2,3] × x[3] + w[2,4] × x[4] + b[2]
以下两节展示了卷积层可以定义的情况,这些情况能够产生与完全连接层描述的相同的计算。
当卷积核和输入大小相等时
让我们从第一个情况开始,其中卷积滤波器的大小等于感受野的大小。回想一下在第十一章中,我们是如何计算具有一个输入通道和多个输出通道的卷积核中的参数数量的。我们有一个大小为 2×2 的卷积核,一个输入通道和两个输出通道。输入大小也是 2×2,这是图 12-2 中四个输入的重塑版本。

图 12-2:一个 2×2 的卷积层,其卷积核等于输入大小,并具有两个输出通道
如果卷积核的维度等于输入大小,如图 12-2 所示,则卷积层中没有滑动窗口机制。对于第一个输出通道,我们有以下一组权重:

对于第二个输出通道,我们有以下一组权重:

如果输入被组织为

我们计算第一个输出通道为 o[1] = ∑i(W[1] x)[i]* + b[1],其中卷积运算符 * 等于逐元素相乘。换句话说,我们在两个矩阵 W[1] 和 x 之间执行逐元素相乘,然后将这些元素的和作为输出;这等价于完全连接层中的点积。最后,我们加上偏置单元。第二个输出通道的计算方法类似:o[2] = ∑i(W[2] * x)[i] + b[2]。
作为奖励,本书的补充材料包括 PyTorch 代码,展示了这个等效性,并且可以在 github.com/rasbt/MachineLearning-QandAI-book 的 supplementary/q12-fc-cnn-equivalence 子文件夹中找到一个动手实践示例。
当卷积核大小为 1 时
第二种情况假设我们将输入重塑为一个“图像”,其尺寸为 1×1,其中“颜色通道”的数量等于输入特征的数量,如图 12-3 所示。

图 12-3:当卷积核大小等于输入大小时,输出节点的数量等于通道的数量。
每个卷积核由一个与输入通道数相等的权重堆叠组成。例如,对于第一个输出层,权重为

同时,第二个通道的权重为:

为了更好地直观理解这个计算过程,请查阅第十一章中的插图,图中描述了如何计算卷积层中的参数。
建议
尽管完全连接层可以作为等效的卷积层来实现,但在标准计算机上这并不会带来即时的性能或其他优势。然而,将完全连接层替换为卷积层,结合为卷积运算开发的专用硬件加速器,可能会带来优势。
此外,理解完全连接层与卷积层等效的场景有助于理解这些层的机制。它还使我们能够在不使用完全连接层的情况下实现卷积神经网络(如果需要的话),从而简化代码实现。
习题
12-1. 增加步幅会如何影响本章讨论的等效性?
12-2. 填充是否会影响完全连接层与卷积层之间的等效性?
第十三章:视觉变换器的大型训练集

为什么视觉变换器(ViTs)通常需要比卷积神经网络(CNNs)更大的训练集?
每个机器学习算法和模型在其设计中都编码了一组特定的假设或先验知识,通常称为归纳偏差。有些归纳偏差是为了使算法在计算上更可行,其他归纳偏差则基于领域知识,还有一些归纳偏差同时包含两者。
CNNs 和 ViTs 可以用于相同的任务,包括图像分类、目标检测和图像分割。CNNs 主要由卷积层组成,而 ViTs 主要由多头注意力块构成(在第八章中讨论了针对自然语言输入的变换器)。
CNNs 具有更多硬编码的归纳偏差,这些偏差是算法设计的一部分,因此它们通常比 ViTs 需要更少的训练数据。从某种意义上说,ViTs 被赋予了更多的自由度,可以或必须从数据中学习某些归纳偏差(假设这些偏差有助于优化训练目标)。然而,一切需要学习的内容都需要更多的训练样本。
以下章节将解释在 CNNs 中遇到的主要归纳偏差,并说明视觉变换器(ViTs)如何在没有这些偏差的情况下仍能良好工作。
CNN 中的归纳偏差
以下是主要的归纳偏差,它们在很大程度上定义了卷积神经网络(CNNs)的工作方式:
局部连接 在 CNNs 中,每个隐藏层中的单元只与前一层中的一部分神经元相连。我们可以通过假设相邻像素比远距离像素更相关来合理化这一限制。作为一个直观的例子,考虑一下这种假设如何应用于图像中识别边缘或轮廓的场景。
权重共享 通过卷积层,我们在整个图像中使用相同的小组权重(即卷积核或滤波器)。这反映了这样一个假设:相同的滤波器在图像的不同部分用于检测相同的模式。
层次处理 CNNs 由多个卷积层组成,用于从输入图像中提取特征。随着网络从输入层到输出层的推进,低级特征依次结合形成越来越复杂的特征,最终导致对更复杂物体和形状的识别。此外,这些层中的卷积滤波器学习在不同的抽象层次上检测特定的模式和特征。
空间不变性 CNNs 表现出空间不变性的数学特性,这意味着即使输入信号在空间域内被移动到不同位置,模型的输出仍然保持一致。这一特性源于局部连接、权重共享和先前提到的层次结构的结合。
CNN 中的局部连接性、权重共享和层次处理的结合导致了空间不变性,使得模型能够识别图像中无论其位置如何的相同模式或特征。
平移不变性是空间不变性的一个特例,其中输出在输入信号在空间域内发生平移或移位后保持不变。在这种情况下,重点仅在于将对象移动到图像中的不同位置,而不涉及其其他属性的旋转或变化。
实际上,卷积层和网络并不是真正的平移不变;它们实现的是某种程度的平移等变性。那么,平移不变性和平移等变性有什么区别呢?平移不变性意味着输出在输入平移时不会改变,而平移等变性则意味着输出会以相应的方式随着输入的平移而改变。换句话说,如果我们将输入对象向右平移,结果也会相应地向右平移,如图 13-1 所示。

图 13-1:不同图像平移下的等变性
如图 13-1 所示,在平移不变性的情况下,无论我们以何种顺序应用操作(先变换后平移,或先平移后变换),都能得到相同的输出模式。
如前所述,CNN 通过其局部连接性、权重共享和层次处理属性的结合实现了平移等变性。图 13-2 描绘了一个卷积操作,以说明局部连接性和权重共享的先验。这张图展示了 CNN 中平移等变性的概念,其中卷积滤波器捕捉输入信号(两个深色块),无论它位于输入的哪个位置。

图 13-2:卷积滤波器和平移等变性
图 13-2 显示了一个 3×3 的输入图像,该图像由左上角(图像上部分)或右上角(图像下部分)两个非零像素值组成。如果我们对这两种输入图像情况应用一个 2×2 的卷积滤波器,可以看到输出特征图包含相同的提取模式,这个模式分别位于左侧(图像上方)或右侧(图像下方),从而展示了卷积操作的平移等变性。
为了做对比,像多层感知机这样的全连接网络缺乏空间不变性或等变性。为了说明这一点,设想一个具有一个隐藏层的多层感知机。输入图像中的每个像素都与输出中的每个值连接。如果我们将输入图像平移一个或多个像素,将会激活一组不同的权重,如图 13-3 所示。

图 13-3:全连接层中的位置特定权重
和全连接网络一样,ViT 架构(以及一般的 transformer 架构)缺乏空间不变性或等变性的归纳偏置。例如,如果我们将相同的物体放置在图像中的两个不同位置,模型会产生不同的输出。这并不理想,因为物体的语义意义(物体所代表或传达的概念)在其位置变化时应该保持不变。因此,模型必须直接从数据中学习这些不变性。为了便于学习 CNN 中有用的模式,需要在更大的数据集上进行预训练。
在 ViT 中,常见的添加位置信息的变通方法是使用相对位置嵌入(也称为相对位置编码),它考虑输入序列中两个标记之间的相对距离。然而,尽管相对嵌入编码了有助于 transformer 跟踪标记相对位置的信息,transformer 仍然需要从数据中学习空间信息是否以及如何与当前任务相关。
ViT 可以超越 CNN
通过前面章节中讨论的归纳偏置所做的硬编码假设,相较于全连接层,显著减少了 CNN 中的参数数量。另一方面,ViT 通常比 CNN 具有更多的参数,因此需要更多的训练数据。(有关如何精确计算全连接层和卷积层中参数数量的内容,请参考第十一章。)
与流行的 CNN 架构相比,ViT 在没有广泛预训练的情况下可能表现不佳,但在足够大的预训练数据集下,它们的表现可以非常好。与语言 transformer 不同,后者通常使用无监督预训练(如第二章中讨论的自监督学习),视觉 transformer 通常使用像 ImageNet 这样的标签数据集进行预训练,ImageNet 提供了数百万张带标签的图像用于训练,并进行常规的监督学习。
一个 ViTs 超越 CNN 预测性能的例子,可以从 ViT 架构的初步研究中看到,如论文《一张图像值 16x16 个词:用于大规模图像识别的变换器》中所示。该研究比较了卷积网络的一种类型 ResNet 与原始 ViT 设计,在不同数据集规模下进行预训练。研究结果还表明,ViT 模型只有在预训练了至少 1 亿张图像后,才能在预测性能上超越卷积方法。
ViTs 中的归纳偏差
ViTs 也具有一些归纳偏差。例如,视觉变换器将输入图像切分,以便分别处理每个输入补丁。在这里,每个补丁可以关注所有其他补丁,从而使模型学习到输入图像中相距较远的补丁之间的关系,如图 13-4 所示。

图 13-4:视觉变换器如何处理图像补丁
切分补丁的归纳偏差使得 ViTs 能够扩展到更大的图像尺寸,而无需增加模型中的参数数量,这样可以减少计算开销。通过分别处理较小的补丁,ViTs 能够有效捕捉图像区域之间的空间关系,同时从自注意力机制捕捉的全局上下文中获益。
这引出了另一个问题:ViTs 从训练数据中学习到什么,如何学习?ViTs 在所有层中学习到更均匀的特征表示,自注意力机制使得全局信息能够更早地汇聚。此外,ViTs 中的残差连接强烈地将特征从较低层传播到较高层,这与 CNN 的层次结构不同。
ViTs 往往更关注全局而非局部关系,因为它们的自注意力机制使模型能够考虑输入图像不同部分之间的远距离依赖关系。因此,ViTs 中的自注意力层通常被认为是低通滤波器,更关注形状和曲率。
相比之下,CNN 中的卷积层通常被认为是高通滤波器,更注重纹理。然而,请记住,卷积层可以充当高通和低通滤波器,这取决于每层学习到的滤波器。高通滤波器检测图像的边缘、细节和纹理,而低通滤波器则捕捉更多全局的、平滑的特征和形状。CNN 通过应用不同大小的卷积核,并在每一层学习不同的滤波器来实现这一点。
建议
如果有足够的数据进行预训练,ViTs 最近已经开始超越 CNN。然而,这并不意味着 CNN 会被淘汰,因为像流行的 EfficientNetV2 CNN 架构这样的技术更不那么依赖于内存和数据。
此外,最近的 ViT 架构不仅仅依赖于大数据集、参数数量和自注意力。相反,它们从卷积神经网络(CNN)中汲取灵感,增加了软卷积归纳偏置,甚至加入了完整的卷积层,从而获得两者的优势。
简而言之,没有卷积层的视觉变换器架构通常比卷积神经网络具有更少的空间和局部归纳偏置。因此,视觉变换器需要学习与数据相关的概念,例如像素之间的局部关系。因此,视觉变换器需要更多的训练数据才能达到良好的预测性能,并在生成建模场景中产生可接受的视觉表示。
练习
13-1. 请考虑图 13-4 中显示的输入图像的块化。生成的块的大小控制了计算和预测性能之间的权衡。最佳的块大小取决于应用程序以及计算成本和模型性能之间的期望权衡。较小的块通常会导致更高还是更低的计算成本?
13-2. 接着上一问题,较小的块通常会导致更高还是更低的预测准确度?
参考文献
-
提出原始视觉变换器模型的论文:Alexey Dosovitskiy 等人,“一张图片值 16x16 个词:用于大规模图像识别的变换器”(2020),
arxiv.org/abs/2010.11929。 -
添加位置编码信息的一个解决方法是使用相对位置嵌入:Peter Shaw、Jakob Uszkoreit 和 Ashish Vaswani,“带有相对位置表示的自注意力”(2018),
arxiv.org/abs/1803.02155。 -
ViT 中的残差连接强烈地将特征从低层传播到高层,这与 CNN 更加分层的结构形成对比:Maithra Raghu 等人,“视觉变换器是否像卷积神经网络一样看待问题?”(2021),
arxiv.org/abs/2108.08810。 -
详细介绍 EfficientNetV2 CNN 架构的研究文章:Mingxing Tan 和 Quoc V. Le,“EfficientNetV2:更小的模型和更快的训练”(2021),
arxiv.org/abs/2104.00298。 -
一种也包含卷积层的 ViT 架构:Stéphane d’Ascoli 等人,“ConViT:通过软卷积归纳偏置改进视觉变换器”(2021),
arxiv.org/abs/2103.10697。 -
另一种使用卷积层的 ViT 示例:Haiping Wu 等人,“CvT:向视觉变换器引入卷积”(2021),
arxiv.org/abs/2103.15808。
第三部分:自然语言处理
第十四章:分布假设

什么是自然语言处理(NLP)中的分布假设?它在哪里使用,它的适用范围有多广?
分布假设是一种语言学理论,建议在相同语境中出现的单词往往具有相似的含义,这一观点来源于 Zellig S. Harris 的原始著作《Distributional Structure》。简而言之,两个单词的含义越相似,它们出现在相似语境中的频率就越高。
以图 14-1 中的句子为例。cats 和 dogs 经常出现在相似的语境中,我们可以将 cats 替换为 dogs,而不至于使句子听起来别扭。我们也可以将 cats 替换为 hamsters,因为它们都是哺乳动物和宠物,句子仍然听起来合理。然而,如果将 cats 替换为一个不相关的词如 sandwiches,句子就会明显错误,而将 cats 替换为不相关的词 driving 也会使句子语法上不正确。

图 14-1:在给定语境中的常见词和不常见词
使用多义词很容易构造反例,即具有多重含义的词,这些含义相关但不完全相同。例如,考虑单词 bank。作为名词,它可以指代金融机构、"河岸的升高地带"、"山坡的陡峭倾斜" 或 "保护性衬垫边缘"(根据 Merriam-Webster 字典)。它甚至可以作为动词使用:to bank on something 意味着依赖或依靠某事。这些不同的含义有不同的分布特征,并不总是在相似的语境中出现。
尽管如此,分布假设仍然非常有用。像 Word2vec 这样的词嵌入(在第一章中介绍)以及许多大型语言变换模型都依赖于这一思想。这包括 BERT 中的掩码语言模型和 GPT 中用于预训练的下一个词任务。
Word2vec、BERT 和 GPT
Word2vec 方法使用一个简单的、两层的神经网络将单词编码成嵌入向量,使得相似单词的嵌入向量在语义和句法上都接近。训练 Word2vec 模型有两种方式:连续词袋模型(CBOW)和跳字模型(skip-gram)。在使用 CBOW 时,Word2vec 模型通过使用周围的上下文单词来预测当前单词。相反,在跳字模型中,Word2vec 根据一个选定的单词预测上下文单词。虽然跳字模型对不常见单词更有效,但 CBOW 通常训练速度较快。
经过训练后,词嵌入被置于向量空间中,使得在语料库中具有共同上下文的词——即在语义和句法上相似的词——被定位得彼此接近,如图 14-2 所示。相反,不相似的词则被定位得相距较远。

图 14-2:Word2vec 在二维向量空间中的嵌入
BERT 是一种基于 Transformer 架构的 LLM(详见第八章),它采用掩蔽语言模型方法,涉及掩蔽(隐藏)句子中的一些词。它的任务是根据序列中的其他词预测这些被掩蔽的词,如图 14-3 所示。这是一种自监督学习的形式,用于预训练 LLM(有关自监督学习的更多内容,请参见第二章)。预训练模型生成的词嵌入中,相似的词(或标记)在嵌入空间中较为接近。

图 14-3:BERT 的预训练任务涉及预测随机掩蔽的词。
GPT 和 BERT 一样,也是基于 Transformer 架构的 LLM,它作为一个解码器工作。像 GPT 这样的解码器模型学习根据前面的词预测序列中的后续词,如图 14-4 所示。与 BERT 这种编码器模型不同,GPT 更侧重于预测后续内容,而不是同时编码整个序列。

图 14-4:GPT 通过预测下一个词进行预训练。
BERT 是一个双向语言模型,考虑整个输入序列,而 GPT 只严格解析前面的序列元素。这意味着 BERT 通常更适合分类任务,而 GPT 更适合文本生成任务。与 BERT 类似,GPT 生成的高质量上下文化词嵌入能够捕捉语义相似性。
假设是否成立?
对于大型数据集,分布假设或多或少成立,这使得它在理解和建模语言模式、词关系和语义意义方面非常有用。例如,这一概念使得词嵌入和语义分析等技术成为可能,从而促进了自然语言处理任务,如文本分类、情感分析和机器翻译。
总之,尽管在某些反例中分布假设并不成立,但它仍是一个非常有用的概念,构成了现代语言 Transformer 模型的基石。
练习
14-1. 在同音异义词的情况下,分布假设是否成立?比如像there和their这样的词,它们发音相同但含义不同。
14-2. 你能想到另一个类似于分布假设的领域吗?(提示:考虑神经网络的其他输入模式。)
参考文献
-
描述分布假设的原始文献:Zellig S. Harris,“分布结构”(1954),
doi.org/10.1080/00437956.1954.11659520。 -
介绍 Word2vec 模型的论文:Tomas Mikolov 等人,“在向量空间中高效估计词表示”(2013),
arxiv.org/abs/1301.3781。 -
介绍 BERT 模型的论文:Jacob Devlin 等人,“BERT:用于语言理解的深度双向变换器预训练”(2018),
arxiv.org/abs/1810.04805。 -
介绍 GPT 模型的论文:Alec Radford 和 Karthik Narasimhan,“通过生成预训练提高语言理解”(2018),
www.semanticscholar.org/paper/Improving-Language-Understanding-by-Generative-Radford-Narasimhan/cd18800a0fe0b668a1cc19f2ec95b5003d0a5035。 -
BERT 生成的嵌入表示中,相似的词(或符号)在嵌入空间中靠得很近:Nelson F. Liu 等人,“上下文表示的语言知识与可迁移性”(2019),
arxiv.org/abs/1903.08855。 -
证明 GPT 生成高质量上下文化词嵌入,能够捕捉语义相似性的论文:Fabio Petroni 等人,“语言模型作为知识库?”(2019),
arxiv.org/abs/1909.01066。
第十五章:文本数据增强

数据增强如何有用?文本数据最常见的增强技术有哪些?
数据增强有助于通过人工增加数据集的大小来提升模型性能,例如减少过拟合的程度,正如第五章所讨论的那样。这些技术通常也应用于计算机视觉模型,比如旋转、缩放和翻转。
类似地,还有几种增强文本数据的技术。最常见的包括同义词替换、词语删除、词语位置交换、句子洗牌、噪声注入、回译和由大语言模型(LLMs)生成的文本。本章将讨论这些技术,每个技术都有可选的代码示例,存放在补充/q15-text-augment子文件夹中,地址是 github.com/rasbt/MachineLearning-QandAI-book。
同义词替换
在同义词替换中,我们随机选择句子中的词语——通常是名词、动词、形容词和副词——并用同义词替换它们。例如,我们可以从句子“猫迅速跳过懒狗”开始,然后增强句子为:“猫快速跳过懒狗。”
同义词替换可以帮助模型学习不同的单词可能具有相似的意思,从而提高其理解和生成文本的能力。在实际应用中,同义词替换通常依赖于如 WordNet 这样的词库。然而,使用这种技术时需要小心,因为并不是所有的同义词在所有语境下都是可以互换的。大多数自动文本替换工具都提供调整替换频率和相似度阈值的设置。然而,自动同义词替换并不完美,你可能需要应用后处理检查,以过滤掉可能不合适的替换。
词语删除
词语删除是另一种数据增强技术,帮助模型学习。与通过同义词替换单词改变文本的同义词替换不同,词语删除是通过从文本中删除某些词语来创建新的变体,同时尽量保持句子的整体意思。例如,我们可以从句子“猫迅速跳过懒狗”开始,然后删除词语迅速,变成“猫跳过懒狗。”
通过随机删除训练数据中的词语,我们教会模型即使在信息缺失的情况下也能做出准确预测。这可以让模型在遇到现实场景中的不完整或噪声数据时更加鲁棒。而且,通过删除非关键性词语,我们可能教会模型专注于与当前任务最相关的文本关键部分。
然而,我们必须小心,不要删除那些可能显著改变句子意义的关键字。例如,在前面的句子中,如果去掉了cat这个词,“The quickly jumped over the lazy dog”就会变得不太合适。我们还必须谨慎选择删除率,以确保删除某些词后,文本依然能够保持合理性。典型的删除率可能在 10%到 20%之间,但这只是一个大致的指导,具体情况可能会根据特定的使用场景有所不同。
词语位置交换
在词语位置交换,也被称为词语洗牌或排列组合中,句子中的词语位置会被交换或重新排列,以创建新的句子版本。例如,如果我们从“猫快速跳过懒狗”开始,我们可能会交换一些词的位置,得到以下句子:“快速猫跳懒狗过。”
尽管这些句子在英语中可能听起来语法不正确或奇怪,但它们为数据增强提供了宝贵的训练信息,因为模型仍然能够识别重要的词汇以及它们之间的关联。然而,这种方法也有其局限性。例如,过度洗牌词语,或者以某些方式洗牌,可能会极大地改变句子的意义,甚至使其变得完全无意义。此外,词语洗牌可能会干扰模型的学习过程,因为某些词语之间的位置关系在这些语境中可能至关重要。
句子洗牌
在句子洗牌中,段落或文档中的整个句子被重新排列,以创建输入文本的新版本。通过在文档中洗牌句子,我们让模型接触到同一内容的不同排列方式,帮助它学习识别主题元素和关键概念,而不是仅仅依赖于特定的句子顺序。这促进了对文档整体主题或类别的更全面理解。因此,这种技术特别适用于处理文档级分析或段落级理解的任务,如文档分类、主题建模或文本摘要。
与前述的基于词语的方法(如词语位置交换、词语删除和同义词替换)不同,句子洗牌保持了单个句子的内部结构。这避免了通过改变词语选择或顺序而导致句子语法错误或完全改变意义的问题。
句子重排对于那些句子顺序对整体意思不重要的文本来说很有用。不过,如果句子之间有逻辑或时间上的联系,它可能会不太适用。例如,考虑以下段落:“我去了超市。然后我买了做披萨的材料。之后,我做了些美味的披萨。”将这些句子重新排列为:“之后,我做了些美味的披萨。然后我买了做披萨的材料。我去了超市。”这种重排打乱了叙事的逻辑和时间顺序。
噪声注入
噪声注入是一个总括性术语,用来描述通过各种方式改变文本并创造文本变异的技术。它既可以指前面提到的方法,也可以指诸如插入随机字母、字符或拼写错误等基于字符层面的技术,以下示例便展示了这一点:
随机字符插入 “猫快速跳过懒狗。”(在单词quickly中插入了一个z。)
随机字符删除 “猫 quickl 跳过懒狗。”(从quickly中删除了y。)
拼写错误引入 “猫 qickuly 跳过懒狗。”(在quickly中引入了拼写错误,将其改为qickuly。)
这些修改对涉及拼写检查和文本修正的任务非常有帮助,但它们也有助于使模型在面对不完美输入时更加稳健。
反向翻译
反向翻译是创造文本变异最常用的技术之一。在这个方法中,句子首先从原始语言翻译成一种或多种不同的语言,然后再翻译回原始语言。往返翻译通常会产生与原句语义相似但结构、词汇或语法上有轻微差异的句子。这种方式可以生成额外的多样化示例用于训练,而不改变整体意义。
举个例子,假设我们将“猫快速跳过懒狗”翻译成德语。我们可能会得到“Die Katze sprang schnell über den faulen Hund。”然后,我们可以将这个德语句子翻译回英文,得到“猫跳过懒狗快速。”
通过反向翻译,一个句子变化的程度取决于所使用的语言以及机器翻译模型的具体情况。在这个例子中,句子的变化非常小。然而,在其他情况下或使用其他语言时,你可能会看到词语或句子结构发生更显著的变化,但整体意义保持不变。
这种方法需要访问可靠的机器翻译模型或服务,并且必须小心确保反向翻译后的句子保留原句的核心含义。
合成数据
合成数据生成是一个总括性术语,描述了用于创建模仿或复制真实世界数据结构的人工数据的方法和技术。本章讨论的所有方法都可以视为合成数据生成技术,因为它们通过对现有数据进行小的修改来生成新数据,从而在创建新事物的同时保持整体意义。
现代生成合成数据的技术现在还包括使用解码器风格的 LLM,例如 GPT(解码器风格的 LLM 将在第十七章中详细讨论)。我们可以通过使用“完成句子”或“生成示例句子”提示等方式,利用这些模型从头生成新数据。我们还可以将 LLM 用作反向翻译的替代方法,提示它们重写句子,如图 15-1 所示。

图 15-1:使用 LLM 重写句子
请注意,LLM(如图 15-1 所示)默认以非确定性模式运行,这意味着我们可以多次提示它,以获得多种重写的句子。
建议
本章讨论的数据增强技术通常用于文本分类、情感分析和其他 NLP 任务,这些任务中可用的标注数据量可能有限。
LLM 通常在如此庞大和多样化的数据集上进行预训练,以至于它们可能不像在其他更具体的 NLP 任务中那样广泛依赖这些增强技术。这是因为 LLM 的目标是捕捉语言的统计特性,而它们所训练的数据量通常提供了足够的上下文和表达方式的多样性。然而,在 LLM 的微调阶段,其中一个预训练模型被调整到一个特定任务,并使用较小的任务特定数据集时,数据增强技术可能会变得更加相关,特别是当任务特定的标注数据集较小时。
练习
15-1. 使用文本数据增强能否帮助解决隐私问题?
15-2. 在哪些情况下数据增强可能对特定任务没有帮助?
参考文献
- WordNet 词库:George A. Miller,“WordNet: A Lexical Database for English”(1995),*
dl.acm.org/doi/10.1145/219717.219748*。
第十六章:自注意力**

自注意力的名称来源于哪里,它与以前开发的注意力机制有何不同?
自注意力使神经网络能够在关注某个特定部分时,参考输入的其他部分,本质上允许每个部分能够“关注”整个输入。为循环神经网络(RNN)开发的原始注意力机制应用于两个不同的序列之间:编码器和解码器嵌入。由于在基于变换器的大型语言模型中使用的注意力机制旨在作用于同一集合的所有元素,因此它被称为自注意力。
本章首先讨论为 RNN 开发的早期注意力机制——Bahdanau 机制,目的是阐明开发注意力机制的动机。然后,我们将 Bahdanau 机制与今天在变换器架构中流行的自注意力机制进行比较。
RNN 中的注意力
一个用于处理长序列的 RNN 注意力机制的例子是Bahdanau 注意力。Bahdanau 注意力是为了使机器学习模型,特别是用于翻译语言的模型,更好地理解长句子而开发的。在这种注意力机制之前,整个输入(例如英语句子)会被压缩成一块信息,重要细节可能会丢失,尤其是当句子很长时。
为了理解常规注意力与自注意力的区别,我们先通过图 16-1 来说明 Bahdanau 注意力机制。

图 16-1:Bahdanau 机制使用单独的 RNN 来计算注意力权重。
在图 16-1 中,α值表示第二个序列元素与序列中从 1 到T的每个其他元素的注意力权重。此外,这种原始的注意力机制涉及两个 RNN。底部的 RNN 计算注意力权重,代表编码器,而顶部的 RNN 生成输出序列,是解码器。
简而言之,原始的 RNN 注意力机制应用于两个不同的序列之间:编码器和解码器嵌入。对于每个生成的输出序列元素,顶部的解码器 RNN 基于隐藏状态和编码器生成的上下文向量。这个上下文向量涉及输入序列的所有元素,并且是所有输入元素的加权和,其中注意力得分(α)代表加权系数。这使得解码器在每一步都能访问到所有输入序列元素(上下文)。关键思想是,注意力权重(和上下文)可能会在每一步动态变化。
这种复杂的编码器-解码器设计背后的动机是我们不能逐词翻译句子。这会导致语法错误的输出,正如图 16-2 中的 RNN 架构(a)所示。

图 16-2:两种 RNN 架构设计用于文本翻译
图 16-2 展示了两种不同的序列到序列 RNN 设计用于句子翻译。图 16-2(a)表示一个常规的序列到序列 RNN,可以逐词地将德语句子翻译成英语。图 16-2(b)描绘了一个编码器-解码器 RNN,它首先读取整个句子,然后再进行翻译。
RNN 结构(a)最适合用于时间序列任务,我们需要一次做出一个预测,例如逐日预测某个股票价格。对于像语言翻译这样的任务,我们通常选择编码器-解码器 RNN,如图 16-2 中的结构(b)。在这里,RNN 编码输入句子,将其存储在中间的隐藏表示中,并生成输出句子。然而,这会产生一个瓶颈,RNN 必须通过一个单一的隐藏状态记住整个输入句子,这对于较长的序列并不有效。
架构(b)中展示的瓶颈促使了 Bahdanau 注意力机制的最初设计,使解码器可以在每个时间步骤访问输入句子中的所有元素。注意力分数还会根据解码器生成的当前词,给不同的输入元素赋予不同的权重。例如,在生成输出序列中的词help时,德语输入句子中的词helfen可能会得到较大的注意力权重,因为在这个上下文中它是高度相关的。
自注意力机制
Bahdanau 注意力机制依赖于一种稍显复杂的编码器-解码器设计,用于建模序列到序列语言建模任务中的长期依赖关系。大约在 Bahdanau 机制推出三年后,研究人员开始简化序列到序列建模架构,提出了是否还需要 RNN 主干才能实现良好的语言翻译性能的问题。这导致了最初的 Transformer 架构和自注意力机制的设计。
在自注意力中,注意力机制应用于同一序列中的所有元素之间(而不是涉及两个序列),正如图 16-3 中简化的注意力机制所示。类似于 RNN 的注意力机制,上下文向量是输入序列元素的注意力加权和。

图 16-3:一个简单的自注意力机制,没有权重矩阵
虽然 图 16-3 中没有包含权重矩阵,但变换器中使用的自注意力机制通常涉及多个权重矩阵来计算注意力权重。
本章为理解变换器模型及其注意力机制的内部工作原理奠定了基础。下一章将更详细地介绍不同类型的变换器架构。
练习
16-1. 考虑到自注意力机制将每个序列元素与自身进行比较,那么自注意力的时间和内存复杂度是什么?
16-2. 我们在自然语言处理的背景下讨论了自注意力机制。这个机制是否也能在计算机视觉应用中发挥作用?
参考文献
-
介绍原始自注意力机制的论文,也被称为 缩放点积 注意力:Ashish Vaswani 等人,“Attention Is All You Need” (2017),
arxiv.org/abs/1706.03762。 -
Bahdanau 注意力机制用于 RNN:Dzmitry Bahdanau、Kyunghyun Cho 和 Yoshua Bengio, “Neural Machine Translation by Jointly Learning to Align and Translate” (2014),
arxiv.org/abs/1409.0473。 -
想了解更多关于参数化自注意力机制的内容,请查看我的博客文章:“从零开始理解和编写大型语言模型的自注意力机制”,*
sebastianraschka.com/blog/2023/self-attention-from-scratch.html*。
第十七章:编码器和解码器型 Transformer**

编码器和解码器型语言 Transformer 之间有什么区别?
编码器和解码器型架构都使用相同的自注意力层来编码单词标记。主要区别在于,编码器旨在学习可用于各种预测建模任务(例如分类)的嵌入。相比之下,解码器旨在生成新文本,例如回答用户查询。
本章首先描述了由编码器和解码器组成的原始 Transformer 架构,编码器处理输入文本,解码器生成翻译。接下来的部分描述了像 BERT 和 RoBERTa 这样的模型如何仅使用编码器来理解上下文,以及 GPT 架构如何强调仅使用解码器机制进行文本生成。
原始 Transformer
在第十六章中介绍的原始 Transformer 架构是为英语到法语和英语到德语的语言翻译而开发的。它利用了编码器和解码器,如图 17-1 所示。

图 17-1:原始的 Transformer 架构
在图 17-1 中,输入文本(即需要翻译的文本句子)首先被分词为单个单词标记,然后通过嵌入层进行编码,之后进入编码器部分(有关嵌入的更多信息,请参见第一章)。在每个嵌入的单词上加上位置编码向量后,嵌入经过多头自注意力层。此层后面是一个加法步骤,如图 17-1 中所示,通过跳跃连接(也称为残差或快捷连接)执行层归一化并添加原始嵌入。接下来是一个 LayerNorm 模块,简称层归一化,它对前一层的激活进行归一化,以提高神经网络训练的稳定性。原始嵌入的加法和层归一化步骤通常被总结为加法与归一化步骤。最后,在进入全连接网络之后——一个由两个全连接层和一个非线性激活函数组成的小型多层感知机——输出再次被加法和归一化,然后传递到解码器的多头自注意力层。
图 17-1 中的解码器与编码器的总体结构相似。关键区别在于输入和输出的不同:编码器接收待翻译的输入文本,而解码器生成翻译后的文本。
编码器
原始变换器中的编码器部分,如图 17-1 所示,负责理解和提取输入文本中的相关信息。然后,它输出输入文本的连续表示(嵌入),该表示被传递给解码器。最后,解码器基于从编码器接收到的连续表示生成翻译后的文本(目标语言)。
多年来,基于原始变换器模型的编码器模块,已开发出多种仅编码器架构。其中一个显著的例子是 BERT,它代表了来自变换器的双向编码器表示。
如第十四章所述,BERT 是基于变换器编码器模块的仅编码器架构。BERT 模型通过掩蔽语言建模和下一句预测任务在大型文本语料库上进行预训练。图 17-2 展示了 BERT 风格变换器中使用的掩蔽语言建模预训练目标。

图 17-2:BERT 在预训练过程中随机掩蔽 15%的输入标记。
如图 17-2 所示,掩蔽语言建模的主要思路是掩蔽(或替换)输入序列中的随机单词标记,然后训练模型根据周围的上下文预测原始被掩蔽的标记。
除了在图 17-2 中展示的掩蔽语言建模预训练任务外,下一句预测任务要求模型预测原文中两个随机打乱句子的顺序是否正确。例如,假设两个句子以随机顺序排列,并且它们之间由[SEP]标记分隔(SEP是separate的缩写)。方括号是该标记的符号的一部分,用于明确表示这是一个特殊标记,而不是文本中的普通单词。BERT 风格的变换器还使用[CLS]标记。[CLS]标记充当模型的占位符,提示模型返回True或False标签,表示句子顺序是否正确:
-
“[CLS] 吐司是一种简单而美味的食物。[SEP] 它通常与黄油、果酱或蜂蜜一起食用。”
-
“[CLS] 它通常与黄油、果酱或蜂蜜一起食用。[SEP] 吐司是一种简单而美味的食物。”
掩蔽语言和下一句预训练目标使 BERT 能够学习输入文本的丰富上下文表示,这些表示可以进一步微调以用于各种下游任务,如情感分析、问答和命名实体识别。值得注意的是,这种预训练是一种自监督学习(有关此类学习的更多细节,请参见第二章)。
RoBERTa(即稳健优化的 BERT 方法)是 BERT 的改进版。它保持与 BERT 相同的总体架构,但采用了若干训练和优化改进措施,如更大的批量大小、更多的训练数据,并去除了下一句预测任务。这些变化使得 RoBERTa 在各种自然语言理解任务中超过了 BERT,取得了更好的表现。
解码器
回到图 17-1 中概述的原始 Transformer 架构,解码器中的多头自注意力机制与编码器中的类似,但它被掩蔽,以防止模型关注未来的位置,从而确保对位置 i 的预测只能依赖于位置小于 i 的已知输出。正如图 17-3 所示,解码器逐字生成输出词。

图 17-3:原始 Transformer 中使用的下一句预测任务
这种掩蔽(在图 17-3 中明确显示,尽管它在解码器的多头自注意力机制中是内部发生的)对于在训练和推理过程中保持 Transformer 模型的自回归特性至关重要。这个自回归特性确保模型一次生成一个输出标记,并将之前生成的标记作为上下文来生成下一个单词标记。
多年来,研究人员在原始的编码器-解码器 Transformer 架构的基础上,发展了几种仅包含解码器的模型,这些模型在各种自然语言处理任务中已被证明非常有效。最著名的模型包括 GPT 系列,我们在第十四章以及书中其他章节中简要讨论过这些模型。
GPT 代表 生成式预训练变换器。GPT 系列由仅包含解码器的模型组成,这些模型在大规模无监督文本数据上进行预训练,并针对特定任务(如文本分类、情感分析、问答和摘要)进行微调。GPT 模型,包括撰写时的 GPT-2、GPT-3 和 GPT-4,在各种基准测试中表现出色,目前是自然语言处理领域最流行的架构。
GPT 模型最显著的特点之一是其涌现特性。涌现特性是指模型由于下一词预测的预训练而发展出的能力和技能。尽管这些模型只被训练预测下一个词,经过预训练的模型却能够进行文本摘要、翻译、问答、分类等任务。此外,这些模型可以通过上下文学习在不更新模型参数的情况下执行新的任务,我们将在第十八章中更详细地讨论这一点。
编码器-解码器混合体
除了传统的编码器和解码器架构外,新的编码器-解码器模型的开发也取得了进展,这些模型结合了两个组件的优势。这些模型通常采用新颖的技术、预训练目标或架构修改,以提升其在各种自然语言处理任务中的表现。一些值得注意的新型编码器-解码器模型包括 BART 和 T5。
编码器-解码器模型通常用于涉及理解输入序列和生成输出序列的自然语言处理任务,这些任务的输出序列往往具有不同的长度和结构。这些模型特别适用于输入与输出序列之间存在复杂映射关系的任务,尤其是在需要捕捉两个序列中元素之间关系的情况下。编码器-解码器模型的常见应用场景包括文本翻译和摘要生成。
术语
所有这些方法——仅编码器、仅解码器和编码器-解码器模型——都是序列到序列模型(通常缩写为seq2seq)。虽然我们称 BERT 风格的方法为“仅编码器”,但这一描述可能会误导,因为这些方法在预训练过程中也会将嵌入解码为输出令牌或文本。换句话说,编码器-解码器架构和仅解码器架构都进行解码。
然而,与仅解码器和编码器-解码器架构不同,编码器-仅架构并不以自回归的方式进行解码。自回归解码指的是一次生成一个输出令牌,并根据先前生成的令牌来调整每个令牌的生成。仅编码器模型并不像这样生成连贯的输出序列。相反,它们专注于理解输入文本并产生任务特定的输出,如标签或令牌预测。
现代 Transformer 模型
简而言之,编码器风格的模型通常用于学习用于分类任务的嵌入,编码器-解码器模型用于生成性任务,其中输出严重依赖输入(例如翻译和摘要生成),而仅解码器模型则用于其他类型的生成性任务,包括问答。自从第一个 Transformer 架构问世以来,已经开发出了数百种编码器-解码器、仅编码器、仅解码器混合型模型,如图 17-4 所示。

图 17-4:按架构类型和开发者分类的一些最受欢迎的大型语言 Transformer 模型
虽然仅编码器模型逐渐变得不那么流行,但像 GPT 这样的仅解码器模型却因通过 GPT-3、ChatGPT 和 GPT-4 在文本生成方面的突破而大爆发。然而,仅编码器模型在训练基于文本嵌入的预测模型时仍然非常有用,而不是用于文本生成。
练习
17-1. 如本章所述,BERT 风格的编码器模型通过掩蔽语言模型和下一句预测预训练目标进行预训练。我们如何将这样一个预训练模型应用于分类任务(例如,预测文本是正面还是负面情感)?
17-2. 我们能否对仅解码器模型,如 GPT,进行微调以用于分类?
参考文献
-
Bahdanau 注意力机制用于 RNN:Dzmitry Bahdanau、Kyunghyun Cho 和 Yoshua Bengio,“通过联合学习对齐和翻译的神经机器翻译”(2014 年),
arxiv.org/abs/1409.0473。 -
最初的 BERT 论文,它通过掩蔽词和下一句预测预训练目标推广了编码器风格的变换器:Jacob Devlin 等,“BERT:用于语言理解的深度双向变换器预训练”(2018 年),
arxiv.org/abs/1810.04805。 -
RoBERTa 通过优化训练程序、使用更大的训练数据集并移除下一句预测任务对 BERT 进行了改进:Yinhan Liu 等,“RoBERTa:一种强健优化的 BERT 预训练方法”(2019 年),
arxiv.org/abs/1907.11692。 -
BART 编码器-解码器架构:Mike Lewis 等,“BART:用于自然语言生成、翻译和理解的去噪序列到序列预训练”(2018 年),
arxiv.org/abs/1910.13461。 -
T5 编码器-解码器架构:Colin Raffel 等,“通过统一的文本到文本变换器探索迁移学习的极限”(2019 年),
arxiv.org/abs/1910.10683。 -
提出首个 GPT 架构的论文:Alec Radford 等,“通过生成预训练提高语言理解”(2018 年),
cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdf。 -
GPT-2 模型:Alec Radford 等,“语言模型是无监督多任务学习者”(2019 年),
www.semanticscholar.org/paper/Language-Models-are-Unsupervised-Multitask-Learners-Radford-Wu/9405cc0d6169988371b2755e573cc28650d14dfe。 -
GPT-3 模型:Tom B. Brown 等,“语言模型是少量示例学习者”(2020 年),
arxiv.org/abs/2005.14165。
第十八章:使用和微调预训练变换器**

使用和微调预训练的大型语言模型有哪些不同的方法?
使用和微调预训练大型语言模型(LLMs)的三种最常见方法包括基于特征的方法、上下文提示和更新模型参数的子集。首先,大多数预训练的 LLMs 或语言变换器可以在不需要进一步微调的情况下使用。例如,我们可以使用基于特征的方法,通过预训练变换器生成的嵌入来训练一个新的下游模型,如线性分类器。第二,我们可以在输入本身展示一个新任务的示例,这意味着我们可以直接展示预期的结果,而无需模型进行任何更新或学习。这一概念也被称为提示。最后,我们也可以微调所有或仅少量的参数,以达到预期的结果。
以下部分将更深入地讨论这些方法。
使用变换器进行分类任务
让我们从利用预训练变换器的传统方法开始:在特征嵌入上训练另一个模型、微调输出层和微调所有层。我们将在分类的背景下讨论这些方法。(稍后我们将在“上下文学习、索引和提示微调”部分的第 116 页中重新讨论提示。)
在基于特征的方法中,我们加载预训练模型并保持其“冻结”,这意味着我们不更新预训练模型的任何参数。相反,我们将模型视为一个特征提取器,应用到我们的新数据集上。然后,我们在这些嵌入上训练一个下游模型。这个下游模型可以是我们喜欢的任何模型(如随机森林、XGBoost 等),但线性分类器通常表现最佳。这可能是因为像 BERT 和 GPT 这样的预训练变换器已经从输入数据中提取了高质量、有用的特征。这些特征嵌入通常能够捕捉复杂的关系和模式,使得线性分类器能够有效地将数据分成不同的类别。此外,线性分类器,如逻辑回归机和支持向量机,通常具有较强的正则化特性。这些正则化特性有助于防止在使用由预训练变换器生成的高维特征空间时出现过拟合。这种基于特征的方法是最有效的,因为它完全不需要更新变换器模型。最后,嵌入可以为给定的训练数据集预先计算(因为它们不会改变),在多个训练周期中训练分类器时非常有用。
图 18-1 展示了 LLM 通常如何通过微调创建并应用于下游任务。在这里,一个预训练的模型,在一个通用文本语料库上进行训练,被微调用于执行像德语到英语翻译这样的任务。

图 18-1:大型语言模型的通用微调工作流程
对预训练 LLM 进行微调的传统方法包括仅更新输出层,我们将其称为 微调 I,以及更新所有层的方法,我们将其称为 微调 II。
微调 I 类似于前面描述的基于特征的方法,但它在 LLM 本身上添加了一个或多个输出层。LLM 的骨干部分保持冻结,我们仅更新这些新层中的模型参数。由于我们不需要对整个网络进行反向传播,因此该方法在吞吐量和内存需求方面相对高效。
在微调 II 中,我们加载模型并添加一个或多个输出层,类似于微调 I。然而,与仅通过最后一层反向传播不同,我们通过反向传播更新 所有 层,这使得这种方法成为最昂贵的方式。虽然这种方法在计算上比基于特征的方法和微调 I 更昂贵,但它通常能带来更好的建模或预测性能。对于更为专业化的领域特定数据集尤其如此。
图 18-2 总结了本节迄今为止描述的三种方法。

图 18-2:利用预训练大型语言模型(LLMs)的三种传统方法
除了本节描述的三种微调方法的概念总结外,图 18-2 还提供了这些方法在训练效率方面的经验法则。由于微调 II 涉及更新比微调 I 更多的层和参数,因此反向传播对于微调 II 的成本更高。出于类似的原因,微调 II 比更简单的基于特征的方法成本更高。
上下文学习、索引和提示调优
像 GPT-2 和 GPT-3 这样的 LLM 推广了 上下文学习 的概念,在这个背景下,它通常被称为 零-shot 或 few-shot learning,这在图 18-3 中得到了说明。

图 18-3:为上下文学习提示 LLM
如图 18-3 所示,上下文学习旨在通过输入或提示提供任务的上下文或示例,从而使模型能够推断所需的行为并生成适当的响应。这种方法利用了模型在预训练期间从大量数据中学习的能力,这些数据包括各种任务和上下文。
注意
少样本学习的定义,与基于上下文学习的方法同义,区别于第三章中讨论的传统少样本学习方法。
例如,假设我们希望使用上下文学习进行少样本的德英翻译,使用像 GPT-3 这样的规模较大的预训练语言模型。为此,我们提供几个德英翻译的示例,以帮助模型理解所需任务,如下所示:
Translate the following German sentences into English:
Example 1:
German: "Ich liebe Pfannkuchen."
English: "I love pancakes."
Example 2:
German: "Das Wetter ist heute schoen."
English: "The weather is nice today."
Translate this sentence:
German: "Wo ist die naechste Bushaltestelle?"
通常,在上下文学习在某些任务或特定数据集上表现不如微调,因为它依赖于预训练模型从训练数据中泛化的能力,而不进一步调整模型的参数以适应当前任务。
然而,上下文学习也有其优势。当用于微调的标注数据有限或不可用时,它尤其有用。它还可以在没有微调模型参数的情况下快速实验不同的任务,特别是在我们无法直接访问模型,或者只通过用户界面(UI)或 API 与模型交互的情况下(例如,ChatGPT)。
与上下文学习相关的概念是硬提示调优,其中硬指的是输入标记的不可微分特性。与之前描述的微调方法通过更新模型参数来更好地执行任务不同,硬提示调优旨在优化提示本身以达到更好的性能。提示调优并不修改模型的参数,但它可能涉及使用较小的标注数据集来识别针对特定任务的最佳提示词形式。例如,为了改善之前的德英翻译任务的提示,我们可能会尝试以下三种提示变体:
-
"将德语句子'{german_sentence}'翻译成英语:{english_translation}" -
"德语:'{german_sentence}' | 英语:{english_translation}" -
"从德语到英语:'{german_sentence}' -> {english_translation}"
提示词调优是一种资源高效的替代方法,代替了参数微调。然而,提示词调优的性能通常不如完全模型微调,因为它并未更新模型的参数来针对特定任务进行调整,这可能会限制其适应任务特定细微差异的能力。此外,提示词调优可能需要大量人工干预,因为它需要人工对比不同提示词的质量,或使用类似的方法来完成这一任务。这通常被称为硬提示,因为输入的标记不可微分。除此之外,还有其他方法提议使用另一个大型语言模型(LLM)来自动生成和评估提示词。
另一种利用纯粹基于上下文学习的方法是索引,如图 18-4 所示。

图 18-4:LLM 索引用于从外部文档中检索信息
在大规模语言模型(LLMs)的上下文中,我们可以将索引视为一种基于上下文学习的解决方案,它允许我们将 LLM 转化为信息检索系统,从外部资源和网站中提取信息。在图 18-4 中,索引模块将文档或网站解析为更小的块,并将其嵌入到可以存储在向量数据库中的向量中。当用户提交查询时,索引模块计算嵌入查询与数据库中每个向量之间的向量相似度。最后,索引模块检索最相似的前k个嵌入,以合成响应。
参数高效微调
近年来,已经开发出许多方法,以更高效地将预训练的变换器适配到新的目标任务。这些方法通常被称为参数高效微调,在撰写本文时,最流行的方法总结在图 18-5 中。

图 18-5:参数高效微调技术的主要类别及其流行示例
与前一节讨论的硬提示方法不同,软提示策略优化了提示的嵌入版本。在硬提示调优中,我们修改的是离散输入标记,而在软提示调优中,我们则使用可训练的参数张量。
软提示调优的思想是在嵌入查询标记之前添加一个可训练的参数张量(即“软提示”)。然后,该添加的张量通过梯度下降优化,以提高在目标数据集上的建模性能。在类似 Python 的伪代码中,软提示调优可以描述为:
x = EmbeddingLayer(input_ids)
x = concatenate([soft_prompt_tensor, x],
dim=seq_len)
output = model(x)
其中,soft_prompt_tensor与嵌入层产生的嵌入输入具有相同的特征维度。因此,修改后的输入矩阵具有额外的行(就像是用额外的标记扩展了原始输入序列,使其更长)。
另一种流行的提示调优方法是前缀调优。前缀调优与软提示调优类似,不同之处在于,在前缀调优中,我们将可训练的张量(软提示)添加到每个变换器块之前,而不仅仅是嵌入输入,这可以稳定训练过程。前缀调优的实现通过以下伪代码进行说明:
def transformer_block_with_prefix(x):
➊ soft_prompt = FullyConnectedLayers(# Prefix
soft_prompt) # Prefix
➋ x = concatenate([soft_prompt, x], # Prefix
dim=seq_len) # Prefix
➌ residual = x
x = SelfAttention(x)
x = LayerNorm(x + residual)
residual = x
x = FullyConnectedLayers(x)
x = LayerNorm(x + residual)
return x
列表 18-1:用于前缀调优的变换器块修改版
让我们将列表 18-1 分为三个主要部分:实现软提示,将软提示(前缀)与输入连接,以及实现其余的变换器块。
首先,soft_prompt,一个张量,通过一组全连接层 ➊ 进行处理。其次,转换后的软提示与主输入 x ➋ 拼接。它们拼接的维度由 seq_len 表示,指的是序列长度维度。第三,后续的代码行 ➌ 描述了变换器块中的标准操作,包括自注意力、层归一化和前馈神经网络层,这些都包裹在残差连接中。
如代码示例 18-1 所示,前缀调优通过添加一个可训练的软提示来修改变换器块。图 18-6 进一步说明了常规变换器块和前缀调优变换器块之间的区别。

图 18-6:常规变换器与前缀调优的比较
软提示调优和前缀调优都被认为是参数高效的,因为它们只需要训练添加的参数张量,而不是大语言模型本身的参数。
适配器方法 与前缀调优相关,因为它们在变换器层中添加了额外的参数。在原始适配器方法中,在每个变换器块的多头自注意力和现有全连接层之后添加了额外的全连接层,如图 18-7 所示。

图 18-7:常规变换器块(左)与带适配器层的变换器块比较
使用原始适配器方法训练大语言模型时,仅更新新的适配器层,而其余变换器层保持冻结。由于适配器层通常较小——适配器块中的第一个全连接层将其输入投影到低维表示中,而第二层则将其投影回原始输入维度——这种适配器方法通常被认为是参数高效的。
在伪代码中,原始适配器方法可以写作如下:
def transformer_block_with_adapter(x):
residual = x
x = SelfAttention(x)
x = FullyConnectedLayers(x) # Adapter
x = LayerNorm(x + residual)
residual = x
x = FullyConnectedLayers(x)
x = FullyConnectedLayers(x) # Adapter
x = LayerNorm(x + residual)
return x
低秩适配(LoRA),另一种值得考虑的流行参数高效微调方法,指的是通过低秩变换重新参数化预训练大语言模型(LLM)权重。LoRA 与 低秩变换 的概念相关,低秩变换是一种使用低维表示来逼近高维矩阵或数据集的技术。低维表示(或 低秩近似)是通过找到一个较少维度的组合来有效捕获原始数据中的大部分信息。常见的低秩变换技术包括主成分分析和奇异值分解。
例如,假设∆W表示 LLM 权重矩阵的参数更新,矩阵维度为ℝ^(A×B)。我们可以将权重更新矩阵分解为两个较小的矩阵:∆W = W[A]W[B],其中W[A]∈ ℝ^(A×h),W[B]∈ ℝ^(h×B)。在这里,我们保持原始权重不变,只训练新的矩阵W[A]和W[B]。
如果我们引入新的权重矩阵,这种方法如何保持参数高效呢?这些新矩阵可以非常小。例如,如果A = 25 且B = 50,则∆W的大小为 25 × 50 = 1,250。如果h = 5,那么W[A]有 125 个参数,W[B]有 250 个参数,两个矩阵合起来总共有 125 + 250 = 375 个参数。
学习完权重更新矩阵后,我们可以编写全连接层的矩阵乘法,如下面的伪代码所示:
def lora_forward_matmul(x):
h = x . W # Regular matrix multiplication
h += x . (W_A . W_B) * scalar
return h
清单 18-2:使用 LoRA 的矩阵乘法
在清单 18-2 中,scalar是一个缩放因子,用于调整组合结果(原始模型输出加上低秩适配)的大小。这平衡了预训练模型的知识和新任务特定的适配。
根据介绍 LoRA 方法的原始论文,使用 LoRA 的模型在多个任务特定的基准测试中表现略好于使用适配器方法的模型。通常,LoRA 的表现甚至优于使用前面描述的微调 II 方法进行微调的模型。
带有人类反馈的强化学习
前一节集中讨论了如何提高微调的效率。接下来,我们如何通过微调提高 LLM 的建模性能呢?
调整或微调 LLM 以适应新的目标领域或任务的传统方法是使用带标签目标数据的监督方法。例如,微调 II 方法允许我们适应一个预训练的 LLM,并在目标任务(如情感分类)上进行微调,使用包含情感标签如positive、neutral和negative的文本数据集。
监督微调是训练 LLM 的基础步骤。另一个更高级的步骤是带有人类反馈的强化学习(RLHF),它可以进一步提高模型与人类偏好的对齐。例如,ChatGPT 及其前身 Instruct-GPT 是两个常见的预训练 LLM(GPT-3),它们通过 RLHF 进行微调。
在 RLHF 中,预训练模型通过监督学习和强化学习的结合进行微调。这种方法由最初的 ChatGPT 模型所普及,而 ChatGPT 又是基于 Instruct-GPT 的。人类反馈通过让人类对不同的模型输出进行排名或评分来收集,提供奖励信号。收集到的奖励标签可以用来训练奖励模型,然后用来指导大语言模型的适应过程,以符合人类偏好。奖励模型通过监督学习进行训练,通常使用预训练的大语言模型作为基础模型,然后通过额外的微调使预训练的大语言模型适应人类偏好。在这个额外的微调阶段,训练使用一种叫做近端策略优化的强化学习方法。
RLHF 使用奖励模型,而不是直接在人工反馈上训练预训练模型,因为将人类参与学习过程会造成瓶颈,因为我们无法实时获得反馈。
适应预训练语言模型
虽然对预训练大语言模型进行全层微调仍然是适应新任务的黄金标准,但也有几种高效的替代方法可以利用预训练的变换器。例如,通过使用基于特征的方法、上下文学习或参数高效微调技术,我们可以在最大限度减少计算成本和资源的情况下,将大语言模型有效地应用于新任务。
三种传统方法——基于特征的方法、微调 I 和微调 II——提供了不同的计算效率和性能权衡。像软提示调优、前缀调优和适配器方法这样的参数高效微调方法进一步优化了适应过程,减少了需要更新的参数数量。同时,RLHF 提供了另一种监督微调的替代方法,可能提高建模性能。
总结来说,预训练大语言模型的多功能性和效率不断提升,为将这些模型有效适应各种任务和领域提供了新的机会和策略。随着这一领域研究的进展,我们可以期待在使用预训练语言模型方面的进一步改进和创新。
练习
18-1. 在何种情况下使用上下文学习比微调更有意义,反之又如何?
18-2. 在前缀调优、适配器和 LoRA 中,我们如何确保模型保留(而不是遗忘)原有的知识?
参考文献
-
介绍 GPT-2 模型的论文:Alec Radford 等人,“语言模型是无监督的多任务学习者”(2019),
www.semanticscholar.org/paper/Language-Models-are-Unsupervised-Multitask-Learners-Radford-Wu/9405cc0d6169988371b2755e573cc28650d14dfe。 -
介绍 GPT-3 模型的论文:Tom B. Brown 等人,“语言模型是少量学习者”(2020),
arxiv.org/abs/2005.14165。 -
自动化提示工程方法,提出使用另一个 LLM 进行自动提示生成和评估:Yongchao Zhou 等人,“大型语言模型是人类级别的提示工程师”(2023),
arxiv.org/abs/2211.01910。 -
LlamaIndex 是一个利用上下文学习的索引方法示例:
github.com/jerryjliu/llama_index。 -
DSPy 是一个流行的开源库,用于检索增强和索引:
github.com/stanfordnlp/dsp。 -
第一个软提示的实例:Brian Lester、Rami Al-Rfou 和 Noah Constant,“规模的力量对参数高效提示调优的影响”(2021),
arxiv.org/abs/2104.08691。 -
首次描述前缀调优的论文:Xiang Lisa Li 和 Percy Liang,“前缀调优:优化生成的连续提示”(2021),
arxiv.org/abs/2101.00190。 -
介绍原始适配器方法的论文:Neil Houlsby 等人,“用于 NLP 的参数高效迁移学习”(2019),
arxiv.org/abs/1902.00751。 -
介绍 LoRA 方法的论文:Edward J. Hu 等人,“LoRA:大规模语言模型的低秩适应”(2021),
arxiv.org/abs/2106.09685。 -
涵盖 40 多篇研究论文的调查,讨论了参数高效微调方法:Vladislav Lialin、Vijeta Deshpande 和 Anna Rumshisky,“缩小规模以扩大规模:参数高效微调指南”(2023),
arxiv.org/abs/2303.15647。 -
InstructGPT 论文:Long Ouyang 等人,“用人类反馈训练语言模型以遵循指令”(2022),
arxiv.org/abs/2203.02155。 -
用于强化学习与人类反馈的邻近策略优化:John Schulman 等人,“邻近策略优化算法”(2017),
arxiv.org/abs/1707.06347。
第十九章:评估生成型大型语言模型

用来评估大型语言模型生成文本质量的标准指标是什么?这些指标为何有用?
困惑度、BLEU、ROUGE 和 BERTScore 是自然语言处理领域中常用的几种评估指标,用于评估 LLM 在各种任务中的表现。尽管最终无法避免人工质量评估,但人工评估既繁琐又昂贵,且难以自动化且带有主观性。因此,我们开发了这些指标,以提供客观的总结分数来衡量进展并比较不同的方法。
本章讨论了评估大型语言模型(LLM)内在和外在性能指标的区别,接着深入探讨了像 BLEU、ROUGE 和 BERTScore 等流行指标,并提供了简单的实际操作示例以作说明。
LLM 评估指标
困惑度指标 与用于预训练 LLM 的损失函数直接相关,并且通常用于评估文本生成和文本补全模型。它本质上量化了模型在给定上下文中预测下一个单词时的平均不确定性——困惑度越低,模型表现越好。
双语评估下游任务(BLEU) 分数是评估机器生成翻译质量的广泛使用的指标。它衡量机器生成翻译和一组人工生成参考翻译之间的 n-gram 重叠程度。较高的 BLEU 分数表示更好的表现,范围从 0(最差)到 1(最好)。
召回导向下游任务评估(ROUGE) 分数是主要用于评估自动摘要(有时也用于机器翻译)模型的指标。它衡量生成的摘要和参考摘要之间的重叠程度。
我们可以把困惑度视为内在指标,而把 BLEU 和 ROUGE 视为外在指标。为了说明这两种类型的指标之间的区别,可以想象优化传统的交叉熵来训练一个图像分类器。交叉熵是我们在训练过程中优化的损失函数,但我们的最终目标是最大化分类精度。由于分类精度无法在训练过程中直接优化,因为它不可微分,因此我们最小化像交叉熵这样的替代损失函数。最小化交叉熵损失或多或少与最大化分类精度相关。
困惑度(Perplexity)通常作为评估指标,用于比较不同语言模型的表现,但它并不是训练过程中的优化目标。BLEU 和 ROUGE 更与分类精度相关,或者说与精确度和召回率相关。实际上,BLEU 是一种类似精确度的分数,用来评估翻译文本的质量,而 ROUGE 是一种类似召回率的分数,用来评估摘要文本。
以下章节将更详细地讨论这些指标的机制。
困惑度(Perplexity)
困惑度与训练过程中直接最小化的交叉熵密切相关,这也是我们将困惑度称为内在指标的原因。
困惑度被定义为 2^(H(p, q)/n),其中H(p, q)是词的真实分布p和预测分布q之间的交叉熵,n是句子长度(单词数或标记数),用于标准化得分。随着交叉熵的减少,困惑度也会减少——困惑度越低,效果越好。虽然我们通常使用自然对数计算交叉熵,但为了保持直观的关系,我们使用以 2 为底的对数来计算交叉熵和困惑度。(然而,无论使用以 2 为底的对数还是自然对数,都是一个较小的实现细节。)
在实际应用中,由于目标句子中每个单词的概率始终为 1,我们将交叉熵计算为模型返回的概率分数的对数。换句话说,如果我们有每个单词的预测概率分数,我们可以直接计算困惑度,如下所示:

其中,s是我们要评估的句子或文本,例如“The quick brown fox jumps over the lazy dog.”,p(s)是模型返回的概率分数,n是单词数或标记数。例如,如果模型返回的概率分数是[0.99, 0.85, 0.89, 0.99, 0.99, 0.99, 0.99, 0.99],则困惑度为:

如果句子是“The fast black cat jumps over the lazy dog.”,且概率为[0.99, 0.65, 0.13, 0.05, 0.21, 0.99, 0.99, 0.99],则相应的困惑度为 2.419。
你可以在supplementary/q19-evaluation-llms子文件夹中的* github.com/rasbt/MachineLearning-QandAI-book *找到这个计算的代码实现和示例。
BLEU 分数
BLEU 是最受欢迎和最广泛使用的翻译文本评估标准。几乎所有具备翻译能力的大型语言模型(LLM)都使用它,包括 OpenAI 的 Whisper 和 GPT 模型等流行工具。
BLEU 是一种基于参考的度量标准,它将模型输出与人工生成的参考文本进行比较,最初开发的目的是捕捉或自动化人类评估的本质。简而言之,BLEU 通过基于精度的得分衡量模型输出与人工生成参考文本之间的词汇重叠。
更详细地说,作为一种基于精度的度量标准,BLEU 计算生成文本(候选文本)中有多少单词出现在参考文本中,并将其除以候选文本的长度(单词数),其中参考文本是由人工提供的样本文本翻译。例如,通常对 n-grams(n 元组)进行计算,而不是单个单词,但为了简便起见,我们将仅考虑单词或 1-gram。(在实际应用中,BLEU 通常是针对 4-gram 计算的。)
图 19-1 展示了 BLEU 分数的计算,使用了计算 1-gram BLEU 分数的例子。图 19-1 中的每个步骤说明了我们如何基于 BLEU 分数的各个组成部分来计算 1-gram BLEU 分数,即加权精确度乘以简洁性惩罚。你还可以在supplementary/q15-text-augment子文件夹中找到这个计算的代码实现,链接地址是github.com/rasbt/MachineLearning-QandAI-book。

图 19-1:计算 1-gram BLEU 分数
BLEU 有几个缺点,主要是因为它衡量的是字符串相似性,而仅仅相似性不足以捕捉翻译质量。例如,句子中虽然单词相似但词序不同,可能仍然得分较高,尽管改变词序会显著改变句子的意义并导致语法结构差。此外,由于 BLEU 依赖于精确的字符串匹配,它对词汇变异非常敏感,无法识别使用同义词或释义的语义相似翻译。换句话说,BLEU 可能会给那些实际上是准确和有意义的翻译分配较低的分数。
原始的 BLEU 论文发现它与人工评估具有较高的相关性,尽管这一点后来被证明是错误的。
BLEU 有缺陷吗?是的。它仍然有用吗?也是的。BLEU 是一个有用的工具,可以用来衡量或评估模型在训练过程中是否有所改进,作为流利度的代理。然而,它可能不能可靠地评估生成翻译的质量,也不适合检测问题。换句话说,它最好作为模型选择工具,而不是模型评估工具。
在写作时,最流行的 BLEU 替代方法是 METEOR 和 COMET(有关更多详细信息,请参见本章末尾的“参考文献”部分)。
ROUGE 分数
虽然 BLEU 通常用于翻译任务,但 ROUGE 是评分文本摘要的流行指标。
BLEU 和 ROUGE 之间有许多相似之处。基于精确度的 BLEU 分数检查候选翻译中有多少个单词出现在参考翻译中。ROUGE 分数也采取了相反的方式,检查参考文本中有多少个单词出现在生成的文本中(这里通常是摘要而非翻译);这可以被解释为基于召回的分数。
现代的实现方式将 ROUGE 计算为一个 F1 分数,它是召回率(参考文本中有多少个单词出现在候选文本中)和精确率(候选文本中有多少个单词出现在参考文本中)的调和平均值。例如,图 19-2 展示了一个 1-gram ROUGE 分数的计算(尽管在实际操作中,ROUGE 通常计算的是 2-grams,即二元组)。

图 19-2:计算 1-gram ROUGE
除了 ROUGE-1(基于 F1 分数的 1-gram ROUGE 得分)之外,还有其他 ROUGE 变体:
ROUGE-N 衡量候选摘要和参考摘要之间的 n-gram 重叠。例如,ROUGE-1 会查看单个单词的重叠(1-gram),而 ROUGE-2 会考虑 2-gram(大二元组)的重叠。
ROUGE-L 衡量候选摘要和参考摘要之间的最长公共子序列(LCS)。该度量捕捉单词的最长共现顺序子序列,它们之间可能有空隙。
ROUGE-S 衡量跳跃大二元组(skip-bigrams)的重叠,即在两个单词之间有灵活数量的单词的词对。它有助于捕捉具有不同词序的句子之间的相似性。
ROUGE 与 BLEU 有相似的弱点。与 BLEU 一样,ROUGE 并不考虑同义词或释义。它衡量候选摘要和参考摘要之间的 n-gram 重叠,这可能导致语义相似但词汇不同的句子得分较低。然而,仍然值得了解 ROUGE,因为根据一项研究,2021 年计算语言学会议上所有介绍新总结模型的论文都使用了 ROUGE,其中 69%的论文仅使用了 ROUGE。
BERTScore
另一个最近开发的外部度量是 BERTScore。
对于熟悉生成视觉模型的 inception score 的读者,BERTScore 采取了类似的方法,使用预训练模型的嵌入(有关嵌入的更多信息,请参见第一章)。在这里,BERTScore 通过利用 BERT 模型生成的上下文嵌入,衡量候选文本和参考文本之间的相似度(该 BERT 模型是第十七章中讨论的编码器式转换器)。
计算 BERTScore 的步骤如下:
-
通过你想要评估的 LLM(如 PaLM、LLaMA、GPT、BLOOM 等)获取候选文本。
-
将候选文本和参考文本进行词元化,最好使用与训练 BERT 时相同的分词器。
-
使用预训练的 BERT 模型为候选文本和参考文本中的所有词元创建嵌入。
-
将候选文本中每个词元的嵌入与参考文本中所有词元的嵌入进行比较,计算它们的余弦相似度。
-
将候选文本中的每个词元与参考文本中具有最高余弦相似度的词元对齐。
-
通过计算候选文本中所有词元的平均相似度分数来计算最终的 BERTScore。
图 19-3 进一步说明了这六个步骤。你也可以在subfolder/q15-text-augment子文件夹中找到一个计算示例,网址为github.com/rasbt/MachineLearning-QandAI-book。

图 19-3:逐步计算 BERTScore
BERTScore 可以用于翻译和总结,并且比传统度量如 BLEU 和 ROUGE 更好地捕捉语义相似度。然而,BERTScore 在同义句生成方面比 BLEU 和 ROUGE 更强大,并且由于其上下文嵌入,它更好地捕捉语义相似性。此外,它可能比 BLEU 和 ROUGE 在计算上更昂贵,因为它需要使用预训练的 BERT 模型进行评估。尽管 BERTScore 提供了一个有用的自动评估指标,但它并不完美,应该与其他评估技术一起使用,包括人工判断。
替代度量
本章涵盖的所有度量标准都是用于评估模型在衡量其与人类表现进行对比时的有用性的替代指标。如前所述,评估 LLM 的最佳方法是指定人工评分者来判断结果。然而,由于这通常成本较高且难以扩展,我们使用前述的度量标准来估算模型性能。引用《InstructGPT paper“用人类反馈训练语言模型遵循指令”》中的话:“公共 NLP 数据集并不能反映我们的语言模型是如何使用的... [它们] 旨在捕捉易于通过自动化度量评估的任务。”
除了困惑度(perplexity)、ROUGE、BLEU 和 BERTScore 之外,还使用了其他几种流行的评估度量来评估 LLM 的预测性能。
练习
19-1. 在图 19-3 的第 5 步中,“cat”两个嵌入之间的余弦相似度并不是 1.0,其中 1.0 表示最大余弦相似度。为什么会这样?
19-2. 实际上,我们可能会发现 BERTScore 并不对称。这意味着交换候选句子和参考句子可能会导致某些文本的 BERTScore 不同。我们该如何解决这个问题?
参考文献
-
提出原始 BLEU 方法的论文:Kishore Papineni 等,“BLEU:一种自动评估机器翻译的方法”(2002),*
aclanthology.org/P02-1040/*。 -
一项否定 BLEU 与人工评估高度相关性的后续研究:Chris Callison-Burch,Miles Osborne 和 Philipp Koehn,“重新评估 BLEU 在机器翻译研究中的作用”(2006),*
aclanthology.org/E06-1032/*。 -
BLEU 的缺点,基于 20 年来发布的 37 项研究:Benjamin Marie,"12 个 BLEU 的关键缺陷"(2022),*
medium.com/@bnjmn_marie/12-critical-flaws-of-bleu-1d790ccbe1b1*。 -
提出原始 ROUGE 方法的论文:Chin-Yew Lin,“ROUGE:一种自动评估摘要的工具包”(2004),*
aclanthology.org/W04-1013/*。 -
关于 ROUGE 在会议论文中的使用调查:Sebastian Gehrmann、Elizabeth Clark 和 Thibault Sellam,“修复裂缝:生成文本评估实践中的障碍调查”(2022),
arxiv.org/abs/2202.06935。 -
BERTScore,一种基于大型语言模型的评估指标:Tianyi Zhang 等人,“BERTScore:使用 BERT 评估文本生成”(2019),
arxiv.org/abs/1904.09675。 -
关于大型语言模型评估指标的综合调研:Asli Celikyilmaz、Elizabeth Clark 和 Jianfeng Gao,“文本生成评估:一项调查”(2021),
arxiv.org/abs/2006.14799。 -
METEOR 是一种改进了 BLEU 的机器翻译指标,采用先进的匹配技术,旨在与人类判断在句子层面上实现更好的相关性:Satanjeev Banerjee 和 Alon Lavie,“METEOR:一种具有更好与人类判断相关性的自动机器翻译评估指标”(2005),
aclanthology.org/W05-0909/。 -
COMET 是一个神经网络框架,采用跨语言预训练模型和多种评估方式,为机器翻译质量与人类判断之间的相关性设定了新的标准:Ricardo Rei 等人,“COMET: 用于机器翻译评估的神经网络框架”(2020),
arxiv.org/abs/2009.09025。 -
InstructGPT 论文:Long Ouyang 等人,“训练语言模型以遵循指令并获得人类反馈”(2022),
arxiv.org/abs/2203.02155。
第四部分:生产与部署
第二十章:无状态与有状态训练

在生产和部署系统的背景下,无状态和有状态训练工作流之间有什么区别?
无状态训练和有状态训练是训练生产模型的两种不同方式。
无状态(重新)训练
在无状态训练中,这是一种更为传统的方法,我们首先在原始训练集上训练初始模型,然后随着新数据的到来重新训练模型。因此,无状态训练通常也被称为无状态重新训练。
如图 20-1 所示,我们可以将无状态重新训练视为一种滑动窗口方法,在这种方法中,我们会基于给定数据流的不同部分对初始模型进行重新训练。

图 20-1:无状态训练定期替换模型。
例如,为了将图 20-1 中的初始模型(模型 1)更新为更新模型(模型 2),我们会使用初始数据的 30% 和最新数据的 70% 来训练模型。
无状态重新训练是一种直接的方法,它通过在用户定义的检查点间隔内从头开始重新训练模型,使我们能够将模型适应数据和特征-目标关系中的最新变化。这种方法在传统的机器学习系统中很常见,尤其是那些不能作为迁移学习或自监督学习工作流的一部分进行微调的系统(参见第二章)。例如,基于树的标准模型实现,如随机森林和梯度提升(XGBoost、CatBoost 和 LightGBM),就属于这一类。
有状态训练
在有状态训练中,我们在初始数据批次上训练模型,然后在新数据到达时定期更新它(而不是重新训练)。
如图 20-2 所示,我们不会从头开始重新训练初始模型(模型 1.0);相反,我们会随着新数据的到来更新或微调它。这种方法对于与迁移学习或自监督学习兼容的模型特别有吸引力。

图 20-2:有状态训练定期更新模型。
有状态方法模仿了迁移学习或自监督学习的工作流,在这种方法中,我们采用预训练模型进行微调。然而,有状态训练与迁移学习和自监督学习有根本性的不同,因为它会更新模型,以适应概念、特征和标签的漂移。相比之下,迁移学习和自监督学习的目标是将模型应用于不同的分类任务。例如,在迁移学习中,目标标签通常不同;在自监督学习中,我们从数据集特征中获取目标标签。
有状态训练的一个显著优点是我们不需要存储数据进行重新训练;相反,我们可以在数据到达时立即用它来更新模型。当数据存储因隐私或资源限制而成为问题时,这一点尤为吸引人。
练习
20-1. 假设我们使用随机森林模型训练一个用于股票交易推荐的分类器,将股票价格的移动平均作为特征。由于新的股市数据每天都会到达,我们正在考虑如何每天更新分类器以保持其最新状态。我们是应该采用无状态训练还是有状态重新训练的方法来更新分类器?
20-2. 假设我们部署一个大型语言模型(例如 Chat-GPT),该模型可以回答用户查询。对话界面包括点赞和点踩按钮,用户可以根据生成的查询直接反馈。在收集用户反馈时,我们不会在新反馈到达时立即更新模型。然而,我们计划每月至少发布一次新的或更新的模型。我们应该为这个模型使用无状态还是有状态重新训练?
第二十一章:数据中心化 AI

什么是数据中心化 AI,它与传统的建模范式有何不同,以及我们如何判断它是否适合一个项目?
数据中心化 AI 是一种范式或工作流,其中我们保持模型训练过程不变,并在数据集上反复迭代,以提高模型的预测性能。以下部分将更详细地定义数据中心化 AI 的含义,并将其与传统的模型中心化方法进行比较。
数据中心化与模型中心化 AI
在数据中心化 AI 的背景下,我们可以将传统的工作流,通常是学术出版中的一部分,视为模型中心化 AI。然而,在学术研究环境中,我们通常更关注开发新方法(例如,神经网络架构或损失函数)。在这里,我们考虑使用现有的基准数据集,将新方法与先前的方案进行比较,并判断它是否优于现状。
图 21-1 总结了数据中心化与模型中心化工作流的区别。

图 21-1:数据中心化与模型中心化机器学习工作流
尽管数据中心化 AI是一个相对较新的术语,但其背后的理念并不新鲜。我与许多人交流过,他们表示,在这个术语被创造之前,他们的项目中已经使用了数据中心化的方法。在我看来,数据中心化 AI 的出现是为了重新吸引人们“关心数据质量”,因为数据收集和数据整理通常被认为是单调乏味或得不到应有回报的。这类似于“深度学习”一词在 2010 年代初期使得神经网络重新引起兴趣。
我们是否需要在数据中心化与模型中心化 AI 之间做出选择,还是可以同时依赖这两者?简而言之,数据中心化 AI 侧重于通过改变数据来提高性能,而模型中心化方法则侧重于修改模型以提高性能。在应用场景中,我们理想情况下应该同时使用这两种方法,以获得最佳的预测性能。然而,在研究环境或应用项目的探索阶段,同时处理过多的变量是混乱的。如果我们同时改变模型和数据,就很难明确指出哪个变化导致了性能的提升。
需要强调的是,数据中心化 AI 是一种范式和工作流,而不是一种特定的技术。因此,数据中心化 AI 隐含地包括以下内容:
-
训练数据的分析和修改,从去除异常值到缺失数据的填补
-
数据合成和数据增强技术
-
数据标注和标签清理方法
-
经典的主动学习设置,其中模型建议需要标注的数据点
如果我们只改变数据(使用这里列出的技术),而不改变建模流程的其他方面,那么我们就认为这是数据中心化的方法。
在机器学习和人工智能中,我们常用“垃圾进,垃圾出”这一说法,意思是低质量的数据会导致低质量的预测模型。换句话说,我们不能指望从低质量的数据集中得到一个表现良好的模型。
我在尝试用机器学习取代现有方法的应用学术项目中观察到一种常见模式。通常,研究人员只有一个小型数据集(比如几百个训练样本)。标注数据往往成本较高,或者被认为枯燥乏味,因此最好避免。在这些情况下,研究人员花费大量时间尝试不同的机器学习算法和模型调优。为了解决这个问题,投入更多时间或资源标注更多数据是值得的。
数据中心化人工智能的主要优势在于它将数据置于首位,这样如果我们投入资源创建更高质量的数据集,所有建模方法都会从中受益。
建议
在应用项目中,采取数据中心化的方法通常是一个好主意,尤其是在我们希望提高预测性能以解决特定问题的情况下。在这种背景下,从建模基准开始,并改善数据集是有意义的,因为这通常比尝试更大、更昂贵的模型更值得投资。
如果我们的任务是开发一种新的或更好的方法论,比如新的神经网络架构或损失函数,基于模型的方法可能是一个更好的选择。使用已建立的基准数据集而不进行修改,使得将新的建模方法与以前的工作进行比较变得更加容易。增加模型的规模通常会提高性能,但增加训练样本数量也能带来类似的效果。假设对于分类、抽取式问答和多选任务来说,训练集较小(< 2k),增加一百个样本可能会带来与增加数十亿参数相同的性能提升。
在实际项目中,交替使用数据中心化和模型中心化的模式是非常有意义的。早期投资于数据质量将惠及所有模型。一旦获得了好的数据集,我们可以开始专注于模型调优以提升性能。
练习
21-1. 最近的一个趋势是医疗保健领域对预测分析的日益重视。例如,假设一家医疗服务提供商开发了一个 AI 系统,分析患者的电子健康记录,并提供生活方式改变或预防措施的建议。为此,提供商要求患者每天监测并共享健康数据(如脉搏和血压)。这是数据中心化人工智能的一个例子吗?
21-2. 假设我们训练一个 ResNet-34 卷积神经网络,用于对 CIFAR-10 和 ImageNet 数据集中的图像进行分类。为了减少过拟合并提高分类准确性,我们实验了数据增强技术,如图像旋转和裁剪。这种方法算是数据中心化吗?
参考文献
-
一个例子说明了增加更多训练数据如何比增加模型大小更能提升模型性能:Yuval Kirstain 等人,《更多示例可能比数十亿参数更有价值》(2021),
arxiv.org/abs/2110.04374。 -
Cleanlab 是一个开源库,包含了在计算机视觉和自然语言处理领域中提高标签错误和数据质量的方法:
github.com/cleanlab/cleanlab。
第二十二章:加速推理

有哪些优化技术可以加速模型推理,而不改变模型架构或牺牲准确性?
在机器学习和人工智能中,模型推理指的是使用训练好的模型进行预测或生成输出。提高推理性能的主要技术包括并行化、矢量化、循环平铺、操作符融合和量化,以下章节将详细讨论这些技术。
并行化
提高推理期间并行化的常见方法之一是一次处理一批样本,而不是逐个处理单一样本。这有时也被称为批量推理,假设我们同时或在短时间窗口内接收多个输入样本或用户输入,如图 22-1 所示。

图 22-1: 顺序推理与批量推理
图 22-1 显示了顺序推理一次处理一个项目的方式,如果有多个样本等待分类,这会造成瓶颈。在批量推理中,模型同时处理所有四个样本。
矢量化
矢量化指的是对整个数据结构(如数组(张量)或矩阵)进行操作,而不是使用for循环等迭代结构。通过矢量化,循环中的多个操作会通过单指令多数据(SIMD)处理同时执行,这在大多数现代 CPU 上都可以实现。
这种方法利用了许多计算系统中的低级优化,通常会显著提高速度。例如,它可能依赖于 BLAS。
BLAS(即基本线性代数子程序的缩写)是一种规范,规定了一组用于执行常见线性代数操作的低级例程,例如向量加法、标量乘法、点积、矩阵乘法等。许多数组和深度学习库,如 NumPy 和 PyTorch,都在幕后使用 BLAS。
为了通过一个例子说明矢量化,假设我们要计算两个向量的点积。非矢量化的做法是使用for循环,逐个遍历数组中的每个元素。然而,这种方法可能非常慢,特别是对于大型数组。通过矢量化,你可以一次性对整个数组执行点积操作,如图 22-2 所示。

图 22-2: Python 中经典的 for 循环与矢量化点积计算
在线性代数或深度学习框架(如 TensorFlow 和 PyTorch)中,矢量化通常是自动进行的。这是因为这些框架设计用于处理多维数组(也称为张量),其操作本质上是矢量化的。这意味着,当你使用这些框架执行函数时,自动利用了矢量化的优势,从而实现更快、更高效的计算。
循环分块
循环分块(也常被称为循环嵌套优化)是一种先进的优化技术,通过将循环的迭代空间拆分成更小的块或“瓦片”来增强数据局部性。这确保了数据一旦加载到缓存中,在缓存清空之前,所有可能的计算都会在其上执行。
图 22-3 说明了二维数组中访问元素的循环分块概念。在常规的for循环中,我们一次迭代处理一个元素,遍历列和行,而在循环分块中,我们将数组细分为更小的块。

图 22-3:二维数组中的循环分块
请注意,在像 Python 这样的语言中,我们通常不会进行循环分块,因为 Python 和许多其他高级语言不像 C 和 C++ 这样的低级语言那样可以控制缓存内存。这类优化通常由底层库(如 NumPy 和 PyTorch)在对大数组进行操作时处理。
操作符融合
操作符融合,有时也叫做循环融合,是一种优化技术,它将多个循环合并为一个循环。这在图 22-4 中得到了说明,其中两个独立的循环分别计算一个数字数组的和与积,被融合成了一个循环。

图 22-4:将两个 for 循环(左)融合为一个(右)
操作符融合可以通过减少循环控制的开销、通过提高缓存性能减少内存访问时间,并可能通过矢量化启用进一步的优化,从而提高模型的性能。
你可能会认为,矢量化行为与循环分块不兼容,因为在循环分块中,我们将一个for循环拆分为多个循环。然而,这些技术实际上是互补的,用于不同的优化,并适用于不同的场景。操作符融合旨在减少循环迭代的总次数,并在整个数据适合缓存时提高数据局部性。而循环分块则是在处理无法完全装入缓存的更大多维数组时,改进缓存利用率。
与操作符融合相关的是重参数化的概念,它通常也可以用来将多个操作简化为一个操作。流行的例子包括训练一个具有多分支架构的网络,在推理时将其重参数化为单流架构。与传统的操作符融合不同,这种重参数化方法并不会将多个操作合并为一个操作,而是重新排列网络中的操作,以创建更高效的推理架构。例如,在所谓的 RepVGG 架构中,每个分支在训练过程中由一系列卷积组成。一旦训练完成,模型就会重参数化为一个单一的卷积序列。
量化
量化减少了机器学习模型的计算和存储需求,特别是深度神经网络。该技术涉及将浮点数(技术上是离散的,但在特定范围内表示连续值)用于实现训练好的神经网络中的权重和偏置转换为更离散、更低精度的表示形式,如整数。使用较低的精度可以减小模型的大小并加快执行速度,从而在推理过程中显著提高速度和硬件效率。
在深度学习领域,将训练好的模型量化为 8 位和 4 位整数已变得越来越常见。这些技术在大型语言模型的部署中尤为常见。
量化主要有两大类。训练后量化是先使用全精度权重进行常规训练,训练完成后再进行量化。量化感知训练则是在训练过程中引入量化步骤。这使得模型可以学习补偿量化的影响,从而有助于保持模型的准确性。
然而,值得注意的是,量化有时可能会导致模型准确度的降低。由于本章重点讨论在不牺牲准确度的情况下加速模型推理,因此量化不如前述技术适合本章内容。
注意
提高推理速度的其他技术包括知识蒸馏和剪枝,这些在第六章中讨论过。然而,这些技术会影响模型架构,导致模型变小,因此不在本章问题的讨论范围内。
练习
22-1. 第七章介绍了几种多 GPU 训练范式,以加速模型训练。理论上,使用多个 GPU 也可以加速模型推理。然而,在实际操作中,这种方法通常并不是最有效或最实用的选择。为什么会这样呢?
22-2. 向量化和循环平铺是两种优化涉及访问数组元素操作的策略。在哪些理想情况下使用每种方法最合适?
参考文献
-
官方 BLAS 网站:
www.netlib.org/blas/。 -
提出循环平铺方法的论文:Michael Wolfe,“更多的迭代空间平铺”(1989),
dl.acm.org/doi/abs/10.1145/76263.76337。 -
RepVGG CNN 架构合并推理模式中的操作:Xiaohan Ding 等人,“RepVGG:让 VGG 风格的卷积神经网络再度伟大”(2021),
arxiv.org/abs/2101.03697。 -
一种将大语言模型中的权重量化到 8 位整数表示的新方法:Tim Dettmers 等人,“LLM.int8():大规模变换器的 8 位矩阵乘法”(2022),
arxiv.org/abs/2208.07339。 -
一种将大语言模型中的权重量化到 4 位整数的新方法:Elias Frantar 等人,“GPTQ:生成预训练变换器的精确后训练量化”(2022),
arxiv.org/abs/2210.17323。
第二十三章:数据分布转移**

我们在模型部署后可能遇到的主要数据分布转移类型有哪些?
数据分布转移 是将机器学习和人工智能模型投入生产时最常见的问题之一。简而言之,它们指的是模型训练时使用的数据分布与模型在现实世界中遇到的数据分布之间的差异。通常,这些变化会导致模型性能显著下降,因为模型的预测不再准确。
数据分布转移有几种类型,其中有些比其他的更具挑战性。最常见的类型包括协变量转移、概念漂移、标签转移和领域转移;这些将在以下章节中详细讨论。
协变量转移
假设 p(x) 描述了输入数据(例如特征)的分布,p(y) 指的是目标变量(或类别标签分布)的分布,而 p(y|x) 是给定输入 x 时,目标 y 的条件分布。
协变量转移 发生在输入数据 p(x) 的分布发生变化时,但给定输入时输出的条件分布 p(y|x) 保持不变。
图 23-1 说明了协变量转移,其中训练数据的特征值和生产过程中遇到的新数据都遵循正态分布。然而,新数据的均值已经与训练数据发生了变化。

图 23-1:训练数据和新数据的分布在协变量转移下有所不同。
例如,假设我们训练了一个模型来预测一封邮件是否为垃圾邮件,依据是特定的特征。现在,当我们将邮件垃圾邮件过滤器嵌入到邮件客户端后,客户收到的邮件信息具有截然不同的特征。例如,邮件内容要长得多,而且是从不同时间区的某个人发送的。然而,如果这些特征与邮件是否为垃圾邮件之间的关系没有变化,那么我们就遇到了协变量转移(covariate shift)。
协变量转移是部署机器学习模型时非常常见的挑战。它意味着模型在生产环境中接收到的数据与训练时使用的数据不同。然而,由于在协变量转移下,输入和输出之间的关系 p(y|x) 保持不变,因此可以采用一些技术来进行调整。
检测协变量漂移的一种常见技术是对抗验证,在第二十九章中有更详细的讨论。一旦检测到协变量漂移,常用的方法是重要性加权,它为训练样本分配不同的权重,以便在训练过程中强调或减弱某些实例。本质上,更可能出现在测试分布中的实例会被赋予更大的权重,而不太可能出现的实例则赋予较小的权重。这种方法使模型能够在训练过程中更多地关注代表测试数据的实例,从而使模型对协变量漂移更加鲁棒。
标签漂移
标签漂移,有时也称为先验概率漂移,发生在类标签分布p(y)发生变化时,但类条件分布p(y|x)保持不变。换句话说,标签分布或目标变量发生了显著变化。
举一个这样的场景的例子,假设我们训练了一个电子邮件垃圾邮件分类器,训练数据集中的垃圾邮件和非垃圾邮件各占 50%。然而,在现实世界中,只有 10%的电子邮件是垃圾邮件。
解决标签漂移的一种常见方法是使用加权损失函数更新模型,尤其是当我们了解标签的新分布时。这本质上是一种重要性加权。通过根据新标签分布调整损失函数中的权重,我们鼓励模型更加关注在新数据中变得更加常见(或更少见)的某些类。这有助于使模型的预测更符合当前的实际情况,从而提高其在新数据上的表现。
概念漂移
概念漂移指的是输入特征与目标变量之间映射的变化。换句话说,概念漂移通常与条件分布p(y|x)的变化相关,例如输入x与输出y之间的关系变化。
使用前一节中垃圾邮件分类器的例子,电子邮件的特征可能保持不变,但这些特征与电子邮件是否是垃圾邮件的关系可能会发生变化。这可能是由于一种新的垃圾邮件策略,这种策略在训练数据中并不存在。概念漂移比目前讨论的其他分布漂移更难处理,因为它需要持续监控并可能需要重新训练模型。
领域漂移
在文献中,领域漂移和概念漂移这两个术语的使用有些不一致,有时被认为是可以互换的。实际上,这两者是相关但稍有不同的现象。概念漂移指的是从输入到输出的映射函数的变化,特别是指随着时间推移,收集更多数据时,特征与目标变量之间的关系发生变化的情况。
在领域漂移中,输入的分布 p(x) 和给定输入的输出条件分布 p(y|x) 都发生变化。这有时也被称为联合分布漂移,因为联合分布 p(x 和 y) = p(y|x) · p(x)。因此,我们可以将领域漂移视为协变量漂移和概念漂移的结合。
此外,由于我们可以通过对变量 x 上的联合分布 p(x, y) 积分来获得边际分布 p(y)(数学表达为 p(y) = ∫ p(x, y) dx),协变量漂移和概念漂移也意味着标签漂移。(然而,可能存在某些例外情况,其中 p(x) 的变化可以补偿 p(y|x) 的变化,从而 p(y) 可能不会改变。)相反,标签漂移和概念漂移通常也意味着协变量漂移。
再次以电子邮件垃圾分类为例,领域漂移意味着特征(电子邮件的内容和结构)以及特征与目标之间的关系随着时间的推移发生变化。例如,2023 年的垃圾邮件可能有不同的特征(新的钓鱼方案、新的语言等),并且垃圾邮件的定义可能也发生了变化。这种类型的漂移对于基于 2020 年数据训练的垃圾邮件过滤器来说是最具挑战性的场景,因为它必须适应输入数据和目标概念的变化。
领域漂移可能是最难处理的漂移类型,但随着时间的推移,监控模型性能和数据统计可以帮助及早检测到领域漂移。一旦检测到,缓解策略包括从目标领域收集更多的标注数据,并重新训练或调整模型。
数据分布漂移的类型
图 23-2 提供了二分类问题背景下不同类型数据漂移的视觉总结,其中黑色圆圈表示来自一个类的示例,而菱形表示来自另一个类的示例。

图 23-2:二分类背景下不同类型数据漂移的总结
如前所述,某些类型的分布漂移比其他类型更具挑战性。最不具问题的是通常被称为协变量漂移。在这种情况下,输入特征的分布 p(x) 在训练数据和测试数据之间发生变化,但给定输入的输出条件分布 p(y|x) 保持不变。由于输入和输出之间的基本关系保持不变,因此基于训练数据训练的模型原则上仍可以应用于测试数据和新数据。
最具问题的分布偏移类型通常是联合分布偏移,其中输入分布 p(x) 和条件输出分布 p(y|x) 都发生变化。这使得模型特别难以调整,因为从训练数据中学到的关系可能不再成立。模型必须应对新的输入模式以及基于这些模式做出预测的新规则。
然而,偏移的“严重性”可能因实际情况而异。例如,即使是协变量偏移,如果偏移严重,或者模型无法适应新的输入分布,可能会变得非常棘手。另一方面,如果偏移相对较小,或者我们能够获得足够的新分布的标注数据以重新训练模型,那么联合分布偏移可能是可以管理的。
一般来说,监控模型的性能并意识到数据分布可能发生的变化至关重要,以便在必要时采取适当的措施。
练习
23-1. 使用重要性加权作为缓解协变量偏移的技术存在什么主要问题?
23-2. 在实际场景中,尤其是当我们无法获得新数据的标签时,我们如何检测这些类型的偏移?
参考文献
- 避免领域偏移的高级缓解技术推荐与指引:Abolfazl Farahani 等人,《领域适应的简要回顾》(2020),*
arxiv.org/abs/2010.03978*。
第五部分:预测性能与模型评估
第二十四章:泊松回归与顺序回归**

何时应优先使用泊松回归而非顺序回归,反之亦然?
我们通常在目标变量表示计数数据(正整数)时使用泊松回归。举一个计数数据的例子,考虑飞机上感染的感冒次数,或者某天餐馆的客人数量。除了目标变量表示计数之外,数据还应符合泊松分布,这意味着均值和方差大致相同。(对于较大的均值,我们可以使用正态分布来近似泊松分布。)
顺序数据是类别数据的一个子类别,其中类别具有自然的顺序,例如 1 < 2 < 3,如图 24-1 所示。顺序数据通常表示为正整数,可能看起来类似于计数数据。例如,考虑亚马逊的星级评分(1 星,2 星,3 星,依此类推)。然而,顺序回归并不对排序类别之间的距离做任何假设。考虑以下疾病严重度的衡量标准:严重 > 中等 > 轻微 > 无。虽然我们通常将疾病严重度变量映射为整数表示(4 > 3 > 2 > 1),但并没有假设 4 和 3(严重和中等)之间的距离与 2 和 1(轻微和无)之间的距离相同。

图 24-1:顺序类别之间的距离是任意的。
简而言之,我们使用泊松回归处理计数数据。当我们知道某些结果是“更高”或“更低”时,但不确定具体差距或是否重要时,我们使用顺序回归。
习题
24-1. 假设我们想预测一个足球运动员在特定赛季中进球的数量。我们应该使用顺序回归还是泊松回归来解决这个问题?
24-2. 假设我们让某人根据他们的偏好顺序排序他们最近观看的三部电影。忽略这个数据集对于机器学习来说有点太小,我们应该使用哪种方法来处理这种数据?
第二十五章:置信区间

构建机器学习分类器置信区间的不同方法有哪些?
有几种构建机器学习模型置信区间的方法,这取决于模型类型和数据的性质。例如,某些方法在处理深度神经网络时计算成本高昂,因此更适合于资源较少的机器学习模型。其他方法则需要更大的数据集才能可靠。
下面是构建置信区间的最常见方法:
-
基于测试集构建正态近似区间
-
自举训练集
-
对测试集预测进行自举
-
使用不同的随机种子重新训练模型的置信区间
在更深入审查这些内容之前,让我们简要回顾一下置信区间的定义和解释。
定义置信区间
置信区间是一种估计未知总体参数的方法。总体参数是统计总体的特定度量,例如平均值或比例。通过“特定”度量,我指的是对于整个总体而言,该参数有一个单一的确切值。尽管这个值可能未知并且通常需要从样本中估计,但它是总体的固定和确定的特征。统计总体则是我们研究的所有项目或个体的完整集合。
在机器学习的背景下,总体可以被认为是模型可能遇到的所有可能实例或数据点的整体集合,我们通常最感兴趣的参数是模型在这个总体上的真实泛化准确性。
我们在测试集上测量的准确性估计了真实的泛化准确性。但是,由于我们使用了特定的测试实例样本,这种测量受到随机误差的影响。这就是置信区间的概念发挥作用的地方。泛化准确性的 95%置信区间为我们提供了一个范围,在这个范围内我们可以相当确定真实的泛化准确性。
例如,如果我们取 100 个不同的数据样本,并为每个样本计算 95%置信区间,大约有 100 个置信区间中的 95 个将包含真实的总体值(例如泛化准确性),如图 25-1 所示。

图 25-1:95%置信区间的概念
更具体地说,如果我们从总体中抽取 100 个不同的代表性测试集,并计算每个测试集的 95%置信区间,我们预期大约有 95 个这些区间将包含真实的泛化准确性。
我们可以通过几种方式来展示置信区间。常见的做法是使用条形图表示,其中条形的顶部代表参数值(例如,模型准确度),而胡须表示置信区间的上下限(图 25-2 的左侧图)。另外,也可以像图 25-2 的右侧图那样,直接展示没有条形的置信区间。

图 25-2:两种常见的绘图变体用于说明置信区间
这种可视化在多方面都非常有用。例如,当两个模型性能的置信区间不重叠时,这是一个强烈的视觉指示,表明两者的性能有显著差异。以统计显著性检验为例,如 t 检验:如果两个 95% 的置信区间不重叠,这强烈表明这两个测量值之间的差异在 0.05 的显著性水平上是统计显著的。
另一方面,如果两个 95% 的置信区间重叠,我们不能自动得出两个测量值之间没有显著差异的结论。即使置信区间重叠,仍然可能存在统计上显著的差异。
另外,为了提供更详细的关于确切数值的信息,我们可以使用表格视图来表达置信区间。两种常见的表示方法总结在表 25-1 中。
表 25-1: 置信区间
| 模型 | 数据集 A | 数据集 B | 数据集 C |
|---|---|---|---|
| 1 | 89.1% ± 1.7% | . . . | . . . |
| 2 | 79.5% ± 2.2% | . . . | . . . |
| 3 | 95.2% ± 1.6% | . . . | . . . |
| 模型 | 数据集 A | 数据集 B | 数据集 C |
| 1 | 89.1% (87.4%, 90.8%) | . . . | . . . |
| 2 | 79.5% (77.3%, 81.7%) | . . . | . . . |
| 3 | 95.2% (93.6%, 96.8%) | . . . | . . . |
如果置信区间是对称的,即上下端点距离估计参数的距离相等,那么通常更倾向于使用±符号。或者,也可以明确地写出上下置信区间。
方法
接下来的部分将描述构建置信区间的四种最常见的方法。
方法 1:正态近似区间
正态近似区间是通过单次训练-测试分割生成置信区间的。它通常被认为是计算置信区间最简单和最传统的方法。这种方法在深度学习领域特别受欢迎,因为训练模型的计算成本较高。当我们只对评估特定模型感兴趣,而不是像在k-折交叉验证中那样使用训练于不同数据划分的模型时,这种方法也更为理想。
它是如何工作的?简而言之,计算预测参数的置信区间的公式(例如,样本均值,用
表示),假设数据服从正态分布,可以表示为
± z × SE。
在这个公式中,z表示z-得分,它表示一个特定值距离标准正态分布均值的标准差数。SE表示预测参数的标准误差(在这种情况下,是样本均值)。
注意
大多数读者应该熟悉 z-得分表,这些表通常出现在入门统计学教材的后面。然而,更方便且更受欢迎的获取 z-得分的方式是使用像 SciPy 的 stats.zscore 函数,它可以计算给定置信水平的 z-得分。
对于我们的场景,样本均值,用
表示,等同于测试集准确度,ACC[test],这是在二项分布比例置信区间中衡量成功预测的指标。
在正态近似下,标准误差可以按以下方式计算:

在这个方程中,n表示测试集的大小。将标准误差代入前面的公式中,我们得到以下结果:

实现该方法的附加代码示例也可以在补充代码库的补充/q25_confidence-intervals子文件夹中找到,地址为github.com/rasbt/MachineLearning-QandAI-book。
尽管由于其简单性,正态近似区间方法非常流行,但它也有一些缺点。首先,正态近似可能并不总是准确,尤其是对于小样本量或数据不服从正态分布的情况。在这种情况下,其他计算置信区间的方法可能更为准确。其次,使用单一的训练-测试划分不能提供关于模型在不同数据划分下表现的变异性的信息。如果模型的表现高度依赖于特定的划分,这可能会成为一个问题,尤其是在数据集较小或数据变异性较大时。
方法 2:自助法训练集
置信区间作为一种工具,用于近似未知参数。然而,当我们仅限于一个估计时,比如从单一测试集中得出的准确度,我们必须做出一些假设才能使其有效。例如,当我们使用前面章节中描述的正态近似区间时,我们假设数据服从正态分布,但这可能成立,也可能不成立。
在一个完美的场景中,我们可以更深入地了解我们的测试集样本分布。然而,这需要访问许多独立的测试数据集,这通常是不可行的。一个解决方法是自助法,它通过重新抽样现有数据来估计抽样分布。
注意
实际上,当测试集足够大时,由于中心极限定理,正态分布的近似将成立。该定理表明,大量独立同分布的随机变量的和(或平均值)将趋近于正态分布,无论个别变量的基础分布如何。很难确切指定什么样的测试集算足够大。然而,在比中心极限定理更强的假设下,我们至少可以利用贝里–埃森定理估计收敛到正态分布的速度,这为我们提供了收敛速度的量化估计。
在机器学习中,我们可以取原始数据集并进行带有替换的随机抽样。如果数据集大小为 n,并且我们进行大小为 n 的带替换随机抽样,这意味着某些数据点可能会在这个新样本中重复,而其他数据点根本没有被抽取。然后,我们可以重复这个过程多次,得到多个训练集和测试集。这个过程称为 袋外自助法,如图 25-3 所示。

图 25-3:袋外自助法在重新抽样的训练集上评估模型。
假设我们构建了 k 个训练集和测试集。我们现在可以利用这些划分来训练和评估模型,以获得 k 次测试集的准确度估计值。考虑到这些测试集准确度估计值的分布,我们可以取 2.5 百分位和 97.5 百分位之间的范围来获得 95%的置信区间,如图 25-4 所示。

图 25-4:来自 1,000 次自助样本的测试准确度分布,包括 95%的置信区间
与正态近似区间方法不同,我们可以认为这种袋外自助法更不依赖于具体的分布。理想情况下,如果正态近似的假设得到满足,两种方法将会产生相同的结果。
由于自助法依赖于重新抽样现有的测试数据,它的缺点是无法引入来自更广泛人群或未见数据的任何新信息。因此,它可能无法始终将模型的表现推广到新的、未见的数据。
请注意,本章使用的是自助抽样方法,而不是通过k-折交叉验证获取训练-测试集划分,因为自助抽样方法在中央极限定理的理论基础上具有更强的支持。还有更高级的袋外自助抽样方法,如.632 和.632+估计,它们通过重新加权精度估计来进行改进。
方法 3:自助抽样测试集预测
自助抽样训练集的替代方法是自助抽样测试集。其思想是按常规在现有的训练集上训练模型,然后在自助抽样的测试集上评估模型,如图 25-5 所示。在获得测试集的性能估计后,我们可以应用前一节中描述的百分位方法。

图 25-5:自助抽样测试集
与之前的自助抽样技术不同,这种方法使用已经训练好的模型,仅对测试集进行重采样(而不是训练集)。这种方法特别适用于评估深度神经网络,因为它不需要在新的数据划分上重新训练模型。然而,这种方法的一个缺点是,它不能评估模型对训练数据小变化的敏感性。
方法 4:使用不同随机种子重新训练模型
在深度学习中,模型通常会使用不同的随机种子进行重新训练,因为某些随机权重初始化可能会导致比其他初始化更好的模型。我们如何从这些实验中构建置信区间?如果我们假设样本均值服从正态分布,那么我们可以采用之前讨论过的方法,在样本均值周围计算置信区间,记作
,如下所示:

由于在这种情况下,我们通常处理的样本数量相对较少(例如,从 5 到 10 个随机种子的模型),因此假设t分布比正态分布更为适用。因此,我们在之前的公式中将z值替换为t值。(随着样本量的增加,t分布趋向于与标准正态分布相似,而临界值[z和t]也会越来越接近。)
此外,如果我们关心平均精度,记作
,我们将 ACC[test, j],即对应于唯一随机种子j的精度,视为一个样本。我们评估的随机种子数量将构成样本大小n。因此,我们将计算:

这里,SE 是标准误差,计算公式为
,而

是平均精度,我们在r个随机种子上计算得到。标准差 SD 的计算公式如下:

总结来说,使用不同随机种子计算置信区间是另一种有效的替代方案。然而,它主要对深度学习模型有益。与正态近似法(方法 1)和自助法测试集(方法 3)相比,它的成本更高,因为它需要重新训练模型。好的一面是,来自不同随机种子的结果为我们提供了对模型稳定性的深入理解。
建议
构建置信区间的每种方法都有其独特的优缺点。正态近似区间计算便宜,但依赖于分布的正态性假设。袋外自助法对这些假设无偏见,但计算开销大。一个更便宜的替代方案是仅对测试集进行自助法,但这涉及对较小的数据集进行自助抽样,可能会对小规模或非代表性的测试集产生误导。最后,从不同的随机种子构建置信区间虽然计算成本高,但能为我们提供关于模型稳定性的额外见解。
练习
25-1. 如前所述,最常见的置信度选择是 95%的置信区间。然而,90%和 99%也很常见。90%的置信区间比 95%的置信区间更小还是更大,为什么会这样?
25-2. 在《方法 3:自助法测试集预测》(第 169 页)中,我们通过自助抽样创建了测试集,然后应用已训练的模型计算每个数据集上的测试集准确性。你能想到一种方法或修改来更高效地获得这些测试准确性吗?
参考文献
-
详细讨论了从不重叠置信区间得出统计显著性结论的陷阱:Martin Krzywinski 和 Naomi Altman,《误差条》(2013),[https://www.nature.com/articles/nmeth.2659](https://www.nature.com/articles/nmeth.2659)。
-
关于二项比例置信区间的更详细解释:[https://en.wikipedia.org/wiki/Binomial_proportion_confidence_interval](https://en.wikipedia.org/wiki/Binomial_proportion_confidence_interval)。
-
关于正态近似区间的详细解释,请参见我的文章第 1.7 节:“机器学习中的模型评估、模型选择和算法选择”(2018),[https://arxiv.org/abs/1811.12808](https://arxiv.org/abs/1811.12808)。
-
关于独立同分布随机变量的中心极限定理的更多信息:[https://en.wikipedia.org/wiki/Central_limit_theorem](https://en.wikipedia.org/wiki/Central_limit_theorem)。
-
更多关于 Berry–Esseen 定理的信息:[https://en.wikipedia.org/wiki/Berry–Esseen_theorem](https://en.wikipedia.org/wiki/Berry–Esseen_theorem)。
-
.632 自助法解决了常规袋外自助法方法的悲观偏差:Bradley Efron,“估计预测规则的错误率:交叉验证的改进”(1983),
www.jstor.org/stable/2288636。 -
.632+ 自助法修正了在 .632 自助法中引入的乐观偏差:Bradley Efron 和 Robert Tibshirani,“交叉验证的改进:.632+ 自助法”(1997),
www.jstor.org/stable/2965703。 -
讨论引导测试集预测的深度学习研究论文:Benjamin Sanchez-Lengeling 等人,“香气的机器学习:学习小分子的通用感知表示”(2019),
arxiv.org/abs/1910.10685。
第二十六章:置信区间与保守预测

置信区间和保守预测之间的区别是什么,我们什么时候使用一个而非另一个?
置信区间和保守预测都是统计方法,用于估计未知总体参数的可能值范围。如第二十五章所讨论,置信区间量化了总体参数落在某个区间内的置信程度。例如,95%置信区间意味着,如果我们从总体中多次抽取样本,并为每个样本计算 95%置信区间,我们期望总体的真实均值(平均值)95%的时间会落在这些区间内。第二十五章介绍了几种应用该方法来估计机器学习模型预测性能的技术。另一方面,保守预测通常用于创建预测区间,旨在以某种概率覆盖真实结果。
本章简要解释了什么是预测区间以及它如何与置信区间不同,然后解释了保守预测是如何被松散地认为是一种构建预测区间的方法。
置信区间与预测区间
而置信区间侧重于描述整个总体的参数,预测区间则提供单个预测目标值的范围。例如,考虑预测人们身高的问题。假设我们从总体中抽取了 10,000 人的样本,我们可能得出平均身高为 5 英尺 7 英寸的结论。我们还可能计算出该平均值的 95%置信区间,范围从 5 英尺 6 英寸到 5 英尺 8 英寸。
然而,预测区间关注的不是估计总体的高度,而是估计单个个体的高度。例如,假设体重为 185 磅,一个人的预测区间可能介于 5 英尺 8 英寸和 6 英尺之间。
在机器学习模型的背景下,我们可以使用置信区间来估计一个总体参数,比如模型的准确性(指的是在所有可能的预测场景中的表现)。相反,预测区间估计的是对于单个给定输入示例的输出值范围。
预测区间与保守预测
保守预测和预测区间都是估计个体模型预测不确定性的统计技术,但它们通过不同的方式和不同的假设进行操作。
虽然预测区间通常假设特定的数据分布,并与特定类型的模型相关联,但保守预测方法是不依赖分布的,可以应用于任何机器学习算法。
简而言之,我们可以将符合预测看作是比预测区间更灵活、更具可泛化性的预测形式。然而,符合预测通常比传统的构建预测区间的方法需要更多的计算资源,而传统方法涉及重新采样或排列技术。
预测区域、区间和集合
在符合预测的上下文中,术语预测区间、预测集和预测区域用于表示给定实例的可能输出。使用的术语类型取决于任务的性质。
在回归任务中,输出是连续变量,预测区间提供了一个范围,真实值预计会以一定的置信度落在该范围内。例如,一个模型可能预测房价在 20 万美元到 25 万美元之间。
在分类任务中,输出是离散变量(类标签),预测集包含了所有被认为是给定实例的可能预测的类标签。例如,一个模型可能预测图像显示的是猫、狗或鸟。
预测区域是一个更通用的术语,既可以指预测区间,也可以指预测集。它描述了模型认为可能的输出集合。
计算符合预测
既然我们已经介绍了置信区间和预测区域之间的差异,并了解了符合预测方法与预测区间的关系,那么符合预测究竟是如何工作的呢?
简而言之,符合预测方法提供了一个框架,用于创建预测区域,即预测任务的潜在结果集合。根据构建这些区域所使用的假设和方法,这些区域被设计为以一定的概率包含真实结果。
对于分类器,给定输入的预测区域是一个标签集合,该集合包含具有给定置信度(通常为 95%)的真实标签,如图 26-1 所示。

图 26-1:分类任务的预测区域
如图 26-1 所示,ImageNet 数据集包含了一部分鸟类物种。在 ImageNet 中,一些鸟类物种属于以下几类之一:鹰、鸭子、老鹰或鹅。ImageNet 还包含其他动物,例如猫。对于一个新图像(这里是老鹰),符合预测集包含了那些类标签,其中真实标签老鹰以 95%的概率包含在此集合中。通常,这包括紧密相关的类别,如这里的鹰和鹅。然而,预测集也可能包含关系较远的类别标签,如猫。
为了逐步描述计算预测区域的概念,假设我们为图像训练一个机器学习分类器。在训练模型之前,数据集通常会分成三部分:训练集、校准集和测试集。我们使用训练集来训练模型,使用校准集来获取符合预测区域的参数。然后,我们可以使用测试集来评估符合预测器的性能。一个典型的分割比例可能是 60%的训练数据,20%的校准数据和 20%的测试数据。
在训练模型之后,第一步是定义一个不符合度度量,这是一个根据实例的“异常”程度将数值分配给每个校准集实例的函数。这可以基于与分类器决策边界的距离,或者更常见的是 1 减去类别标签的预测概率。得分越高,实例越异常。
在对新数据点使用符合预测之前,我们使用校准集中的不符合度得分来计算分位数阈值。这个阈值是一个概率水平,例如,在选择 95%的置信水平时,校准集中 95%的实例的不符合度得分低于此阈值。然后,使用该阈值来确定新实例的预测区域,确保预测符合所需的置信水平。
一旦我们获得了阈值,就可以计算新数据的预测区域。在这里,对于给定实例的每个可能的类别标签(分类器的每个可能输出),我们检查其不符合度得分是否低于阈值。如果低于该阈值,则将其包括在该实例的预测集内。
一个符合预测的例子
让我们通过一个简单的符合预测方法,称为得分方法,来说明这个符合预测的过程。假设我们在训练集上训练了一个分类器,用于区分三种鸟类:麻雀、知更鸟和鹰。假设校准数据集的预测概率如下:
麻雀 [0.95, 0.9, 0.85, 0.8, 0.75]
知更鸟 [0.7, 0.65, 0.6, 0.55, 0.5]
鹰 [0.4, 0.35, 0.3, 0.25, 0.2]
如图所示,我们有一个包含 15 个示例的校准集,每个类别 5 个示例。请注意,分类器会为每个训练示例返回三个概率得分:一个对应于每个类别(麻雀、知更鸟和鹰)。然而,在这里我们只选择了真实类别标签的概率。例如,我们可能会得到[0.95, 0.02, 0.03],这是第一个校准示例的预测概率,其真实标签是麻雀。在这种情况下,我们只保留了 0.95。
接下来,在获得之前的概率得分后,我们可以通过 1 减去概率来计算不符合度得分,如下所示:
麻雀 [0.05, 0.1, 0.15, 0.2, 0.25]
知更鸟 [0.3, 0.35, 0.4, 0.45, 0.5]
鹰 [0.6, 0.65, 0.7, 0.75, 0.8]
考虑到 0.95 的置信水平,我们现在选择一个阈值,使得 95%的非一致性分数低于该阈值。根据这个例子中的非一致性分数,阈值为 0.8。然后,我们可以使用这个阈值来构建我们想要分类的新实例的预测集。
现在假设我们有一个新的实例(一个新的鸟类图像),我们想要对其进行分类。我们计算该新鸟图像的非一致性分数,假设它属于训练集中的每个鸟类物种(类标签):
麻雀 0.26
知更鸟 0.45
鹰 0.9
在这种情况下,麻雀和知更鸟的非一致性分数低于 0.8 的阈值。因此,这个输入的预测集为[麻雀,知更鸟]。换句话说,这告诉我们,平均而言,真实的类标签会在 95%的时间内被包含在预测集中。
一个实现分数方法的实用代码示例可以在补充文件夹/q26_conformal-prediction中找到,网址为github.com/rasbt/MachineLearning-QandAI-book。
保守预测的好处
与使用分类器返回的类成员概率不同,保守预测的主要优势在于其理论保证和普适性。保守预测方法并不对数据的分布或所使用的模型做出任何强假设,并且可以与任何现有的机器学习算法结合使用,以提供预测的置信度度量。
置信区间具有渐近覆盖保证,这意味着随着样本(测试集)大小趋于无穷大,覆盖保证保持有效。这并不意味着置信区间仅适用于非常大的样本大小,而是它们的性质随着样本大小的增加变得更加稳健。因此,置信区间依赖于渐近性质,意味着它们的保证在样本大小增长时变得更加强大。
相比之下,保守预测提供了有限样本的保证,确保无论样本大小如何,都能实现覆盖概率。例如,如果我们为保守预测方法指定 95%的置信水平,并生成 100 个校准集及其相应的预测集,该方法将确保 100 个测试点中有 95 个包含真实类标签。这一结果不受校准集大小的影响。
虽然保守预测有许多优点,但它并不总是提供最紧密的预测区间。有时,如果特定分类器的基本假设成立,该分类器自身的概率估计可能提供更紧密、更具信息性的区间。
建议
置信区间告诉我们关于模型属性的不确定性水平,比如分类器的预测准确性。预测区间或符合性预测输出告诉我们关于模型中某个特定预测的不确定性水平。两者对于理解模型的可靠性和性能都非常重要,但它们提供的是不同类型的信息。
例如,模型预测准确性的置信区间有助于比较和评估模型,并决定部署哪个模型。另一方面,预测区间有助于在实践中使用模型并理解其预测。例如,它可以帮助识别模型不确定的情况,这时可能需要额外的数据、人类监督或采用不同的方法。
练习
26-1. 预测集的大小可能会在不同实例之间有所不同。例如,对于一个实例,预测集的大小可能为 1,而对于另一个实例,预测集的大小可能为 3。预测集的大小告诉我们什么?
26-2. 第二十五章和第二十六章集中讨论了分类方法。我们能否也使用符合性预测和置信区间进行回归呢?
参考文献
-
MAPIE 是一个流行的 Python 中用于符合性预测的库:
mapie.readthedocs.io/。 -
关于本章中使用的评分方法,详见:Christoph Molnar,《Python 中的符合性预测介绍》(2023),
christophmolnar.com/books/conformal-prediction/。 -
除了评分方法外,还有几种符合性预测方法的变体。有关符合性预测文献和资源的全面集合,请参见 Awesome Conformal Prediction 页面:
github.com/valeman/awesome-conformal-prediction。
第二十七章:适当度量**

距离函数的三个性质是什么,才能使其成为适当的度量?
度量是数学、计算机科学以及其他多个科学领域的基础。了解定义良好的距离函数的基本性质,以衡量点或数据集之间的距离或差异是非常重要的。例如,在处理神经网络中的损失函数时,理解这些函数是否像适当的度量一样表现,可以帮助了解优化算法如何收敛到一个解。
本章分析了两种常用的损失函数——均方误差和交叉熵损失,以演示它们是否符合适当度量标准的要求。
标准
为了说明适当度量的标准,我们考虑两个向量或点 v 和 w 以及它们之间的距离 d(v, w),如图 27-1 所示。

图 27-1:两个二维向量之间的欧几里得距离
适当度量的标准如下:
-
两点之间的距离始终是非负的,d(v, w) ≥ 0,只有当两点相同,即v = w时,距离才为 0。
-
距离是对称的;例如,d(v, w) = d(w, v)。
-
距离函数满足三角不等式,对任意三个点:v、w、x,意味着 d(v, w) ≤ d(v, x) + d(x, w)。
为了更好地理解三角不等式,想象这些点是三角形的顶点。如果我们考虑任何一个三角形,两边之和总是大于第三边,如图 27-2 所示。

图 27-2:三角不等式
思考一下,如果图 27-2 中描述的三角不等式不成立,会发生什么。如果 AB 边和 BC 边的长度之和短于 AC 边,那么 AB 边和 BC 边就无法相交形成一个三角形;相反,它们会相互错开。因此,它们相交并形成三角形,证明了三角不等式的成立。
均方误差
均方误差 (MSE) 损失计算目标变量 y 和预测目标值 ŷ 之间的平方欧几里得距离:

索引 i 表示数据集或样本中的第 i 个数据点。这个损失函数是适当的度量吗?
为了简化起见,我们将考虑两个数据点之间的平方误差 (SE) 损失(尽管以下的见解也适用于均方误差 MSE)。如以下公式所示,SE 损失量化了预测值与实际值之间的平方差,对于单个数据点而言,而 MSE 损失则是将这些平方差在数据集中的所有数据点上求平均:

在这种情况下,SE 满足第一个标准的第一部分:两个点之间的距离总是非负的。由于我们将差值平方,因此它不能是负数。
第二个标准如何呢?即只有当两个点相同时,距离才可以为 0?由于在平方误差(SE)中的减法操作,可以直观地看出,只有当预测值与目标变量匹配时,y = ŷ,它才能为 0。与第一个标准一样,我们可以通过平方来确认 SE 满足第二个标准:我们有(y – ŷ)² = (ŷ – y)²。
初看之下,似乎平方误差损失也满足第三个标准,即三角不等式。直观上,你可以通过选择三个任意数字来检查这一点,这里是 1, 2, 3:
-
(1 – 2)² ≤ (1 – 3)² + (2 – 3)²
-
(1 – 3)² ≤ (1 – 2)² + (2 – 3)²
-
(2 – 3)² ≤ (1 – 2)² + (1 – 3)²
然而,存在一些值使得此公式不成立。例如,考虑值 a = 0, b = 2, 和 c = 1。这样我们得到 d(a, b) = 4, d(a, c) = 1, 和 d(b, c) = 1,产生以下情形,这违反了三角不等式:
-
(0 – 2)² ≰ (0 – 1)² + (2 – 1)²
-
(2 – 1)² ≤ (0 –1)² + (0 – 2)²
-
(0 – 1)² ≤ (0 –2)² + (1 – 2)²
由于以上示例不满足三角不等式,我们得出结论,(均方)误差损失不是一个合适的度量标准。
然而,如果我们将平方误差转变为根平方误差

三角不等式可以得到满足:

注意
你可能熟悉 L[2] 距离或欧几里得距离,它已知满足三角不等式。这两种距离度量在考虑两个标量值时与根平方误差等价。
交叉熵损失
交叉熵用于衡量两个概率分布之间的距离。在机器学习中,当我们训练逻辑回归或神经网络分类器,在包含n个训练样本的数据集上时,我们使用类标签 y 和预测概率 p 之间的离散交叉熵损失(CE):

这个损失函数是一个合适的度量标准吗?为了简单起见,我们将只考虑两个数据点之间的交叉熵函数(H):

交叉熵损失满足第一个标准的一部分:距离始终非负,因为概率值是[0, 1]范围内的数字。因此,log(p)的范围在–∞到 0 之间。重要的是,H函数包含一个负号。因此,交叉熵的范围在∞和 0 之间,符合上面显示的第一个标准的一个方面。
然而,交叉熵损失在两个相同点时并不为 0。例如,H(0.9, 0.9) = –0.9 × log(0.9) = 0.095。
上面显示的第二个标准也被交叉熵损失违反,因为该损失不是对称的:–y × log(p) ≠ –p × log(y)。我们通过一个具体的数值例子来说明:
-
如果 y = 1 且 p = 0.5,那么 –1 × log(0.5) = 0.693。
-
如果 y = 0.5 且 p = 1,那么 –0.5 × log(1) = 0。
最后,交叉熵损失不满足三角不等式,H(r, p) ≥ H(r, q) + H(q, p)。我们通过一个例子来说明这一点。假设我们选择 r = 0.9,p = 0.5 和 q = 0.4。我们得到:
-
H(0.9, 0.5) = 0.624
-
H(0.9, 0.4) = 0.825
-
H(0.4, 0.5) = 0.277
如你所见,0.624 ≥ 0.825 + 0.277 在这里不成立。
总结来说,尽管交叉熵损失是通过(随机)梯度下降训练神经网络时有用的损失函数,但它不是一个合适的距离度量,因为它不满足三个标准中的任何一个。
练习
27-1. 假设我们考虑使用平均绝对误差(MAE)作为衡量机器学习模型表现的替代指标,而不是均方根误差(RMSE),其中
和
。然而,一位同事认为 MAE 不是度量空间中的合适距离度量,因为它涉及绝对值,因此我们应该使用 RMSE。这个论点是否正确?
27-2. 根据你对上一问题的回答,你认为 MAE 比 RMSE 更好还是更差?
第二十八章:K 折交叉验证中的 K 值

k-折交叉验证是评估机器学习分类器的常见选择,因为它使我们能够使用所有训练数据来模拟机器学习算法在新数据上的表现。选择较大k的优缺点是什么?
我们可以将k-折交叉验证视为当数据有限时进行模型评估的一种解决方案。在机器学习模型评估中,我们关注模型的泛化性能,即它在新数据上的表现如何。在k-折交叉验证中,我们通过将训练数据划分为k个验证轮次和折叠,利用训练数据进行模型选择和评估。如果我们有k个折叠,我们就有k次迭代,产生k个不同的模型,如图 28-1 所示。

图 28-1:一个k-折交叉验证用于模型评估的示例,其中k=5
使用k-折交叉验证时,我们通常通过计算k个模型的平均表现来评估特定超参数配置的表现。这个表现反映或近似于在评估后通过完整训练数据集训练得到的模型的表现。
以下部分将讨论在k-折交叉验证中选择k值的权衡,并探讨较大k值及其计算需求,尤其是在深度学习背景下的挑战。接着我们将讨论k的核心用途,以及如何根据具体的建模需求选择适当的值。
选择 k 值时的权衡
如果k过大,不同交叉验证轮次之间的训练集会过于相似。因此,k个模型与通过在整个训练集上训练得到的模型非常相似。在这种情况下,我们仍然可以利用k-折交叉验证的优势:通过每轮中保留的验证折叠来评估整个训练集的表现。(这里,我们通过将每次迭代中所有k - 1 个训练折叠连接在一起,得到训练集。)然而,大k的一个缺点是,分析具有特定超参数设置的机器学习算法在不同训练数据集上的表现变得更加困难。
除了数据集过于相似的问题,使用较大值的k进行 k 折交叉验证在计算上也更为复杂。较大的k会增加迭代次数和每次迭代中的训练集大小,因此计算成本更高。如果我们使用的是相对较大的模型,训练代价较高,如当代深度神经网络,这个问题尤为严重。
k的常见选择通常是 5 或 10,出于实际和历史原因。Ron Kohavi 的一项研究(请参见本章末的“参考文献”)发现,k = 10 对于经典机器学习算法(如决策树和朴素贝叶斯分类器)在一些小型数据集上的偏差和方差平衡效果良好。
例如,在 10 折交叉验证中,我们每轮使用 9/10(90%)的数据进行训练,而在 5 折交叉验证中,我们每轮仅使用 4/5(80%)的数据,如图 28-2 所示。

图 28-2:5 折交叉验证与 10 折交叉验证的比较
然而,这并不意味着大的训练集不好,因为如果我们假设模型训练可以从更多的训练数据中获益,较大的训练集可以减少性能估计的悲观偏差(这通常是件好事)。(有关学习曲线的示例,请参见图 5-1 在第 24 页的内容。)
在实际操作中,过小或过大的k可能会增加方差。例如,较大的k使得训练折叠之间的相似性更强,因为较小的比例数据被留作验证集。由于训练折叠之间更为相似,每轮中的模型也会更为相似。在实践中,我们可能会发现,较大的k值下,验证折叠得分的方差较小。另一方面,当k值较大时,验证集较小,因此可能包含更多的随机噪声,或更容易受到数据特征的影响,从而导致不同折叠间的验证得分差异更大。尽管模型本身更为相似(因为训练集更相似),但验证得分可能会更容易受到小型验证集的特殊性影响,从而导致整体交叉验证得分的方差更大。
确定适当的 k 值
在决定适当的k值时,我们通常会受到计算性能和常规的指导。然而,定义使用k-折交叉验证的目的和背景是值得的。例如,如果我们主要关心近似最终模型的预测性能,使用较大的k值是有意义的。这样,训练折叠与合并的训练数据集非常相似,同时我们仍然可以通过验证折叠在所有数据点上评估模型。
另一方面,如果我们关心评估给定的超参数配置和训练管道对不同训练数据集的敏感性,那么选择一个较小的k值更为合理。
由于大多数实际场景包括两个步骤——调整超参数和评估模型性能——我们也可以考虑采用两步程序。例如,在调整超参数时,可以使用较小的k。这将有助于加速超参数搜索并探测超参数配置的鲁棒性(除了平均性能外,我们还可以将方差作为选择标准)。然后,在超参数调整和选择之后,我们可以增加k的值来评估模型。
然而,重复使用相同的数据集进行模型选择和评估会引入偏差,通常最好使用单独的测试集进行模型评估。此外,嵌套交叉验证可能是k-折交叉验证的替代方法。
练习
28-1. 假设我们希望为模型提供尽可能多的训练数据。我们考虑使用留一交叉验证(LOOCV),这是k-折交叉验证的特例,其中k等于训练样本的数量,这样验证集仅包含一个数据点。一位同事提到,对于不连续的损失函数和性能度量(如分类准确度),LOOCV 存在缺陷。例如,对于仅包含一个样本的验证集,准确率始终为 0(0%)或 1(99%)。这真的是一个问题吗?
28-2. 本章讨论了模型选择和模型评估作为k-折交叉验证的两个应用场景。你能想到其他应用场景吗?
参考文献
-
如需更详细的解释,了解为何以及如何使用k-折交叉验证,请参阅我的文章:《机器学习中的模型评估、模型选择与算法选择》(2018),*
arxiv.org/abs/1811.12808*。 -
推荐选择k = 5 和k = 10 的论文:Ron Kohavi,“《交叉验证与自助法在准确性估计和模型选择中的应用研究》”(1995),*
dl.acm.org/doi/10.5555/1643031.1643047*。
第二十九章:训练集和测试集不一致

假设我们训练的模型在测试集上的表现远好于在训练集上的表现。由于先前在类似数据集上,类似的模型配置表现良好,我们怀疑数据可能有些不对劲。我们可以采取哪些方法来检查训练集和测试集之间的差异,又可以使用哪些策略来缓解这些问题?
在更详细地调查数据集之前,我们应该检查数据加载和评估代码中的技术问题。例如,一个简单的合理性检查是暂时将测试集替换为训练集,并重新评估模型。在这种情况下,我们应该看到训练集和测试集的表现是相同的(因为这两个数据集现在是相同的)。如果我们发现差异,很可能是代码中有 bug;根据我的经验,这类 bug 常常与错误的洗牌或不一致(通常是缺失的)数据归一化有关。
如果测试集的表现远好于训练集的表现,我们可以排除过拟合的可能性。更有可能的是,训练集和测试集的分布存在显著差异。这些分布差异可能会影响特征和目标。在这种情况下,绘制训练集和测试集的目标或标签分布是一个好主意。例如,一个常见的问题是,如果数据集在划分为训练集和测试集之前没有正确洗牌,测试集可能会缺失某些类别标签。对于小型表格数据集,也可以通过直方图比较训练集和测试集中的特征分布。
查看特征分布对于表格数据是一个不错的方法,但对于图像和文本数据来说,这就比较棘手了。一种相对简单且更通用的方法来检查训练集和测试集之间的差异是对抗验证。
对抗验证,如图 29-1 所示,是一种识别训练数据和测试数据相似度的技术。我们首先将训练集和测试集合并成一个数据集,然后创建一个二元目标变量,用于区分训练数据和测试数据。例如,我们可以使用一个新的 是否为测试集? 标签,其中将标签 0 分配给训练数据,标签 1 分配给测试数据。接下来,我们使用 k 折交叉验证或重新划分数据集为训练集和测试集,并像往常一样训练机器学习模型。理想情况下,我们希望模型表现较差,这表明训练数据和测试数据的分布是相似的。另一方面,如果模型在预测 是否为测试集? 标签时表现良好,那么就表明训练集和测试集之间存在差异,我们需要进一步调查。

图 29-1:用于检测训练集和测试集差异的对抗验证工作流
如果我们在使用对抗性验证时检测到训练集和测试集之间的不一致,我们应该采用什么缓解技术?如果我们处理的是表格数据集,我们可以逐一去除特征,看看这是否有助于解决问题,因为一些虚假的特征有时可能与目标变量高度相关。为了实施这一策略,我们可以使用带有更新目标的顺序特征选择算法。例如,我们可以通过最小化分类准确率来代替最大化分类准确率。对于去除特征不那么简单的情况(例如图像和文本数据),我们还可以调查是否通过去除与测试集不同的单个训练实例来解决不一致问题。
练习
29-1. 对于对抗性预测任务,什么是一个好的性能基准?
29-2. 由于训练数据集通常比测试数据集大,对抗性验证往往会导致一个不平衡的预测问题(大多数标记为Is test?的示例为假而不是正确)。这是否是一个问题?如果是,我们该如何缓解这一点?
第三十章:有限标签数据

假设我们绘制一条学习曲线(例如,如图 5-1 所示,位于第 24 页),并发现机器学习模型出现过拟合,可能需要更多的训练数据。有哪些不同的方法可以处理监督学习中有限标签数据的问题?
在无法收集更多数据的情况下,我们可以使用一些与常规监督学习相关的方法,在有限标签数据的情况下提高模型性能。
在有限标签数据下提高模型性能
以下章节探讨了在训练数据有限的情况下,有助于解决问题的各种机器学习范式。
标签更多数据
收集更多的训练样本通常是提高模型性能的最佳方法(学习曲线是诊断这一点的好工具)。然而,在实际中,这往往是不可行的,因为获取高质量的数据可能很昂贵,计算资源和存储可能不足,或者数据可能难以获取。
引导数据
类似于第五章中讨论的减少过拟合的技术,通过生成修改过的(增强的)或人工的(合成的)训练样本来“引导”数据,能够提升预测模型的性能。当然,提升数据质量也可以提高模型的预测性能,正如在第二十一章中讨论的那样。
迁移学习
迁移学习描述了在通用数据集(例如 ImageNet)上训练一个模型,然后对预训练的目标数据集(例如一个包含不同鸟类物种的数据集)进行微调,如图 30-1 中所示。

图 30-1:迁移学习的过程
迁移学习通常是在深度学习的背景下进行的,其中模型的权重可以被更新。这与基于树的方法不同,因为大多数决策树算法是非参数模型,不支持迭代训练或参数更新。
自监督学习
类似于迁移学习,在自监督学习中,模型会在不同的任务上进行预训练,然后微调以适应目标任务,而该任务只有有限的数据。然而,自监督学习通常依赖于可以直接从未标注数据中自动提取的标签信息。因此,自监督学习通常也被称为无监督预训练。
自监督学习的常见例子包括语言建模中的下一个词(例如 GPT 使用)或掩蔽词(例如 BERT 使用)预训练任务,更多细节请参见第十七章。另一个来自计算机视觉的直观例子是图像修复:预测随机移除的图像缺失部分,如图 30-2 所示。

图 30-2:自监督学习中的图像修复
关于自监督学习的更多细节,请参见第二章。
主动学习
在主动学习中,如图 30-3 所示,我们通常涉及人工标注者或用户在学习过程中的反馈。然而,主动学习并不是一开始就标注整个数据集,而是通过优先级方案建议未标注的数据点进行标注,以最大化机器学习模型的性能。

图 30-3:在主动学习中,模型向 oracle 请求标签。
主动学习一词指的是模型主动选择数据进行标注。例如,最简单的主动学习形式是选择预测不确定性较高的数据点,由人工标注员进行标注(也称为oracle)。
少量样本学习
在少量样本学习的场景中,我们通常处理的是包含每个类别仅少量示例的极小数据集。在研究中,1-shot(每个类别一个示例)和 5-shot(每个类别五个示例)学习场景非常常见。少量样本学习的极端案例是零样本学习,在这种情况下没有提供标签。零样本学习的流行例子包括 GPT-3 及相关语言模型,在这些模型中,用户必须通过输入提示提供所有必要的信息,如图 30-4 所示。

图 30-4:使用 ChatGPT 进行零样本分类
关于少量样本学习的更多细节,请参见第三章。
元学习
元学习涉及开发方法来确定机器学习算法如何最好地从数据中学习。因此,我们可以将元学习看作是“学习如何学习”。机器学习社区已经开发了几种元学习方法。在机器学习社区中,元学习不仅代表多个子类别和方法;有时它也用来描述相关但不同的过程,导致其在解释和应用上的细微差别。
元学习是少样本学习的主要子类别之一。在这里,重点是学习一个好的特征提取模块,该模块将支持集和查询图像转换为向量表示。这些向量表示通过与支持集中的训练示例进行比较,优化用于确定查询示例的预测类别。(这种元学习形式在第三章的第 17 页中有说明。)
另一个与少样本学习方法无关的元学习分支,专注于从数据集中提取元数据(也称为元特征)用于监督学习任务,如图 30-5 所示。元特征是数据集本身的描述。例如,这些可以包括特征的数量和不同特征的统计数据(峰度、范围、均值等)。

图 30-5:涉及提取元数据的元学习过程
提取的元特征为选择适合当前数据集的机器学习算法提供了信息。通过这种方法,我们可以缩小算法和超参数的搜索空间,从而帮助减少数据集较小时的过拟合。
弱监督学习
弱监督学习,如图 30-6 所示,涉及使用外部标签源为未标记的数据集生成标签。通常,弱监督标签函数生成的标签比人工或领域专家生成的标签更嘈杂或不准确,因此称为弱监督。我们可以开发或采用基于规则的分类器来创建弱监督学习中的标签;这些规则通常只涵盖未标记数据集的一个子集。

图 30-6:弱监督学习使用外部标签函数来训练机器学习模型。
让我们回到第二十三章中的电子邮件垃圾邮件分类示例,来说明一种基于规则的数据标注方法。在弱监督下,我们可以基于电子邮件主题行中的关键词SALE设计一个基于规则的分类器来识别一部分垃圾邮件。请注意,虽然我们可以使用此规则将某些电子邮件标记为垃圾邮件正例,但不应将没有SALE的邮件标记为非垃圾邮件。相反,我们应该将这些邮件保持未标记状态,或者为它们应用不同的规则。
弱监督学习有一个子类别称为 PU 学习。在PU 学习中,PU是正样本-未标记学习的缩写,我们只标记和学习正样本。
半监督学习
半监督学习与弱监督学习密切相关:它也涉及为数据集中未标记的实例创建标签。这两种方法之间的主要区别在于如何创建标签。在弱监督中,我们使用外部标注函数创建标签,这些函数通常是嘈杂、不准确的,或者仅覆盖数据的一个子集。在半监督中,我们不使用外部标注函数;相反,我们利用数据本身的结构。例如,我们可以根据邻近已标记数据点的密度为额外的数据点打标签,如图 30-7 所示。

图 30-7:半监督学习
尽管我们可以将弱监督应用于完全未标记的数据集,半监督学习则要求至少有一部分数据是已标记的。在实践中,通常先应用弱监督对数据的一个子集进行标注,然后使用半监督学习对未被标注函数捕捉到的实例进行标注。
由于它们之间的紧密关系,半监督学习有时被称为弱监督学习的一个子类别,反之亦然。
自训练
自训练介于半监督学习和弱监督学习之间。对于这种技术,我们训练一个模型来标注数据集,或者采用现有模型来完成同样的任务。这个模型也被称为伪标签生成器。
自训练并不能保证标签的准确性,因此它与弱监督学习相关。此外,尽管我们使用或采用机器学习模型进行伪标签生成,自训练也与半监督学习相关。
自训练的一个例子是知识蒸馏,在第六章中讨论过。
多任务学习
多任务学习训练神经网络来处理多个理想上相关的任务。例如,如果我们训练一个分类器来检测垃圾邮件,那么垃圾邮件分类就是主要任务。在多任务学习中,我们可以为模型添加一个或多个相关任务来解决,这些被称为辅助任务。对于垃圾邮件的例子,一个辅助任务可能是对邮件的主题或语言进行分类。
通常,多任务学习是通过多个损失函数来实现的,这些损失函数需要同时优化,每个任务对应一个损失函数。辅助任务作为归纳偏置,引导模型优先选择能够解释多个任务的假设。这种方法通常会使模型在未见数据上的表现更好。
多任务学习有两个子类别:硬参数共享的多任务学习和软参数共享的多任务学习。图 30-8 展示了这两种方法之间的区别。

图 30-8:多任务学习的两种主要类型
在硬参数共享中,如图 30-8 所示,只有输出层是特定于任务的,而所有任务共享相同的隐藏层和神经网络骨干架构。相比之下,软参数共享使用独立的神经网络处理每个任务,但会应用正则化技术,如在参数层之间最小化距离,以鼓励网络间的相似性。
多模态学习
多任务学习涉及使用多个任务和损失函数训练一个模型,而多模态学习则侧重于融合多种类型的输入数据。
多模态学习的常见示例是同时处理图像和文本数据的架构(尽管多模态学习不限于两种模态,可以应用于任意数量的输入模态)。根据任务的不同,我们可以使用匹配损失,迫使相关图像和文本之间的嵌入向量相似,如图 30-9 所示。(有关嵌入向量的更多信息,请参见第一章。)

图 30-9:带有匹配损失的多模态学习
图 30-9 展示了图像和文本编码器作为独立组件。图像编码器可以是卷积骨干网络或视觉变换器,而语言编码器可以是循环神经网络或语言变换器。然而,现如今,通常使用一个基于变换器的模块,可以同时处理图像和文本数据。例如,VideoBERT 模型有一个联合模块,处理视频和文本,用于动作分类和视频字幕生成。
如图 30-9 所示,优化匹配损失对于学习可应用于各种任务的嵌入是有用的,如图像分类或摘要。然而,也可以直接优化目标损失,如图 30-10 所示,进行分类或回归。

图 30-10:用于优化监督学习目标的多模态学习
图 30-10 展示了从两个不同传感器收集的数据。一个可能是温度计,另一个可能是视频摄像机。信号编码器将信息转换为嵌入(共享相同的维度数),然后将它们连接起来,形成模型的输入表示。
直观上,结合来自不同模态的数据的模型通常比单一模态模型表现更好,因为它们可以利用更多的信息。此外,最近的研究表明,多模态学习成功的关键在于潜在空间表示质量的提高。
归纳偏差
选择具有更强归纳偏差的模型可以通过对数据结构做出假设,从而帮助减少数据需求。例如,由于卷积网络的归纳偏差,它们比视觉变换器需要更少的数据,正如第十三章中讨论的那样。
建议
在所有这些减少数据需求的技术中,我们应如何决定在特定情况下使用哪些方法?
像收集更多数据、数据增强和特征工程这样的技术与本章讨论的所有方法兼容。多任务学习和多模态输入也可以与这里概述的学习策略结合使用。如果模型出现过拟合,我们还应该使用第五章和第六章中讨论的技术。
但我们如何在主动学习、少样本学习、迁移学习、自监督学习、半监督学习和弱监督学习之间做出选择呢?决定尝试哪种监督学习技术非常依赖于具体的情境。你可以参考图 30-11 中的图示,帮助你选择最适合你项目的方法。

图 30-11:选择监督学习技术的建议
请注意,图 30-11 中的黑色框不是终端节点,而是回到第二个框“评估模型性能”;为了避免视觉杂乱,省略了额外的箭头。
练习
30-1. 假设我们被要求构建一个机器学习模型,该模型利用图像检测类似 iPad 的平板设备外壳上的制造缺陷。我们有数百万张未标记的各类计算设备图像,包括智能手机、平板电脑和计算机;成千上万张标记了不同类型损坏的智能手机图片;以及数百张专门与检测平板设备制造缺陷相关的标记图像。我们该如何通过自监督学习或迁移学习来解决这个问题?
30-2. 在主动学习中,选择困难的样本供人工检查和标注通常基于置信度评分。神经网络可以通过在输出层使用逻辑 sigmoid 或 softmax 函数来计算类别归属概率,从而提供这样的评分。然而,普遍认为,深度神经网络在面对分布外数据时表现出过度自信,这使得它们在主动学习中的应用变得低效。对于主动学习,如何使用深度神经网络获取置信度评分的其他方法有哪些?
参考文献
-
尽管增量学习的决策树并不常见,但确实存在用于以迭代方式训练决策树的算法:
en.wikipedia.org/wiki/Incremental_decision_tree。 -
使用多任务学习训练的模型通常优于单一任务训练的模型:Rich Caruana,“多任务学习”(1997),
doi.org/10.1023%2FA%3A1007379606734。 -
一个基于 Transformer 的单一模块,可以同时处理图像和文本数据:Chen Sun 等人,“VideoBERT:一种用于视频和语言表示学习的联合模型”(2019),
arxiv.org/abs/1904.01766。 -
上述研究表明,多模态学习成功的关键是潜在空间表示质量的提升:Yu Huang 等人,“是什么使多模态学习比单一模态更好(可以证明)”(2021),
arxiv.org/abs/2106.04538。 -
欲了解更多关于主动学习的信息:Zhen 等人,“深度主动学习的比较调查”(2022),
arxiv.org/abs/2203.13450。 -
关于如何分布外数据可能导致深度神经网络过度自信的详细讨论:Anh Nguyen, Jason Yosinski 和 Jeff Clune,“深度神经网络容易被愚弄:对于无法识别图像的高置信度预测”(2014),
arxiv.org/abs/1412.1897。
第三十一章:后记

本书带你走过了一段旅程,首先介绍了机器学习的基础概念,如嵌入、潜在空间和表示,然后深入探讨了先进的技术和架构,包括自监督学习、少样本学习和变压器。书中还涉及了许多实用技术,如模型部署、多 GPU 训练和数据中心的人工智能,并深入探讨了计算机视觉和自然语言处理等专业领域。
本书的每一章不仅为你提供了概念性的知识,还提供了实用的见解,使得本书在学术和现实世界应用中都非常有用。无论你是一个有抱负的数据科学家、机器学习工程师,还是对快速发展的人工智能领域感到好奇,我希望这本书对你有所帮助。
如果你觉得本书有价值,我将非常感激你分享你的阅读经验,并将本书推荐给其他可能也会受益的人。我也很乐意听取任何评论和建议。欢迎随时在本书的官方论坛上讨论,网址是github.com/rasbt/MachineLearning-QandAI-book/discussions。你还可以查看sebastianraschka.com/contact/,了解与我联系的最佳方式。
感谢阅读,祝你在迷人的机器学习和人工智能世界中一切顺利。
附录:习题答案
第一章
1-1. 输出层之前的最后一层(在这种情况下是第二个全连接层)可能对嵌入最为有用。然而,我们也可以使用所有其他中间层来创建嵌入。由于后面的层通常会学习更高层次的特征,这些层通常在语义上更有意义,更适合不同类型的任务,包括相关的分类任务。
1-2. 与嵌入(embeddings)不同的一种传统输入表示方法是独热编码(one-hot encoding),如第一章所讨论的那样。在这种方法中,每个类别变量使用一个二进制向量表示,其中只有一个值是“热”或激活的(例如,设为 1),而所有其他位置则保持不活跃(例如,设为 0)。
另一种不是嵌入的表示方式是直方图。一个典型的例子是图像直方图(参见 en.wikipedia.org/wiki/Image_histogram 了解更多示例)。这些直方图提供了数字图像中色调分布的图形表示,捕捉了像素的强度分布。
此外,词袋模型提供了一种与嵌入不同的方法。在这种模型中,输入句子被表示为一个无序的词集合或“袋”,忽略了语法甚至词序。有关词袋模型的更多细节,请参见 en.wikipedia.org/wiki/Bag-of-words_model。
第二章
2-1. 将自监督学习应用于视频数据的一种方法是预测视频中的下一帧。这类似于在 GPT 等大型语言模型中的下一词预测。这种方法挑战模型预测序列中的后续事件或动作,赋予它对内容的时间理解。
另一种方法是预测缺失或被遮盖的帧。这个想法受到了像 BERT 这样的巨大语言模型的启发,其中某些词被遮盖,模型的任务是预测这些词。在视频的情况下,可以遮盖整个帧,模型根据周围帧提供的上下文学习插值并预测被遮盖的帧。
图像修复(Inpainting)是视频自监督学习的另一种途径。在这种方法中,不是遮盖整个帧,而是遮盖帧中的特定像素区域。然后,模型被训练去预测缺失或被遮盖的部分,这有助于它掌握视频内容中的细粒度视觉细节和空间关系。
最后,可以使用一种着色技术,将视频转换为灰度图像,然后模型的任务是预测颜色。这不仅教会模型物体的原始颜色,还能提供对光照、阴影和场景整体氛围的理解。
2-2. 我们可以移除(掩码)特征值,并训练一个模型来预测这些值,类似于经典的数据插补方法。例如,使用这种方法的一个方法是 TabNet;参见 Sercan O. Arik 和 Tomas Pfister,《TabNet:通过注意力机制解释性学习表格数据》(2019), arxiv.org/abs/1908.07442。
也可以通过在原始特征空间或嵌入空间中生成训练样本的增强版本来使用对比学习。例如,SAINT 和 SCARF 方法采用了这种方法。关于前者,请参阅 Gowthami Some-palli 等人,《SAINT:通过行注意力和对比预训练改进的表格数据神经网络》(2021), arxiv.org/abs/2106.01342。关于后者,请参阅 Dara Bahri 等人,《SCARF:使用随机特征破坏的自监督对比学习》(2021), arxiv.org/abs/2106.15147。
第三章
3-1. 类似于监督学习方法,我们首先将数据集划分为训练集和测试集。然后,我们进一步将训练集和测试集划分为子集,每个子集包含一个来自每个类别的图像。为了设计训练任务,我们只考虑一个子集的类别,例如类别(数字)0、1、2、5、6、8、9。接下来,在测试时,我们使用剩余的类别 3、4、7。对于每个分类任务,神经网络每次接收一个图像示例。
3-2. 考虑一种稀有疾病的医学影像场景。训练数据集可能仅包含少数对应不同类型疾病的示例,而少样本系统可能只对新出现的稀有疾病(训练集中没有的疾病)有一例或几例案例。任务是根据这一有限的示例数量识别新的稀有疾病。
另一个少样本系统的例子是推荐系统,该系统只有有限数量的用户评分项。基于这些有限的示例,模型必须预测用户可能喜欢的未来产品。假设有一个仓库机器人,随着公司库存的增加,机器人必须学习识别新物品。机器人需要根据仅有的几个例子学习识别并适应这些新物品。
第四章
4-1. 你可以尝试增加初始神经网络的大小。可能所选择的网络太小,无法包含适合的子网络。
另一个选择是尝试不同的随机初始化(例如,通过更改随机种子)。彩票假设认为,某些 随机初始化的网络包含可以通过剪枝获得的高度准确的子网络,但并非所有网络都有这样的子网络。
4-2. 当使用 ReLU 激活函数训练神经网络时,如果函数输入小于 0,特定的激活值将被设置为 0。这导致隐藏层中的某些节点不参与计算,这些节点有时被称为死神经元。虽然 ReLU 激活函数不会直接导致稀疏权重,但零激活输出有时会导致无法恢复的零权重。这一观察结果支持了彩票假说,该假说认为训练良好的网络可能包含具有稀疏且可训练权重的子网络,这些权重可以在不损失准确度的情况下进行修剪。
第五章
5-1. XGBoost 是一个基于树的梯度提升实现,当前版本不支持迁移学习。与人工神经网络不同,XGBoost 是一个非参数模型,我们不能轻易地在新数据到达时更新它;因此,常规的迁移学习在这里是行不通的。
然而,我们可以将一个 XGBoost 模型在某个任务上训练得到的结果作为另一个 XGBoost 模型的特征。考虑两个数据集的特征集合重叠。例如,我们可以为合并后的数据集设计一个自监督的分类任务。然后,我们可以在目标数据集上训练第二个 XGBoost 模型,该模型以原始特征集作为输入,并结合第一个 XGBoost 模型的输出。
5-2. 在应用数据增强时,我们通常还需要增加训练时间;因此,可能需要更长时间来训练模型。
或者,我们可能应用了过多的数据增强。过度增强数据可能导致过度变化,这些变化并不反映数据中的自然变化,从而导致过拟合或对新数据的泛化能力差。以 MNIST 为例,这也可能包括对图像进行平移或裁剪,使得由于缺失部分而使数字变得无法识别。
另一种可能性是我们应用了过于简单、领域不一致的数据增强。例如,假设我们正在对图像进行垂直或水平翻转。如果是 MNIST 数据集,这样做就没有意义,因为将手写数字垂直或水平翻转会生成现实中不存在的数字。
第六章
6-1. 调整训练周期数是一个更简单且更普遍的方法。这对于不支持模型检查点的旧框架尤为适用。因此,改变训练周期数可能是一个更容易的解决方案,尤其适用于小型数据集和模型,在这些情况下,每个超参数配置的运行和评估成本较低。此方法还避免了在训练过程中需要监控验证集性能,使得使用起来更加简单和直接。
提前停止和检查点方法对于训练成本高昂的模型特别有用。通常,它也是一种更灵活和更强健的防止过拟合的方法。然而,这种方法的一个缺点是,在噪声较大的训练环境下,我们可能会优先选择一个较早的训练周期,即使验证集的准确度并不能很好地估计泛化精度。
6-2. 集成方法的一个显而易见的缺点是计算成本增加。例如,如果我们建立一个包含五个神经网络的神经网络集成,那么这个集成的成本可能是单个模型的五倍。
尽管我们通常会考虑上述的推理成本,但存储成本的增加是另一个显著的限制因素。如今,大多数计算机视觉和语言模型拥有数百万甚至数十亿个参数,这些参数必须在分布式环境中存储。模型集成使得这一问题更加复杂。
使用模型集成时,降低可解释性是我们需要承担的另一个成本。理解和分析单个模型的预测已经是一个挑战。根据集成方法的不同,我们可能会增加额外的复杂度,从而降低可解释性。
第七章
7-1. Adam 优化器实现了一种带有内部权重参数的自适应方法。Adam 每个模型参数有两个优化器参数(均值和方差),因此我们不仅需要拆分模型的权重张量,还需要拆分优化器的状态以应对内存限制。(请注意,这在大多数 DeepSpeed 并行化技术中已经实现。)
7-2. 数据并行性理论上可以在 CPU 上工作,但其好处将是有限的。例如,和在 CPU 内存中复制模型以并行训练多个不同数据批次的模型相比,增加数据吞吐量可能更为合理。
第八章
8-1. 自注意力机制由于n对n的比较(其中n是输入序列的长度)而具有二次计算和内存复杂度,这使得与其他神经网络架构相比,变换器的计算成本较高。此外,像 GPT 这样的解码器风格变换器生成输出是一次生成一个标记,这在推理时不能并行化(尽管正如在第八章中讨论的那样,生成每个标记仍然是高度并行化的)。
8-2. 是的,我们可以将自注意力看作一种特征选择方式,尽管它与其他类型的特征选择存在差异。在这种情况下,区分硬注意力和软注意力非常重要。软注意力为所有输入计算重要性权重,而硬注意力则选择输入的一个子集。硬注意力更像是掩码操作,其中某些输入被设置为 0 或 1,而软注意力允许一个连续的范围的权重。注意力与特征选择的主要区别在于,特征选择通常是一个固定操作,而注意力权重是基于输入动态计算的。在特征选择算法中,选定的特征始终是相同的,而在注意力机制中,权重则可以根据输入变化。
第九章
9-1. 自动化这种评估本身就很困难,目前的黄金标准仍然基于人工评估和判断。然而,也存在一些度量标准作为定量指标。
为了评估生成图像的多样性,可以比较生成样本的条件类别分布和边际类别分布,例如使用 Kullback–Leibler 散度(KL 散度)正则化项。这种度量方法在 VAE 中也用于使潜在空间向量类似于标准高斯分布。KL 散度项越高,生成的图像多样性越大。
还可以将生成图像的统计数据与真实图像进行比较,使用预训练模型的特征空间,如作为图像分类器训练的卷积网络。如果相似度很高(或距离很小),则表示这两个分布彼此接近,这通常是图像质量更好的标志。这种方法通常也被称为Fréchet 起始距离方法。
9-2. 像 GAN、VAE 或扩散模型的生成器一样,一致性模型也将从简单分布(如标准高斯分布)中采样的噪声张量作为输入,生成新的图像。
第十章
10-1. 是的,我们可以通过设置k = 1 来使 top-k采样具有确定性,这样模型在生成输出文本时会始终选择具有最高概率分数的单词作为下一个单词。
我们还可以使核采样具有确定性,例如通过设置概率质量阈值p,使其仅包括一个项目,该项目要么恰好满足阈值,要么超过阈值。这将使模型始终选择具有最高概率的标记。
10-2. 在某些情况下,推理过程中丢弃层的随机行为是可以接受的,例如在使用单一模型构建模型集成时。(如果没有丢弃层中的随机行为,模型对于给定输入将始终产生相同的结果,这样集成模型就没有意义了。)
此外,dropout 中的随机推理行为对于鲁棒性测试非常有用。对于关键应用,如医疗保健或自动驾驶,理解模型的微小变化如何影响其预测至关重要。通过使用确定性 dropout 模式,我们可以模拟这些微小变化并测试模型的鲁棒性。
第十一章
11-1. SGD 只有学习率作为超参数,但没有其他参数。因此,除了在反向传播过程中为每个权重参数计算的梯度(包括计算梯度所需的层激活值)之外,它不会增加任何额外的参数存储。
Adam 优化器更为复杂,且需要更多的存储。具体来说,Adam 会为每个参数保存过去梯度的指数衰减平均值(第一矩)和过去平方梯度的指数衰减平均值(第二原矩)。因此,对于网络中的每个参数,Adam 需要存储两个额外的值。如果网络中有 n 个参数,Adam 需要为 2n 个额外的参数分配存储空间。
如果网络中有 n 个可训练参数,Adam 会增加 2n 个参数用于跟踪。例如,在 AlexNet 中,网络包含 26,926 个参数(如练习 1-1 中所计算),因此 Adam 总共需要额外的 53,852 个值(2 × 26,926)。
11-2. 每个 BatchNorm 层在训练过程中学习两组参数:一组缩放系数(gamma)和一组偏移系数(beta)。这些系数的学习目的是让模型在发现标准化对学习不利时能够将其反转。每一组参数(gamma 和 beta)的大小与它们所标准化的层中的通道数(或神经元数)相同,因为这些参数是为每个通道(或神经元)单独学习的。
对于第一个 BatchNorm 层,它位于第一个卷积层之后,且有五个输出通道,这将增加 10 个额外的参数。对于第二个 BatchNorm 层,它位于第二个卷积层之后,且有 12 个输出通道,这将增加 24 个额外的参数。
第一个全连接层有 128 个输出通道,这意味着需要 256 个额外的 BatchNorm 参数。第二个全连接层没有伴随 BatchNorm 层,因为它是输出层。
因此,BatchNorm 向网络中添加了 10 + 24 + 256 = 290 个额外的参数。
第十二章
12-1. 仅仅将步幅从 1 增加到 2(或更大的值)不应影响等价性,因为在这两种情况下,卷积核的大小都等于输入的大小,因此这里没有滑动窗口机制。
12-2. 将填充增加到大于 0 的值将影响结果。由于填充的输入,我们将进行滑动窗口卷积操作,在这种操作中,完全连接层的等价性不再成立。换句话说,填充会改变输入的空间维度,这将不再与卷积核的大小匹配,并且每个特征图会产生多个输出值。
第十三章
13-1. 使用更小的补丁会增加给定输入图像的补丁数量,从而导致更多的标记被输入到变换器中。这会增加计算复杂度,因为变换器中的自注意力机制在输入标记数量上具有二次复杂度。因此,更小的输入补丁会使模型的计算成本更高。
13-2. 使用更大的输入补丁可能会导致输入图像中较精细的细节和局部结构的丢失,这可能会对模型的预测性能产生负面影响。感兴趣的读者可能会喜欢《FlexiViT》论文,该论文研究了补丁大小和数量对计算和预测性能的权衡(Lucas Beyer 等,“FlexiViT: One Model for All Patch Sizes” [2022],arxiv.org/abs/2212.08013)。
第十四章
14-1. 由于同音词具有不同的含义,我们预计它们会出现在其他上下文中,例如“there”和“their”在“I can see you over there”和“Their paper is very nice”中的使用。
由于分布假设认为具有相似含义的词应出现在相似的上下文中,因此同音词并不违背分布假设。
14-2. 分布假设的基本思想可以应用于其他领域,例如计算机视觉。在图像的情况下,出现在相似视觉上下文中的物体可能在语义上相关。在更低的层面,邻近的像素可能在语义上相关,因为它们是同一物体的一部分;这一思想被用于图像数据的自监督学习中的掩码自编码器。(我们在第二章中讨论了掩码自编码器。)
另一个例子是蛋白质建模。例如,研究人员表明,训练在蛋白质序列上的语言变换器(其中每个字母代表一个氨基酸的字符串表示,例如MNGTEGPNFYVPFSNKTGVV . . .)学习到的嵌入中,类似的氨基酸会聚集在一起(Alexander Rives 等,“Biological Structure and Function Emerge from Scaling Unsupervised Learning to 250 Million Protein Sequences” [2019],www.biorxiv.org/content/10.1101/622803v1.full)。例如,疏水性氨基酸如 V、I、L 和 M 出现在同一簇中,而芳香族氨基酸如 F、W 和 Y 出现在另一个簇中。在这个背景下,我们可以将氨基酸视为句子中的一个词。
第十五章
15-1. 假设现有数据不存在隐私问题,数据增强有助于生成现有数据的变体,而无需收集额外的数据,这有助于解决隐私问题。
然而,如果原始数据包含个人可识别信息,即使是增强数据或合成数据也可能会与个人信息产生关联,特别是如果增强过程未能充分遮蔽或改变原始数据。
15-2. 如果原始数据集已经足够大且多样,以至于模型不会因为数据不足而出现过拟合或性能不足的情况,那么数据增强可能不那么有益。例如,在预训练大型语言模型(LLMs)时,通常会出现这种情况。高度专业化领域的模型(例如医学、法律和金融领域)可能会受到同义词替换和回译等技术的负面影响,因为这些技术可能会将领域特定术语替换为具有特定含义的词汇。一般来说,在那些对措辞选择非常敏感的任务背景中,数据增强必须格外小心地应用。
第十六章
16-1. 自注意力机制具有二次时间和内存复杂度。更精确地说,我们可以将自注意力的时间和内存复杂度表示为 O(N² × d),其中 N 是序列的长度,d 是序列中每个元素的嵌入维度。
这是因为自注意力机制涉及计算序列中每一对元素之间的相似度。例如,我们有一个输入矩阵 X,它有 N 个标记(行),其中每个标记是一个 d 维的嵌入向量(列)。
当我们计算每个标记嵌入与其他标记嵌入的点积时,我们进行 XX^T 乘法,结果是一个 N×N 的相似度矩阵。这种乘法对于单个标记对来说涉及 d 次乘法,而我们有 N² 对这样的标记对。因此,计算复杂度为 O(N²×d)。然后,N×N 的相似度矩阵被用来计算序列元素的加权平均值,最终得到一个 N×d 的输出表示。这使得自注意力机制在计算上非常昂贵,并且对内存要求较高,尤其是在长序列或 d 值较大的情况下。
16-2. 是的。有趣的是,自注意力机制可能部分受到用于图像处理的卷积神经网络中的空间注意力机制的启发(Kelvin Xu 等,“Show, Attend and Tell: Neural Image Caption Generation with Visual Attention” [2015],* arxiv.org/abs/1502.03044 *)。空间注意力是一种机制,允许神经网络专注于图像中与给定任务相关的特定区域。它通过选择性地加权图像中不同空间位置的重要性,使网络能够“更多地关注”某些区域并忽略其他区域。
第十七章
17-1. 要将预训练的 BERT 模型适应分类任务,您需要添加一个分类的输出层,通常称为分类头。
如前所述,BERT 在预训练时使用[CLS]标记进行下句预测任务。我们可以微调一个新的输出层来完成我们的目标预测任务,比如情感分类,而不是将其训练用于下句预测。
嵌入的[CLS]输出向量作为整个输入序列的摘要。我们可以将其视为特征向量,并在其上训练一个小型神经网络,通常是一个全连接层,后跟 softmax 激活函数,用于预测类别概率。全连接层的输出大小应与我们分类任务中的类别数量相匹配。然后,我们可以像往常一样使用反向传播进行训练。不同的微调策略(更新所有层与仅更新最后一层)可以用来在监督数据集上训练模型,例如。
17-2. 是的,我们可以对像 GPT 这样的仅解码器模型进行微调,以用于分类任务,尽管它可能不如使用基于编码器的模型(如 BERT)有效。与 BERT 不同,我们不需要使用特殊的[CLS]标记,但基本概念类似于对编码器风格模型进行微调以进行分类。我们添加一个分类头(一个全连接层和一个 softmax 激活函数),并在第一个生成的输出标记的嵌入(最终的隐藏状态)上进行训练。(这类似于使用[CLS]标记的嵌入。)
第十八章
18-1. 如果我们无法访问模型,或者想将模型适应于其未被训练过的类似任务时,上下文学习是有用的。
相反,微调对于将模型适应新目标领域非常有用。例如,假设该模型是在一个通用语料库上预训练的,而我们想将其应用于金融数据或文档。在这种情况下,微调模型以适应该目标领域的数据是有意义的。
请注意,在微调模型时也可以使用上下文学习。例如,当一个预训练的语言模型在特定任务或领域上进行微调时,上下文学习会利用该模型根据输入中提供的上下文生成响应的能力,相较于没有微调的上下文学习,这可能会在目标领域中提供更准确的结果。
18-2. 这是隐式完成的。在前缀微调、适配器和 LoRA 中,预训练语言模型的原始知识通过保持核心模型参数冻结的方式得以保留,同时引入额外的可学习参数,这些参数适应新的任务。
第十九章
19-1. 如果我们使用像 Word2Vec 这样的嵌入技术,它会独立处理每个词,那么我们会期望“cat”词嵌入之间的余弦相似度为 1.0。然而,在本例中,我们使用的是变换器模型来生成嵌入。变换器使用自注意力机制,在生成嵌入向量时考虑整个上下文(例如输入文本)。(有关自注意力的更多信息,请参见第十六章)。由于cat一词在两个不同的句子中出现,BERT 模型为这两个cat实例生成了不同的嵌入。
19-2. 切换候选文本和参考文本的效果与计算跨列的最大余弦相似度(如图 19-3 第 5 步所示)与跨行计算相似,这可能导致特定文本的 BERT-Score 不同。因此,BERTScore 通常在实践中计算为类似于 ROUGE 的 F1 分数。例如,我们先计算一种方式的 BERTScore(召回率),然后计算另一种方式(精准率),最后计算调和均值(F1 分数)。
第二十章
20-1. 随机森林通常基于 CART 决策树,不能随着新数据的到来轻松更新。因此,无状态训练方法将是唯一可行的选择。另一方面,假设我们改为使用神经网络模型,例如递归神经网络,那么有状态方法可能更有意义,因为神经网络可以根据新数据进行即时更新。(然而,在开始时,比较有状态和无状态系统是个好主意,这样可以在决定使用哪种方法之前了解哪种方法最有效。)
20-2. 在这里,采用有状态重训练方法最为合理。与其在现有数据(包括用户反馈)的基础上训练一个新模型,更合理的做法是根据用户反馈更新模型。大型语言模型通常是通过自监督的方式预训练,然后通过监督学习进行微调。训练大型语言模型非常昂贵,因此通过有状态重训练来更新模型,而不是重新从头开始训练,是更合适的做法。
第二十一章
21-1. 根据提供的信息,目前不清楚这是否是一个以数据为中心的方法。AI 系统在做出预测和推荐时,严重依赖数据输入,但这对于任何 AI 的机器学习方法来说都是如此。为了确定这种方法是否是数据中心的 AI 示例,我们需要知道 AI 系统是如何开发的。如果它是通过使用固定模型并精细化训练数据来开发的,那么这可能算作数据中心的方法;否则,它只是常规的机器学习和预测建模。
21-2. 如果我们保持模型不变——即重用相同的 ResNet-34 架构——并且仅改变数据增强方法以研究其对模型性能的影响,那么我们可以将其视为数据驱动的方法。然而,数据增强通常也是现代机器学习管道的一部分,单独使用数据增强并不能告诉我们某种方法是否以数据为中心。根据现代定义,数据驱动的方法意味着在保持其余建模和训练管道不变的情况下,积极研究不同数据集增强技术之间的差异。
第二十二章
22-1. 使用多 GPU 策略进行推理的一个缺点是 GPU 之间的额外通信开销。然而,对于推理任务,由于不需要梯度计算和更新,相比训练,推理任务相对较小,GPU 之间的通信所需时间可能会超过并行化所节省的时间。
管理多个 GPU 也意味着更高的设备和能源成本。实际上,优化单 GPU 或 CPU 性能通常更具价值。如果有多个 GPU 可用,在不同 GPU 上并行处理多个样本通常比通过多个 GPU 处理同一样本更有意义。
22-2. 循环分块通常与向量化结合使用。例如,在应用循环分块后,每个块可以使用向量化操作进行处理。这使我们能够对已经在缓存中的数据使用 SIMD 指令,从而提高两种技术的效果。
第二十三章
23-1. 问题在于重要性加权假设测试集分布与部署分布一致。然而,由于各种原因,如用户行为变化、产品特性演变或环境动态,这种假设通常不成立。
23-2. 常见的做法是监控分类准确率等指标,性能下降可能表明数据发生了变化。然而,如果我们无法访问新数据的标签,这种做法就不切实际。
在无法标记新到数据的情况下,我们可以使用统计学的两样本检验来确定示例是否来自相同的分布。我们还可以使用对抗验证,详见第二十九章。然而,这些方法无法帮助检测概念漂移,因为它们仅比较输入分布,而不是输入与输出之间的关系。
其他方法包括测量重构误差:如果我们有一个在源数据上训练的自编码器,我们可以监控新数据的重构误差。如果误差显著增加,这可能表明输入分布发生了变化。
异常值检测是另一种常见技术。在这里,数据点被识别为异常值的异常高比例可能表明数据分布发生了变化。
第二十四章
24-1. 尝试预测一个球员进球数(例如基于过去赛季的数据)是一个泊松回归问题。另一方面,我们也可以应用有序回归模型对不同球员进行排名,按照他们将进球的数量进行排序。然而,由于进球差距是固定的并且可以量化(例如,3 和 4 个进球之间的差距与 15 和 16 个进球之间的差距是一样的),这并不是一个适合有序回归模型的问题。
24-2. 这是一个类似于有序回归问题的排名问题,但也有一些区别。由于我们仅知道电影的相对顺序,成对排名算法可能比有序回归模型更合适。
然而,如果让被评估者为每部电影分配数值标签(如 1 到 5 的评分尺度,类似于亚马逊上的星级评分系统),那么就可以对这种类型的数据训练并使用有序回归模型。
第二十五章
25-1. 置信度水平(90%、95%、99%等)的选择会影响置信区间的宽度。较高的置信度水平会产生更宽的区间,因为我们需要撒出更大的网,以确保更有信心地捕捉到真实参数。
相反,较低的置信度会产生一个较窄的区间,反映出对于真实参数位置的不确定性较大。因此,90%的置信区间比 95%的置信区间要窄,反映出对于真实总体参数位置的更大不确定性。通俗来说,我们有 90%的把握认为真实参数位于一个较小的数值范围内。为了增加这种确定性,我们必须将宽度增加到 95%或 99%。
例如,假设我们有 90%的把握相信在未来两周内威斯康星州会下雨。如果我们希望在没有收集额外数据的情况下以 95%的置信度做出预测,我们需要增加时间间隔。例如,我们可以说我们有 95%的把握认为未来四周内会下雨,或者 99%的把握认为在未来两个月内会下雨。
25-2. 由于模型已经训练完成并且保持不变,将其应用于每个测试集会显得浪费。为了加速本节中描述的过程,我们从技术上来说只需要在原始测试集上应用模型一次。然后,我们可以直接对实际标签和预测标签进行自助抽样(而不是对原始样本进行抽样),以创建自助抽样的测试集。接着,我们可以基于每个集合中自助抽样的标签计算测试集的准确度。
第二十六章
26-1. 预测集的大小可以告诉我们关于预测置信度的很多信息。如果预测集的大小较小(例如,在分类任务中为 1),这表明对预测有很高的信心。算法有足够的证据强烈推荐某个特定的结果。
如果预测集的大小较大(例如,在分类任务中为 3),这表示更多的不确定性。模型对预测的信心较低,并且认为多个结果都是可能的。在实际操作中,我们可以利用这一信息为预测集大小较大的样本分配更多资源。例如,我们可以将这些案例标记为需要人工验证,因为机器学习模型的信心较低。
26-2. 绝对正确。置信区间同样适用于回归模型,就像它们适用于分类模型一样。实际上,在回归的上下文中,它们甚至更为通用。例如,我们可以使用第二十五章中所示的方法计算模型性能的置信区间,如均方误差。(但我们也可以为个别预测和模型参数计算置信区间。如果你对模型参数的置信区间感兴趣,可以查看我的文章《可解释的机器学习——关于线性和逻辑回归作为可解释模型的书评与思考》,网址为 sebastianraschka.com/blog/2020/interpretable-ml-1.html。)
我们还可以为回归模型计算符合性预测区间。该区间是一个可能的目标值范围,而不是单一的点估计。对这样的预测区间的解释是,在假设未来与过去在统计上相似的前提下(例如,基于模型训练时的数据),新的实例的真实目标值将在该范围内,以一定的置信度,例如 95%。
第二十七章
27-1. 由于 MAE 是基于距离的绝对值,它自然满足第一个标准:不能为负数。此外,如果我们交换 y 和 ŷ 的值,MAE 的结果保持不变,因此它满足第二个标准。那么,三角不等式如何呢?类似于 RMSE 与欧几里得距离或 L2 范数的关系,MAE 与两个向量之间的 L1 范数相似。由于所有向量范数都满足三角不等式(Horn 和 Johnson,《矩阵分析》,剑桥大学出版社,1990),所以我们的同事是错误的。
此外,即使 MAE 不是一个合适的度量标准,它仍然可以作为一个有用的模型评估指标;例如,考虑分类准确率。
27-2. MAE 对所有误差赋予相同的权重,而 RMSE 由于二次幂的关系,对较大绝对值的误差给予更多关注。因此,RMSE 总是至少与 MAE 一样大。然而,没有哪个指标在所有情况下都比另一个好,它们都在多年的无数研究中被用来评估模型性能。
如果你对 MAE 和 RMSE 之间的更多比较感兴趣,你可能会喜欢 Cort J. Willmott 和 Kenji Matsuura 的文章《在评估平均模型性能时,平均绝对误差(MAE)相对于均方根误差(RMSE)的优点》(2005),* www.int-res.com/abstracts/cr/v30/n1/p79-82*。
Chapter 28
28-1. 如果我们只关心平均表现,这就不是问题。例如,如果我们有一个包含 100 个训练样本的数据集,且模型在 100 个验证折叠中正确预测了 70 个,我们估计模型的准确率为 70%。然而,假设我们有兴趣分析不同折叠的估计值的方差。在这种情况下,LOOCV 就不太有用:因为每个折叠仅包含一个训练样本,我们无法计算每个折叠的方差并将其与其他折叠进行比较。
28-2. k折交叉验证的另一个使用场景是模型集成。例如,在 5 折交叉验证中,我们训练五个不同的模型,因为我们有五个稍微不同的训练集。然而,除了在整个训练集上训练最终模型之外,我们还可以将这五个模型组合成一个模型集成(这在 Kaggle 上特别流行)。有关这个过程的示意图,请参见图 6-3,位于第 34 页。
Chapter 29
29-1. 作为性能基准,实施零规则分类器(例如多数类分类器)是一个好主意。因为我们通常拥有比测试数据更多的训练数据,我们可以计算一个总是预测Is test? False的模型的表现,如果我们将原始数据集划分为 70%的训练数据和 30%的测试数据,它应该会得到 70%的准确率。如果训练在对抗验证数据集上的模型的准确率明显超过这个基准(比如 80%),我们可能需要进一步调查一个严重的差异问题。
29-2. 总的来说,这不是一个大问题,因为我们主要关心是否存在偏离多数类预测基准的强偏差。例如,如果我们将对抗验证模型的准确率与基准进行比较(而不是 50%的准确率),则不应存在问题。然而,考虑像 Matthew 相关系数、ROC 或精确度-召回曲线下面积等评估指标可能更好,而不是分类准确率。
Chapter 30
30-1. 虽然我们通常将自监督学习和迁移学习视为不同的方法,但它们并不一定是互斥的。例如,我们可以使用自监督学习在一个带标签或更大规模的未标记图像数据集上预训练模型(在这种情况下,未标记的图像可能对应于各种计算设备的数百万张图片)。
我们可以不从随机权重开始,而是使用自监督学习的神经网络权重,然后通过数千张带标签的智能手机图片进行迁移学习。由于智能手机与平板电脑相关,迁移学习在这里是一种非常有前景的方法。
最后,在自监督预训练和迁移学习之后,我们可以在目标任务的数百张带标签图片上进行微调,这些任务是与平板电脑相关的。
30-2. 除了针对神经网络输出层中过于自信的分数的缓解技术外,我们还可以考虑通过集成方法来获取置信度分数。例如,在推理过程中,我们可以利用丢弃法(dropout)来获得一个示例的多个不同预测,从而计算预测标签的不确定性,而不是在推理时禁用丢弃法。
另一种选择是使用* k *折交叉验证从训练集的不同部分构建模型集成,正如在第六章的集成部分中讨论的那样。
也可以将在第二十六章中讨论的符合性预测方法应用于主动学习。


浙公网安备 33010602011771号