├── .gitignore ├── Chapter 1 Introduction.md ├── Chapter 2 Supervised learning.md ├── Chapter 3 Shallow neural networks.md ├── Chapter 4 Deep neural networks.md ├── Chapter 5 Loss functions.md ├── Chapter 6 Fitting models.md ├── Chapter 7 Gradients and initialization.md ├── Chapter 8 Measuring performance.md ├── README.md └── figures ├── chapter1 ├── IntroAgeHeight.svg ├── IntroCompletion.svg ├── IntroFaceSpace.svg ├── IntroInterpolate.svg ├── IntroLatent.svg ├── IntroModels.svg ├── IntroModels2a.svg ├── IntroOverview.svg ├── IntroOverviewSideCap.svg ├── IntroReinforce.svg ├── IntroSynthesis.svg └── IntroVariety.svg ├── chapter2 ├── SupervisedLinear.svg ├── SupervisedLinearFitError.svg ├── SupervisedOpt.svg └── SupervisedSurface.svg ├── chapter3 ├── ShallowActivations.svg ├── ShallowApproximate.svg ├── ShallowBuildUp.svg ├── ShallowBuildUp2D.svg ├── ShallowChangeSlope.svg ├── ShallowFunctions.svg ├── ShallowHyperplanes.svg ├── ShallowNet.svg ├── ShallowNetThreeInputsTwoOutputs.svg ├── ShallowNetTwoInputs.svg ├── ShallowNetTwoOutputs.svg ├── ShallowReLU.svg ├── ShallowRegions.svg └── ShallowTerminology.svg ├── chapter4 ├── DeepBuildUp.svg ├── DeepConcat.svg ├── DeepConcatQuestion.svg ├── DeepFold.svg ├── DeepKLayer.svg ├── DeepParams.svg ├── DeepProbZeroCross.svg ├── DeepTwoLayer.svg └── DeepTwoLayer2D.svg ├── chapter5 ├── LossBern.svg ├── LossBinaryClassification.svg ├── LossCategorical.svg ├── LossCrossEntropy.svg ├── LossDataTypes.svg ├── LossHeteroscedastic.svg ├── LossLog.svg ├── LossLogisticSigmoid.svg ├── LossMoG.svg ├── LossMultiClassClassification.svg ├── LossNorm.svg ├── LossNormalRegression.svg ├── LossPoisson.svg └── LossVonMises.svg ├── chapter6 ├── TrainADAM.svg ├── TrainConvexProb.svg ├── TrainGaborData.svg ├── TrainGaborGDSGD.svg ├── TrainGaborMin.svg ├── TrainGaborModel.svg ├── TrainGaborSGDIter.svg ├── TrainLRMin.svg ├── TrainLineSearch.svg ├── TrainMomentum.svg └── TrainNesterov.svg ├── chapter7 ├── Train2BP1.svg ├── Train2BP2.svg ├── Train2BP3.svg ├── Train2BPIntuitions.svg ├── Train2BPIntuitions2.svg ├── Train2CompGraph.svg ├── Train2Exploding.svg ├── Train2ReLUDeriv.svg └── code.png └── chapter8 ├── PerfBias.svg ├── PerfBiasVarianceTradeoff.svg ├── PerfCapacityVariance.svg ├── PerfDataSet.svg ├── PerfDoubleDescent.svg ├── PerfMNIST1D.svg ├── PerfMNIST1DResults.svg ├── PerfModel.svg ├── PerfNoiseBiasVariance.svg ├── PerfSmoothness.svg ├── PerfSmoothness2.svg ├── PerfTypical.svg └── PerfVariance.svg /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | -------------------------------------------------------------------------------- /Chapter 1 Introduction.md: -------------------------------------------------------------------------------- 1 | # Chapter 1 Introduction 2 | 人工智能(AI)旨在打造模仿智能行为的系统。它覆盖了众多方法,涵盖了基于逻辑、搜索和概率推理的技术。机器学习是 AI 的一个分支,它通过对观测数据进行数学模型拟合来学习决策制定。这个领域近年来迅猛发展,现在几乎(虽不完全准确)与 AI 同义。 3 | 4 | 深度神经网络是一类机器学习模型,将其应用到数据上的过程称为深度学习。目前,深度网络是最强大和最实用的机器学习模型之一,常见于日常生活中。我们常常用自然语言处理(Natural Language Processing)算法翻译文本、用计算机视觉(Computer Vision)系统搜索特定对象的图片,或通过语音识别(Speech Recognition)界面与数字助理交谈,这些都是深度学习的实际应用。 5 | 6 | 正如本书标题所示,它旨在帮助初学者理解深度学习的基本原理。本书既非理论性质太重(没有证明),也不过分侧重实践(几乎不包含代码)。其目的在于阐释深度学习的核心思想;读者在阅读完这本书后,将能够在没有现成成功方案的新情境中应用深度学习。 7 | 机器学习方法大体上分为三大类:监督学习(Supervised Learning)、无监督学习(Unsupervised Learning)和强化学习(Reinforcement Learning)。目前,这三大类的前沿方法均依赖于深度学习(见图 1.1)。本书的开篇章节从高层次上介绍了这三大类,并且这种分类也在书的结构中得到了体现。无论我们是否乐见,深度学习都将改变我们的世界,而这种改变并非全都是积极的。因此,本章还简要介绍了人工智能伦理的基本概念。最后,我们提出了一些建议,帮助读者更好地利用这本书。 8 | 9 | ## 1.1 监督学习 10 | 监督学习模型建立了一种从输入数据到输出预测的关系。在后续几节中,我们会详细探讨输入、输出、模型本身,以及“训练”模型所指的含义。 11 | ![](figures/chapter1/IntroOverview.svg) 12 | 图 1.1 机器学习是人工智能的一个分支,它专注于将数学模型应用于观测数据。它主要分为三个类别:监督学习、非监督学习和强化学习。深度神经网络在这三个领域中均发挥着重要作用。 13 | ### 1.1.1 回归和分类问题 14 | 图 1.2 展示了几个回归和分类问题的例子。在每个例子中,都有一个与现实世界相关的输入(如一个句子、一段声音文件、一幅图片等),这些输入被转换成数字向量。这个向量就是模型的输入。模型把这个输入映射到一个输出向量,随后这个输出向量被再次转换,变成一个具有现实意义的预测。目前,我们主要关注输入和输出,并把模型当作一个黑盒子,它接受一个数字向量并输出另一个数字向量。 15 | 16 | 图 1.2a 中的模型基于如房屋的平方米数和卧室数量等输入特征来预测房价。这是一个回归问题,因为模型返回的是一个连续数值(而非某个类别)。而图 1.2b 中的模型则以分子的化学结构为输入,预测其熔点和沸点。由于预测了多个数值,这是一个多变量回归问题。 17 | 18 | 图 1.2c 中的模型接收包含餐厅评论的文本字符串作为输入,并预测评论是正面的还是负面的。这是一个二元分类问题,因为模型试图将输入分配到两个不同的类别中。输出向量包含输入属于每个类别的概率。图 1.2d 和 1.2e 则展示了多类别分类问题。在这里,模型将输入分配到多于两个的类别中。第一个例子中,输入是一个音频文件,模型预测它包含的音乐类型。第二个例子中,输入是一幅图片,模型预测图片中包含的对象。在这些例子中,模型均返回一个包含各类别概率的大小为 N 的向量。 19 | 20 | ![](figures/chapter1/IntroModels.svg) 21 | 22 | 图 1.2 回归和分类问题。a)这个回归模型使用描述房产特征的数字向量来预测其价格。b)这个多变量回归模型以化学分子的结构为输入,预测其熔点和沸点。c)这个二元分类模型接收餐厅评论,并将其划分为正面或负面。d)这个多类别分类问题将一段音频片段归类为 N 种音乐类型中的一种。e)第二个多类别分类问题中,模型根据图片可能包含的 N 种物体之一来分类图片。 23 | ### 1.1.2 输入 24 | 图 1.2 中的输入数据类型各异。在房价预测例子中,输入是一个固定长度的向量,包含了描述房产特征的值。这是一种表格数据,它没有内在结构;如果我们改变输入值的顺序再构建一个新模型,预期模型的预测结果不会改变。 25 | 26 | 另一方面,在餐厅评论的例子中,输入是一段文本。这可能根据评论中的单词数而长度不同,且输入顺序很重要;例如,“我的妻子吃了鸡肉”与“鸡肉吃了我的妻子”意义截然不同。在传递给模型之前,文本必须被编码为数字形式。这里,我们使用一个包含 10,000 个词的固定词汇表,并将单词索引简单拼接起来。 27 | 28 | 在音乐分类的例子中,输入向量可能是固定大小的(比如 10 秒音频片段),但其维度非常高。数字音频通常以 44.1 kHz 采样并以 16 位整数表示,因此一个 10 秒的音频片段包含 441,000 个整数。显然,监督学习模型必须能够处理大量输入。图像分类例子中的输入(由每个像素的 RGB 值串联起来的)也非常庞大。而且,它的结构本质上是二维的;即使在输入向量中不相邻,上下相邻的两个像素也紧密相关。 29 | 30 | 最后,考虑预测分子熔点和沸点的模型的输入。一个分子可能包含不同数量且连接方式各异的原子。在这种情况下,模型需要同时考虑分子的几何结构和组成原子。 31 | ### 1.1.3 机器学习模型 32 | 到目前为止,我们把机器学习模型当作一个黑盒子,它接受输入向量并返回输出向量。但这个黑盒子里面究竟是什么呢?考虑一个根据孩子年龄来预测身高的模型(见图 1.3)。机器学习模型其实是一个数学方程,描述了平均身高如何随年龄变化(图 1.3 中的青色曲线)。当我们把年龄输入这个方程,它就会返回相应的身高。例如,如果年龄是 10 岁,我们预测身高为 139 厘米。 33 | 34 | 更精确地说,这个模型代表了一系列方程,用于将输入映射到输出(即不同的青色曲线)。特定的方程(曲线)是根据训练数据(输入和输出对的示例)来选择的。在图 1.3 中,这些对由橙色点表示,我们可以看到模型(青色线条)合理地描述了这些数据。当我们谈到训练或拟合一个模型时,我们的意思是在可能的方程(青色曲线)中寻找一个最能准确描述训练数据的关系。 35 | 36 | 因此,图 1.2 中的模型需要标记好的输入/输出对来进行训练。例如,音乐分类模型需要大量音频片段,这些片段已由人类专家确定了各自的音乐类型。这些输入/输出对在训练过程中起到了教师或监督者的作用,这就是“监督学习”这个术语的由来。 37 | 38 | ![](figures/chapter1/IntroAgeHeight.svg) 39 | 40 | **图 1.3** 机器学习模型。该模型表示一系列关系,将输入(儿童年龄)与输出(儿童身高)联系起来。通过训练数据(橙色点,包括输入/输出对)来选定具体的关系。在训练模型过程中,我们寻找能够很好描述数据的关系。这里,经过训练的模型是青色曲线,可以用来计算任何年龄的儿童身高。 41 | ### 1.1.4 深度神经网络 42 | 这本书着重讨论深度神经网络,这是一种特别有效的机器学习模型。它们是方程,能够代表输入和输出之间极其广泛的关系,并且在这些关系中寻找描述训练数据的关系特别容易。 43 | 44 | 深度神经网络可以处理非常大、变化多端的输入,并且能够包含各种内部结构。它们能输出单个实数(回归)、多个数值(多变量回归)或两个或更多类别的概率(分别对应二元和多类别分类)。正如我们在下一节中将看到的,它们的输出也可能非常大、变长,并且包含内部结构。想象具有这些特性的方程可能很困难,读者应努力暂时搁置怀疑。 45 | ### 1.1.5 结构化输出 46 | 图 1.4a 展示了一个用于语义分割的多变量二元分类模型。在这里,输入图像的每个像素都被分配一个二元标签,指示它是属于牛还是背景。图 1.4b 展示了一个多变量回归模型,输入是街景图像,输出是每个像素的深度。在这两种情况下,输出都是高维且有结构的。然而,这种结构与输入紧密相关,可以被利用;如果一个像素被标记为“牛”,那么具有相似 RGB 值的邻近像素可能有相同的标签。 47 | 48 | 图 1.4c-e 描述了三个输出具有与输入不太紧密相关的复杂结构的模型。图 1.4c 展示了一个模型,输入是音频文件,输出是文件中的转录词。图 1.4d 是一个翻译模型,输入是英文文本,输出是法文翻译。图 1.4e 描述了一个极具挑战性的任务,输入是描述性文本,模型需要生成与这个描述匹配的图像。 49 | 50 | 原则上,这三个后续任务可以在标准监督学习框架下解决,但它们更为困难,原因有二。首先,输出可能确实模糊不清;从英语到法语有多种有效翻译,任何描述都可能对应多种图像。其次,输出包含大量结构;并非所有单词串都能构成有效的英语和法语句子,也不是所有 RGB 值的组合都能构成合理的图像。除了学习映射,我们还必须遵循输出的“语法”。 51 | 52 | 幸运的是,这种“语法”可以在不需要输出标签的情况下学习。例如,我们可以通过学习大量文本数据的统计信息来学习构建有效的英语句子。这为本书接下来讨论的无监督学习模型部分提供了一个联系。 53 | 54 | ![](figures/chapter1/IntroModels2a.svg) 55 | 56 | **图1.4** 具有结构化输出的监督学习任务。a) 这个语义分割模型把 RGB 图像映射到一个二元图像,用于指示每个像素是属于背景还是牛(改编自 Noh 等人,2015年)。b) 这个单目深度估计模型将 RGB 图像映射到一个输出图像,每个像素代表深度(改编自 Cordts 等人,2016年)。c) 这个音频转录模型将音频样本映射到音频中所说话语的文字转录。d) 这个翻译模型将英语文本字符串映射到其对应的法语翻译。e) 这个图像合成模型将文字描述映射到一幅图像(示例来自 https://openai.com/dall-e-2/ )。在每个案例中,输出都具有复杂的内部结构或语法。在某些情况下,与输入相兼容的输出可能有多个。 57 | ## 1.2 无监督学习 58 | 从没有对应输出标签的输入数据中构建模型被称为无监督学习;缺乏输出标签意味着不存在“监督”。无监督学习的目标不是学习输入到输出的映射,而是描述或理解数据的结构。就像监督学习一样,数据可能具有非常不同的特点;它可能是离散或连续的,低维或高维的,长度固定或变化的。 59 | ### 1.2.1 生成式模型 60 | 本书着重介绍生成式无监督模型,这类模型学习如何合成新的数据实例,使其在统计上与训练数据难以区分。一些生成式模型明确描述了输入数据的概率分布,并通过从这个分布中抽样来生成新实例。其他模型则仅学习生成新实例的机制,而不直接描述其分布。 61 | 62 | 最先进的生成式模型能够合成极为逼真但与训练实例不同的实例。它们在生成图像(见图 1.5)和文本(见图 1.6)方面特别成功。这些模型还可以在某些输出预先确定的约束下合成数据(称为条件生成)。例如,包括图像修复(见图 1.7)和文本补全(见图 1.8)在内的应用。事实上,现代文本生成模型非常强大,以至于它们看起来几乎具有智能。给定一段文本后接一个问题,模型通常能通过生成文档最可能的补全来“填补”缺失的答案。然而,实际上,模型只了解语言的统计特性,并不真正理解其答案的含义。 63 | 64 | ![](figures/chapter1/IntroSynthesis.svg) 65 | 图1.5 图像生成式模型。左图:两幅图像由训练有素的猫图模型生成。这些不是真正的猫,而是概率模型生成的样本。右图:两幅图像由专门训练的建筑图模型生成。改编自 Karras 等人 (2020b)。 66 | 67 | ``` 68 | 当我到达森林边缘时,月亮已经升起,树木间筛下的光线银白而冷冽。我不由自主地颤抖起来,虽然我并不觉得冷,我加快了脚步。我从未离开过村庄这么远,对于接下来会发生什么,我心中毫无底。我已经走了数小时,感到疲惫和饥饿。我匆忙出发,连食物都没带,更别提武器了。在这个陌生的地方,我手无寸铁,孤身一人,不知所措。 69 | 70 | 我走了这么长时间,以至于完全失去了时间感。我不知道自己究竟走了多远,我只知道我必须继续前进。我必须找到她。我感觉我已经很接近了。她就在附近,而且她正处于危险之中。我必须找到她,并在一切为时已晚之前救助她。 71 | ``` 72 | 图1.6 文本数据生成式模型合成的短篇故事。该模型描述了一个为每个输出字符串分配概率的概率分布。通过从模型中抽样,可以创造出遵循训练数据(这里是短篇故事)统计特性的字符串,这些字符串之前从未出现过。 73 | 74 | ![](figures/chapter1/IntroCompletion.svg) 75 | 图1.7 图像修复。原始图像(左图)中,男孩被金属缆绳遮挡。不需要的区域(中图)被移除,生成式模型在其余像素保持不变的约束下合成了新图像(右图)。改编自 Saharia 等人 (2022a)。 76 | 77 | ``` 78 | 在巴斯大学进行的第一场讲座前,我有些紧张。教室里坐满了看似成百上千的学生,他们的目光让人畏惧。我走上讲台,刚要开口,却发生了一件奇怪的事情。 79 | 80 | 突然,教室里回荡着震耳欲聋的噪声,宛如巨兽的咆哮。声音太大了,我不得不捂住耳朵,什么都听不见了。我看到学生们惊慌失措地四处张望。然而,就像它来得那么突然,噪声又迅速消失,教室恢复了寂静。 81 | 82 | `我愣在那里,试图弄清楚刚才发生了什么。然后我意识到,所有学生都在等着我说话。我本想说些风趣或聪明的话,但脑海一片空白。于是我只好说:“嗯,那真奇怪”,接着开始我的讲座。` 83 | ``` 84 | 图1.8 条件性文本合成。给定一段初始文本(第一段),文本生成式模型可以通过合成“缺失”的剩余部分来合理地继续这段文字。由 GPT3 生成(Brown 等人,2020)。 85 | 86 | ![](figures/chapter1/IntroFaceSpace.svg) 87 | 图1.9 人脸的变化。人脸大约包含 42 块肌肉,因此可以用大约 42 个数字来描述同一个人在相同光照条件下的图像中的大部分变化。一般而言,图像、音乐和文本的数据集可以用相对较少的潜在变量来描述,尽管通常更难将这些变量与特定的物理机制联系起来。图像来自 Dynamic FACES 数据库(Holland 等人,2019)。 88 | ### 1.2.2 潜变量 89 | 一些生成式模型(但不是所有)利用了这样一个观点:数据的维度可以比原始观测变量的数量更小。例如,有效且有意义的英语句子的数量远少于随机组合单词形成的字符串数量。同样,真实世界的图像只占通过随机赋予每个像素 RGB 值能创建的图像的一小部分。这是因为图像是由物理过程生成的(见图 1.9)。 90 | 91 | 这就引出了一个想法,即我们可以使用较少的潜在变量来描述每个数据实例。在这里,深度学习的作用是描述这些潜变量与数据之间的映射关系。这些潜变量通常被设计为具有简单的概率分布。通过从这个分布中抽样并将结果通过深度学习模型传递,我们可以创造新的样本(见图 1.10)。 92 | 93 | ![](figures/chapter1/IntroLatent.svg) 94 | 图1.10 潜变量。潜变量在许多生成模型中扮演关键角色,这些模型利用深度学习来揭示低维潜变量与观测到的高维数据之间的联系。潜变量按设计拥有简易的概率分布。因此,通过从这些潜变量的简单分布中采样,再利用深度学习模型将采样结果映射到观测数据空间,我们便能创造出新的样本。 95 | 96 | 这些模型为操纵真实数据提供了新的方法。例如,考虑找出支持两个真实实例的潜变量。我们可以通过在它们的潜在表示之间插值,并将中间位置映射回数据空间,从而在这些实例之间进行插值(见图 1.11)。 97 | 98 | ![](figures/chapter1/IntroInterpolate.svg) 99 | 图1.11 图像插值。图像插值是一种有趣的应用。在每一行的图像中,左右两侧为真实图像,中间三张则是生成模型创造的插值序列。这些生成模型学习到了所有图像均可通过一组潜在变量来生成的原理。通过确定这两张真实图像的潜变量,对它们的值进行插值,然后用这些中间变量生成新图像,我们能创造出既视觉上合理,又融合了两张原始图像特征的中间图像。上排图片改编自 Sauer 等人 (2022),下排图片改编自 Ramesh 等人 (2022)。 100 | ### 1.2.3 结合监督学习与无监督学习 101 | 具有潜变量的生成式模型也可以促进输出具有结构的监督学习模型的发展(见图 1.4)。例如,考虑学习如何预测与描述相对应的图像。我们可以学习文本的潜变量与图像的潜变量之间的关系,而不是直接将文本输入映射到图像上。 102 | 103 | 这种方法有三个优点。首先,由于输入和输出维度较低,我们可能需要更少的文本/图像对来学习这种映射。其次,我们更有可能生成看起来合理的图像;潜变量的任何合理值都应该产生像是一个可信的示例。第三,如果我们在两组潜变量之间的映射或潜变量到图像的映射中引入随机性,那么我们可以生成多个都与描述相匹配的图像(见图 1.12)。 104 | 105 | ![](figures/chapter1/IntroVariety.svg) 106 | 图1.12 从“时代广场上的滑板泰迪熊”这个标题出发,DALL·E-2(Ramesh 等人,2022)生成了多张图片。 107 | ## 1.3 强化学习 108 | 机器学习的最后一个领域是强化学习。这个范畴引入了代理(agent)的概念,代理生活在一个世界中,在每个时间步骤中可以执行特定行动。行动会改变系统的状态,但这种改变不一定是确定性的。执行行动还可能产生奖励,强化学习的目标是让代理学会选择能够平均获得高奖励的行动。 109 | 110 | 一个复杂点是奖励可能在行动后一段时间才出现,因此把奖励与特定行动关联起来并不直接。这被称为时间性信用分配问题。在学习过程中,代理必须在探索(寻找新的可能性)和利用(使用已知的策略)之间做出平衡;也许代理已经学会了如何获得适度的奖励,它应该继续遵循这个策略(利用现有知识),还是尝试不同的行动以寻找改进的机会(探索新的可能性)? 111 | ### 1.3.1 两个例子 112 | 考虑教一个类人机器人如何行走。机器人在特定时间可以执行有限的行动(如移动各种关节),这些行动会改变世界的状态(即它的姿态)。我们可以通过设立障碍赛道上的检查点来奖励机器人。为了到达每个检查点,它必须执行许多行动,但当收到奖励时,很难确定哪些行动对奖励有贡献,哪些是无关紧要的。这就是时间性信用分配问题的一个实例。 113 | 114 | 第二个例子是学习下棋。同样,代理在任何时刻都有一组有效的行动(棋子移动)。然而,这些行动以非确定性的方式改变系统状态;对于任何行动选择,对手可能以多种不同的方式回应。这里,我们可以根据捕获棋子来设定奖励结构,或者在游戏结束时赢得比赛来获得单一奖励。在后者情况下,时间性信用分配问题非常严重;系统必须学习在众多走法中哪些是成功或失败的关键。 115 | 116 | 探索与利用的权衡在这两个例子中也很明显。机器人可能已经发现,通过侧躺并用一条腿推动可以前进。这种策略虽然能让机器人移动并获得奖励,但比最优解——站立行走——要慢得多。因此,它面临一个选择,是利用已知的策略(沿地面滑行)还是探索其他可能的行动(可能实现更快的移动)。在下棋例子中也是如此,代理可能学到了一系列合理的开局走法。它应该利用这些知识,还是探索不同的开局序列? 117 | 118 | 深度学习如何融入强化学习框架可能不那么明显。有几种可能的方法,其中一种是使用深度网络构建从观察到的世界状态到行动的映射。这被称为策略网络。在机器人的例子中,策略网络会学习从传感器测量到关节运动的映射。在下棋的例子中,网络将学习从棋盘的当前状态到走法选择的映射(见图 1.13)。 119 | 120 | ![](figures/chapter1/IntroReinforce.svg) 121 | 图1.13 在强化学习中使用策略网络是一种创新。通过深度神经网络,我们可以定义从状态(例如棋盘上的位置)到动作(可能的移动)的映射。这种映射即为所谓的“策略”。 122 | ## 1.4 伦理 123 | 如果不讨论人工智能的伦理影响就撰写本书,将是不负责任的。这种强大技术将至少在与电力、内燃机、晶体管或互联网相同的程度上改变世界。在医疗保健、设计、娱乐、交通、教育以及几乎所有商业领域的潜在益处都是巨大的。然而,科学家和工程师对其工作成果的影响常常过于乐观,造成的潜在伤害同样巨大。以下几点突出了五个关注点。 124 | 125 | - **偏见与公平性**:如果我们训练一个系统基于历史数据来预测个人的薪酬水平,那么这个系统将重现历史偏见;例如,它可能会预测女性应获得比男性更低的薪酬。已有几个此类案例成为国际新闻:一个用于超分辨率人脸图像的 AI 系统使非白人看起来更白;一个用于生成图像的系统在被要求合成律师图片时只产生了男性的图片。不慎使用 AI 进行算法决策可能会加剧现有偏见。有关更多讨论,请参阅 Binns(2018)。 126 | - **解释性**:深度学习系统做出决策,但我们通常不知道其基于何种信息或如何做出的。它们可能包含数十亿个参数,我们无法仅通过检查来理解它们的工作原理。这导致了可解释 AI 的子领域的形成。一个中等成功的领域是产生局部解释;我们无法解释整个系统,但可以提供为何做出特定决策的可解释描述。然而,目前尚不清楚是否有可能构建对其用户甚至其创建者完全透明的复杂决策系统。更多信息请参见 Grennan 等人(2022)。 127 | - **武器化 AI**:所有重要技术都被直接或间接地用于战争。可悲的是,暴力冲突似乎是人类行为的不可避免特征。AI 可能是有史以来构建的最强大的技术,并且无疑会在军事背景中得到广泛部署。事实上,这已经在发生(参见 Heikkilä,2022)。 128 | - **集中权力**:世界上最强大的公司之所以大力投资人工智能,并非出于改善人类命运的善意兴趣。他们意识到这些技术将使他们获得巨大利润。与任何先进技术一样,深度学习可能会使权力集中在掌握它的少数组织手中。将目前由人类完成的工作自动化,将改变经济环境,对薪资较低、技能较少的工人的生计产生不成比例的影响。乐观主义者认为,工业革命期间也发生了类似的变革,导致工作时间缩短。但事实是,我们不知道 AI 的大规模应用将对社会产生何种影响(参见 David,2015)。 129 | - **存在风险**:人类面临的主要存在风险都来自技术。气候变化是由工业化推动的。核武器源于物理学研究。由于交通、农业和建筑的创新,使得人口更大、更密集、更相互连接,疫情因此更易发生且传播更快。人工智能带来新的存在风险。我们应该非常谨慎地构建比人类更有能力和可扩展性的系统。在最乐观的情况下,它会将巨大的权力集中在少数拥有者手中。在最悲观的情况下,我们可能无法控制它,甚至无法理解其动机(参见 Tegmark,2018)。 130 | 131 | 这份列表远非完整。AI 还可能助长监控、虚假信息、隐私侵犯、欺诈和金融市场操纵的现象,而且培训 AI 系统所需的能源也会对气候变化产生影响。此外,这些担忧并非无的放矢;AI 的伦理问题已有许多实例(参见 Dao,2021年的部分列表)。互联网的近期历史展示了新技术可能以意想不到的方式造成伤害。80年代和90年代初的在线社区几乎无法预见假新闻、垃圾邮件、网络骚扰、欺诈、网络欺凌、极端单身文化、政治操纵、个人信息泄露、网络激进化和网络报复色情的泛滥。 132 | 133 | 研究或学习(或撰写关于)AI 的每个人都应思考科学家对其技术使用的责任程度。我们应该认识到,资本主义是推动 AI 发展的主要动力,法律进步和社会利益的实施可能会大大落后。我们应反思作为科学家和工程师,是否有可能控制这个领域的进展,以减少潜在的伤害。我们还应考虑愿意为哪种组织工作。他们在减少 AI 潜在危害方面的承诺有多认真?他们是否只是为了减少声誉风险而进行“伦理洗白”,还是真正实施机制来停止伦理上可疑的项目? 134 | 135 | 鼓励所有读者进一步探索这些问题。在线课程 https://ethics-of-ai.mooc.fi/ 是一个有用的入门资源。如果您是使用本书进行教学的教授,建议您与学生讨论这些问题。如果您是在未进行此类讨论的课程中学习的学生,请敦促您的教授实现这一点。如果您在企业环境中部署或研究 AI,建议您审视雇主的价值观,并帮助改变它们(或离开),如果它们不尽人意。 136 | ## 1.5 本书结构 137 | 本书的结构遵循本导言的框架。第2至9章详细介绍监督学习流程。我们描述了浅层和深层神经网络,并讨论了如何训练它们、如何衡量和提高它们的性能。第10至13章讲述了深度神经网络的常见架构变化,包括卷积网络、残差连接和变压器,这些架构在监督学习、无监督学习和强化学习中都有应用。 138 | 139 | 第14至18章聚焦通过深度神经网络进行的无监督学习。我们专门为四种现代深度生成模型各写了一章:生成对抗网络、变分自编码器、规范化流和扩散模型。第19章简要介绍深度强化学习。这个主题本可以轻易成为一本书的核心,因此本书的处理相对浅显。然而,这一部分旨在为不熟悉这一领域的读者提供一个良好的起点。 140 | 141 | 尽管本书标题为“深度学习”,但深度学习的某些方面仍然缺乏充分理解。第20章提出了一些基础问题:为什么深度网络易于训练?为什么它们泛化能力如此强?为什么需要如此多的参数?它们是否需要深度?在此过程中,我们探讨了一些意外现象,如损失函数的结构、双重下降、理解和彩票。书籍以第21章结尾,讨论伦理和深度学习。 142 | ## 1.6 其他书籍 143 | 这本书是自成体系的,但主要聚焦于深度学习领域。它旨在成为《深度学习》(Goodfellow 等人,2016年)的精神续作,后者是一本极佳的资源,但没有涵盖近期的进展。对于更广泛的机器学习领域,最新且百科全书式的资源是《概率机器学习》(Murphy,2022年、2023年)。然而,《模式识别与机器学习》(Bishop,2006年)仍是一本优秀且相关的书籍。 144 | 145 | 如果你喜欢本书,那么我之前的作品《计算机视觉:模型、学习与推理》(Prince,2012年)也值得一读。尽管部分内容已显陈旧,但它包含了对概率的全面介绍,包括贝叶斯方法,以及潜变量模型、计算机视觉的几何学、高斯过程和图形模型的良好初步覆盖。它使用与本书相同的符号,并可以在网上找到。关于图形模型的详细处理可以在《概率图形模型:原理与技术》(Koller & Friedman,2009年)中找到,而高斯过程则由《机器学习中的高斯过程》(Williams & Rasmussen,2006年)涵盖。 146 | 147 | 对于背景数学,可以参考《机器学习的数学》(Deisenroth 等人,2020年)。更注重编程的方法可以参考《深入深度学习》(Zhang 等人,2023年)。计算机视觉最佳概述是 Szeliski(2022年),还有即将出版的《计算机视觉基础》(Torralba 等人,2024年)。学习图神经网络的好起点是《图表示学习》(Hamilton,2020年)。关于强化学习的权威著作是《强化学习导论》(Sutton & Barto,2018年)。一个很好的入门资源是《深度强化学习基础》(Graesser & Keng,2019年)。 148 | ## 1.7 如何阅读本书 149 | 本书的大多数剩余章节包含主要正文、注释部分和一组问题。主要正文旨在自成体系,可在不参考章节其他部分的情况下阅读。尽可能地,背景数学被纳入正文中。但对于那些可能会分散主要论点注意力的更大主题,背景材料被放在附录中,并在页边提供参考。本书中的大多数符号是标准的。但一些约定使用得不太广泛,鼓励读者在继续之前查阅附录A。 150 | 151 | 正文包括许多深度学习模型和结果的新颖插图和可视化。我努力提供现有观点的新解释,而不仅仅是整理他人的工作。深度学习是一个新领域,有时现象理解不足。我试图明确指出在哪些情况下是这样,以及何时我的解释应该谨慎对待。 152 | 153 | 只有在描述结果的章节主体中才包含参考文献。相反,它们可以在章节末尾的注释部分找到。我在主文中通常不尊重历史先例;如果当前技术的祖先已不再有用,我将不会提及它。然而,该领域的历史发展在注释部分有所描述,并希望公平地分配了功劳。注释被组织成段落,并提供了进一步阅读的指引。它们应该帮助读者在子领域内定位自己,并理解它与机器学习的其他部分的关系。注释部分不像正文那样自成体系。根据您的背景知识和兴趣水平,您可能会觉得这些部分更有用或更没用。 154 | 155 | 每章都有一些相关的问题。它们在主文的边栏中被引用,应在相应的点尝试解答。正如乔治·波利亚所指出的,“你看,数学不是一项观赏运动。”他是正确的,我强烈建议你在阅读时尝试解决问题。在某些情况下,它们提供了将帮助您理解正文的洞察。在相关网站上提供答案的问题用星号标记。此外,帮助您理解本书中观点的 Python 笔记本也可通过网站获得,并在正文的边栏中引用。事实上,如果您感到生疏,现在可能值得通读一下有关背景数学的笔记本。 156 | 157 | 不幸的是,AI 研究的进展速度使得这本书不可避免地成为一项持续的工作。如果有您觉得难以理解的部分、值得注意的遗漏或看似多余的部分,请通过相关网站与我联系。我们可以一起让下一版更好。 158 | -------------------------------------------------------------------------------- /Chapter 2 Supervised learning.md: -------------------------------------------------------------------------------- 1 | # 第二章 监督学习(Supervised Learning) 2 | 监督学习模型就是将一个或多个输入转化为一个或多个输出的方式。比如,我们可以将某部二手丰田普锐斯的车龄和行驶里程作为输入,预估的车辆价格则是输出。 3 | 4 | 这个模型其实只是个数学公式;当我们把输入放入这个公式进行计算,我们得到的结果就是所谓的“推理”。这个公式还包含一些参数。改变参数值会改变计算的结果;这个公式其实描述了输入和输出之间所有可能关系的“家族”,而参数则定义了其中的特定关系。 5 | 6 | 每当我们训练或学习模型时,我们其实是在寻找可以真实反映输入与输出关系的参数。学习算法收集一组输入/输出对,然后调整这些参数,使得输入数据能够尽可能准确地预测出其相应的输出。如果对于这些训练数据,模型的预测效果不错,那么我们就会寄希望于它能在未来遇到新的未知输出的情况下,依然能做出好的预测。 7 | 8 | 本章的目标是深入探讨这些观点。我们会首先对这个框架进行更详细的描述,并引入一些专业的符号。然后,我们会用一个简单的范例来展示如何使用一条直线来描述输入与输出间的关系。这个线性模型比较容易理解且直观,却恰好包含了所有有监督学习的关键概念。 9 | ## 2.1 监督学习介绍 10 | 在监督学习中,我们的目标是建立一个模型,这个模型能够接收输入 x 并给出预测结果 y。简单来说,我们假设输入 x 和输出 y 都是预先定义且大小固定的向量,并且这些向量中的元素排列顺序始终一致。举个例子,如普锐斯汽车的例子,输入 x 总是先包含汽车的年龄,然后是行驶里程,按照这个顺序。这种数据被称为结构化或表格数据(structured or tabular data)。 11 | 12 | 为了进行预测,我们需要一个函数模型 f[•],它以 x 为输入并返回预测结果 y,即: 13 | 14 | $$ 15 | y = f[x] \tag{2.1} 16 | $$ 17 | 18 | 当我们根据输入 x 来计算预测结果 y 时,这个过程称为推理(inference)。 19 | 20 | 这个模型实际上是一个具有固定形式的数学方程,代表了输入和输出之间各种不同的关系。模型中也包含一些参数 $\phi$。这些参数的选择决定了输入和输出之间具体的关系。更准确地说,我们应该这样表达这个关系: 21 | 22 | $$ 23 | y = f[x, \phi] \tag{2.2} 24 | $$ 25 | 26 | 当我们谈及学习或训练模型时,意味着我们在尝试找出能够根据输入合理预测输出的参数 $\phi$。我们通过一组包含 I 对输入和输出样本 ${x_i, y_i}$ 的训练数据集来学习这些参数。我们的目标是选取能够尽可能准确地将每一个训练输入映射到它对应的输出的参数。我们通过损失函数 L 来衡量这种映射的准确程度。损失函数是一个标量值,它概括了模型基于当前参数 $\phi$ 预测训练数据输出与实际输入的不匹配程度。 27 | 28 | 我们可以把损失函数视为参数的函数 $L[\phi]$。在训练模型时,我们的目标是寻找一组参数 $\hat \phi$,这组参数能够使损失函数的值最小: 29 | 30 | $$ 31 | \hat \phi = \arg \mathop{\min}\limits_{\phi} L [\phi] \tag{2.3} 32 | $$ 33 | 34 | 如果在这个最小化过程之后损失很小,说明我们找到了一组能够从训练输入 $x_i$ 准确预测训练输出 $y_i$ 的模型参数。 35 | 36 | 在训练模型之后,我们接下来需要评估它的性能。我们会在一组独立的测试数据上运行模型,以评估它对于训练过程中未曾见过的示例的泛化能力。如果模型的性能达到预期,那么我们就可以开始部署这个模型了。 37 | 38 | ## 2.2 线性回归示例 39 | 让我们通过一个简单的实例,将这些理论概念具体化。假设有一个模型 $y = f[x, \phi]$,它能够根据某个输入 x,预测出单一的输出 y。接着,我们将构建一个损失函数,并就如何训练这个模型进行讨论。 40 | ### 2.2.1 一维线性回归模型 41 | 一维线性回归模型以一条直线的形式,展现了输入x和输出y之间的关系: 42 | 43 | $$ 44 | y = f[x, \phi] = \phi_0 + \phi_1 x \tag{2.4} 45 | $$ 46 | 47 | ![Figure2.1](figures/chapter2/SupervisedLinear.svg) 48 | 49 | 图2.1 线性回归模型。在我们确定了参数 $\phi = [\phi_0 , \phi_1 ]^T$ 的选择后,该模型就可以依据输入值(x轴位置)来预测输出值(y轴位置)。通过调整y轴截距 $\phi_0$ 和直线斜率 $\phi_1$ 的值,我们的预测结果(代表为青色、橙色以及灰色线)也就有所不同。所以,线性回归模型(公式 2.4)实际上就定义了一个输入/输出关系的集合(代表为多条直线),而模型的参数则用来确定我们将使用的具体一条直线(即集合中的一个成员)。 50 | 51 | 这个模型有两个参数 $\phi = [\phi_0,\phi_1]^T$,$\phi_0$ 和 $\phi_1$ 分别代表直线的截距和斜率。调整截距和斜率的值,可以改变输入和输出之间的关系(如图 2.1 所示)。因此,我们可以认为方程 2.4 描述的是一族可能的输入-输出关系(即:所有可能的线)。而具体选择哪个参数,就能确定这一族关系中的特定成员(也就是特定的一条直线)。 52 | 53 | ### 2.2.2 损失(Loss) 54 | 55 | 对于这个模型,训练数据集(见图 2.2a)由 I 对输入/输出数据对 ${x_i, y_i}$ 组成。图 2.2b–d 展示了三组不同参数定义下的三条线。图 2.2d 中的绿色线条比其他两条更准确地描述了数据,因为它更接近于数据点。然而,我们需要一种系统的方法来判断哪一组参数 $\phi$ 比其他参数更优。为了做到这一点,我们给每一组参数赋予一个数值,这个数值表示模型与数据之间不匹配的程度。我们称这个值为损失;损失越低,表示模型拟合得越好。 56 | 57 | 这种不匹配是通过模型预测 $f[x_i,\phi]$(线在 xi 处的高度)和真实输出 $y_i$ 之间的差异来表示的。在图 2.2b–d 中,这些差异以橙色虚线显示。我们通过计算所有 I 对训练数据对中这些差异的平方和来量化总的不匹配、训练误差或损失: 58 | 59 | $$ 60 | L(\phi) = \sum_{i=1}^{I} (f(x_i; \phi) - y_i)^2 = \sum_{i=1}^{I} (\phi_0 + \phi_1 x_i - y_i)^2 \tag{2.5} 61 | $$ 62 | 63 | 由于最佳参数是使这个表达式最小化的参数,我们称之为最小二乘损失。平方操作意味着偏差的方向(即线是在数据点上方还是下方)不重要。我们将在第 5 章回到这个选择的理论原因。 64 | 65 | ![Figure2.2](figures/chapter2/SupervisedLinearFitError.svg) 66 | 67 | Figure 2.2 线性回归中的训练数据,模型和损失的展示。a)我们的训练数据(标注为橙色的点)包含着 I = 12 个输入输出对 {$x_i , y_i$ }。b–d)每一部分都展示了一个具有不同参数的线性回归模型。根据我们选择的截距和斜率参数 $\phi = [\phi_0 , \phi_1 ]^T$,模型的预测结果(表示为橙色的虚线)的误差可能会变大或变小。这里的损失 L 实际上就是这些误差的平方和。如果你看一下图表 b 和 c,你会发现其线条拟合的并不是很好,这使得它们的损失 L 分别为 7.07 和 10.28,这是相当大的损失。而在图表 d 中,该模型拟合得相当好,导致其损失 L 仅为 0.20;实际上,这就是所有可能的线条中损失最小的那一条,可以认为这些参数是最优的。 68 | 69 | 损失 L 是参数 $\phi$ 的函数;当模型拟合较差时(如图 2.2b,c),损失会较大;而拟合良好时(如图 2.2d),损失则较小。从这个角度来看,我们称 $L[\phi]$ 为损失函数或成本函数。目标是找到能最小化这个量的参数 $\hat \phi$: 70 | 71 | $$ 72 | \begin{align} 73 | \hat{\phi} &= \underset{\phi}{\mathrm{argmin}} \, L(\phi) \\ 74 | &= \underset{\phi}{\mathrm{argmin}} \, \left[ \sum_{i=1}^{I} (f(x_i; \phi) - y_i)^2 \right] \\ 75 | &= \underset{\phi}{\mathrm{argmin}} \, \left[ \sum_{i=1}^{I} (\phi_0 + \phi_1 x_i - y_i)^2 \right] \tag{2.6} 76 | \end{align} 77 | $$ 78 | 由于模型只有两个参数(y 截距 $\phi_0$ 和斜率 $\phi_1$),我们可以为每一组参数值的组合计算损失,并将损失函数以表面的形式进行可视化(见图 2.3)。"最佳" 参数则位于这个表面的最低点。 79 | 80 | ![Figure2.3](figures/chapter2/SupervisedSurface.svg) 81 | 82 | ### 2.2.3 训练 83 | 寻找使损失最小化的参数的过程称为模型拟合、训练或学习。这个过程的基本方法是首先随机选择初始参数,然后通过不断“下降”损失函数,直到找到最低点(参见图 2.4)。具体做法是,测量当前位置损失函数表面的梯度,然后朝最陡峭的下坡方向迈出一步。接着不断重复这个过程,直到梯度变平,无法再进一步优化。 84 | 85 | ### 2.2.4 测试 86 | 当模型训练完成后,我们想知道它在实际应用中的表现。这可以通过在一组独立的测试数据上计算损失来实现。模型预测的准确性在多大程度上能泛化到测试数据,一方面取决于训练数据的代表性和完整性;另一方面,则取决于模型的表达能力。例如,简单的模型如直线可能无法完全捕捉输入和输出之间的真实关系,这就是所谓的欠拟合。相反,表达能力过强的模型可能会描述训练数据中的一些不典型的统计特性,导致不正常的预测结果,这被称为过拟合。 87 | 88 | ## 2.3 概要 89 | 监督学习模型是一个函数 $y = f[x, \phi]$,它将输入 x 与输出 y 关联起来。这种特定的关系由参数 φ 决定。为了训练模型,我们在训练数据集 {$x_i, y_i$} 上定义了损失函数 $L[\phi]$,以量化模型预测 $f[x_i,\phi]$ 与实际观测输出 yi 之间的不匹配程度。然后我们寻找能够最小化这个损失的参数。我们通过在不同的测试数据集上评估模型,来检查它对新输入的泛化能力。 90 | 91 | 接下来的第 3-9 章将进一步深入这些概念。首先,我们将探讨模型本身。1D 线性回归的明显限制是,它只能以直线形式描述输入和输出之间的关系。第 3 章介绍的浅层神经网络虽然比线性回归稍复杂,但能描述更广泛的输入/输出关系。第 4 章的深度神经网络在保持表达能力的同时,能用更少的参数描述复杂函数,且在实际应用中表现更佳。 92 | 93 | 第 5 章将探讨不同任务下的损失函数及其理论基础,特别是最小二乘损失。第 6 章和第 7 章将讨论训练过程,第 8 章将讨论如何衡量模型性能,而第 9 章将考察旨在提高性能的正则化技术。 94 | 95 | ![Figure2.4](figures/chapter2/SupervisedOpt.svg) 96 | ## Notes 97 | 98 | **损失函数(loss Function)与成本函数(cost function)**:在机器学习领域,尤其是在本书中,“损失函数”和“成本函数”这两个术语通常可以互换使用。但更准确地说,损失函数是指与单个数据点相关的具体项(例如,方程 2.5 中每个平方项),而成本函数是指需要被最小化的整体量(即方程 2.5 中的整个右侧部分)。成本函数可能还包含与单个数据点无关的其他项(详见第 9.1 节)。更广义上,目标函数指的是任何需要最大化或最小化的函数。 99 | 100 | **生成(Generative)模型与判别(Discriminative)模型**:本章中提到的模型 $y = f[x, \phi]$ 属于判别模型。这类模型基于实际测量的数据 x 来预测输出 y。另一种方法是构建生成模型 $x = g[y, \phi]$,在这种模型中,实际测量的数据 x 被看作是输出 y 的函数。 101 | 虽然生成模型的缺点是它们不直接预测 y,但它们的优势在于能够融入关于数据生成方式的先验知识。比如,如果我们要预测图像 x 中汽车的三维位置和方向 y,我们可以在函数 $x = g[y, \phi]$ 中加入关于汽车形状、三维几何和光传输的知识。 102 | 尽管这听起来是个好主意,但实际上,在现代机器学习中,判别模型更为主流。这是因为在生成模型中利用先验知识所带来的优势通常不及利用大量训练数据来学习灵活的判别模型所获得的优势。 103 | ## 课后习题 104 | **问题 2.1** 为了在损失函数(方程 2.5)上实现“downhill”,我们需要计算它对参数 $\phi_0$ 和 $\phi_1$ 的梯度。请计算出这两个参数的梯度值 $\partial L / \partial \phi_0$ 和 $\partial L / \partial \phi_1$ 的具体表达式。 105 | 106 | **问题 2.2** 请证明我们可以通过将问题 2.1 中的导数设置为零,然后求解 $\phi_0$ 和 $\phi_1$,以闭合形式找到损失函数的最小值。需要注意的是,这种方法适用于线性回归,但不适用于更复杂的模型;这就是为什么我们通常会使用迭代的模型拟合方法,例如梯度下降(参见图 2.4)。 107 | 108 | **问题 2.3∗** 考虑将线性回归改造为生成模型,形式为 $x = g[y, \phi] = \phi_0 + \phi_1 y$。请问这种情况下的新损失函数是什么?请找出进行推理所需的逆函数 $y = g^{-1}[x, \phi]$ 的表达式。对于一个给定的训练数据集 {${x_i,y_i}$},这个模型是否会做出与判别模型版本相同的预测?一种验证方法是编写程序,使用这两种方法对三个数据点进行线性拟合,看结果是否一致。 109 | 110 | ## 习题答案: 111 | ### 问题2.1 112 | 113 | 给定的损失函数是: 114 | $$ 115 | L(\phi) = \sum_{i=1}^{I} (\phi_0 + \phi_1 x_i - y_i)^2 116 | $$ 117 | 我们需要计算两个参数 $\phi_0$ 和 $\phi_1$ 的梯度。这里的梯度是损失函数对这两个参数的偏导数。 118 | 119 | 对 $\phi_0$ 的偏导数,应用链式法则: 120 | 121 | $$ 122 | \begin{aligned} 123 | \frac{\partial L}{\partial \phi_0} &= \frac{\partial}{\partial \phi_0} \sum_{i=1}^{I} (\phi_0 + \phi_1 x_i - y_i)^2 \\ 124 | &= \sum_{i=1}^{I} 2(\phi_0 + \phi_1 x_i - y_i) \cdot \frac{\partial}{\partial \phi_0} (\phi_0 + \phi_1 x_i - y_i) \\ 125 | &= \sum_{i=1}^{I} 2(\phi_0 + \phi_1 x_i - y_i) \cdot 1 \\ 126 | &= \sum_{i=1}^{I} 2(\phi_0 + \phi_1 x_i - y_i) 127 | \end{aligned} 128 | $$ 129 | 130 | 对 $\phi_1$ 的偏导数同样应用链式法则: 131 | 132 | $$ 133 | \begin{aligned} 134 | \frac{\partial L}{\partial \phi_1} &= \frac{\partial}{\partial \phi_1} \sum_{i=1}^{I} (\phi_0 + \phi_1 x_i - y_i)^2 \\ 135 | &= \sum_{i=1}^{I} 2(\phi_0 + \phi_1 x_i - y_i) \cdot \frac{\partial}{\partial \phi_1} (\phi_0 + \phi_1 x_i - y_i) \\ 136 | &= \sum_{i=1}^{I} 2(\phi_0 + \phi_1 x_i - y_i) \cdot x_i 137 | \end{aligned} 138 | $$ 139 | 综上所述,梯度的具体表达式是: 140 | 141 | $$ \frac{\partial L}{\partial \phi_0} = \sum_{i=1}^{I} 2(\phi_0 + \phi_1 x_i - y_i) $$ 142 | $$ \frac{\partial L}{\partial \phi_1} = \sum_{i=1}^{I} 2(\phi_0 + \phi_1 x_i - y_i) x_i $$ 143 | ### 问题2.2 144 | 为了找到损失函数的最小值,我们可以将导数(梯度)设置为零,并解这些等式来找到 $\phi_0$ 和$\phi_1$ 。这种方法适用于线性回归,因为损失函数是关于参数的二次函数,从而形成了一个凸函数。在凸函数中,任何局部最小值也是全局最小值,因此通过解析方法可以找到这个最小值。 145 | #### 步骤 1: 设置梯度为零 146 | 我们上面已经得到了损失函数 $L(\phi)$ 关于 $\phi_0$ 和$\phi_1$ 的梯度,为了找到最小值,我们将这些导数设置为零: 147 | 148 | $$ 149 | \begin{align} 150 | \sum_{i=1}^{I} 2(\phi_0 + \phi_1 x_i - y_i) = 0 \\ 151 | \sum_{i=1}^{I} 2(\phi_0 + \phi_1 x_i - y_i) x_i = 0 152 | \end{align} 153 | $$ 154 | #### 步骤 2: 解这些方程 155 | 我们可以通过解这两个方程来找到 $\phi_0$ 和$\phi_1$ 的值。首先,我们简化这两个方程: 156 | 157 | $$ 158 | \begin{align} 159 | \sum_{i=1}^{I} (\phi_0 + \phi_1 x_i - y_i) = 0 \\ 160 | \sum_{i=1}^{I} (\phi_0 + \phi_1 x_i - y_i) x_i = 0 161 | \end{align} 162 | $$ 163 | 164 | 然后,我们展开这些求和: 165 | 166 | $$ 167 | \begin{align} 168 | I\phi_0 + \phi_1 \sum_{i=1}^{I} x_i - \sum_{i=1}^{I} y_i = 0 \\ 169 | \phi_0 \sum_{i=1}^{I} x_i + \phi_1 \sum_{i=1}^{I} x_i^2 - \sum_{i=1}^{I} y_i x_i = 0 170 | \end{align} 171 | $$ 172 | 173 | 现在,我们有了两个方程和两个未知数 $\phi_0$ 和 $\phi_1$ 。这是一个线性方程组,可以使用标准的代数方法(例如高斯消元法或矩阵求逆)来解。 174 | #### 注意事项 175 | 虽然这种方法对于线性回归是有效的,但对于更复杂的模型(如具有非线性关系或更多参数的模型)通常不可行。在这些情况下,我们通常会使用迭代方法(如梯度下降),因为它们不依赖于能够解析地解方程,并且可以处理非凸函数,其中可能存在多个局部最小值。 176 | 177 | ### 问题2.3 178 | 当我们将线性回归模型转换为生成模型时,模型的形式变为 $x = g[y, \phi] = \phi_0 + \phi_1 y$。在这种情况下,我们的目标是最小化 x和 $g[y, \phi]$ 之间的差异。 179 | #### 新损失函数 180 | 新的损失函数将是 x 和生成的 x (即 $g[y, \phi]$)之间的差的平方和。因此,新的损失函数 $L'(\phi)$ 可以表示为: 181 | 182 | $$ 183 | \begin{align} 184 | L'(\phi) &= \sum_{i=1}^{I} (x_i - g[y_i, \phi])^2 \\ 185 | &= \sum_{i=1}^{I} (x_i - (\phi_0 + \phi_1 y_i))^2 186 | \end{align} 187 | $$ 188 | 189 | #### 逆函数 190 | 为了找到逆函数 $g^{-1}[x, \phi]$,我们需要重新排列 $x = \phi_0 + \phi_1 y$ 来解出 y: 191 | 192 | $$ 193 | \begin{align} 194 | x = \phi_0 + \phi_1 y \\ 195 | x - \phi_0 = \phi_1 y \\ 196 | y = \frac{x - \phi_0}{\phi_1} 197 | \end{align} 198 | $$ 199 | 200 | 因此,逆函数 $g^{-1}[x, \phi]$ 是: 201 | 202 | $$ 203 | g^{-1}[x, \phi] = \frac{x - \phi_0}{\phi_1} 204 | $$ 205 | #### 模型预测比较 206 | 在这种情况下,生成模型和判别模型版本是否会做出相同的预测取决于模型的学习方式。判别模型直接学习了从 y 到 x 的映射,而生成模型学习了从 x 到 y 的映射,然后我们求逆以进行预测。 207 | 208 | 尽管在数学上这两种模型可能似乎应该提供相同的预测,但在实际操作中,由于诸如数值稳定性、拟合方法(如最小二乘法与梯度下降)等因素,它们可能会产生略有不同的结果。验证这一点的一种方法是,对于一个简单的数据集(如三个数据点),分别使用这两种方法进行线性拟合,并比较结果。在实际应用中,这种比较通常是通过编程实现的。 209 | -------------------------------------------------------------------------------- /Chapter 3 Shallow neural networks.md: -------------------------------------------------------------------------------- 1 | # 第三章 浅层神经网络 2 | 第二章我们学习了使用一维线性回归的监督学习方法,但这种模型只能表示出输入与输出之间简单的线性关系。在这一章里,我们将接触到浅层神经网络。这种网络可以表达分段线性函数,并且能力强大到足以近似任何复杂度的多维输入和输出之间的关系。 3 | ## 3.1 神经网络示例 4 | 浅层神经网络是带有参数 $\phi$ 的函数 $y = f[x, \phi]$,它将多变量输入 $x$ 映射成多变量输出 $y$。关于浅层神经网络的全面定义将在第3.4节中给出。首先,我们通过一个示例网络 $f[x, \phi]$ 来介绍核心概念。这个网络能够将单一变量输入 $x$ 转化为单一变量输出 $y$,并包含十个参数 $\phi = \{\phi_0, \phi_1, \phi_2, \phi_3, \theta_{10}, \theta_{11}, \theta_{20}, \theta_{21}, \theta_{30}, \theta_{31}\}$: 5 | 6 | $$ 7 | \begin{align} 8 | y &= f[x, \phi] \\ 9 | &= \phi_0 + \phi_1a[\theta_{10} + \theta_{11}x] + \phi_2a[\theta_{20} + \theta_{21}x] + \phi_3a[\theta_{30} + \theta_{31}x] \tag{3.1} 10 | \end{align} 11 | $$ 12 | 13 | 这个计算过程可以分成三个步骤:首先,计算输入数据 $x$ 的三个线性函数($\theta_{10} + \theta_{11}x, \theta_{20} + \theta_{21}x, \theta_{30} + \theta_{31}x$)。接着,将这三个函数的结果通过激活函数 $a[\cdot]$ 处理。最后,用 $\phi_1, \phi_2, \phi_3$ 对这三个激活结果进行加权,求和,并加上一个偏移量 $\phi_0$。 14 | 15 | 接下来,我们需要定义激活函数(activation function)$a[\cdot]$。虽然有很多选择,但最常用的是整流线性单元(ReLU): 16 | 17 | $$ 18 | a[z] = ReLU[z] = 19 | \begin{cases} 20 | 0 & \text{if } z < 0 \\ 21 | z & \text{if } z \geq 0 22 | \end{cases} \tag{3.2} 23 | $$ 24 | 25 | 这个函数在输入为正时返回输入值,否则返回零(参见图 3.1)。 26 | 27 | 方程 3.1 描述了哪一类输入/输出关系可能不是一目了然的。但是,前一章节提到的所有概念都适用于这里。方程 3.1 表示了一个函数族,具体的函数取决于 φ 中的十个参数。如果我们知道这些参数,就可以通过对给定输入 $x$ 计算该方程来进行推断(预测 $y$)。给定一个训练数据集 $\{{x_i,y_i}\}^I_{i=1}$,我们可以定义一个最小二乘损失函数 $L[\phi]$,用它来评估对于任意参数值 $\phi$,模型描述该数据集的效果。为了训练这个模型,我们要找出能够最小化这个损失的参数值 $\hat \phi$。 28 | 29 | ![Figure 3.1](figures/chapter3/ShallowReLU.svg) 30 | `图 3.1 整流线性单元 (Rectified Linear Unit, ReLU)。这种激活函数在输入小于零时输出为零,否则保持输入值不变。简而言之,它将所有负数输入值变为零。需要注意的是,虽然有许多其他激活函数可供选择(参见图 3.13),但 ReLU 由于其简单易懂,成为最常用的选择。` 31 | 32 | ![Figure 3.2](figures/chapter3/ShallowFunctions.svg) 33 | 34 | `图 3.2 由方程 3.1 定义的函数族。a-c) 展示了三种不同参数 $\phi$ 的选择下的函数。在这些函数中,输入与输出的关系均为分段线性。不过,各个拐点的位置、拐点间线段的斜率,以及整体高度各不相同。` 35 | ### 3.1.1 神经网络直观理解 36 | 事实上,方程 3.1 描述了一个连续分段线性函数族(见图 3.2),这个函数族最多包含四个线性区域。下面我们解析这个方程,阐释它是如何描绘出这样一个函数族的。为了便于理解,我们将这个函数拆分为两个部分。首先,我们定义几个中间量: 37 | 38 | $$ 39 | \begin{align} 40 | h1 = a[\theta_{10} + \theta_{11}x] \\ 41 | h2 = a[\theta_{20} + \theta_{21}x] \\ 42 | h3 = a[\theta_{30} + \theta_{31}x] 43 | \end{align} \tag{3.3} 44 | $$ 45 | 这里的 $h1, h2, h3$ 被称为隐藏单元。然后,我们通过将这些隐藏单元与一个线性函数结合来计算输出: 46 | 47 | $$ 48 | y = \phi_0 + \phi_1h1 + \phi_2h2 + \phi_3h3 \tag{3.4} 49 | $$ 50 | 51 | 图 3.3 展示了形成图 3.2a 中函数的计算流程。每个隐藏单元内包含了一个关于输入的线性函数 $\theta_0 + \theta_1x$,该线性函数在零点以下被 ReLU 函数 $a[\cdot]$ 截断。这三条线在零点交叉的位置形成了最终输出函数的三个“拐点”。然后,分别用 $\phi_1, \phi_2, \phi_3$ 对这三条被截断的线加权。最后,加上偏移量 $\phi_0$ 来控制最终函数的整体高度。 52 | 53 | ![Figure 3.3](figures/chapter3/ShallowBuildUp.svg) 54 | 55 | `图 3.3 展示图 3.2a 中函数的计算过程。a-c) 输入 x 分别经过三个具有不同 y 截距 θ•0 和斜率 θ•1 的线性函数处理。d-f) 每个线性函数的输出再经过 ReLU 激活函数处理,将所有负数输出值变为零。g-i) 接着,这三个处理过的输出分别乘以权重 $\phi_1 , \phi_2 , \phi_3$ 进行加权。j) 最后,将这些加权后的输出相加,并加上一个控制整体高度的偏移量 $\phi_0$ 。每个线性段代表了隐层单元中的一种不同激活模式。在阴影区域,h2 处于非激活状态(被剪切),而 h1 和 h3 保持激活状态。` 56 | 57 | 在图 3.3j 中,每个线性区域对应于隐藏单元中的一种不同激活模式。当一个单元在 ReLU 函数下被截断时,我们称其为不活跃状态;相反,如果没有被截断,则处于活跃状态。例如,在阴影区域内,得到 $h1$ 和 $h3$(处于活跃状态)的贡献,但没有 $h2$(处于不活跃状态)的贡献。每个线性区域的斜率取决于两个因素:(i)这个区域内活跃输入的原始斜率 $\theta_1$ 和(ii)随后应用的权重 $\phi$。例如,在阴影区域(参见问题 3.3),斜率是 $\phi_1\theta_{11} + \theta_{31}\phi_3$,其中第一项是图中(g)面板的斜率,第二项是(i)面板的斜率。 58 | 59 | 由于每个隐藏单元贡献了一个拐点,所以有三个隐藏单元时,可以形成四个线性区域。但是,这些区域的斜率只有三个是相互独立的;第四个斜率要么是零(如果在这个区域所有隐藏单元都处于不活跃状态),要么是其他区域斜率的总和。 60 | ### 3.1.2 描绘神经网络 61 | 我们此前一直探讨的是一种神经网络,它由一个输入层、一个输出层和三个隐藏单元组成。在图 3.4a 中,我们将这个网络形象化。图中,最左边的是输入层,中间部分是隐藏单元,右边则是输出层。图中的每一条连接线代表了这个神经网络的十个参数中的一个。而为了图像表示的简洁,我们通常不会特别标出截距参数,所以大多数情况下,这个网络的表达方式如图 3.4b 所示。 62 | 63 | 64 | ![Figure 3.4](figures/chapter3/ShallowNet.svg) 65 | 66 | `图 3.4 描述神经网络结构。a) 输入变量 x 位于左侧,隐层单元 h1 , h2 , 和 h3 位于中间,输出变量 y 位于右侧。计算过程从左向右进行。输入变量用于计算隐层单元的值,这些隐层单元的组合进而生成输出值。图中的十个箭头分别代表一个参数,橙色代表截距,黑色代表斜率。每个参数将其来源的值乘以自己,然后将结果加到其目标上。例如,我们将参数 φ1 与来源于 h1 的值相乘,再将结果加到 y 上。为了将偏移量纳入这一计算框架,引入了值为 1 的额外节点(橙色圆圈),例如我们将 φ0 乘以 1(实际上无变化)后加到 y 上。ReLU 函数被应用于隐层单元。b) 通常情况下,网络图中会省略截距、ReLU 函数和参数名称的显示;这种简化后的表示方式实际上描述了同一个网络。` 67 | ## 3.2 通用逼近定理(Universal approximation theorem) 68 | 在上一节中,我们介绍了一个只有一个输入、一个输出、使用ReLU激活函数,并配备了三个隐藏单元的神经网络示例。现在,让我们稍微扩展这个概念,考虑一个拥有 $D$ 个隐藏单元的网络,其中第 $d^{th}$ 个隐藏单元表示为: 69 | 70 | $$ 71 | h_d = a[\theta_{d0} + \theta_{d1}x], \tag{3.5} 72 | $$ 73 | 74 | 这些隐藏单元通过线性方式结合,共同产生输出: 75 | 76 | 77 | $$ 78 | y = \phi_0 + \sum_{d=1}^{D} \phi_dh_d. \tag{3.6} 79 | $$ 80 | 81 | 在浅层网络中,隐藏单元的数量是衡量网络“容量”(即其处理复杂性的能力)的一个指标。当使用 ReLU 激活函数时,具有 $D$ 个隐藏单元的网络输出最多有 $D$ 个拐点,因此它是一个最多有 $D + 1$ 个线性区域的分段线性函数。随着增加更多的隐藏单元,模型能够逼近更为复杂的函数。 82 | 83 | 实际上,如果网络有足够的“容量”(即足够多的隐藏单元),它就能够以任意精度描述定义在实数线某个紧凑子集上的任何连续一维函数。这是因为,每当我们增加一个隐藏单元,就会在函数中增加一个新的线性区域。随着这些线性区域的增多,它们代表了函数中越来越小的部分,这些部分可以被一条线越来越精确地逼近(参见图 3.5)。通用逼近定理证明了,对于任何连续函数,都存在一个浅层网络,它能以任意设定的精度逼近这个函数。 84 | 85 | ![Figure 3.5](figures/chapter3/ShallowApproximate.svg) 86 | 87 | `图 3.5 用分段线性模型近似一维函数(虚线表示)。a-c) 随着分段区域的数量增加,该模型逐渐趋近于连续函数。一个只有单一输入的神经网络会为每个隐层单元新增一个线性区域。根据通用近似定理(Universal Approximation Theorem),只要隐层单元足够多,就能构建一个浅层神经网络,该网络能够以任意精度近似定义在 RDi 紧凑子集上的任何连续函数。` 88 | ## 3.3 多变量输入与输出 89 | 在前述例子中,网络仅有一个单变量标量输入 $x$ 和一个单变量标量输出 $y$。然而,对于网络将多变量输入 $x = [x_1, x_2, \dots, x_{D_i}]^T$(其中 “$^T$” 表示转置)映射到多变量输出预测 $y = [y_1, y_2, \dots, y_{D_o}]^T$ 的更广泛情况,通用逼近定理 (universal approximation theorem) 依然成立。我们首先探讨如何改进模型以预测多变量输出。接着,我们将讨论多变量输入的处理方式。最后,在第 3.4 节,我们会提出浅层神经网络的通用定义。 90 | ## 3.3 多变量输入和输出 91 | 在前面的例子中,网络有一个单变量输入 $x$ 和一个单变量输出 $y$。然而,通用逼近定理也同样适用于网络将多变量输入 $x = [x_1, x_2, \dots, x_{D_i}]^T$ 映射到多变量输出 $y = [y_1, y_2, \dots, y_{D_o}]^T$ 的更一般情况。我们首先探索如何将模型扩展到预测多变量输出。然后我们会考虑多变量输入。最后,在第3.4节中,我们将提出浅层神经网络的通用定义。 92 | ### 3.3.1 可视化多变量输出 93 | 为了将网络扩展到能产生多变量输出 $y$,我们可以简单地为每个输出使用隐藏单元的不同线性函数。例如,一个具有单变量输入 $x$、四个隐藏单元 $h_1, h_2, h_3, h_4$ 和一个二维多变量输出 $y = [y_1, y_2]^T$ 的网络可以定义为: 94 | 95 | $$ 96 | \begin{align} 97 | h_1 = a[\theta_{10} + \theta_{11}x] \\ 98 | h_2 = a[\theta_{20} + \theta_{21}x] \\ 99 | h_3 = a[\theta_{30} + \theta_{31}x] \\ 100 | h_4 = a[\theta_{40} + \theta_{41}x] 101 | \end{align} \tag{3.7} 102 | $$ 103 | 以及 104 | $$ 105 | \begin{align} 106 | y1 = \phi_{10} + \phi_{11}h1 + \phi_{12}h2 + \phi_{13}h3 + \phi_{14}h4 \\ 107 | y2 = \phi_{20} + \phi_{21}h1 + \phi_{22}h2 + \phi_{23}h3 + \phi_{24}h4. 108 | \end{align} \tag{3.8} 109 | $$ 110 | 111 | 这两个输出是隐藏单元的两种不同线性组合。 112 | 113 | 如图 3.3 所示,分段函数的“接点”取决于隐藏单元处的 ReLU 函数 $a[\cdot]$ 截断的初始线性函数 $\theta_0 + \theta_1x$。由于 $y1$ 和 $y2$ 都是相同四个隐藏单元的不同线性函数,因此它们各自的四个“接点”位置必须相同。然而,这些线性区域的斜率和整体的垂直偏移可能不同(参见图 3.6)。 114 | 115 | 116 | ![Figure 3.6](figures/chapter3/ShallowNetTwoOutputs.svg) 117 | 118 | `图 3.6 展示了一个具有一个输入、四个隐层单元和两个输出的网络。a) 网络结构的可视化展示。b) 该网络产生两个分段线性函数,y1[x] 和 y2[x]。由于这些函数共享相同的隐层单元,它们的四个“关节”(位于垂直虚线处)位置是固定的,但它们的斜率和整体高度可能有所不同。` 119 | 120 | ### 3.3.2 可视化多变量输入 121 | 122 | 为了应对多变量输入 $x$,我们扩展了输入与隐藏单元之间的线性关联。例如,一个有两个输入 $x = [x_1, x_2]^T$ 和一个标量输出 $y$ 的网络(参见图 3.7)可能由三个隐藏单元构成,定义如下: 123 | 124 | $$ 125 | \begin{align} 126 | h1 = a[\theta_{10} + \theta_{11}x_1 + \theta_{12}x_2] \\ 127 | h2 = a[\theta_{20} + \theta_{21}x_1 + \theta_{22}x_2] \\ 128 | h3 = a[\theta_{30} + \theta_{31}x_1 + \theta_{32}x_2] 129 | \end{align} \tag{3.9} 130 | $$ 131 | 132 | 133 | 这里,每个输入都对应一个斜率参数。隐藏单元以通常的方式结合,形成输出: 134 | 135 | $$ 136 | y = \phi_0 + \phi_1h1 + \phi_2h2 + \phi_3h3 \tag{3.10} 137 | $$ 138 | 139 | ![Figure 3.7](figures/chapter3/ShallowNetTwoInputs.svg) 140 | 141 | `图 3.7 展示了具有二维多变量输入 x = [x1, x2]^T 和单一输出 y 的神经网络的可视化。` 142 | 143 | 图 3.8 展示了这个网络的处理过程。每个隐藏单元接收两个输入的线性组合,这在三维输入/输出空间中形成了一个有方向的平面。激活函数将这些平面的负值剪切为零。接着,这些被剪切的平面在第二个线性函数(方程 3.10)中被重新组合,形成了一个由凸多边形区域组成的连续分段线性表面(见图 3.8j)。每个区域代表了一种不同的激活模式。例如,在中央的三角形区域中,第一个和第三个隐藏单元处于激活状态,而第二个则未激活。当模型有超过两个输入时,可视化变得更加困难。不过,其基本原理是相似的:输出将是输入的连续分段线性函数,其中线性区域在多维输入空间中呈现为凸多面体。 144 | 145 | ![Figure 3.8](figures/chapter3/ShallowBuildUp2D.svg) 146 | 147 | `图 3.8 在一个具有两个输入 $x = [x1,x2]^T$、三个隐层单元 h1,h2,h3 和一个输出 y 的网络中的处理过程。a-c) 每个隐层单元的输入是两个输入变量的线性函数,对应于一个方向性平面。亮度代表函数的输出,例如,在面板 (a) 中,亮度表示 $θ_10 + θ_{11}x_1 + θ_{12} x2$。细线代表等值线。d-f) ReLU (Rectified Linear Unit) 激活函数对每个平面进行剪切处理(青色线相当于图 3.3d-f 中的“关节”)。g-i) 这些被剪切的平面随后被加权,j) 然后和一个决定表面整体高度的偏移量相加。最终得到的是一个由凸的分段线性多边形区域构成的连续表面。` 148 | 149 | 需要注意的是,随着输入维度的增加,线性区域的数量迅速增长(参见图 3.9)。为了更好地理解这种增长速度,考虑每个隐藏单元定义了一个超平面,区分了单元活跃和不活跃的空间部分(见图 3.8d-f 中的青色线条)。如果我们的隐藏单元数量与输入维度 $D_i$ 相等,我们可以将每个超平面与一个坐标轴对齐(见图 3.10)。对于两个输入维度,这会将空间划分为四个象限。对于三个维度,这会形成八个八分区,而对于 $D_i$ 维度,则会形成 $2^{D_i}$ 个正交空间。由于浅层神经网络通常比输入维度有更多的隐藏单元,它们通常会创造出超过 $2^{D_i}$ 个线性区域。 150 | 151 | ## 3.4 浅层神经网络:一般情况 152 | 153 | 我们已经通过几个示例来展示浅层网络的工作原理。现在我们定义一个浅层神经网络的通用方程 \( y = f[x, \phi] \),它利用 \( h \in \mathbb{R}^{D_h} \) 个隐藏单元将多维输入 \( x \in \mathbb{R}^{D_i} \) 映射到多维输出 \( y \in \mathbb{R}^{D_o} \)。每个隐藏单元的计算方式如下: 154 | 155 | $$ 156 | h_d = a \left[ \theta_{d0} + \sum_{i=1}^{D_i} \theta_{di}x_i \right] \tag{3.11} 157 | $$ 158 | 159 | ![Figure 3.9](figures/chapter3/ShallowRegions.svg) 160 | 161 | `图 3.9 隐层单元与线性区域的关系。a) 对于五种不同输入维度 Di = {1, 5, 10, 50, 100},展示了隐层单元数与其能够产生的最大线性区域数之间的关系。在高维度下,线性区域的数量迅速增加;例如,在 D = 500 单元和输入维度 Di = 100 的情况下,线性区域的数量可以超过 10^107(实心圆所示)。b) 将相同的数据以参数数量作为函数进行绘制。实心圆表示与 a) 面板中相同的模型,拥有 D = 500 隐层单元。这个网络有 51,001 个参数,在现代标准下被认为非常小。` 162 | 163 | 164 | ![Figure 3.10](figures/chapter3/ShallowHyperplanes.svg) 165 | 166 | 167 | `图 3.10 输入维度与线性区域数量的关系。a) 对于单输入维度的模型,一个隐层单元可以创建一个分割点,将输入轴分为两个线性区域。b) 在两个输入维度的模型中,两个隐层单元可以使用两条线(此处与坐标轴对齐)划分输入空间,形成四个区域。c) 在三个输入维度的模型中,三个隐层单元可以用三个平面(同样与坐标轴对齐)划分输入空间,形成八个区域。延伸这一逻辑,一个具有 Di 输入维度和 Di 隐层单元的模型可以用 Di 超平面来划分输入空间,从而形成 2^Di 个线性区域。` 168 | 169 | ![Figure 3.11](figures/chapter3/ShallowNetThreeInputsTwoOutputs.svg) 170 | 171 | `图 3.11 展示了一个具有三个输入和两个输出的神经网络的可视化。该网络共有二十个参数,包括十五个斜率(由箭头指示)和五个偏移(未显示)。` 172 | 173 | 这些隐藏单元被线性方式组合,以产生输出: 174 | 175 | $$ 176 | y_j = \phi_{j0} + \sum_{d=1}^{D_h} \phi_{jd}h_d \tag{3.12} 177 | $$ 178 | 179 | 其中 $a[\cdot]$ 是一种非线性激活函数。该模型的参数为 $\phi = \{ \theta_{\cdot}, \phi_{\cdot}\}$。图 3.11 展示了一个包含三个输入、三个隐藏单元和两个输出的示例。 180 | 181 | 激活函数使得模型能描述输入与输出之间的非线性关系,因此它本身必须是非线性的;如果没有激活函数,或使用线性激活函数,从输入到输出的映射将被限制为线性映射。已尝试了多种不同的激活函数(见图 3.13),但最常用的选择是 ReLU(见图 3.1),它具有易于理解的优点。使用 ReLU 激活的网络将输入空间划分为由 ReLU 函数中的“接点”计算出的超平面交叉定义的凸多面体。每个凸多面体内包含一个不同的线性函数。尽管每个输出的多面体都相同,但它们包含的线性函数可能会有所不同。 182 | ## 3.5 术语 183 | 在本章的结尾,我们来介绍一些术语。神经网络领域有很多专业术语。通常情况下,它们是通过层来描述的。在图 3.12 中,左边是输入层,中间是隐藏层,右边是输出层。我们可以说图 3.12 中的网络有一个包含四个隐藏单元的隐藏层。隐藏单元本身有时也被称为神经元。当数据通过网络传输时,隐藏层输入的值(即在应用 ReLU 函数之前的值)被称为预激活值。隐藏层的值(即在应用 ReLU 函数之后的值)被称为激活值。 184 | 185 | 由于历史原因,任何至少有一个隐藏层的神经网络也被称为多层感知器(MLP)。本章所述的具有一个隐藏层的网络有时被称为浅层神经网络。具有多个隐藏层的网络(将在下一章中描述)被称为深度神经网络。其中连接形成一个无环图(即没有循环的图,如本章中的所有示例)的神经网络被称为前馈网络。如果一个层中的每个元素都连接到下一个层中的每个元素(如本章中的所有示例),则该网络被称为全连接网络。这些连接代表了基础方程中的斜率参数,并被称为网络权重。偏移参数(在图 3.12 中未显示)被称为偏置。 186 | 187 | ![Figure 3.12](figures/chapter3/ShallowTerminology.svg) 188 | 189 | 190 | `图 3.12 术语: 一个浅层网络由一个输入层、一个隐层和一个输出层构成。每一层都通过前向连接(箭头所示)与下一层相连,因此这类模型被称为前向网络(feed-forward networks)。当每一层中的每个变量都与下一层的每个变量相连时,我们称之为全连接网络(fully connected network)。每个连接代表了底层方程中的斜率参数,这些参数称为权重(weights)。隐层中的变量被称为神经元(neurons)或隐层单元(hidden units)。进入隐层单元的值称为激活前值(pre-activations),而隐层单元上的值(即应用 ReLU 函数后的值)称为激活值(activations)。` 191 | ## 3.6 总结 192 | 浅层神经网络包含一个隐藏层。它们的工作过程包括:(i) 计算输入的多个线性函数,(ii) 将这些函数结果通过激活函数处理,然后 (iii) 将这些激活后的结果线性组合以产生输出。浅层神经网络通过将输入空间划分成连续的、由分段线性区域组成的表面来根据输入 x 进行预测 y。只要拥有足够多的隐藏单元(神经元),浅层神经网络能够以任意精度逼近任何连续函数。 193 | 194 | 第 4 章将讨论深度神经网络,这些网络通过增加更多隐藏层来扩展本章所述的模型。第 5 至 7 章将描述如何训练这些模型。 195 | ## Notes 196 | **"神经"网络**:如果本章中的模型仅仅是函数,为什么它们被称为“神经网络”呢?这个连接实际上是比较脆弱的。像图 3.12 中的可视化包括节点(输入、隐藏单元和输出),它们之间有密集的连接。这与哺乳动物大脑中密集连接的神经元在表面上有相似之处。然而,几乎没有证据表明大脑计算的方式与神经网络相同,而且从生物学角度来考虑这一点是没有帮助的。 197 | 198 | ![Figure 3.13](figures/chapter3/ShallowActivations.svg) 199 | 200 | `图 3.13 激活函数(Activation functions)。a) Logistic sigmoid 函数和 tanh 函数。b) Leaky ReLU 函数和参数为 0.25 的 Parametric ReLU 函数。c) SoftPlus 函数、高斯误差线性激活函数(Gaussian error linear unit)和 sigmoid线性激活函数(sigmoid linear unit)。d) 参数为 0.5 和 1.0 的指数线性激活函数(Exponential Linear Unit)。e) 按比例调整的指数线性激活函数(Scaled Exponential Linear Unit)。f) 参数为 0.4,1.0,和 1.4 的 Swish 函数。` 201 | 202 | **神经网络的历史**:1943年,McCulloch 和 Pitts 首次提出了人工神经元的概念,这种神经元能够将输入信号组合以产生输出,但缺乏有效的学习算法。1958年,Rosenblatt 开发出了感知机(Perceptron),一种通过线性组合输入信号并设定阈值来做出是/否决策的模型,并为其设计了一种从数据中学习权重的算法。1969年,Minsky 和 Papert 指出,仅用线性函数处理一般分类问题是不够的。他们认为,通过增加带有非线性激活函数的隐藏层(由此产生了“多层感知机(Multi-layer Perceptron)”这一术语),可以学习到更广泛的输入/输出关系。不过,他们也指出,Rosenblatt 的算法无法学习这些模型的参数。直到20世纪80年代,一个有效的学习算法——反向传播(Backpropagation,详见第7章)才被发明,此后神经网络的研究才重新获得显著发展。关于神经网络历史的详细记载可参见 Kurenkov (2020)、Sejnowski (2018) 和 Schmidhuber (2022) 的著作。 203 | 204 | **激活函数**:ReLU(Rectified Linear Unit)函数最早在1969年由 Fukushima 提出并使用。然而,在神经网络的早期阶段,更常见的激活函数是逻辑 S 形(Logistic Sigmoid)或双曲正切(Tanh)函数(见图 3.13a)。2009年以后,由 Jarrett et al.、Nair & Hinton 和 Glorot et al. 等人的工作重新推广,ReLU 成为现代神经网络成功故事的重要组成部分。ReLU 的一个显著特性是,对于大于零的输入值,其输出相对于输入的导数恒为1,这有助于提高训练的稳定性和效率(详见第7章)。这与逻辑 S 形激活函数形成鲜明对比,后者的导数在大的正输入和负输入下会趋近于零,即发生饱和现象。 205 | 206 | 然而,ReLU函数存在一个明显的不足:当输入为负值时,它的导数为零。这意味着如果所有训练样本对某个ReLU函数都产生负输入,那么在训练过程中就无法改进该ReLU的输入参数。因为相对于输入权重的梯度在局部呈平坦状态,我们无法通过梯度下降法“下坡”。这种现象被称为ReLU消亡问题。为解决这一问题,提出了多种ReLU的改进版本(见图 3.13b),包括 (i) 渗漏ReLU(Leaky ReLU,Maas et al., 2013),即使对负输入值也有一定的线性输出,其斜率较小,大约为0.1;(ii) 参数化ReLU(Parametric ReLU,He et al., 2015),将负值部分的斜率作为一个可学习的参数;以及 (iii) 连接型ReLU(Concatenated ReLU,Shang et al., 2016),它生成两个输出,一个在零以下截断(类似于标准ReLU),另一个在零以上截断。 207 | 208 | 此外,还研究了多种平滑函数(见图 3.13c–d),例如soft-plus函数(Glorot et al., 2011)、高斯误差线性单元(Gaussian Error Linear Unit,Hendrycks & Gimpel, 2016)、S形线性单元(Sigmoid Linear Unit,Hendrycks & Gimpel, 2016)和指数线性单元(Exponential Linear Unit,Clevert et al., 2015)。这些函数大多旨在避免ReLU消亡问题,同时限制负值的梯度过大。Klambauer et al. (2017) 提出了缩放指数线性单元(Scaled Exponential Linear Unit,见图 3.13e),这一激活函数特别有趣,因为当输入方差在有限范围内时,它能帮助稳定激活值的方差(详见第7.5节)。2017年,Ramachandran et al. 采用了一种经验方法来选择激活函数。他们在可能的函数空间中寻找,在各种监督学习任务上表现最佳的函数。他们找到的最佳函数是 $a[x] = x/(1 + exp[−βx])$,其中 β 是一个可学习的参数(见图 3.13f)。他们将这个函数命名为Swish。有趣的是,Swish实际上是对 Hendrycks & Gimpel (2016) 和 Elfwing et al. (2018) 之前提出的激活函数的再发现。2019年,Howard et al. 提出了HardSwish函数,它近似于Swish,形状非常相似,但计算速度更快: 209 | 210 | $$ 211 | HardSwish[z] = 212 | \begin{cases} 213 | 0 & \text{for } z < -3 \\ 214 | \frac{z(z + 3)}{6} & \text{for } -3 \leq z \leq 3 \\ 215 | z & \text{for } z > 3 216 | \end{cases} \tag{3.13} 217 | 218 | $$ 219 | 220 | 尽管这些激活函数各有特点,但目前尚无定论哪种在实际应用中明显优于其他。不过,渗漏ReLU、参数化ReLU和许多连续函数在特定情况下相比ReLU确实表现出了轻微的性能提升。在本书剩余部分,我们主要关注使用基本ReLU函数的神经网络,因为它们创建的函数更容易根据线性区域数量进行刻画。 221 | 222 | **通用逼近定理**:该定理的宽度版本指出,存在一个单隐藏层且隐藏单元数量有限的网络,能够在 Rn 的紧凑子集上以任意精度逼近任何特定的连续函数。这一理论最初由 Cybenko (1989) 针对 S 形激活函数类别证明,并后由 Hornik (1991) 扩展到更广泛的非线性激活函数。 223 | 224 | **线性区域数量**:考虑一个拥有 $D_i \geq 2$ 维输入和 D 个隐藏单元的浅层网络。其线性区域的数量取决于由 ReLU 函数的转折点所形成的 D 个超平面的相交情况(如图 3.8d-f 所示)。每个区域由 ReLU 函数对输入的剪切或不剪切的不同组合产生。Zaslavsky (1975) 指出,在 $D_i \leq D$ 维输入空间内,由 D 个超平面所创造的区域数量最多可以达到 $\sum_{j=0}^{D_i} \binom{D}{j}$(即二项式系数之和)。一般而言,浅层神经网络的隐藏单元数 D 几乎总是大于输入维度 $D_i$,并能在 $2^{D_i}$ 到 $2^D$ 之间创造多个线性区域。 225 | 226 | **线性、仿射与非线性函数**:严格定义下,线性变换 $f[\cdot]$ 是遵循叠加原理的任何函数,即 $f[a + b] = f[a] + f[b]$。根据这个定义,$f[2a] = 2f[a]$。加权和 $f[h1, h2, h3] = \phi_{h1} + \phi_{h2} + \phi_{h3}$ 是线性的,但加上偏移(偏置)后,$f[h1, h2, h3] = \phi_0 + \phi_{h1} + \phi_{h2} + \phi_{h3}$,就不再是线性的。例如,当我们加倍前一个函数的参数时,输出也加倍,但后一个函数不是这样。后者更恰当地被称为仿射函数。在机器学习领域,这些术语常常混用。在本书中,我们也将遵循这一习惯,把这两种函数都称为线性。我们将遇到的所有其他函数都是非线性的。 227 | ## 课后习题 228 | **问题 3.1** 若方程 3.1 中的激活函数是线性的,即 $a[z] = \phi_0 + \phi_{1}z$,则输入到输出的映射将是怎样的?如果移除激活函数,使 $a[z] = z$,又将产生何种映射? 229 | 230 | **问题 3.2** 在图 3.3j 的四个线性区域中,分别指出哪些隐藏单元是活跃的,哪些是不活跃的(即剪切或不剪切输入的隐藏单元)。 231 | 232 | **问题 3.3** 导出图 3.3j 函数中“关节”位置的表达式,用十个参数 $\phi$ 和输入 x 表示。同时,导出四个线性区域斜率的表达式。 233 | 234 | **问题 3.4** 绘制图 3.3 的一个版本,其中第三个隐藏单元的截距和斜率发生变化,如图 3.14c 所示,假定其他参数保持不变。 235 | 236 | ![Figure 3.14](figures/chapter3/ShallowChangeSlope.svg) 237 | 238 | `图 3.14:针对问题 3.4, 描述了一个网络的处理过程,该网络具有一个输入,三个隐藏单元,以及一个输出。a-c) 所示的是,每个隐藏单元接受的输入来源是原输入的线性转换。前两个隐藏单元接收到的输入与图 3.3 中的一样,但是最后一个与它们不同。` 239 | 240 | **问题 3.5** 证明以下性质对于 $\alpha \in \mathbb{R}^+$ 成立: 241 | $$ 242 | ReLU[\alpha \cdot z] = \alpha \cdot ReLU[z] \tag{3.14} 243 | $$ 244 | 这是 ReLU 函数的非负齐次性质。 245 | 246 | **问题 3.6** 继续问题 3.5,当我们将方程 3.3 和 3.4 中定义的浅层网络的参数 $\theta_{10}$ 和 $\theta_{11}$ 乘以一个正常数 $\alpha$ 并将斜率 $\phi_1$ 除以同一参数 $\alpha$ 时,会发生什么?如果 $\alpha$ 是负数呢? 247 | 248 | **问题 3.7** 考虑使用最小二乘损失函数拟合方程 3.1 中的模型。这个损失函数是否有唯一的最小值?即,是否存在一组“最佳”参数? 249 | 250 | **问题 3.8** 考虑将 ReLU 激活函数替换为 (i) 海维赛德阶跃函数 $heaviside[z]$,(ii) 双曲正切函数 $tanh[z]$,以及 (iii) 矩形函数 $rect[z]$。为每种激活函数重绘图 3.3,并简要描述使用一个输入、三个隐藏单元和一个输出的神经网络,对于每种激活函数所能创造的函数族。 251 | $$ 252 | heaviside[z] = \begin{cases} 253 | 0 & z < 0 \\ 254 | 1 & z \geq 0 255 | \end{cases} 256 | $$ 257 | $$ 258 | rect[z] = \begin{cases} 259 | 0 & z < 0 \\ 260 | 1 & 0 \leq z \leq 1 \\ 261 | 0 & z > 1 262 | \end{cases} \tag{3.15} 263 | $$ 264 | 265 | 请针对以下每一个函数,重新绘制一份图 3.3。原始的参数为:$\phi = [\phi_0, \phi_1, \phi_2, \phi_3, \theta_{10}, \theta_{20}, \theta_{30}, \theta_{31}] = [-0.23, -1.3, 1.3, 0.66, -0.2, 0.4, -0.9, 0.9, 1.1, -0.7]$。对于每个激活函数,尝试用通俗的语言解释一下,对于那些神经网络来说,它们只有一个输入,三个隐藏单元和一个输出,可以创造出什么样的函数族。 266 | 267 | 268 | **问题 3.9** 证明图 3.3 中第三个线性区域的斜率是第一个和第四个线性区域斜率之和。 269 | 270 | **问题 3.10** 考虑一个有一个输入、一个输出和三个隐藏单元的神经网络。图 3.3 展示了如何形成四个线性区域。在什么情况下,这个网络会产生少于四个线性区域的分段线性函数? 271 | 272 | **问题 3.11** 和 **问题 3.12** 图 3.7 中的模型包含多少个参数? 273 | 274 | **问题 3.13** 在图 3.8 的七个区域中,每个区域的激活模式分别是什么?也就是说,在每个区域中,哪些隐藏单元是激活状态(传递输入),哪些是非激活状态(剪切输入)? 275 | 276 | **问题 3.14** 描述图 3.11 中网络的方程。需要三个方程从输入计算出三个隐藏单元的值,以及两个方程从隐藏单元计算输出。 277 | 278 | **问题 3.15** 图 3.11 中的网络最多能创建多少个三维线性区域? 279 | 280 | **问题 3.16** 描述一个具有两个输入、四个隐藏单元和三个输出的网络的方程,并按照图 3.11 的风格绘制这个网络模型。 281 | 282 | **问题 3.17** 方程 3.11 和 3.12 定义了一个具有 $D_i$ 个输入、$D_h$ 个隐藏单元的隐藏层以及 $D_o$ 个输出的通用神经网络。求出模型参数数量的表达式,以 $D_i$、$D_h$ 和 $D_o$ 作为变量。 283 | 284 | **问题 3.18** 证明一个只有 $D_i = 2$ 维输入、$D_o = 1$ 维输出和 $D = 3$ 个隐藏单元的浅层网络所能创建的最大区域数是七个,如图 3.8j 所示。根据 Zaslavsky (1975) 的结果,即用 $D$ 个超平面划分 $D_i$ 维空间时创造的最大区域数是 $\sum_{j=0}^{D_i} \binom{D}{j}$。如果在这个模型中增加两个隐藏单元,使 $D = 5$,那么最大区域数将是多少? 285 | -------------------------------------------------------------------------------- /Chapter 4 Deep neural networks.md: -------------------------------------------------------------------------------- 1 | 前面一章我们讨论了只有一个隐藏层的浅层神经网络。本章,我们将转向深度神经网络,这种网络拥有多个隐藏层。无论是浅层还是深层网络,当使用 ReLU (Rectified Linear Unit) 激活函数时,它们都能实现从输入到输出的分段直线式的变换。 2 | 3 | 浅层神经网络的能力随着隐藏单元数量的增加而提升。实际上,如果隐藏单元足够多,这些网络甚至能够模拟高维空间中极其复杂的函数。但是,对于某些特定的函数,所需的隐藏单元数量可能非常庞大,以至于实际应用变得不现实。相比之下,深度神经网络能够在相同数量的参数条件下创造出更多的线性判断区域。因此,从实际应用的角度来看,深度网络能够描述更加广泛的函数类型。 4 | 5 | ## 4.1 组合神经网络 6 | 为了更深入地理解深度神经网络的行为特征,我们首先考虑将两个浅层网络进行组合,使得第一个网络的输出成为第二个网络的输入。设想两个各有三个隐藏单元的浅层网络(见图 4.1a)。第一个网络接收输入 x,并产生输出 y,其定义如下: 7 | $$ 8 | \begin{align} 9 | h_1 = a[\theta_{10}+\theta_{11}x] \\ 10 | h_2 = a[\theta_{20}+\theta_{21}x] \\ 11 | h_3 = a[\theta_{30}+\theta_{31}x] 12 | \end{align} \tag{4.1} 13 | $$ 14 | 以及 15 | $$ 16 | y = \phi_0 + \phi_1h_1 + \phi_2h_2 + \phi_3h_3 \tag{4.2} 17 | $$ 18 | 第二个网络以 y 作为输入,产生输出 y′,定义如下: 19 | $$ 20 | \begin{align} 21 | h^\prime_1 = a[\theta^\prime_{10}+\theta^\prime_{11}y] \\ 22 | h^\prime_2 = a[\theta^\prime_{20}+\theta^\prime_{21}y] \\ 23 | h^\prime_3 = a[\theta^\prime_{30}+\theta^\prime_{31}y] 24 | \end{align} \tag{4.3} 25 | $$ 26 | 以及 27 | $$ 28 | y^\prime = \phi^\prime_0 + \phi^\prime_1h^\prime_1 + \phi^\prime_2h^\prime_2 + \phi^\prime_3h^\prime_3 \tag{4.2} 29 | $$ 30 | 在使用 ReLU(线性整流单元)激活函数的情况下,该模型描述了一系列分段线性函数。然而,与拥有六个隐藏单元的浅层网络相比,这种组合网络的线性区域数量潜在地更多。例如,若第一个网络产生三个正负斜率交替的区域(见图 4.1b),这意味着三个不同范围的 x 值被映射到同一输出范围 y ∈ [−1, 1]。接下来,从该 y 范围到 y′ 的映射被重复应用三次。最终的效果是,第二个网络定义的函数被复制三次,从而形成九个线性区域。这一原理在更高维度同样适用(见图 4.2)。 31 | 32 | ![Figure4.1](figures/chapter4/DeepConcat.svg) 33 | 34 | `图 4.1: 结合了各含三个隐藏单元的两个单层网络。a) 第一个网络的输出 y 成为第二个网络的输入。b) 第一个网络通过一个包含三个线性区域的函数,将输入 x(取值范围为 [−1, 1])映射到输出 y(取值范围为 [−1, 1])。这些线性区域的设计目的是让它们的斜率符号交替出现。因此,多个输入 x(以灰色圆圈表示)可以被映射到同一个输出 y(以青色圆圈表示)。c) 第二个网络定义了一个包含三个线性区域的函数,它将输入 y 转换为输出 y′(即将青色圆圈映射到棕色圆圈)。d) 当这两个函数结合后,它们共同作用的结果是:(i) 第一个网络能将三个不同的输入 x 映射到任意一个特定的输出 y,以及 ((ii) 第二个网络以相同的方式处理这些输出;这导致第二个网络在面板 (c) 中定义的函数被重复三次,并根据面板 (b) 中各区域的斜率不同,进行了相应的翻转和缩放处理。` 35 | 36 | ![Figure 4.2](figures/chapter4/DeepTwoLayer2D.svg) 37 | 38 | `图 4.2: 结合了两个神经网络,输入为二维。a) 第一个网络(源自图 3.8)包含三个隐藏单元,它接收两个输入 x1 和 x2,并输出一个标量 y。这个输出随后被送入一个含有两个隐藏单元的第二网络,生成输出 y′。b) 第一个网络构建的函数包含七个线性区域,其中一个区域保持水平。c) 第二个网络定义了一个在 y ∈ [−1, 1] 范围内包含两个线性区域的函数。d) 当这两个网络结合时,第一个网络中的六个非平坦区域每个都被第二网络划分为两个新的区域,总共形成了 13 个线性区域。` 39 | 40 | ![Figure 4.3](figures/chapter4/DeepFold.svg) 41 | 42 | 43 | `图 4.3: 深层网络用于折叠输入空间。a) 对于图 4.1 中的第一个网络,一种理解方式是它把输入空间折叠,使其叠加在自身之上。b) 第二个网络则在这个已被折叠的空间上施加其功能。c) 最终的输出结果,是在再次展开这些折叠后得到的。` 44 | 45 | 组合网络的另一种思考方式是,第一个网络将输入空间 x 折叠回自身,使得多个输入产生相同的输出。随后,第二个网络在所有重叠点上应用同一函数,实现了函数在这些点上的复制(见图 4.3)。 46 | 47 | ## 4.2 从组合网络到深层网络 48 | 上一节我们展示了通过将一个浅层神经网络的输出传递给另一个网络,可以创建复杂的函数。现在我们将说明,这实际上是一个包含两个隐藏层的深层网络的特例。 49 | 50 | 第一个网络的输出($y = \phi_0 + \phi_1h_1 + \phi_2h_2 + \phi_3h_3$)是隐藏单元激活值的线性组合。第二个网络的初始操作(根据方程 4.3,我们计算 $\theta'_{10}+\theta'_{11}y、\theta'_{20}+θ'_{21}y 和 \theta'_{30}+\theta'_{31}y$)是对第一个网络输出的线性函数。将一个线性函数应用于另一个线性函数,结果仍然是线性函数。将 y 的表达式代入方程 4.3,可以得到: 51 | 52 | $$ 53 | \begin{align} 54 | h'_1 = a[\psi_0 + \theta_{11} \psi_1] = a[\psi_0 + \theta_{11} \phi_0 + \theta_{11} \phi_1 h_1 + \theta_{11} \phi_2 h_2 + \theta_{11} \phi_3 h_3] \\ 55 | h'_2 = a[\psi_0 + \theta_{21} \psi_1] = a[\psi_0 + \theta_{21} \phi_0 + \theta_{21} \phi_1 h_1 + \theta_{21} \phi_2 h_2 + \theta_{21} \phi_3 h_3] \\ 56 | h'_3 = a[\psi_0 + \theta_{31} \psi_1] = a[\psi_0 + \theta_{31} \phi_0 + \theta_{31} \phi_1 h_1 + \theta_{31} \phi_2 h_2 + \theta_{31} \phi_3 h_3] 57 | \end{align} \tag{4.5} 58 | $$ 59 | 60 | 进一步重写为: 61 | 62 | $$ 63 | \begin{align} 64 | h'_1 = a[\psi_0 + \psi_{11} h_1 + \psi_{12} h_2 + \psi_{13} h_3] \\ 65 | h'_2 = a[\psi_0 + \psi_{21} h_1 + \psi_{22} h_2 + \psi_{23} h_3] \\ 66 | h'_3 = a[\psi_0 + \psi_{31} h_1 + \psi_{32} h_2 + \psi_{33} h_3], 67 | \end{align} \tag{4.6} 68 | $$ 69 | 70 | 其中 $\psi_{10} = \theta^\prime_{10} + \theta^\prime_{11} \psi_0, \psi_{11} = \theta^\prime_{11}\psi_1 , \psi_{12} = \theta^\prime_{11}\psi_2$ 等等。这样的结果就是一个拥有两个隐藏层的网络(见图 4.4)。 71 | 72 | 因此,一个含有两层的网络能够表示那些通过将单层网络的输出传递给另一个网络而创建的函数族。实际上,它能表示一个更广泛的函数族,因为在方程 4.6 中,九个斜率参数 $\psi_{11}, psi_{21}, ..., psi_{33}$ 可以取任意值。而在方程 4.5 中,这些参数受限于外积 $[\theta^\prime_{11},\theta^\prime_{21},\theta^\prime_{31}]^T[\psi_1, \psi_2, \psi_3]$。 73 | 74 | ### 4.3 深度神经网络 75 | 在上一节中,我们展示了将两个浅层网络组合起来可以形成一个有两个隐藏层的特殊深度网络。现在,我们将探讨一个一般情况下的深度网络,它具有两个隐藏层,每层含有三个隐藏单元(见图 4.4)。 76 | 77 | ![Figure 4.4](figures/chapter4/DeepTwoLayer.svg) 78 | 79 | `图 4.4: 一个神经网络,它有一个输入、一个输出,并包含两个隐藏层,每层有三个隐藏单元。` 80 | 81 | 第一层由以下公式定义: 82 | 83 | $$ 84 | \begin{align} 85 | h_1 = a[\theta_{10} + \theta_{11}x] \\ 86 | h_2 = a[\theta_{20} + \theta_{21}x] \\ 87 | h_3 = a[\theta_{30} + \theta_{31}x] 88 | \end{align} \tag{4.7} 89 | $$ 90 | 91 | 接着是第二层: 92 | 93 | $$ 94 | \begin{align} 95 | h'_1 = a[\psi_{10} + \psi_{11}h_1 + \psi_{12}h_2 + \psi_{13}h_3] \\ 96 | h'_2 = a[\psi_{20} + \psi_{21}h_1 + \psi_{22}h_2 + \psi_{23}h_3] \\ 97 | h'_3 = a[\psi_{30} + \psi_{31}h_1 + \psi_{32}h_2 + \psi_{33}h_3] 98 | \end{align} \tag{4.8} 99 | $$ 100 | 101 | 以及输出层: 102 | 103 | $$ 104 | y' = \phi_0 + \phi_1h'_1 + \phi_2h'_2 + \phi_3h'_3 \tag{4.9} 105 | $$ 106 | 107 | 基于这些方程,我们可以用另一种方式思考网络是如何构建出越来越复杂的函数(见图 4.5): 108 | 109 | 1. 第一层的三个隐藏单元 $h_1,h_2,h_3$通过对输入形成线性函数,然后通过 ReLU 激活函数来计算(参见方程 4.7)。 110 | 2. 第二层的激活前状态是通过对这些隐藏单元形成三个新的线性函数来计算的(参见方程 4.8)。此时,我们实际上构建了一个有三个输出的浅层网络,计算了三个具有相同转折点位置的分段线性函数(参见图 3.6)。 111 | 3. 在第二隐藏层,我们对每个函数应用另一个 ReLU 函数 a[⋅] (参见方程 4.8),这会对函数进行裁剪并在每个函数中添加新的转折点。 112 | 4. 最终的输出是这些隐藏单元的线性组合(参见方程 4.9)。 113 | 114 | ![Figure 4.5](figures/chapter4/DeepBuildUp.svg) 115 | 116 | ``图 4.5: 图 4.4 中深层网络的计算过程。a–c) 第二隐藏层接收的输入(即预激活值)是三个分段线性函数,这些函数在相同的位置连接(参见图 3.6)。d–f) ReLU 激活函数将每个分段线性函数的值截断为零。g–i) 接着,这些被截断的函数分别以参数 φ′1、`φ′2 和 φ′3 进行加权处理。j) 最终,这些被截断且加权的函数被相加,并加上一个调节总体高度的偏移 φ′0。 117 | 118 | ![Figure 4.6](figures/chapter4/DeepKLayer.svg) 119 | 120 | `图 4.6: 描述一个具有 Di = 3维输入 x、Do = 2维输出 y 以及 K = 3个隐藏层 h1、h2、h3 的网络的矩阵表示法,这些隐藏层的维度分别是 D1 = 4、D2 = 2 和 D3 = 3。权重以矩阵 Ωk 的形式存储,通过与前一层的激活值相乘来为下一层生成预激活值。例如,Ω1 是一个 2 × 4 的矩阵,用于计算从第一层的激活值到第二层的预激活值。这个矩阵作用于第一层的四个隐藏单元,并为第二层的两个隐藏单元生成输入。偏置则以向量 βk 的形式存储,其维度与其输入的层相对应。比如,偏置向量 β2 长度为三,因为 h3 层包含三个隐藏单元。 121 | 122 | 总的来说,我们可以从两个角度来理解每一层的作用:一是将输入空间进行“折叠”处理,二是创造新的函数,这些函数经过剪切(形成新的区域)后被重新组合。前者强调了输出函数的依赖关系,但没有突出剪切如何创造新的转折点;而后者则侧重于剪切和转折点的产生,但忽视了输出函数中的依赖性。最终,这两种描述都只能提供对深度神经网络运作方式的部分理解。然而,重要的是不要忘记,这些都只是描述输入 x 与输出 y′ 之间关系的方程式。实际上,我们可以将方程式 4.7 到 4.9 结合起来,得到一个更全面的表达式: 123 | 124 | 125 | $$ 126 | \begin{align} 127 | y' = \phi'_0 &+ \phi'_1 a[\psi_{10} + \psi_{11} a[\theta_{10} + \theta_{11} x]] + \psi_{12} a[\psi_{20} + \psi_{21} a[\theta_{20} + \theta_{21} x]] + \psi_{13} a[\psi_{30} + \psi_{31} a[\theta_{30} + \theta_{31} x]] \\ 128 | &+ \psi'_{2} a[\psi_{20} + \psi_{21} a[\theta_{10} + \theta_{11} x]] + \psi_{22} a[\psi_{20} + \psi_{21} a[\theta_{20} + \theta_{21} x]] + \psi_{23} a[\psi_{30} + \psi_{31} a[\theta_{30} + \theta_{31} x]] \\ 129 | &+ \psi'_{3} a[\psi_{30} + \psi_{31} a[\theta_{10} + \theta_{11} x]] + \psi_{32} a[\psi_{20} + \psi_{21} a[\theta_{20} + \theta_{21} x]] + \psi_{33} a[\psi_{30} + \psi_{31} a[\theta_{30} + \theta_{31} x]] 130 | \end{align} \tag{4.10} 131 | $$ 132 | 133 | 尽管这个表达式确实有些难以理解,但它提供了对深度神经网络内部操作更加全面的视角。 134 | 135 | ### 4.3.1 超参数 136 | 我们可以将深度网络的结构扩展到不止两个隐藏层;现代的网络可能包含超过一百层,每层拥有数千个隐藏单元。每层隐藏单元的数量称为网络的*宽度*,而隐藏层的数量则称为网络的*深度*。隐藏单元的总数量是衡量网络*容量*的重要指标。 137 | 138 | 我们用 $K$ 来代表层数,$D_1, D_2, \ldots, D_K$ 来表示每层的隐藏单元数量。这些都是*超参数*的典型例子。它们是在学习模型参数(即斜率和截距项)之前确定的量。对于给定的超参数(比如,$K = 2$ 层,每层有 $D_k = 3$ 个隐藏单元),模型就定义了一个函数族,而具体的参数则确定了这个族中的特定函数。因此,当我们考虑到超参数时,可以把神经网络看作是一系列函数族,这些函数族将输入与输出相联系。 139 | 140 | 141 | ### 4.4 矩阵表示法 142 | 我们已经了解到深度神经网络是由线性变换和激活函数交替构成的。我们也可以用矩阵表示法来等效地描述方程式 4.7 到 4.9: 143 | 144 | $$ 145 | \begin{bmatrix} 146 | h_1' \\ 147 | h_2' \\ 148 | h_3' 149 | \end{bmatrix} 150 | = a 151 | \left( 152 | \begin{bmatrix} 153 | \theta_{10} \\ 154 | \theta_{20} \\ 155 | \theta_{30} 156 | \end{bmatrix} 157 | + 158 | \begin{bmatrix} 159 | \theta_{11} & \theta_{12} \\ 160 | \theta_{21} & \theta_{22} \\ 161 | \theta_{31} & \theta_{32} 162 | \end{bmatrix} 163 | \begin{bmatrix} 164 | x_1 \\ 165 | x_2 166 | \end{bmatrix} 167 | \right), 168 | \tag{4.11} 169 | $$ 170 | 171 | $$ 172 | \begin{bmatrix} 173 | h_1' \\ 174 | h_2' \\ 175 | h_3' 176 | \end{bmatrix} 177 | = a 178 | \left( 179 | \begin{bmatrix} 180 | \psi_{10} \\ 181 | \psi_{20} \\ 182 | \psi_{30} 183 | \end{bmatrix} 184 | + 185 | \begin{bmatrix} 186 | \psi_{11} & \psi_{12} & \psi_{13} \\ 187 | \psi_{21} & \psi_{22} & \psi_{23} \\ 188 | \psi_{31} & \psi_{32} & \psi_{33} 189 | \end{bmatrix} 190 | \begin{bmatrix} 191 | h_1 \\ 192 | h_2 \\ 193 | h_3 194 | \end{bmatrix} 195 | \right), 196 | \tag{4.12} 197 | $$ 198 | 199 | 以及 200 | 201 | $$ 202 | y' = \phi_0' + 203 | \begin{bmatrix} 204 | \phi_1' & \phi_2' & \phi_3' 205 | \end{bmatrix} 206 | \begin{bmatrix} 207 | h_1' \\ 208 | h_2' \\ 209 | h_3' 210 | \end{bmatrix}, 211 | \tag{4.13} 212 | $$ 213 | 214 | 或者更简洁地用矩阵表示法表示为: 215 | 216 | $$ 217 | \begin{align} 218 | h = a[\theta_0 + \Theta x] \\ 219 | h' = a[\psi_0 + \Psi h] \\ 220 | y' = \phi_0' + \phi'^T h' 221 | \end{align} \tag{4.14} 222 | $$ 223 | 224 | 在每种情况下,函数 $a[\cdot]$ 都是将激活函数独立地应用于其向量输入的每个元素上。 225 | 226 | ### 4.4.1 通用公式 227 | 对于层数众多的网络,上述的表示方法可能显得过于复杂。因此,我们从现在开始将第 $k$ 层的隐藏单元向量记作 $h_k$,对第 $k+1$ 层产生影响的偏置(截距)向量记作 $\beta_k$,以及作用于第 $k$ 层并影响第 $(k+1)$ 层的权重(斜率)矩阵记作 $\Omega_k$。这样,一个包含 $K$ 层的通用深度网络 $y = f[x, \phi]$ 可以表示为: 228 | 229 | $$ 230 | \begin{align*} 231 | h_1 &= a[\beta_0 + \Omega_0 x] \\ 232 | h_2 &= a[\beta_1 + \Omega_1 h_1] \\ 233 | h_3 &= a[\beta_2 + \Omega_2 h_2] \\ 234 | & \vdots \\ 235 | h_K &= a[\beta_{K-1} + \Omega_{K-1}h_{K-1}] \\ 236 | y &= \beta_K + \Omega_K h_K. 237 | \end{align*} 238 | \tag{4.15} 239 | $$ 240 | 241 | 这个模型的参数 $\phi$ 包括了所有的权重矩阵和偏置向量,表示为 $\phi = \{ \beta_k, \Omega_k \}^{K}_{k=0}$。 242 | 243 | 如果第 $k$ 层有 $D_k$ 个隐藏单元,那么偏置向量 $\beta_{k-1}$ 的维度就是 $D_k$。最后一个偏置向量 $\beta_K$ 的维度是输出的 $D_0$。第一个权重矩阵 $\Omega_0$ 的维度是 $D_1 \times D_i$,其中 $D_i$ 是输入的维度。最后一个权重矩阵 $\Omega_K$ 的维度是 $D_0 \times D_K$,其余的矩阵 $\Omega_k$ 的维度是 $D_{k+1} \times D_k$(参见图 4.6)。 244 | 245 | 我们也可以将整个网络等效地表示为一个单一函数: 246 | 247 | 248 | $$ 249 | y = \beta_K + \Omega_K [\beta_{K-1} + \Omega_{K-1} [ \ldots a[\beta_2 + \Omega_2 [a[\beta_1 + \Omega_1 [a[\beta_0 + \Omega_0 x]] \ldots ]]. 250 | \tag{4.16} 251 | $$ 252 | 253 | ### 4.5 浅层网络与深层网络的比较 254 | 第 3 章讨论了单隐藏层的浅层网络,而本章我们讨论了多隐藏层的深层网络。现在,我们来比较这两种模型。 255 | 256 | ### 4.5.1 逼近不同函数的能力 257 | 在第 3.2 节,我们提出了一个观点:具备足够容量(隐藏单元)的浅层神经网络能够极其接近地模拟任何连续函数。本章我们了解到,一个包含两个隐藏层的深层网络能够实现两个浅层网络的功能组合。如果其中一个网络执行恒等函数,那么这个深层网络就等同于一个浅层网络。因此,它也能在拥有足够容量的情况下非常接近地逼近任何连续函数。 258 | 259 | ### 4.5.2 每个参数产生的线性区域数量 260 | 一个有一个输入、一个输出和 $D > 2$ 个隐藏单元的浅层网络能够创造最多 $D + 1$ 个线性区域,由 $3D + 1$ 个参数定义。相比之下,一个有一个输入、一个输出和 $K$ 层 $D > 2$ 个隐藏单元的深层网络能够使用 $3D + 1 + (K - 1)D(D + 1)$ 个参数创造最多 $(D + 1)^K$ 个线性区域的函数。 261 | 262 | 图 4.7a 展示了对于将标量输入 $x$ 映射到标量输出 $y$ 的网络,最大线性区域数量随参数数量增加而增加的趋势。深层神经网络在固定参数预算下可以创造出更复杂的函数。当输入维度 $D_i$ 增加时,这种效果更加显著(参见图 4.7b),尽管计算最大区域数量的方法更加复杂。 263 | 264 | 尽管这听起来很吸引人,但函数的灵活性仍然受到参数数量的限制。深度网络能够创建大量的线性区域,但这些区域中存在着复杂的依赖性和对称性。我们在之前讨论过深层网络如何通过“折叠”输入空间来实现这一点(参见图 4.3)。因此,除非我们希望逼近的现实世界函数中存在相似的对称性,或者我们有理由相信输入到输出的映射真的涉及到简单函数的组合,否则更多的区域数量并不一定是一个优势。 265 | 266 | ![Figure 4.7](figures/chapter4/DeepParams.svg) 267 | 268 | `图 4.7: 随着网络深度的增加,神经网络能够产生的线性区域数量急剧增加。a) 输入为 Di = 1 的网络。每条曲线代表在不同隐藏层 K 数量下,变化每层隐藏单元 D 数量的情况。在相同参数限制(水平位置)下,较深的网络能比较浅的网络产生更多线性区域。例如,一个 K = 5 层、每层 D = 10 隐藏单元的网络有 471 个参数(突出显示的点),可以产生 161,051 个区域。b) 输入为 Di = 10 的网络。曲线上的每个点代表增加了十个隐藏单元。在这种情况下,一个 K = 5 层、每层 D = 50 隐藏单元的模型拥有 10,801 个参数(突出显示的点),能创建超过 10^134 个线性区域。` 269 | ### 4.5.3 深度效率 270 | 深层和浅层网络都能模拟任意函数,但某些函数使用深层网络进行逼近会更有效率。事实上,已经发现某些函数需要浅层网络有指数级更多的隐藏单元才能与深层网络实现同等水平的逼近。这种现象被称为神经网络的“深度效率”。虽然这听起来很有吸引力,但目前尚不清楚我们想要逼近的真实世界函数是否符合这种特性。 271 | 272 | ### 4.5.4 大型结构化输入 273 | 我们讨论了每一层的每个元素都与下一层的每个元素相连的完全连接网络。但这种网络对于像图像这样的大型结构化输入来说并不实际,因为输入可能包含大约 10^6 个像素。参数数量会非常庞大,而且我们希望图像的不同部分以类似的方式进行处理;没有必要在图像的每个可能位置都独立学习识别同一对象。 274 | 275 | 解决方案是并行处理图像的局部区域,然后逐步整合来自更大区域的信息。这种由局部到全局的处理方式在没有多层结构的情况下很难实现(参见第 10 章)。 276 | 277 | ### 4.5.5 训练和泛化 278 | 深层网络相比于浅层网络的另一个潜在优势是它们更容易训练;通常训练中等深度的网络比浅层网络要容易(参见图 20.2)。这可能是因为过度参数化的深层模型存在许多大致相同且易于找到的解决方案。然而,随着隐藏层的增加,训练又变得更加困难,尽管已经发展了许多缓解这一问题的方法(参见第 11 章)。 279 | 280 | 深度神经网络在泛化到新数据方面似乎也比浅层网络表现更佳。在实际应用中,大多数任务的最佳结果是通过使用数十甚至数百层的网络实现的。这两种现象都尚未被充分理解,我们将在第 20 章中进一步探讨这些主题。 281 | ### 4.6 总结 282 | 本章首先探讨了组合两个浅层网络时所发生的情况。我们认为,第一个网络对输入空间进行了“折叠”,随后第二个网络应用了一个分段线性函数。在输入空间被折叠到其自身时,第二个网络的效果得到了复制。 283 | 284 | 接着,我们证明了这种浅层网络组合实际上是具有两个隐藏层的深层网络的一种特例。我们解释了每一层中的 ReLU 函数如何在多个位置剪切输入函数,并在输出函数中创建更多的“关节”。我们引入了超参数的概念,对于我们目前讨论的网络而言,它包括了隐藏层的数量和每层中隐藏单元的数量。 285 | 286 | 最后,我们对浅层和深层网络进行了比较。我们发现:(i) 给定足够容量,两种网络都能逼近任何函数;(ii) 相比之下,深层网络每个参数能产生更多的线性区域;(iii) 某些函数可以通过深层网络更有效率地逼近;(iv) 像图像这样的大型结构化输入更适合通过多阶段处理;(v) 实践中,大多数任务使用多层的深层网络能达到最佳效果。 287 | 288 | 了解了深层和浅层网络模型后,我们接下来将关注它们的训练过程。在下一章,我们将讨论损失函数,它对于任何给定的参数值 φ,提供了一个指标,显示模型输出与训练数据集中的真实预测之间的差异。在第 6 章和第 7 章中,我们将深入训练过程本身,探索如何寻找使损失最小化的参数值。 289 | 290 | ## Notes 291 | **深度学习**:长期以来人们已经理解,通过组合浅层神经网络或发展具有多个隐藏层的网络,可以构建更复杂的函数。事实上,“深度学习”这个术语最早由 Dechter 在 1986 年使用。然而,由于实际问题,人们对此的兴趣有限;无法很好地训练这些网络。深度学习的现代时代是由 Krizhevsky 等人在 2012 年报告的图像分类方面的惊人改进所启动的。这一突破性进展可以说是由四个因素的汇聚造成的:更大的训练数据集、训练时更强大的处理能力、使用 ReLU 激活函数和使用随机梯度下降(见第 6 章)。LeCun 等人在 2015 年提供了现代深度学习早期进展的概览。 292 | 293 | **线性区域数量**:对于使用总共 $D$ 个隐藏单元和 ReLU 激活的深度网络,区域数量的上限是 $2^D$(Montufar 等人,2014)。同样的作者展示了一个具有 $D_i$ 维输入和 $K$ 层、每层包含 $D \geq D_i$ 个隐藏单元的深度 ReLU 网络,具有 $O\left(\left(\frac{D}{D_i}\right)^{(K-1)D_i}D D_i\right)$ 个线性区域。Montufar(2017)、Arora 等人(2016)和 Serra 等人(2018)都提供了考虑到每层有不同数量隐藏单元的可能性的更紧密的上限。Serra 等人(2018)提供了一个计算神经网络中线性区域数量的算法,尽管它只适用于非常小的网络。 294 | 295 | 如果 $K$ 层中的每层隐藏单元数量 $D$ 相同,并且 $D$ 是输入维度 $D_i$ 的整数倍,则最大线性区域数量 $N_r$ 可以精确计算,为: 296 | 297 | $$ 298 | N_r = \left( \frac{D}{D_i} + 1 \right)^{D_i(K-1)} \cdot \sum_{j=0}^{D_i} \binom{D}{j} 299 | \tag{4.17} 300 | $$ 301 | 302 | 这个表达式中的第一项对应于网络的前 $K - 1$ 层,可以被认为是反复折叠输入空间。然而,我们现在需要将 $\frac{D}{D_i}$ 个 303 | 304 | 隐藏单元分配给每个输入维度以创建这些折叠。这个方程中的最后一项(二项式系数之和)是浅层网络可以创建的区域数量,归因于最后一层。更多信息,请参考 Montufar 等人(2014)、Pascanu 等人(2013)和 Montufar(2017)。 305 | 306 | **通用逼近定理**:我们在 4.5.1 节中讨论了一个观点,即如果深度网络的各层包含足够多的隐藏单元,那么宽度版本的通用逼近定理将适用。这意味着存在一种网络结构,它能够在 $R^{D_i}$ 的一个紧凑子集上,以任意精度逼近任何给定的连续函数。Lu et al. (2017) 证实,只要层数足够,每层至少包含 $D_i + 4$ 个隐藏单元的带有 ReLU 激活函数的网络,能够以任意精度逼近任何指定的 $D_i$ 维勒贝格(Lebesgue)可积函数。这被称作通用逼近定理的*深度版本*。 307 | 308 | **深度效率**:近期研究显示,某些函数可以被深度网络实现,但无法被容量上限呈指数级增长的浅层网络所表达。换言之,浅层网络要准确描述这些函数,需要指数级增加其单元数量。这种现象被称为神经网络的*深度效率*。 309 | 310 | Telgarsky (2016) 指出,对于任意整数 $k$,可以构建一个具有单一输入、单一输出,并且包含 $O[k^3]$ 层恒定宽度的网络,这样的网络不能用少于 $2^k$ 宽度的 $O[k]$ 层来实现。更令人惊讶的是,Eldan & Shamir (2016) 发现,当涉及到多变量输入时,某些三层网络无法由任何两层网络实现,前提是两层网络的容量低于输入维度的亚指数级。Cohen et al. (2016)、Safran & Shamir (2017. 和 Poggio et al. (2017) 同样展示了深层网络能够有效逼近的函数,而这些函数对于浅层网络却难以做到。Liang & Srikant (2016) 则表明,在一定的逼近误差上限条件下,对于包括单变量函数在内的广泛函数类别,浅层网络需要远比深层网络多的指数级隐藏单元。 311 | 312 | **宽度效率**:Lu et al. (2017) 探讨了这样一个问题:是否存在宽而浅的网络(即,隐藏单元众多的浅层网络),而这些网络却无法通过深度不显著增加的窄网络来实现。他们发现,确实存在一类宽而浅的网络,只有通过深度为多项式级别的窄网络才能表达。这被称为神经网络的_宽度效率_。相对于深度的指数级下界限制,宽度的多项式级下界限制显得更为宽松,这表明在网络设计中,深度比宽度更为重要。Vardi et al. (2022) 进一步证明,对于带有 ReLU 激活函数的网络,减小宽度的代价仅是网络深度的线性增加。 313 | ## Problems 314 | **问题 4.1*** 考虑组合图 4.8 中的两个神经网络。请绘制一张图,展示当输入 $x$ 在 [-1,1] 范围内变化时,输出 $y'$ 的变化关系。 315 | 316 | ![Figure 4.8](figures/chapter4/DeepConcatQuestion.svg) 317 | 318 | `图 4.8: 针对问题 4.1,展示了两个网络的组合。a) 第一个网络的输出 y 转化为第二个网络的输入。b) 第一个网络在输出值 y ∈ [−1, 1] 的范围内计算该函数。c) 第二个网络则在输入范围 y ∈ [−1, 1] 内计算该函数。` 319 | 320 | **问题 4.2** 请确定图 4.6 中的四个超参数。 321 | 322 | **问题 4.3** 利用 ReLU(修正线性单元)函数的非负同质性质(见问题 3.5),证明以下等式: 323 | $$ 324 | ReLU[\beta_1 + \lambda_1 \cdot \Omega_1 ReLU[\beta_0 + \lambda_0 \cdot \Omega_0 x]] = \lambda_0\lambda_1 · ReLU[\frac{1}{\lambda_0\lambda_1} \beta_1 + \Omega_1 ReLU[\frac{1}{\lambda_0} \beta_0 + \Omega_0 x]] \tag{4.18} 325 | $$ 326 | 327 | 其中 $\lambda_0$ 和 $\lambda_1$ 是非负数值标量。由此可见,只要同时调整偏置,并在网络末端重新应用这些缩放因子,就可以任意缩放权重矩阵。 328 | 329 | **问题 4.4** 编写一个深度神经网络的方程,该网络有 $D_i = 5$ 个输入、$D_o = 4$ 个输出,并且有三个隐藏层,其大小分别为 $D_1 = 20$、$D_2 = 10$ 和 $D_3 = 7$。使用方程式 4.15 和 4.16 的形式表示。每个权重矩阵(Weight Matrix)$\Omega$ 和偏置向量(Bias Vector)$\beta$ 的大小分别是多少? 330 | 331 | **问题 4.5** 考虑一个深度神经网络,它有 $D_i = 5$ 个输入、$D_o = 1$ 个输出,以及 $K = 20$ 个隐藏层,每层含有 $D = 30$ 个隐藏单元。请问这个网络的深度和宽度分别是多少? 332 | 333 | **问题 4.6** 考虑一个网络,它有 $D_i = 1$ 个输入、$D_o = 1$ 个输出,并且有 $K = 10$ 层,每层包含 $D = 10$ 个隐藏单元。如果我们增加一层深度或增加每层的单元数量,哪种情况下权重的数量会增加更多?请给出你的理由。 334 | 335 | **问题 4.7** 为方程 3.1 中的浅层神经网络选择参数 $\phi = {\phi_0, \phi_1, \phi_2, \phi_3, \theta_{10}, \theta_{11}, \theta_{20}, \theta_{21}, \theta_{30}, \theta_{31}}$ 的值,使得该网络在有限范围 $x \in [a, b]$ 上定义一个恒等函数。 336 | 337 | **问题 4.8*** 图 4.9 展示了一个浅层网络(如图 3.3 所示)中三个隐藏单元的激活情况。隐藏单元的斜率分别为 1.0, 1.0 和 -1.0,隐藏单元的“关节”位置分别在 1/6, 2/6 和 4/6。找出 $\phi_0, \phi_1, \phi_2$ 和 $\phi_3$ 的值,使得隐藏单元激活的组合为 $\phi_0 + \phi_1 h_1 + \phi_2 h_2 + \phi_3 h_3$,以创建一个具有四个线性区域的函数,这些区域的输出值在零和一之间摆动。最左边区域的斜率应该是正的,下一个是负的,依此类推。如果我们将这个网络与自身组合,将会创建多少个线性区域?如果我们将其与自身组合 $K$ 次,将会创建多少个? 338 | 339 | ![Figure 4.9](figures/chapter4/DeepProbZeroCross.svg) 340 | 341 | `图 4.9: 针对问题 4.8 的隐藏单元激活情况。a) 第一个隐藏单元在 x = 1/6 的位置形成一个拐点,其激活区域的斜率为正一。b) 第二个隐藏单元在 x = 2/6 的位置形成一个拐点,其激活区域的斜率同样为正一。c) 第三个隐藏单元在 x = 4/6 的位置形成一个拐点,但其激活区域的斜率为负一。` 342 | 343 | **问题 4.9*** 继续问题 4.8,使用一个有两个隐藏单元的浅层网络,能否创建一个具有三个线性区域的函数,其输出值在零和一之间来回摆动?使用一个有四个隐藏单元的浅层网络,能否创建一个以同样方式摆动的具有五个线性区域的函数? 344 | 345 | **问题 4.10** 考虑一个深度神经网络,它有一个输入、一个输出,以及 $K$ 个隐藏层,每层包含 $D$ 个隐藏单元。展示这个网络总共有 $3D + 1 + (K - 1)D(D + 1)$ 个参数。 346 | 347 | **问题 4.11*** 考虑两个将标量输入 $x$ 映射到标量输出 $y$ 的神经网络。第一个网络是浅层的,有 $D = 95$ 个隐藏单元。第二个是深层的,有 $K = 10$ 层,每层包含 $D = 5$ 个隐藏单元。每个网络有多少参数?每个网络可以制造多少个线性区域?哪个运行得更快? 348 | -------------------------------------------------------------------------------- /Chapter 5 Loss functions.md: -------------------------------------------------------------------------------- 1 | 前三章分别介绍了线性回归、浅层神经网络和深度神经网络。这些都属于函数家族,能够实现从输入到输出的映射,其具体的函数取决于模型参数 $\phi$。在训练这些模型时,我们的目标是找到能够为特定任务提供最优输入输出映射的参数。本章将详细阐述“最优映射”的含义。 2 | 3 | 要定义“最优映射”,首先需要一组训练数据集 $\{x_i, y_i\}$,即输入和输出的配对。损失函数(Loss Function)$L[\phi]$ 能够返回一个数值,这个数值描述了模型预测 $f(x_i, \phi)$ 与其对应的真实输出 $y_i$ 之间的不匹配程度。在训练过程中,我们追求的是能最小化损失的参数值 $\phi$,以使训练输入尽可能准确地映射到输出。例如,在第2章中,我们见到了一种损失函数——最小平方损失函数,适用于目标是实数 $y \in \mathbb{R}$ 的单变量回归问题。该函数通过计算模型预测 $f(x_i, \phi)$ 与真实值 $y_i$ 之间差异的平方和来进行计算。 4 | 5 | 本章还提出了一个框架,不仅证明了在实值输出场景下选择最小平方准则的适用性,还指导我们为其他类型的预测问题构建损失函数。我们将讨论包括二元分类(其中预测结果 $y \in \{0, 1\}$ 属于两个类别中的一个)和多类别分类(预测结果 $y \in \{1, 2, \ldots, K\}$ 属于 $K$ 个类别中的一个)在内的多种情形。在接下来的两章中,我们将探讨模型训练的过程,目标是找到能最小化这些损失函数的参数值。 6 | ## 5.1 最大似然 7 | 在本节中,我们将介绍构建损失函数的具体方法。设想一个计算输入 $x$ 到输出的模型 $f(x, \phi)$,其中 $\phi$ 是模型的参数。之前,我们认为模型直接输出预测结果 $y$。现在,我们改变思路,将模型视为计算给定输入 $x$ 时,可能的输出 $y$ 的条件概率分布 $Pr(y|x)$。这种损失函数的设计目的是使得每个训练输出 $y_i$ 在由对应输入 $x_i$ 计算得到的分布 $Pr(y_i|x_i)$ 中具有较高的概率(见图 5.1)。 8 | 9 | ![Figure5.1](figures/chapter5/LossDataTypes.svg) 10 | 11 | 12 | `图 5.1 输出分布预测。a) 回归任务中,目标是基于训练数据 {xi,yi}(橙色点)从输入 x 预测出一个实数输出 y。对于每个输入值 x,机器学习模型预测输出 y ∈ R 的分布 P(y|x)(青色曲线展示了 x = 2.0 和 x = 7.0 时的分布)。损失函数的目的是使根据相应输入 xi 预测出的分布最大化观测到的训练输出 yi 的概率。b) 在分类任务中,为预测离散类别 y ∈ {1, 2, 3, 4},我们采用离散概率分布,模型因此针对 xi 的每个值预测 yi 的四个可能值的概率分布直方图。c) 在预测计数 y ∈ {0, 1, 2, ...} 和 d) 预测方向 y ∈ (−π, π] 的任务中,我们分别采用定义在正整数集和圆周域上的分布。` 13 | 14 | #### 5.1.1 计算输出的分布 15 | 这引出了一个问题:模型 $f(x, \phi)$ 如何转化为计算概率分布的形式。答案很简单。首先,我们需要选定一个定义在输出域 $Y$ 上的参数化概率分布 $Pr(y|\theta)$。接着,我们利用神经网络来计算该分布的一个或多个参数 $\theta$。 16 | 17 | 例如,假设预测域是实数集,即 $y \in \mathbb{R}$。在这种情况下,我们可能选择单变量正态分布,它在 $\mathbb{R}$ 上有定义。该分布由均值 $\mu$ 和方差 $\sigma^2$ 所决定,因此 $\theta = \{\mu, \sigma^2\}$。机器学习模型可以用来预测均值 $\mu$,而方差 $\sigma^2$ 则可以视为一个待定的常数。 18 | #### 5.1.2 最大似然准则 19 | 模型现在针对每个训练输入 $x_i$ 计算不同的分布参数 $\theta_i = f(x_i, \phi)$。我们的目标是使每个训练输出 $y_i$ 在其相应的分布 $Pr(y_i|\theta_i)$ 下具有较高概率。因此,我们选择模型参数 $\phi$,以最大化所有 $I$ 个训练样本的联合概率: 20 | $$ 21 | \begin{align} 22 | \hat{\phi} &= argmax_{\phi} \left[ \prod_{i=1}^{I} Pr(y_i|x_i) \right] \\ 23 | &= argmax_{\phi} \left[ \prod_{i=1}^{I} Pr(y_i|\theta_i) \right] \\ 24 | &= argmax_{\phi} \left[ \prod_{i=1}^{I} Pr(y_i|f(x_i, \phi)) \right] \\ 25 | \end{align} \tag{5.1} 26 | $$ 27 | 28 | 这个联合概率项反映的是参数的似然(Likelihood),因此方程 5.1 称为最大似然准则(Maximum Likelihood Criterion)[^1]。 29 | 30 | 这里我们基于两个假设。首先,我们假设所有数据点的输出 $y_i$ 都服从相同的概率分布,即数据是同分布的。其次,我们认为给定输入的输出的条件分布 $Pr(y_i|x_i)$ 是相互独立的,因此整个训练数据集的似然可以表示为: 31 | 32 | $$ 33 | Pr(y_1, y_2, \ldots , y_I|x_1, x_2, \ldots , x_I) = \prod_{i=1}^{I} Pr(y_i|x_i) \tag{5.2} 34 | $$ 35 | 36 | 换言之,我们假定数据是独立同分布(i.i.d.)的。 37 | 38 | ![Figure5.2](figures/chapter5/LossLog.svg) 39 | 40 | `图 5.2 对数变换。a) 对数函数是单调递增的,即若 z > z′,则 log z > log z′。因此,任何函数 g(z) 的最大值位置与 log g(z) 的最大值位置相同。b) 函数 g(z)。c) 该函数的对数 log g(z)。g(z) 上所有正斜率的位置在经过对数变换后依然保持正斜率,负斜率的位置同样保持负斜率。最大值位置不变。` 41 | #### 5.1.3 最大化对数似然 42 | 尽管最大似然准则(方程 5.1)理论上有效,但在实际应用中并不方便。每个项 $Pr(y_i|f(x_i, \phi))$ 的值可能很小,导致这些项的乘积极小,难以用有限精度算法精确表示。幸运的是,我们可以通过最大化似然的对数来解决这个问题: 43 | 44 | $$ 45 | \begin{align} 46 | \hat{\phi} &= argmax_{\phi} \left[ \prod_{i=1}^{I} Pr(y_i|f(x_i, \phi)) \right] \\ 47 | &= argmax_{\phi} \left[ \log \prod_{i=1}^{I} Pr(y_i|f(x_i, \phi)) \right] \\ 48 | &= argmax_{\phi} \left[ \sum_{i=1}^{I} \log Pr(y_i|f(x_i, \phi)) \right] 49 | \end{align} \tag{5.3} 50 | $$ 51 | 52 | 由于对数是单调递增函数,对数似然准则与原始最大似然准则在数学上是等价的。这意味着,提高对数似然准则的同时,也就提高了最大似然准则。因此,两种准则的最大值位置是相同的,最优的模型参数 $\hat{\phi}$ 在两种情况下都是一致的。同时,对数似然准则通过求和而非乘积,避免了精度问题。 53 | #### 5.1.4 最小化负对数似然 54 | 55 | 通常,模型拟合问题是以最小化损失的方式来定义的。为了将最大对数似然准则转换为一个最小化问题,我们通过乘以负一得到负对数似然准则: 56 | 57 | $$ 58 | \hat{\phi} = argmin_{\phi} \left[ - \sum_{i=1}^{I} \log Pr(y_i|f(x_i, \phi)) \right] 59 | = argmin_{\phi} [ L[\phi] ] \tag{5.4} 60 | $$ 61 | 这就构成了最终的损失函数 $L[\phi]$。 62 | 63 | #### 5.1.5 推断 64 | 65 | 如今,网络不再直接预测输出 $y$,而是确定了一个关于 $y$ 的概率分布。在进行推断时,我们一般需要一个具体的估计值而不是整个分布,因此我们选择分布的最大值作为预测: 66 | 67 | $$ 68 | \hat{y} = argmax_y [Pr(y|f(x, \phi))] \tag{5.5} 69 | $$ 70 | (5.5) 71 | 72 | 我们通常可以根据模型预测的分布参数 $\theta$ 来确定这个估计值。例如,在单变量正态分布中,最大值出现在均值 $\mu$ 处。 73 | 74 | 75 | ## 5.2 构建损失函数的步骤 76 | 77 | 根据最大似然方法,针对训练数据 $\{x_i, y_i\}$ 构建损失函数的步骤如下: 78 | 79 | 1. 选定一个适合预测结果 $y$ 的概率分布 $Pr(y|\theta)$,并确定其分布参数 $\theta$。 80 | 2. 设定机器学习模型 $f(x, \phi)$ 来预测这些参数中的一个或多个,即 $\theta = f(x, \phi)$,$Pr(y|\theta) = Pr(y|f(x, \phi))$。 81 | 3. 为训练模型,寻找最小化负对数似然损失函数的模型参数 $\phi$: 82 | 83 | $$ 84 | \hat{\phi} = argmin_{\phi} [ L[\phi] ] = argmin_{\phi} \left[ - \sum_{i=1}^{I} \log Pr(y_i|f(x_i, \phi)) \right] \tag{5.6} 85 | $$ 86 | 87 | 4. 对于新的测试样例 $x$,返回完整分布 $Pr(y|f(x, \phi))$ 或此分布的最大值。 88 | 89 | 本章其余部分主要讨论如何使用这种方法为常见的预测类型构建损失函数。 90 | ## 5.3 示例 1:单变量回归 91 | 92 | 首先考虑单变量回归模型。这里的目标是用带有参数 $\phi$ 的模型 $f(x, \phi)$,从输入 $x$ 预测单一实数输出 $y \in \mathbb{R}$。遵循上述步骤,我们为输出域 $y$ 选择一个概率分布。我们选用单变量正态分布(见图 5.3),它定义在 $y \in \mathbb{R}$ 上。该分布有两个参数(均值 $\mu$ 和方差 $\sigma^2$),并具有概率密度函数: 93 | 94 | $$ 95 | Pr(y|\mu, \sigma^2) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp \left[ -\frac{(y - \mu)^2}{2\sigma^2} \right] \tag{5.7} 96 | $$ 97 | 接着,我们让机器学习模型 $f(x, \phi)$ 计算这个分布的一个或多个参数。在这里,我们只计算均值 $\mu = f(x, \phi)$: 98 | 99 | $$ 100 | Pr(y|f(x, \phi), \sigma^2) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp \left[ -\frac{(y - f(x, \phi))^2}{2\sigma^2} \right] \tag{5.8} 101 | $$ 102 | 我们的目标是找到使训练数据 $\{x_i, y_i\}$ 在此分布下尽可能概率最高的参数 $\phi$(参见图 5.4)。为此,我们选择了基于负对数似然的损失函数 $L[\phi]$: 103 | 104 | $$ 105 | L[\phi] = - \sum_{i=1}^{I} \log \left[ Pr(y_i|f(x_i, \phi), \sigma^2) \right] 106 | = - \sum_{i=1}^{I} \log \left[ \frac{1}{\sqrt{2\pi\sigma^2}} \exp \left[ -\frac{(y_i - f(x_i, \phi))^2}{2\sigma^2} \right] \right] \tag{5.9} 107 | $$ 108 | 在训练模型时,我们的目标是找到最小化这一损失的参数 $\hat{\phi}$。 109 | 110 | ![图5.3](figures/chapter5/LossNorm.svg) 111 | 112 | `图 5.3 单变量正态分布(也被称为高斯分布)是在实数轴 z ∈ R 上定义的,其主要由两个参数 μ 和 σ2 决定。其中,均值 μ 决定了分布的峰值位置,而方差 σ2 的标准差(即方差的正平方根)则决定了分布的宽度。因为整个概率密度的总和为一,所以当方差减小,分布变得更加集中时,其峰值也相应地变得更高。` 113 | #### 5.3.1 最小平方损失函数 114 | 115 | 我们对损失函数进行一系列代数操作,目的是寻找: 116 | 117 | $$ 118 | \begin{align} 119 | \hat{\phi} &= argmin_{\phi} \left[ -\sum_{i=1}^{I} \log \left[ \frac{1}{\sqrt{2\pi\sigma^2}} \exp \left[ -\frac{(y_i - f(x_i, \phi))^2}{2\sigma^2} \right] \right] \right] \\ 120 | &= argmin_{\phi} \left[ -\sum_{i=1}^{I} ( \log \frac{1}{\sqrt{2\pi\sigma^2}} - \frac{(y_i - f(x_i, \phi))^2}{2\sigma^2} ) \right] \\ 121 | &= argmin_{\phi} \left[ \sum_{i=1}^{I} \frac{(y_i - f(x_i, \phi))^2}{2\sigma^2} \right] \tag{5.10} 122 | \end{align} 123 | $$ 124 | 在这里,我们去除了与 $\phi$ 无关的项,并忽略了常数缩放因子,因为它不影响最小值的位置。 125 | 126 | 通过这些操作,我们得到了最小平方损失函数,这是我们在第2章讨论线性回归时首次提出的: 127 | 128 | $$ 129 | L[\phi] = \sum_{i=1}^{I} (y_i - f(x_i, \phi))^2 \tag{5.11} 130 | $$ 131 | 最小平方损失函数的自然来源于两个假设:预测误差(i)是独立的,并且(ii)遵循均值为 $\mu = f(x_i, \phi)$ 的正态分布(参见图 5.4)。 132 | 133 | ![Figure5.4](figures/chapter5/LossNormalRegression.svg) 134 | 135 | `图 5.4 最小二乘法与正态分布最大似然损失的等效性。a) 参照图 2.2 中的线性模型。最小二乘法通过最小化模型预测值 f[xi,φ](绿线)与真实输出值 yi(橙色点)之间差异(虚线表示)的平方和来进行优化。在此例中,模型拟合非常准确,因此这些差异非常小(比如,对于被特别标出的两个点)。b) 当参数设置不当时,模型拟合效果较差,导致平方差异显著增加。c) 最小二乘法的原理是假设模型预测的是输出值的正态分布的平均值,并且我们通过最大化概率来优化它。在第一种情况下,由于模型拟合得很好,所以数据的概率 Pr(yi|xi)(水平橙色虚线)较高(相应的负对数概率较小)。d) 在第二种情况下,由于模型拟合效果差,因此概率较低,负对数概率较高。` 136 | 137 | #### 5.3.2 推断 138 | 139 | 网络现在不直接预测 $y$,而是预测 $y$ 的正态分布均值 $\mu = f(x, \phi)$。在进行推断时,我们通常寻求一个最佳的单点估计,因此我们选择预测分布的最大值: 140 | 141 | $$ 142 | \hat{y} = argmax_y [Pr(y|f(x, \phi))] \tag{5.12} 143 | $$ 144 | 145 | 146 | 在单变量正态分布中,最大值位置由均值参数 $\mu$ 决定(参见图 5.3)。这正是模型所计算的,因此 $\hat{y} = f(x, \phi)$。 147 | #### 5.3.3 估计方差 148 | 149 | 在制定最小平方损失函数时,我们假定网络预测了正态分布的均值。有趣的是,方程 5.11 中的最终表达式并不依赖于方差 $\sigma^2$。但我们可以将 $\sigma^2$ 视为模型的参数之一,并对模型参数 $\phi$ 和分布的方差 $\sigma^2$ 一起最小化方程 5.9: 150 | 151 | 152 | $$ 153 | \hat{\phi}, \hat{\sigma}^2 = \arg\min_{\phi,\sigma^2} \left[ -\sum_{i=1}^I \log \left[ \frac{1}{\sqrt{2\pi\sigma^2}} \exp \left( -\frac{(y_i - f(x_i; \phi))^2}{2\sigma^2} \right) \right] \right] \tag{5.13} 154 | $$ 155 | 156 | 157 | 在推断阶段,模型从输入中预测均值 $\mu = f[x, \hat{\phi}]$,同时我们在训练过程中得到了方差 $\hat{\sigma}^2$ 的估计。均值是最优预测,而方差反映了预测的不确定性。 158 | 159 | #### 5.3.4 异方差回归 160 | 161 | 先前的模型假定数据方差是固定的,但这可能不太现实。当模型的不确定性随输入数据变化时,我们称之为异方差(与同方差相对,后者不确定性是固定的)。 162 | 163 | 一种处理这种情况的简单方法是训练一个神经网络 $f(x, \phi)$ 来同时计算均值和方差。举个例子,考虑一个输出两个值的浅层网络,其中第一个输出 $f_1(x, \phi)$ 预测均值,第二个输出 $f_2(x, \phi)$ 预测方差。 164 | 165 | 为了确保计算的方差始终为正,我们需要对网络的第二个输出应用一个能映射到正数的函数。一个好的选择是使用平方函数,得到: 166 | 167 | $$ 168 | \begin{align} 169 | \mu = f_1(x, \phi) \\ 170 | \sigma^2 = f_2(x, \phi)^2 171 | \end{align}\tag{5.14} 172 | $$ 173 | 这样就得到了以下损失函数: 174 | 175 | $$ 176 | \hat{\phi} = argmin_{\phi} \left[ -\sum_{i=1}^{I} \log \left[ \frac{1}{\sqrt{2\pi f_2(x_i, \phi)^2}} \exp \left[ -\frac{(y_i - f_1(x_i, \phi))^2}{2f_2(x_i, \phi)^2} \right] \right] \right] \tag{5.15} 177 | $$ 178 | 图 5.5 对比了同方差和异方差模型。 179 | 180 | ![Figure5.5](figures/chapter5/LossHeteroscedastic.svg) 181 | 182 | `图 5.5 同方差回归与异方差回归比较。a) 在同方差回归中,一个简单的神经网络模型根据输入 x 预测输出分布的平均值 μ。b) 这种情况下,尽管输出的均值(用蓝线表示)随输入 x 呈分段线性变化,方差却始终保持不变(通过箭头和灰色区域表示的 ±2 标准差来展示)。c) 异方差回归的浅层神经网络除了预测均值外,还会预测输出的方差 σ2(更精确地说,是计算方差的平方根,然后再平方)。d) 如此一来,标准差也随输入 x 呈分段线性变化。` 183 | ## 5.4 示例 2:二元分类 184 | 185 | 在二元分类任务中,我们的目标是根据数据 $x$ 将其划分为两个离散类别之一 $y \in \{0, 1\}$。这里的 $y$ 被称为标签。二元分类的例子包括:(i)根据文本数据 $x$ 判断餐厅评论是正面($y = 1$)还是负面($y = 0$);(ii)根据 MRI 扫描 $x$ 判断肿瘤是否存在($y = 1$)或不存在($y = 0$)。 186 | 187 | 我们再次按照第5.2节的步骤构建损失函数。首先,我们为输出空间 $y \in \{0, 1\}$ 选择了伯努利分布,这个分布定义在 $\{0, 1\}$ 上。它有一个参数 $\lambda \in [0, 1]$,表示 $y$ 取值为 1 的概率(见图 5.6): 188 | 189 | $$ 190 | Pr(y|\lambda) = 191 | \begin{cases} 192 | 1 - \lambda & \text{if } y = 0 \\ 193 | \lambda & \text{if } y = 1 194 | \end{cases} \tag{5.16} 195 | $$ 196 | 197 | 也可以写成: 198 | 199 | $$ 200 | Pr(y|\lambda) = (1 - \lambda)^{1-y} \cdot \lambda^y \tag{5.17} 201 | $$ 202 | 然后,我们设置机器学习模型 $f(x, \phi)$ 来预测单一参数 $\lambda$。但由于 $\lambda$ 只能在 [0, 1] 范围内取值,我们需要通过一个函数将网络输出映射到这个范围内。一个合适的函数是逻辑斯蒂 sigmoid 函数(见图 5.7): 203 | 204 | $$ 205 | sig[z] = \frac{1}{1 + \exp[-z]} \tag{5.18} 206 | $$ 207 | 因此,我们预测的分布参数为 $\lambda = sig[f(x, \phi)]$。现在的似然表达式为: 208 | 209 | $$ 210 | Pr(y|x) = (1 - sig[f(x, \phi)])^{1-y} \cdot sig[f(x, \phi)]^y \tag{5.19} 211 | $$ 212 | 这在图 5.8 中展示了一个浅层神经网络模型。损失函数是训练集的负对数似然: 213 | 214 | $$ 215 | L[\phi] = \sum_{i=1}^{I} -\left[(1 - y_i) \log [1 - sig[f(x_i, \phi)]] + y_i \log [sig[f(x_i, \phi)]]\right] \tag{5.20} 216 | $$ 217 | 由于第5.7节将会解释的原因,这称为二元交叉熵损失。 218 | 219 | 变换后的模型输出 $sig[f(x, \phi)]$ 预测了伯努利分布的参数 $\lambda$。这代表 $y = 1$ 的概率,所以 $1 - \lambda$ 代表 $y = 0$ 的概率。在进行推断时,如果我们需要 $y$ 的具体估计,那么当 $\lambda > 0.5$ 时我们设定 $y = 1$,否则设定 $y = 0$。 220 | 221 | ![Figure5.6](figures/chapter5/LossBern.svg) 222 | 223 | `图 5.6 伯努利分布。伯努利分布是定义在仅包含 {0,1} 的域上的分布,它由单一参数 λ 定义,λ 表示观测到结果为 1 的概率。相应地,结果为 0 的概率则为 1 − λ。` 224 | 225 | ![Figure5.7](figures/chapter5/LossLogisticSigmoid.svg) 226 | 227 | `图 5.7 逻辑 Sigmoid 函数。该函数把实数 z 映射到 0 到 1 之间的值,因此 sig[z] 的范围是 [0, 1]。当输入为 0 时,输出值为 0.5。负数输入对应于小于 0.5 的输出值,而正数输入对应于大于 0.5 的输出值。` 228 | 229 | ![Figure5.8](figures/chapter5/LossBinaryClassification.svg) 230 | 231 | `图 5.8 二元分类模型。a) 网络的输出是一个分段线性函数,能够接受任意实数值。b) 这些值通过逻辑 Sigmoid 函数转换,被压缩到 [0,1] 的区间内。c) 转换后的输出用来预测概率 λ,即 y = 1 的可能性(用实线表示)。因此,y = 0 的可能性就是 1 − λ(用虚线表示)。对任一固定的 x(通过垂直切片展示),我们能得到一个与图 5.6 类似的伯努利分布的两种概率值。损失函数倾向于优化模型参数,使得在与正例 yi = 1 关联的 xi 位置上 λ 的值较大,而在与负例 yi = 0 关联的位置上 λ 的值较小。` 232 | ## 5.5 示例 3:多类别分类 233 | 234 | 多类别分类的目标是将输入数据 $x$ 分配给 $K > 2$ 个类别中的一个,即 $y \in \{1, 2, \ldots, K\}$。现实中的例子包括:(i)预测手写数字图像 $x$ 中的哪一个数字 $y$($K = 10$);(ii)预测不完整句子 $x$ 后面跟随的哪一个词汇 $y$($K$ 个可能词汇)。 235 | 236 | 我们再次遵循第5.2节的步骤。首先,对于输出空间 $y \in \{1, 2, \ldots, K\}$,我们选择分类分布(见图 5.9)。这个分布有 $K$ 个参数 $\lambda_1, \lambda_2, \ldots, \lambda_K$,它们确定每个类别的概率: 237 | $$ 238 | Pr(y = k) = \lambda_k \tag{5.21} 239 | $$ 240 | 参数被限制在零和一之间,并且总和必须为一,以形成有效的概率分布。 241 | 242 | 然后,我们利用具有 $K$ 个输出的网络 $f(x, \phi)$ 来从输入 $x$ 计算这 $K$ 个参数。为了确保网络输出符合约束,我们通过一个函数处理这 $K$ 个输出,这个函数是*softmax*函数(见图 5.10)。softmax 函数接受长度为 $K$ 的任意向量,并返回一个同样长度的向量,其元素位于 [0, 1] 范围内且总和为一。softmax 函数的第 $k$ 个输出是: 243 | 244 | $$ 245 | softmax_k[z] = \frac{\exp[z_k]}{\sum_{k'=1}^{K} \exp[z_{k'}]} \tag{5.22} 246 | $$ 247 | 指数函数确保输出为正,分母的求和则保证这 $K$ 个数的总和为一。 248 | 249 | 因此,输入 $x$ 有标签 $y$ 的似然(见图 5.10)是: 250 | 251 | $$ 252 | Pr(y = k|x) = softmax_k[f(x, \phi)] \tag{5.23} 253 | $$ 254 | 损失函数是训练数据的负对数似然: 255 | 256 | $$ 257 | L[\phi] = -\sum_{i=1}^{I} \log \left[ softmax_{y_i} [f(x_i, \phi)] \right] 258 | = -\sum_{i=1}^{I} \left[ f_{y_i}[x_i, \phi] - \log \left( \sum_{k'=1}^{K} \exp [f_{k'}[x_i, \phi]] \right) \right], 259 | $$ 260 | (5.24) 261 | 262 | 其中 $f_k[x, \phi]$ 是神经网络的第 $k$ 个输出。由于将在第5.7节中解释的原因,这被称为多类别交叉熵损失。 263 | 264 | 模型输出的变换代表了 $y \in \{1, 2, \ldots, K\}$ 可能类别的分类分布。作为点估计,我们选择最可能的类别 $\hat{y} = argmax_k[Pr(y = k|f(x, \phi))]$,这对应于图 5.10 中对于该 $x$ 值最高的曲线。 265 | 266 | ![Figure5.9](figures/chapter5/LossCategorical.svg) 267 | 268 | `图 5.9 分类分布。分类分布为超过两个的 K 类别分配概率值,相应的概率为 λ1,λ2,...,λK。这里有五个类别,因此 K = 5。为保证其为一个有效的概率分布,每个参数 λk 都应处于 [0, 1] 的范围内,并且所有 K 个参数的总和必须等于 1。` 269 | 270 | ![Figure5.10](figures/chapter5/LossMultiClassClassification.svg) 271 | `图 5.10 针对 K = 3 类别的多类别分类。a) 该网络输出三个可以任意取值的分段线性函数。b) 通过 softmax 函数处理后,这些输出值被限制为非负数,且它们的总和必须为一。因此,对于任何给定的输入 x,我们都能得到有效的分类分布参数:图中任意垂直切片所产生的三个值的总和为一,这些值代表在类似图 5.9 的分类分布条形图中各条的高度。` 272 | ### 5.5.1 预测其他数据类型 273 | 274 | 本章主要关注回归和分类,因为这些问题非常普遍。然而,为了预测不同类型的数据,我们只需选择适合该领域的分布,并应用第5.2节中的方法。图 5.11 列出了一系列概率分布及其预测领域。其中一些将在本章末尾的问题中进行探讨。 275 | 276 | | Data Type | Domain | Distribution | Use | 277 | |-----------|--------|--------------|-----| 278 | | univariate, continuous, unbounded | $y \in \mathbb{R}$ | normal | regression | 279 | | univariate, continuous, unbounded | $y \in \mathbb{R}$ | Laplace | robust regression | 280 | | univariate, continuous, unbounded | $y \in \mathbb{R}$ | or t-distribution | multimodal regression | 281 | | univariate, continuous, bounded below | $y \in \mathbb{R}^+$ | exponential or gamma | predicting magnitude | 282 | | univariate, continuous, bounded | $y \in [0, 1]$ | beta | predicting proportions | 283 | | multivariate, continuous, unbounded | $y \in \mathbb{R}^K$ | multivariate normal | multivariate regression | 284 | | univariate, continuous, circular | $y \in (-\pi, \pi]$ | von Mises | predicting direction | 285 | | univariate, discrete, binary | $y \in \{0, 1\}$ | Bernoulli | binary classification | 286 | | univariate, discrete, bounded | $y \in \{1, 2, \ldots, K\}$ | categorical | multiclass classification | 287 | | univariate, discrete, bounded below | $y \in [0, 1, 2, 3, \ldots]$ | Poisson | predicting event counts | 288 | | multivariate, discrete, permutation | $y \in \text{Perm}[1, 2, \ldots, K]$ | Plackett-Luce | ranking | 289 | 290 | `图 5.11 不同预测类型下损失函数的分布。` 291 | ## 5.6 多输出预测 292 | 在许多情况下,我们需要使用同一个模型进行多个预测,因此目标输出 $y$ 是向量形式。例如,我们可能想同时预测分子的熔点和沸点(多变量回归问题),或者预测图像中每个点的物体类别(多变量分类问题)。虽然可以定义多变量概率分布,并利用神经网络模拟它们作为输入的函数参数,但更常见的做法是将每个预测视为独立的。 293 | 294 | 独立性意味着我们把概率 $Pr(y|f(x, \phi))$ 看作是对于每个元素 $y_d \in y$ 的单变量项的乘积: 295 | 296 | $$ 297 | Pr(y|f(x, \phi)) = \prod_{d} Pr(y_d|f_d[x, \phi]) \tag{5.25} 298 | $$ 299 | 其中 $f_d[x, \phi]$ 是网络对于 $y_d$ 分布参数的第 $d$ 组输出。例如,对于预测多个连续变量 $y_d \in \mathbb{R}$,我们对每个 $y_d$ 使用正态分布,并由网络输出 $f_d[x, \phi]$ 预测这些分布的均值。对于预测多个离散变量 $y_d \in \{1, 2, \ldots, K\}$,我们对每个 $y_d$ 使用分类分布。在这种情况下,每组网络输出 $f_d[x, \phi]$ 预测对 $y_d$ 分类分布的贡献值。 300 | 301 | 最小化负对数概率时,这个乘积变为各项的求和: 302 | 303 | $$ 304 | L[\phi] = -\sum_{i=1}^{I} \log [Pr(y_i|f(x_i, \phi))] = -\sum_{i=1}^{I} \sum_{d} \log [Pr(y_{id}|f_d[x_i, \phi])] \tag{5.26} 305 | $$ 306 | 307 | 其中 $y_{id}$ 是第 $i$ 个训练样本的第 $d$ 个输出。 308 | 309 | 为了同时进行两种或更多类型的预测,我们同样假设每种错误是独立的。比如,为了同时预测风向和风力,我们可能分别选择定义在圆形域的 von Mises 分布预测风向,以及定义在正实数上的指数分布预测风力。独立性假设意味着这两个预测的联合似然是单独似然的乘积。在计算负对数似然时,这些项会转化为加和形式。 310 | 311 | ## 5.7 交叉熵损失 (Cross-entropy loss) 312 | 313 | 在本章中,我们开发了旨在最小化负对数似然 (negative log-likelihood) 的损失函数。然而,术语“交叉熵损失 (cross-entropy loss)”也广为流传。在本节中,我们将解释交叉熵损失,并证明它与使用负对数似然是等价的。 314 | 315 | 交叉熵损失的核心思想是寻找参数 $\theta$,以最小化观测数据 $y$ 的经验分布 $q(y)$ 与模型分布 $Pr(y|\theta)$(见图 5.12)之间的差距。可以用 Kullback-Leibler (KL) 散度来衡量两个概率分布 $q(z)$ 和 $p(z)$ 之间的距离: 316 | 317 | $$ 318 | D_{KL}(q||p) = \int_{-\infty}^{\infty} q(z) \log [q(z)] dz - \int_{-\infty}^{\infty} q(z) \log [p(z)] dz \tag{5.27} 319 | $$ 320 | 设想我们在点集 $\{y_i\}^I_{i=1}$ 观测到了一组经验数据分布。这可以表示为点质量的加权总和: 321 | 322 | $$ 323 | q(y) = \frac{1}{I} \sum_{i=1}^{I} \delta[y - y_i] \tag{5.28} 324 | $$ 325 | 326 | 这里的 $\delta[\cdot]$ 是 Dirac delta 函数。我们的目标是最小化模型分布 $Pr(y|\theta)$ 与这一经验分布之间的 KL 散度: 327 | 328 | $$ 329 | \begin{align} 330 | \hat{\theta} &= argmin_{\theta} \left[ \int_{-\infty}^{\infty} q(y) \log [q(y)] dy - \int_{-\infty}^{\infty} q(y) \log [Pr(y|\theta)] dy \right] \\ 331 | &= argmin_{\theta} \left[ -\int_{-\infty}^{\infty} q(y) \log [Pr(y|\theta)] dy \right], 332 | \end{align} \tag{5.29} 333 | $$ 334 | 335 | 由于第一项与 $\theta$ 无关,因此消失了。剩下的第二项被称为*交叉熵 (cross-entropy)*。它可以理解为在考虑到另一个分布已知信息后,一个分布中剩余的不确定性量。接下来,我们将方程 5.28 中的 $q(y)$ 定义代入: 336 | 337 | $$ 338 | \begin{align} 339 | \hat{\theta} &= argmin_{\theta} \left[ \int_{-\infty}^{\infty} \left( \frac{1}{I} \sum_{i=1}^{I} \delta[y - y_i] \right) \log [Pr(y|\theta)] dy \right] \\ 340 | &= argmin_{\theta} \left[ -\sum_{i=1}^{I} \log [Pr(y_i|\theta)] \right], 341 | \end{align} \tag{5.30} 342 | $$ 343 | 344 | 第一行的两项相乘,对应于图 5.12a 中点质量与图 5.12b 中分布的对数进行逐点乘积。最终我们得到一组集中在数据点上的有限加权概率质量。在最后一行,我们去掉了不影响最小值位置的常数缩放因子 $1/I$。 345 | 346 | 在机器学习领域,分布参数 $\theta$ 由模型 $f[x_i, \phi]$ 计算得出。因此,我们有: 347 | 348 | $$ 349 | \hat{\phi} = argmin_{\phi} \left[ -\sum_{i=1}^{I} \log [Pr(y_i|f[x_i, \phi])] \right] \tag{5.31} 350 | $$ 351 | 这正是第 5.2 节提到的负对数似然准则。由此可见,负对数似然准则(即最大化数据似然)与交叉熵准则(即最小化模型与经验数据分布间的距离)是等价的。 352 | 353 | ![Figure5.12](figures/chapter5/LossCrossEntropy.svg) 354 | 355 | `图 5.12 交叉熵方法。a) 训练样本的实证分布(箭头标示了 Dirac delta 函数)。b) 模型分布(参数为 θ = μ,σ2 的正态分布)。通过交叉熵方法,我们尝试最小化这两个分布之间的距离(即 KL 散度),这个距离是模型参数 θ 的函数。` 356 | 357 | ## 5.8 总结 358 | 359 | 在前面的章节中,我们考虑神经网络是如何直接从数据 x 预测输出 y 的。在本章,我们改变了观点,把神经网络视为计算输出空间概率分布 $Pr(y|\theta)$ 上的参数 $\theta$。这引领我们采用了一种原理性方法构建损失函数。我们选择了能够使观测数据在这些分布下的似然最大化的模型参数 $\phi$。我们发现,这等同于最小化负对数似然 (negative log-likelihood)。 360 | 361 | 这种方法的自然结果是,回归的最小二乘准则;它基于假设 y 符合正态分布,并且我们正在预测其均值。我们还探讨了如何 (1) 扩展回归模型以估计对预测的不确定性,以及 (2) 扩展模型使不确定性依赖于输入(heteroscedastic model)。我们将同样的方法应用于二元分类和多类分类,为每种情况推导出了损失函数。我们讨论了如何处理更加复杂的数据类型以及如何处理多个输出。最后,我们指出交叉熵是另一种等效的考虑模型拟合方式。 362 | 363 | 在之前的章节中,我们开发了神经网络模型。在本章,我们为决定模型如何根据一组给定参数描述训练数据的效果,开发了损失函数。下一章将考虑模型训练,我们的目标是找到能使这种损失最小化的模型参数。 364 | 365 | 366 | ## 笔记 367 | 368 | 基于正态分布的损失函数:Nix & Weigend (1994) 和 Williams (1996) 研究了异方差非线性回归 (heteroscedastic nonlinear regression),其中输出的均值和方差都是输入的函数。在无监督学习的背景下,Burda 等人 (2016) 使用了基于具有对角协方差的多变量正态分布的损失函数,而 Dorta 等人 (2018) 使用了基于具有完全协方差的正态分布的损失函数。 369 | 370 | 稳健回归:Qi 等人 (2020) 研究了最小化平均绝对误差而非平均平方误差的回归模型特性。这种损失函数基于对输出采用拉普拉斯分布的假设,并估计给定输入的中位数输出,而非均值。Barron (2019) 提出了一种参数化稳健度的损失函数。在概率背景下解释时,它产生了一个包括正态分布和柯西分布作为特例的单变量概率分布族。 371 | 372 | 估计分位数:有时,我们可能不想在回归任务中估计均值或中位数,而是希望预测一个分位数。例如,这对风险模型很有用,我们希望知道真实值在 90% 的时间内会小于预测值。这被称为分位数回归 (Koenker & Hallock, 2001)。这可以通过拟合一个异方差回归模型,然后基于预测的正态分布估计分位数来完成。或者,分位数可以直接使用分位数损失(也称为弹球损失)来估计。在实践中,这最小化了数据与模型的绝对偏差,但在一个方向上对偏差的权重比另一个方向更大。最近的研究探索了同时预测多个分位数以获得整体分布形状的概念(Rodrigues & Pereira, 2020)。 373 | 374 | 类别不平衡和焦点损失:Lin 等人 (2017c) 讨论了分类问题中的数据不平衡问题。如果某些类别的示例数量远大于其他类别,则标准的最大似然损失就不再适用;模型可能会专注于提高对主导类别中已分类良好示例的信心,而对代表性较差的类别分类不佳。Lin 等人 (2017c) 引入了焦点损失,该损失添加了一个额外的参数,用于减弱分类良好示例的影响,以提高性能。 375 | 376 | 学习排名:Cao 等人 (2007),Xia 等人 (2008),和 Chen 等人 (2009) 都在学习排名数据的损失函数中使用了 Plackett-Luce 模型。这是学习排名的列表式方法,因为模型一次性处理整个待排名的对象列表。其他方法包括点式方法,其中模型处理单个对象,以及对式方法,其中模型处理对象对。Chen 等人 (2009) 总结了学习排名的不同方法。 377 | 378 | 其他数据类型:Fan 等人 (2020) 使用基于贝塔分布的损失来预测 0 到 1 之间的值。Jacobs 等人 (1991) 和 Bishop (1994) 研究了适用于多模态数据的混合密度网络。这些模型将输出建模为基于输入的高斯混合(见图 5.14)。Prokudin 等人 (2018) 使用了 von Mises 分布来预测方向(见图 5.13)。Fallah 等人 (2009) 使用泊松分布构建了预测计数的损失函数(见图 5.15)。Ng 等人 (2017) 使用基于伽马分布的损失函数来预测持续时间。 379 | 380 | ![Figure5.13](figures/chapter5/LossVonMises.svg) 381 | 382 | `图 5.13 冯·米塞斯分布定义在圆周上,范围是(−π, π]。它由两个参数构成:平均值 μ 决定了分布峰值的位置;浓度参数 κ(大于 0)起着类似于方差倒数的作用,因此 1/√κ 可以大致看作是与正态分布的标准差相对应的量。` 383 | 384 | 非概率方法:采用本章讨论的概率方法并不是严格必要的,但这在近年来已成为默认方法;任何旨在减少模型输出与训练输出之间距离的损失函数都是足够的,距离可以用任何看似合理的方式定义。有几种著名的非概率机器学习模型用于分类,包括支持向量机 (Vapnik, 1995; Cristianini & Shawe-Taylor, 2000),它们使用铰链损失,以及 AdaBoost (Freund & Schapire, 1997),它们使用指数损失。 385 | 386 | 387 | ## Problems 388 | 389 | ## 问题 390 | 391 | **问题 5.1** 证明逻辑 sigmoid 函数 $\text{sig}[z]$ 将 $z = -\infty$ 映射到 0,$z = 0$ 映射到 0.5,$z = \infty$ 映射到 1,其中: 392 | 393 | $$ 394 | \text{sig}[z] = \frac{1}{1 + \exp[-z]} \tag{5.32} 395 | $$ 396 | 397 | **问题 5.2** 对于单个训练对 $\{x, y\}$ 的二元分类,损失 $L$ 为: 398 | 399 | $$ 400 | L = -(1 - y) \log [1 - \text{sig}[f[x, \phi]]] - y \log [\text{sig}[f[x, \phi]]] \tag{5.33} 401 | $$ 402 | 其中 $\text{sig}[\cdot]$ 在方程 5.32 中定义。当训练标签 $y = 0$ 时(1)以及当 $y = 1$ 时(2),将这种损失作为变换后的网络输出 $\text{sig}[f[x, \phi]] \in [0, 1]$ 的函数绘制出来。 403 | 404 | **问题 5.3*** 假设我们想构建一个模型,基于本地气压 $x$ 的测量来预测占主导地位的风向 $y$(以弧度表示)。适用于圆形域的分布是 von Mises distribution(见图 5.13): 405 | 406 | $$ 407 | Pr(y|\mu, \kappa) = \frac{\exp[\kappa \cos(y - \mu)]}{2\pi \cdot \text{Bessel}_0[\kappa]} \tag{5.34} 408 | $$ 409 | 其中 $\mu$ 是平均方向的度量,$\kappa$ 是集中度的度量(即方差的倒数)。项 $\text{Bessel}_0[\kappa]$ 是阶数为 0 的修改过的贝塞尔函数。使用第 5.2 节的配方来开发用于学习模型 $f[x, \phi]$ 参数 $\mu$ 的损失函数,以预测最有可能的风向。你的解决方案应将集中度 $\kappa$ 视为常数。你会如何进行推理? 410 | 411 | **问题 5.4*** 有时,对于输入 $x$ 的输出 $y$ 是多模态的(见图 5.14a);对于给定输入,有多个有效的预测。在这里,我们可能使用正态分量的加权和作为输出的分布。这被称为高斯混合 (Gaussian Mixture) 模型。例如,两个高斯的混合具有参数 $\Theta = \{\lambda, \mu_1, \sigma_1^2, \mu_2, \sigma_2^2\}$: 412 | 413 | $$ 414 | Pr(y|\mu_1, \mu_2, \sigma_1^2, \sigma_2^2) = \frac{\lambda}{\sqrt{2\pi\sigma_1^2}} \exp \left[ -\frac{(y - \mu_1)^2}{2\sigma_1^2} \right] + \frac{1 - \lambda}{\sqrt{2\pi\sigma_2^2}} \exp \left[ -\frac{(y - \mu_2)^2}{2\sigma_2^2} \right] \tag{5.35} 415 | $$ 416 | 其中 $\lambda \in [0, 1]$ 控制两个分量的相对权重,它们分别具有均值 $\mu_1, \mu_2$ 和方差 $\sigma_1^2, \sigma_2^2$。这个模型可以表示具有两个峰的分布(见图 5.14b)或具有更复杂形状的单峰分布(见图 5.14c)。使用第 5.2 节的配方构建一个训练模型 $f[x, \phi]$ 的损失函数,该模型接收输入 $x$,具有参数 $\phi$,并预测两个高斯的混合。损失应基于 $I$ 训练数据对 $\{x_i, y_i\}$。在进行推理时,你预见会遇到什么问题? 417 | 418 | ![Figure5.14](figures/chapter5/LossMoG.svg) 419 | 420 | `图 5.14 多模态数据及其高斯混合密度。a) 在示例训练数据中,当输入 x 的值处于中间范围时,相应的输出 y 会沿着两种可能的路径之一变化。例如,在 x = 0 的情况下,输出 y 的值可能接近 −2 或 +3,但不太可能是介于这两个值之间。b) 高斯混合模型非常适合描述这种数据,它通过将两个或更多具有不同均值和方差的正态分布(此处为两个分布,分别用虚线蓝色和橙色曲线表示)进行加权求和(用实线青色曲线表示)来构建。当各个正态分布的均值相差较远时,便形成了多模态分布。c) 当这些均值较为接近时,这种混合模型能够描述单峰但非正态的密度分布。` 421 | 422 | 423 | **问题 5.5** 考虑扩展问题 5.3 中的模型,使用两个 von Mises distribution 的混合来预测风向。为这个模型写出似然 $Pr(y|\theta)$ 的表达式。网络需要产生多少个输出? 424 | 425 | **问题 5.6** 考虑构建一个模型,预测接下来一分钟内将有多少行人 $y \in \{0, 1, 2, \ldots\}$ 经过城市中给定的点,这是基于包含一天中的时间、经纬度和社区类型等信息的数据 $x$。适用于模拟计数的分布是泊松分布(见图 5.15)。它有一个称为速率的单一参数 $\lambda > 0$,代表分布的均值。该分布的概率密度函数为: 426 | 427 | $$ 428 | Pr(y = k) = \frac{\lambda^k e^{-\lambda}}{k!} \tag{5.36} 429 | $$ 430 | 假设我们可以访问 $I$ 个训练对 $\{x_i, y_i\}$,为这个模型设计一个损失函数。 431 | 432 | ![Figure5.15](figures/chapter5/LossPoisson.svg) 433 | 434 | `图 5.15 泊松分布是定义在非负整数上的离散分布,具有一个参数 λ(正实数),称为分布的率,它代表了分布的平均值。a–c) 分别展示了当率为 1.4、2.8 和 6.0 时的泊松分布,展示了不同率值下分布形态的变化。` 435 | 436 | **问题 5.7** 考虑一个多变量回归问题,我们预测十个输出,因此 $y \in \mathbb{R}^{10}$,并且用独立的正态分布对每个进行建模,其中均值 $\mu_d$ 由网络预测,方差 $\sigma^2$ 是常数。写出似然 $Pr(y|f[x, \phi])$ 的表达式。展示如果我们不估计方差 $\sigma^2$,最小化这个模型的负对数似然仍然等价于最小化一系列平方项。 437 | 438 | **问题 5.8*** 构建一个损失函数,用于基于独立正态分布进行多变量预测 $y \in \mathbb{R}^D_i$,每个维度有不同的方差 $\sigma_d^2$。假设一个异方差模型,使得均值 $\mu_d$ 和方差 $\sigma_d^2$ 都随数据而变化。 439 | 440 | **问题 5.9*** 考虑一个多变量回归问题,我们从数据 $x$ 预测一个人的身高(以米为单位)和体重(以千克为单位)。这里,单位的范围差异较大。你认为这会导致什么问题?提出两个解决这些问题的方案。 441 | 442 | **问题 5.10** 扩展问题 5.3 中的模型,预测风向和风速,并定义相关的损失函数。 443 | 444 | -------------------------------------------------------------------------------- /Chapter 6 Fitting models.md: -------------------------------------------------------------------------------- 1 | 第 3 章和第 4 章详细讨论了浅层和深层神经网络,它们构成了分段线性函数族,函数的具体形式由各自的参数确定。第 5 章引入了损失概念 —— 一个反映网络预测与训练集真实值差异的单个数值。 2 | 损失与网络参数有关,本章着重于探讨如何确定能使损失最小化的参数值。这个过程称为网络参数的学习,或更通俗地说,是模型的训练或拟合。该过程首先是选取一组初始参数值,随后重复执行两个步骤:(i) 计算损失函数关于参数的导数(梯度);(ii) 根据梯度调整参数,以期减少损失。多次迭代后,目标是使损失函数达到其全局最小值。 3 | 本章重点讨论参数调整步骤,即采用何种算法来减少损失。第 7 章将介绍如何为神经网络初始化参数并计算梯度。 4 | ## 6.1 梯度下降 5 | 为了拟合模型,我们需要一组输入/输出对的训练集 $\{x_i, y_i\}$。我们寻求模型 $f(x_i, \phi)$ 的参数 $\phi$,使得这些参数能够尽可能准确地将输入 $x_i$ 映射到输出 $y_i$。为此目的,我们定义了一个损失函数 $L(\phi)$,它通过返回一个数值来量化映射中的误差。优化算法的目标是找到一组参数 $\hat{\phi}$,使得这个损失函数达到最小值: 6 | 7 | $$ 8 | \hat{\phi} = \arg\min_{\phi} L(\phi) \tag{6.1} 9 | $$ 10 | 11 | 虽然存在多种优化算法,但训练神经网络通常采用迭代方法。这些方法首先启发式地设定初始参数值,然后反复调整参数以降低损失值。 12 | 13 | 这个过程中最基本的方法称为梯度下降。它从初始参数 $\phi = [\phi_0, \phi_1, \ldots, \phi_N]^T$ 开始,并分两步迭代: 14 | 15 | **步骤 1.** 计算损失相对于参数的导数: 16 | $$ 17 | \frac{\partial L}{\partial \phi} = 18 | \begin{bmatrix} 19 | \frac{\partial L}{\partial \phi_0} \\ 20 | \frac{\partial L}{\partial \phi_1} \\ 21 | \vdots \\ 22 | \frac{\partial L}{\partial \phi_N} 23 | \end{bmatrix} \tag{6.2} 24 | $$ 25 | 26 | **步骤 2.** 根据以下规则更新参数: 27 | $$ 28 | \phi \leftarrow \phi - \alpha \cdot \frac{\partial L}{\partial \phi} \tag{6.3} 29 | $$ 30 | 其中,正数 $\alpha$ 确定了调整的幅度。 31 | 32 | 第一步计算当前位置上损失函数的梯度,确定了损失增加的方向。第二步则是向相反方向(即下降方向)小幅移动。参数 $\alpha$ 可以固定(此时称之为学习率),或者通过线性搜索尝试多个 $\alpha$ 值,以找到能最大程度降低损失的值。 33 | 34 | 当损失函数达到最小值时,其表面必须是平坦的(否则,我们还能通过继续下降来进一步改进)。因此,梯度将变为零,参数也随之停止改变。在实践中,我们会监测梯度的大小,并在其变得过小时停止算法。 35 | 36 | ### 6.1.1 线性回归示例 37 | 38 | 考虑将梯度下降方法应用于第2章介绍的一维线性回归模型。该模型 $f(x, \phi)$ 把一个标量输入 $x$ 映射到一个标量输出 $y$,具有参数 $\phi = [\phi_0, \phi_1]^T$,分别代表了y轴截距和斜率: 39 | 40 | $$ 41 | y = f(x, \phi) = \phi_0 + \phi_1x \tag{6.4} 42 | $$ 43 | 44 | 给定一个数据集 $\{x_i, y_i\}$,包含 $I$ 对输入/输出数据,我们采用最小二乘法作为损失函数: 45 | $$ 46 | L(\phi) = \sum_{i=1}^I e_i = \sum_{i=1}^I (f(x_i, \phi) - y_i)^2 = \sum_{i=1}^I (\phi_0 + \phi_1x_i - y_i)^2 \tag{6.5} 47 | $$ 48 | 这里的 $e_i = (\phi_0 + \phi_1x_i - y_i)^2$ 表示第 \(i\) 个训练样本对损失的单独贡献。 49 | 50 | 损失函数对参数的导数可以表示为各个贡献导数的总和: 51 | $$ 52 | \frac{\partial L}{\partial \phi} = \frac{\partial}{\partial \phi} \sum_{i=1}^I e_i = \sum_{i=1}^I \frac{\partial e_i}{\partial \phi} \tag{6.6} 53 | $$ 54 | 具体计算方式如下: 55 | $$ 56 | \frac{\partial e_i}{\partial \phi} = 57 | \begin{bmatrix} 58 | \frac{\partial e_i}{\partial \phi_0} \\ 59 | \frac{\partial e_i}{\partial \phi_1} 60 | \end{bmatrix} = 61 | \begin{bmatrix} 62 | 2(\phi_0 + \phi_1x_i - y_i) \\ 63 | 2x_i(\phi_0 + \phi_1x_i - y_i) 64 | \end{bmatrix} \tag{6.7} 65 | $$ 66 | 67 | 图 6.1 通过迭代地根据方程 6.6 和 6.7 计算导数,接着依据方程 6.3 的规则更新参数,展示了算法的逐步进展。在此示例中,我们采用了线搜索技术,在每次迭代中找到能够最大限度减少损失的 $\alpha$ 值。 68 | 69 | ![Figure6.1](figures/chapter6/TrainLRMin.svg) 70 | `图 6.1 线性回归模型的梯度下降。a) 训练集由 12 对输入/输出数据对 {xi , yi} 组成。b) 损失函数图展示了梯度下降的迭代过程。从点 0 出发,我们沿最陡峭的下降方向前进,直至无法进一步降低损失,从而到达点 1。然后,我们重复此过程,测量点 1 的梯度并继续下降到点 2,以此类推。c) 通过热图可以更直观地展示这一过程,图中的亮度代表了损失大小。仅经过四轮迭代,我们已经非常接近最小损失值。d) 点 0 处参数(线条最浅)的模型对数据的描述非常不准确,但随着每轮迭代,模型的拟合度都有所提升。点 4 处参数(线条最深)的模型已能合理描述训练数据。` 71 | 72 | ### 6.1.2 Gabor模型示例 73 | 线性回归问题的损失函数(参见图 6.1c)总是有一个清晰定义的全局最小值。更形式化地说,这些函数是凸函数,意味着曲面上任意两点连线(即弦)不会穿过函数图像。凸性保证了无论参数初始化在何处,只要我们不断地“下坡”,最终都能找到最小值;这样的训练过程是不会失败的。 74 | 75 | 然而,大部分非线性模型(包括浅层和深层网络)的损失函数都是非凸的。由于参数众多,使得神经网络损失函数的可视化变得极具挑战性。因此,我们首先研究一个参数较少的简单非线性模型,以深入理解非凸损失函数的特性: 76 | 77 | $$ 78 | f(x, \phi) = \sin[\phi_0 + 0.06 \cdot \phi_1x] \cdot \exp \left( - \frac{(\phi_0 + 0.06 \cdot \phi_1x)^2}{32.0} \right) \tag{6.8} 79 | $$ 80 | 81 | 这个Gabor模型将标量输入$x$映射到标量输出$y$,并且由一个正弦分量(产生振荡效果)和一个负指数分量(使得振幅随离中心距离增加而减小)相乘构成。模型具有两个参数$\phi = [\phi_0, \phi_1]^T$,$\phi_0 \in \mathbb{R}$ 控制函数的拉伸或压缩,而$\phi_1 \in \mathbb{R}^+$ 则决定沿x轴的拉伸或压缩(见图6.2)。 82 | 83 | 考虑一个包含$I$个样本$\{x_i, y_i\}$的训练集。定义$I$个训练样本的最小二乘损失函数为: 84 | $$ 85 | L(\phi) = \sum_{i=1}^I (f(x_i, \phi) - y_i)^2 \tag{6.9} 86 | $$ 87 | 88 | 目标再次是找到能够最小化这个损失的参数$\hat{\phi}$。 89 | 90 | ![Figure6.2](figures/chapter6/TrainGaborModel.svg) 91 | 92 | `图 6.2 Gabor 模型。这个非线性模型将单一输入 x 映射到单一输出 y,拥有参数组 φ = [φ0 , φ1]T。它描述了一个振幅随距离中心增加而减小的正弦波函数。φ0 参数决定了波峰的位置,随 φ0 增大,波形向左移动。φ1 参数控制波形相对于中心的压缩程度,φ1 增大时,波形变得更窄。a–c) 展示了具有不同参数的模型。` 93 | 94 | ![Figure6.3](figures/chapter6/TrainGaborData.svg) 95 | 96 | `图 6.3 用于拟合 Gabor 模型的训练数据。训练集包含了 28 组输入/输出样本 {xi,yi}。这些样本是通过在区间 [−15, 15] 内均匀采样 xi,然后将样本值通过参数设为 φ = [0.0,16.6]T 的 Gabor 模型处理,并加入正态分布的噪声生成的。` 97 | ### 6.1.3 局部最小值与鞍点 98 | 图 6.4 展示了这个数据集的 Gabor 模型损失函数。存在众多局部最小值(标记为青色圆圈)。在这些位置,梯度为零,无论向哪个方向移动,损失都会增加,然而这些并不代表函数的全局最小点。损失最小的点,即全局最小值,用灰色圆圈标出。 99 | 100 | 如果我们从随机位置出发,采用梯度下降法“下山”,无法保证最终能够达到全局最小值并找出最优参数(参见图 6.5a)。算法很可能会停在某个局部最小值,而不是最佳解。更重要的是,我们无法确定是否有更优的解存在于其他地方。 101 | 102 | 此外,损失函数中还存在鞍点(比如图 6.4中的蓝色十字处)。在鞍点,虽然梯度为零,但是函数值在某些方向上升,在其他方向下降。如果当前参数位置并非正好在鞍点上,那么通过“下山”梯度下降法仍有可能逃脱。然而,鞍点附近的曲面几乎是平坦的,这使得很难确定训练是否已经收敛。如果我们在梯度很小时就终止算法,可能会错误地在鞍点附近停止,误以为找到了解决方案。 103 | 104 | ![Figure6.4](figures/chapter6/TrainGaborMin.svg) 105 | 106 | `图 6.4 Gabor 模型的损失函数。a) 损失函数呈现非凸形状,除了一个全局最小值(灰色圆圈)外,还存在多个局部最小值(青色圆圈)。同时,该函数包含鞍点,即在这些点上,虽然梯度临时为零,但函数值在某一方向上升,在另一方向下降。例如,蓝色叉号标识的鞍点,水平方向移动导致函数值下降,而垂直方向移动则导致上升。b–f) 展示了对应于不同最小值点的模型状态。在这些状态下,任何微小的调整都无法使损失值进一步降低。图 (c) 中展示的全局最小值点,其损失值为 0.64。` 107 | 108 | ![Figure6.5](figures/chapter6/TrainGaborGDSGD.svg) 109 | 110 | `图 6.5 梯度下降与随机梯度下降的比较。a) 使用线性搜索的梯度下降方法。只要初始设置正确,位于损失函数的适当“谷底”(如点 1 和 3),参数估计便会稳步向全局最小值靠拢。但如果初始点设在这个谷底之外(如点 2),则可能会陷入局部最小值。b) 随机梯度下降通过引入噪声到优化过程中,使得即便是从错误的“谷底”(如点 2)出发,也有可能跳出并最终找到全局最小值。` 111 | ## 6.2 随机梯度下降 112 | Gabor 模型具有两个参数,因此我们可以通过以下两种方式找到全局最小值:(i)穷尽地搜索参数空间或(ii)重复从不同位置开始梯度下降,并选择损失最低的结果。然而,神经网络模型可能拥有数以百万计的参数,这使得上述两种方法都不现实。简言之,利用梯度下降方法寻找高维损失函数的全局最优解颇具挑战性。我们能找到一个最小值,但无法确定这是否为全局最小值或一个较优解。 113 | 一个主要问题是,梯度下降算法的最终结果完全取决于其起始点。随机梯度下降(SGD)尝试通过在每一步中为梯度引入一些噪声来解决这一问题。这样,解决方案在平均意义上仍向低处移动,但在任何给定的迭代中,所选方向不必然是最陡峭的下坡方向。实际上,有时甚至可能不是向下的。SGD算法可能暂时向上移动,因此能够从损失函数的一个“谷”跳跃到另一个(见图 6.5b)。 114 | 115 | #### 6.2.1 批次和周期 116 | 引入随机性的机制很简单。在每次迭代时,算法随机选择训练数据的一个子集,并仅根据这些示例计算梯度。这个子集称为*小批量*(minibatch)或简称*批次*(batch)。因此,模型参数$\phi_t$在第t次迭代的更新规则为: 117 | $$ 118 | \phi_{t+1} \leftarrow \phi_t - \alpha \cdot \sum_{i \in B_t} \frac{\partial \mathcal{L}[\phi]}{\partial \phi} \tag{6.10} 119 | $$ 120 | 其中$B_t$是当前批次中输入/输出对索引的集合,$e_i$是第\(i\)对导致的损失。$\alpha$是学习率,与梯度大小一起,决定了每次迭代的移动距离。学习率在开始时确定,并不受函数局部特性的影响。 121 | 122 | 通常,批次是从数据集中不重复抽取的。算法遍历所有训练样本直至全部使用完毕,然后再次从完整训练数据集开始抽样。整个训练数据集的单次遍历称为一个*周期*。批次的大小可以从单一样本到整个数据集不等。后者被称为*全批量梯度下降*,与常规(非随机)梯度下降相同。 123 | 124 | SGD的另一解释是,它在每次迭代计算不同损失函数的梯度;由于损失函数依赖于模型与训练数据,因此每个随机选择的批次都会不同。从这个角度看,SGD在一个不断变化的损失函数上执行确定性梯度下降(见图 6.6)。然而,尽管存在这种变异性,任何点的期望损失和梯度与常规梯度下降保持一致。 125 | 126 | ![Figure6.6](figures/chapter6/TrainGaborSGDIter.svg) 127 | 128 | `图 6.6 针对 Gabor 模型的随机梯度下降方法,采用的批处理大小为三。a) 针对全部训练数据集的损失函数图。每一次迭代都对应一组可能的参数变化概率分布(小图展示了样本选择)。这些分布对应于选择的三个批处理元素的不同组合。b) 某一特定批处理的损失函数图。随机梯度下降算法依据学习速率和当前梯度的大小,沿着损失函数下降方向移动一段距离。当前模型(小图中的虚线表示)将调整以更好地符合这批数据(以实线表示)。c) 另一批数据会生成不同的损失函数,并导致不同的模型更新。d) 对这批数据,算法沿着批损失函数的下降方向移动,但相对于图 (a) 中的全局损失函数可能是上升的。这展示了随机梯度下降如何帮助模型跳出局部最小值,寻找全局最优解。` 129 | 130 | #### 6.2.2 随机梯度下降的特性 131 | SGD具有几个吸引人的特点。首先,尽管它在路径上增加了噪声,但每次迭代都改善了对数据子集的拟合,因此更新通常是合理的,即使不是最佳的。其次,通过无重复抽取训练样本并遍历数据集,保证了所有训练样本的平等贡献。第三,仅使用训练数据的一部分计算梯度在计算上更为高效。第四,它原则上能够逃离局部最小值。第五,它减少了在鞍点附近停滞的几率;很可能至少有一些批次在损失函数的任何点上都有显著梯度。最后,有证据表明,SGD找到的参数能使神经网络在实际中对新数据具有良好的泛化能力(见第9.2节)。 132 | 133 | SGD不一定按传统意义上“收敛”。然而,我们希望当接近全局最小值时,所有数据点都能被模型很好地描述,这样无论选择哪个批次,梯度都将很小,参数变化不大。实践中,SGD常配合学习率调度使用。学习率α起始于一个较高值,并每经过N个周期以一个固定比例降低。这样做的逻辑是,在训练初期,我们希望算法能探索参数空间,跨越不同的“谷”寻找合理的区域;而在后期,当我们大致处于正确位置时,更注重参数的微调,因此通过降低α来减小变化幅度。 134 | 135 | ## 6.3 动量 136 | 在随机梯度下降法中,增加动量(Momentum)项是一种常见的改进方法。此方法通过结合当前批次计算得到的梯度与上一步骤的移动方向的加权组合来更新参数: 137 | $$ 138 | m_{t+1} \leftarrow \beta \cdot m_t + (1 - \beta) \sum_{i \in B_t} \frac{\partial \mathcal{L}[\phi]}{\partial \phi} \tag{6.11} 139 | $$ 140 | $$ 141 | \phi_{t+1} \leftarrow \phi_t - \alpha \cdot m_{t+1}, 142 | $$ 143 | 其中,$m_t$ 表示动量项,$\beta \in [0,1]$ 用于控制随时间变化的平滑效果,$\alpha$ 为学习率。 144 | 145 | 动量的递归计算方式导致梯度更新步骤成为所有先前梯度的无限加权和,其中随着时间的推移,权重逐渐减少。若这些梯度在多个迭代中保持一致方向,则有效的学习速率会增加;反之,如果梯度方向频繁变化,由于累加项之间的相互抵消,有效的学习速率则会降低。这样能够使参数更新路径更加平滑,减少在优化过程中的震荡现象(参见图 6.7)。 146 | 147 | ![Figure6.7](figures/chapter6/TrainMomentum.svg) 148 | `图 6.7 带动量的随机梯度下降。a) 传统的随机梯度下降方法向最小值进发的路径曲折复杂。b) 通过引入动量项,可以将当前步的更新设定为之前更新与当前批次梯度的加权混合,从而使路径更平滑,加快收敛速度。` 149 | ### 6.3.1 Nesterov 加速动量 150 | 动量项可视为对 SGD 算法下一步移动位置的粗略预测。Nesterov 加速动量(参见图 6.8)不是在当前位置,而是在预测的位置计算梯度: 151 | 152 | $$ 153 | \begin{align} 154 | & m_{t+1} \leftarrow \beta \cdot m_t + (1 - \beta) \sum_{i in B} \frac{\partial L(\phi_t - \alpha \cdot m_t)}{\partial \phi} \\ 155 | & \phi_{t+1} \leftarrow \phi_t - \alpha \cdot m_{t+1} 156 | \end{align} \tag{6.12} 157 | $$ 158 | 159 | 此处,梯度是在 $\phi_t - \alpha \cdot m_t$ 位置计算的。这种方式使得梯度项能够对仅靠动量确定的路径进行修正。 160 | 161 | ![Figure6.8](figures/chapter6/TrainNesterov.svg) 162 | `图 6.8 Nesterov 加速动量。该方法的解沿虚线前进至点 1。在传统动量更新中,先在点 1 处计算梯度,再按此方向移动至点 2,并添加前一次迭代的动量(即延虚线方向),最终到达点 3。Nesterov 动量先应用动量(从点 1 至点 4),然后计算梯度并更新至点 5。` 163 | ## 6.4 Adam 164 | 传统的梯度下降方法采用固定步长,存在一个问题:它会对大梯度的参数做出较大调整(在这些情况下我们可能需要更加小心),而对小梯度的参数调整较小(这里可能需要进一步的探索)。当损失函数表面的梯度在一个方向比另一个方向更陡峭时,很难选择一个同时能(i)在两个方向上有效进展且(ii)保持稳定的学习率(见图 6.9a–b)。 165 | 166 | 一个简便的方法是对梯度进行标准化处理,使得在每个方向上都能按固定距离(由学习率决定)前进。首先,我们计算梯度 $m_{t+1}$ 和逐点平方梯度 $v_{t+1}$: 167 | 168 | $$ 169 | m_{t+1} \leftarrow \frac{\partial L(\phi_t)}{\partial \phi} \tag{6.13} 170 | $$ 171 | $$ 172 | v_{t+1} \leftarrow \left( \frac{\partial L(\phi_t)}{\partial \phi} \right)^2 173 | $$ 174 | 175 | 接下来应用更新规则: 176 | 177 | $$ 178 | \phi_{t+1} \leftarrow \phi_t - \alpha \cdot \frac{m_{t+1}}{\sqrt{v_{t+1} + \epsilon}} \tag{6.14} 179 | $$ 180 | 181 | 其中,平方根和除法均为逐点执行,$\alpha$ 表示学习率,$\epsilon$ 是一个小常量,用于防止当梯度大小为零时除以零的情况。$v_{t+1}$ 为平方梯度,通过其正平方根来标准化梯度,使得最终只剩下每个坐标方向上的符号。算法因此沿每个坐标方向移动固定距离 $\alpha$,方向由下坡方向确定(见图 6.9c)。这种简单的算法虽然能在两个方向上取得进展,但除非刚好到达最小值点,否则不会收敛。它会在最小值周围反复跳动。 182 | 183 | *自适应矩估计*(Adaptive Moment Estimation,简称*Adam*)在这一思路基础上,对梯度估计和平方梯度都引入了动量: 184 | $$ 185 | m_{t+1} \leftarrow \beta \cdot m_t + (1 - \beta) \frac{\partial L(\phi_t)}{\partial \phi} 186 | $$ 187 | $$ 188 | v_{t+1} \leftarrow \gamma \cdot v_t + (1 - \gamma) \left( \frac{\partial L(\phi_t)}{\partial \phi} \right)^2 \tag{6.15} 189 | $$ 190 | 其中 $\beta$ 和 $\gamma$ 分别是两种统计量的动量系数。 191 | 192 | 使用动量相当于对这些统计量的历史数据进行加权平均。在开始时,所有之前的测量基本上都是零,这会导致估计值过小。因此,我们通过以下规则对这些统计量进行调整: 193 | 194 | $$ 195 | \hat{m}_{t+1} \leftarrow \frac{m_{t+1}}{1 - \beta^{t+1}} 196 | $$ 197 | $$ 198 | \hat{v}_{t+1} \leftarrow \frac{v_{t+1}}{1 - \gamma^{t+1}} \tag{6.16} 199 | $$ 200 | 201 | 由于 $\beta$ 和 $\gamma$ 的取值范围是 [0,1],随着时间步进,指数项 $t+1$ 逐渐减小,分母趋近于一,这种调整的效果逐渐变小。 202 | 203 | 最终,我们按之前的方式更新参数,但使用调整后的项: 204 | 205 | $$ 206 | \phi_{t+1} \leftarrow \phi_t - \alpha \cdot \frac{\hat{m}_{t+1}}{\sqrt{\hat{v}_{t+1}} + \epsilon} \tag{6.17} 207 | $$ 208 | 209 | 这一算法能够朝整体最小值收敛,并在参数空间的每个方向上都取得良好进展。注意,Adam 通常在一个随机环境下使用,其中梯度及其平方基于小批量数据计算: 210 | 211 | $$ 212 | m_{t+1} \leftarrow \beta \cdot m_t + (1 - \beta) \sum_{i \in B} \frac{\partial L(\phi_t)}{\partial \phi} 213 | $$ 214 | $$ 215 | v_{t+1} \leftarrow \gamma \cdot v_t + (1 - \gamma) \sum_{i in B} \left( \frac{\partial L(\phi_t)}{\partial \phi} \right)^2 \tag{6.18} 216 | $$ 217 | 218 | 因此,实际的轨迹会有噪声。 219 | 220 | 如第7章所述,神经网络参数的梯度大小可能取决于它们在网络中的深度。Adam 有助于补偿这一趋势,并在不同层之间平衡变化。实际上,由于它避免了图 6.9a–b 中描述的情况,Adam 对初始学习率的敏感度较低,因此不需要复杂的学习率调整策略。 221 | 222 | ![Figure6.9](figures/chapter6/TrainADAM.svg) 223 | 224 | `图 6.9 自适应矩估计(Adam)。a) 该损失函数在垂直方向上迅速变化,在水平方向上变化缓慢。若使用适合垂直进展的学习率进行全批梯度下降,算法达到最终水平位置需时甚久。b) 若学习率设置利于水平进展,则会在垂直方向过冲,导致不稳定。c) 一个简单方法是每步沿每个轴固定距离移动,以两个方向都下降。这需要通过归一化梯度大小并保留方向来完成。但这通常不会精确收敛至最小值,而是在其周边振荡(如最后两点间)。d) Adam 算法利用动量优化梯度估计和归一化,确保路径更平滑。` 225 | ## 6.5 训练算法的超参数 226 | 选择学习算法、批量大小(Batch Size)、学习率调度(Learning Rate Schedule)和动量系数(Momentum Coefficients)都是训练算法的超参数;它们直接影响最终模型的性能,但与模型的参数本身不同。挑选这些超参数更像是一门艺术而非精确科学,常见的做法是训练多个带有不同超参数的模型,然后选出表现最佳的一个。这个过程称为超参数搜索。我们将在第8章深入讨论这一话题。 227 | 228 | ## 6.6 总结 229 | 本章围绕模型训练进行了讨论。我们将问题定义为找到使损失函数 L[φ] 达到最小的参数 φ。梯度下降法(Gradient Descent)通过测量当前参数下损失函数的梯度(即,当我们微调参数时损失如何变化)来进行。接着,它会将参数向着能使损失最快减少的方向调整。这个过程持续进行,直到达到收敛状态。 230 | 231 | 对于非线性函数,损失函数可能存在局部最小值(梯度下降可能会陷入这些点)和鞍点(梯度下降可能似乎已收敛,但实际上并未真正收敛)。随机梯度下降(Stochastic Gradient Descent)有助于缓解这些问题。每次迭代,我们都使用数据的一个不同随机子集(一个批次)来计算梯度,为过程引入噪声,避免算法陷入参数空间的非最优区域。此外,每次迭代计算成本更低,因为只利用了数据的一部分。我们还看到,引入动量项可以使收敛过程更加高效。最后,我们介绍了 Adam 算法(Adam Algorithm)。 232 | 233 | 本章内容适用于任何模型的优化。下一章将专门探讨与神经网络训练相关的两个问题。首先是如何使用著名的反向传播算法(Backpropagation Algorithm)计算损失函数相对于神经网络参数的梯度。其次是在优化开始之前如何正确初始化网络参数。如果初始化不当,优化过程使用的梯度可能会异常大或小,从而妨碍训练进程。 234 | ## Notes 235 | **优化算法**:优化算法在工程学中被广泛使用,一般倾向于使用“目标函数”而非损失函数或成本函数。梯度下降法由 Cauchy 在 1847 年提出,而随机梯度下降的概念至少可以追溯到 Robbins & Monro 的 1951 年工作。两者之间的一种现代中间方案是随机方差减小下降(Stochastic Variance-Reduced Descent, Johnson & Zhang, 2013),在该方法中,全梯度定期计算,与随机更新交替进行。优化算法,特别是针对神经网络的,可以参考 Ruder (2016)、Bottou 等 (2018) 以及 Sun (2020) 的综述。Bottou (2012) 探讨了 SGD 的最佳实践,包括无重复的随机选择。 236 | 237 | **凸性、极小值与鞍点**:如果函数上任意两点间的连线(弦)都不与函数相交,则该函数是凸的。这可以通过分析海森矩阵(Hessian Matrix,即二阶导数矩阵)来验证: 238 | $$ H[\phi] = \begin{bmatrix} \frac{\partial^2 L}{\partial \phi_1 \partial \phi_0} & \frac{\partial^2 L}{\partial \phi_1^2} & \cdots & \frac{\partial^2 L}{\partial \phi_1 \partial \phi_N} \\ \frac{\partial^2 L}{\partial \phi_2 \partial \phi_0} & \frac{\partial^2 L}{\partial \phi_2^2} & \cdots & \frac{\partial^2 L}{\partial \phi_2 \partial \phi_N} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial^2 L}{\partial \phi_N \partial \phi_0} & \frac{\partial^2 L}{\partial \phi_N^2} & \cdots & \frac{\partial^2 L}{\partial \phi_N^2} \\ \end{bmatrix} \tag{6.19}$$ 239 | 240 | 如果海森矩阵在所有可能的参数值上都是正定的(具有正特征值),则该函数是凸的;损失函数将呈现为光滑的碗状(如图 6.1c 所示),使得训练过程相对简单。存在单一的全局最小值,不会有局部最小值或鞍点。 241 | 242 | 对于任何损失函数,梯度为零的位置处海森矩阵的特征值能够帮助我们将该位置分类为:(i)最小值(所有特征值均为正),(ii)最大值(所有特征值均为负),或(iii)鞍点(正特征值与处于最小值的方向相关,负特征值与处于最大值的方向相关)。 243 | 244 | **线搜索**:梯度下降法使用固定步长可能效率不高,因为移动的距离完全由梯度的大小决定。函数变化快时,它可能移动较长距离(可能应更谨慎),而函数变化慢时则移动较短距离(可能应探索更远)。因此,梯度下降通常与线搜索过程结合使用,通过在期望方向上采样函数来尝试找到最优步长。一种方法是括号法(如图 6.10)。梯度下降在下降山谷时还可能导致低效的振荡行为(如图 6.5a 的路径 1)。 245 | 246 | ![Figure6.10](figures/chapter6/TrainLineSearch.svg) 247 | 248 | `图 6.10 利用夹逼法进行线性搜索。a) 当前的解在位置 a(橙色点),我们计划探索区间 [a, d](灰色阴影部分)。在这个区间内,我们选取两个内部点 b 和 c,评估这些点的损失函数值。发现 L[b] 大于 L[c],因此我们将区间 [a, b] 从搜索范围中剔除。b) 接下来,在细化后的搜索区间重复这一步骤,此次发现 L[b] 小于 L[c],因此我们剔除区间 [c, d]。c) 通过不断重复这一过程,直到我们能够紧密定位到最小值的位置。` 249 | 250 | **超越梯度下降**:已开发出许多算法解决梯度下降的问题。其中最著名的是牛顿法(Newton Method),它通过使用海森矩阵的逆矩阵(Inverse of the Hessian Matrix)来考虑表面的曲率;如果函数梯度变化迅速,则会应用更谨慎的更新策略。这种方法使线搜索变得不必要,且不会受到振荡行为的影响。然而,它在简单形式下向最近的极值移动可能是一个缺点,特别是当我们接近山顶而非山谷底部时,可能会是一个最大值。此外,对于参数众多的情况,如神经网络,计算海森矩阵的逆变得不切实际。 251 | 252 | **SGD 的特性**:当学习率趋近于零时,SGD 的极限是一种随机微分方程。Jastrzębski 等(2018)指出,这一方程依赖于学习率与批量大小的比例,并发现学习率与批量大小比例与找到的最小值的宽度有关。较宽的最小值被认为更为理想;如果测试数据的损失函数相似,则参数估计的微小错误对测试性能的影响较小。He 等(2019)为 SGD 提出了一个泛化界限,显示了批量大小与学习率比例的正相关性。通过在不同架构和数据集上训练大量模型,他们找到了当批量大小与学习率比例较低时,测试准确率提高的实证证据。Smith 等(2018)和 Goyal 等(2018)也认为批量大小与学习率的比例对泛化至关重要(参见图 20.10)。 253 | 254 | **动量**:Polyak 在 1964 年提出使用动量加速优化的概念。Goh(2017)对动量的属性进行了深入讨论。Nesterov 加速梯度方法由 Nesterov 在 1983 年引入,并首次由 Sutskever 等人(2013)在随机梯度下降的背景下应用 Nesterov 动量。 255 | 256 | **自适应训练算法**:AdaGrad(Duchi 等人,2011年)是一种优化算法,它通过为每个参数分配不同的学习率来应对某些参数可能需要移动更远距离的问题。AdaGrad 使用每个参数的累计平方梯度来降低其学习率。这样做的缺点是学习率会随时间降低,可能在找到最小值之前停止学习。RMSProp(Hinton 等人,2012a)和 AdaDelta(Zeiler,2012)对该算法进行了改进,通过递归更新平方梯度项来避免这些问题。 257 | 258 | 目前最广泛使用的自适应训练算法是自适应矩估计优化(Adaptive Moment Estimation or Adam,Kingma & Ba,2015)。它结合了动量(其中梯度向量随时间平均)和 AdaGrad、AdaDelta 与 RMSProp(其中使用平滑的平方梯度项为每个参数调整学习率)的思想。尽管存在理论上的争议,原始的 Adam 算法在实践中表现出色,广泛使用,主要是因为它在广泛的超参数范围内都能良好工作,并且能够迅速取得初步进展。 259 | 260 | 自适应训练算法的一个潜在问题是学习率基于观察到的梯度的累积统计。在训练开始阶段,由于样本量少,这些统计可能极为嘈杂。通过学习率热身(Goyal 等人,2018)可以解决这一问题,其中在最初的几千次迭代中逐渐增加学习率。另一种解决方案是校正 Adam(Liu 等人,2021a),它逐渐改变动量项,有助于避免高方差。Dozat(2016)将 Nesterov 动量整合入 Adam 算法中。 261 | 262 | **SGD 与 Adam**:关于 SGD 和 Adam 的相对优势一直存在激烈讨论。Wilson 等人(2017)提供了证据表明,带动量的 SGD 能找到比 Adam 更低的极小值,从而在多种深度学习任务中实现更好的泛化。然而,这是有些奇怪的,因为在特定条件下(当 β = γ = 0 时),SGD 实际上是 Adam 的一种特例。这表明,当使用 Adam 的默认超参数时,SGD 可能会有更好的表现。Loshchilov & Hutter(2019)提出的 AdamW,在存在 L2 正则化时显著提升了 Adam 的性能。Choi 等人(2019)的研究表明,如果寻找最佳的 Adam 超参数,它与 SGD 的表现相当且收敛更快。Keskar & Socher(2017)提出了 SWATS 方法,先使用 Adam 快速进展,然后切换到 SGD 以获得更好的最终泛化性能。 263 | 264 | **穷尽搜索**:本章讨论的所有算法都是迭代的。一个完全不同的方法是对网络参数进行量化,并使用 SAT 解算器(Mézard & Mora,2009)穷尽搜索结果离散化的参数空间。这种方法有可能找到全局最小值,并确保没有其他更低的损失存在,但只对非常小的模型实用。 265 | 266 | ## Problems 267 | 问题 6.1 证明方程 6.5 中最小二乘损失函数的导数可以通过方程 6.7 中的表达式给出。 268 | 269 | 问题 6.2 若 Hessian 矩阵 $H[\phi]$ 的特征值在任何位置都是正值,则该表面为凸面。在这种情况下,该表面存在一个唯一的最小值,使得优化变得简单。求线性回归模型(方程 6.5)的 Hessian 矩阵的代数表达式, 270 | 271 | $$ 272 | H[\phi] = \begin{bmatrix} 273 | \frac{\partial^2 L}{\partial \phi_0^2} & \frac{\partial^2 L}{\partial \phi_0 \partial \phi_1} \\ 274 | \frac{\partial^2 L}{\partial \phi_1 \partial \phi_0} & \frac{\partial^2 L}{\partial \phi_1^2} \\ 275 | \end{bmatrix} \tag{6.20} 276 | $$ 277 | 278 | 通过证明其特征值始终为正来论证此函数的凸性。这可以通过证明矩阵的迹和行列式均为正值来实现。 279 | 280 | 问题 6.3 对于 Gabor 模型(方程 6.8),计算参数 $\phi_0$ 和 $\phi_1$ 对最小二乘损失 $L[\phi]$ 的导数。 281 | 282 | 问题 6.4* 逻辑回归模型通过线性函数将一个维度的输入 $x$ 分类到两个可能的类别 $y \in \{0,1\}$ 中。该模型具有两个参数,$\phi_0$ 和 $\phi_1$,定义如下: 283 | 284 | $$ 285 | Pr(y = 1|x) = sig[\phi_0 + \phi_1x] \tag{6.21} 286 | $$ 287 | 288 | 其中 $sig[\cdot]$ 是逻辑 sigmoid 函数: 289 | 290 | $$ 291 | sig[z] = \frac{1}{1 + exp[-z]} \tag{6.22} 292 | $$ 293 | 问题 6.5* 计算相对于方程 3.1 中介绍的简单神经网络模型的十个参数的最小二乘损失的导数: 294 | 295 | $$ 296 | f[x,z] = \phi_0 + \phi_1a[\theta_0 + \theta_1x] + \phi_2a[\beta_0 + \beta_1x] + \phi_3a[\gamma_0 + \gamma_1x] \tag{6.23} 297 | $$ 298 | 299 | 仔细考虑 ReLU 函数 $a[\cdot]$ 的导数将如何表达。 300 | 301 | 问题 6.6 图 6.11 中哪些函数是凸函数?请给出你的论证。对每个点 1–7 进行分类,分别为(i)局部最小值,(ii)全局最小值,或(iii)两者都不是。 302 | 303 | ![Figure6.11](figures/chapter6/TrainConvexProb.svg) 304 | 305 | `图 6.11 展示了问题 6.6 中的三个一维损失函数。` 306 | 307 | 问题 6.7* 图 6.5a 中的路径 1 在向最小值方向下降时表现出来回摆动的低效率。特别是,每一步都以直角转变方向。对这一现象给出定性解释,并提出一种可能的解决方案,以避免此种行为。 308 | 309 | 问题 6.8* 固定学习率的(非随机)梯度下降法能否逃离局部最小值? 310 | 311 | 问题 6.9 在数据集大小为 100,批量大小为 20 的条件下,我们运行了 1,000 次迭代的随机梯度下降算法。模型被训练了多少个周期? 312 | 313 | 问题 6.10 证明动量项 $m_t$ (方程 6.11)是先前迭代中梯度的无限加权和,并推导出该总和中系数(权重)的表达式。 314 | 315 | 问题 6.11 如果模型有一百万个参数,Hessian 矩阵将是什么维度? 316 | -------------------------------------------------------------------------------- /Chapter 7 Gradients and initialization.md: -------------------------------------------------------------------------------- 1 | 第 6 章介绍了迭代优化算法,这是一类用于找到函数最小值的通用算法。在神经网络的背景下,它们用于寻找能够最小化损失函数的参数,使模型能够根据输入准确预测训练数据的输出。基本方法是随机选择一组初始参数,然后逐步进行微小调整,平均而言这些调整会降低损失。每一次的调整都是基于当前参数位置对损失函数梯度的计算结果。 2 | 3 | 本章将讨论两个神经网络特有的问题。首先,我们将探讨如何高效地计算梯度。这是一个巨大的挑战,因为截至本文写作时,最大的模型拥有达到 10^12 的参数数量,且在训练算法的每次迭代中都需要对每个参数计算梯度。其次,我们讨论如何进行参数的初始化。如果初始化过程不被妥善处理,初始的损失及其梯度可能会非常大或非常小,这在任何情况下都将阻碍训练过程。 4 | ## 7.1 问题定义 5 | 考虑一个网络 $f(x, \phi)$,它接受多变量输入 $x$,具有参数 $\phi$,并包含三个隐藏层 $h_1, h_2$ 和 $h_3$: 6 | 7 | $$ 8 | \begin{align} 9 | h_1 = a(\beta_0 + \Omega_0x) \\ 10 | h_2 = a(\beta_1 + \Omega_1h_1) \\ 11 | h_3 = a(\beta_2 + \Omega_2h_2) \\ 12 | f(x, \phi) = \beta_3 + \Omega_3h_3 13 | \end{align} \tag{7.1} 14 | $$ 15 | 16 | 其中激活函数 $a[\cdot]$ 分别作用于输入的每个元素。模型参数 $\phi = \{\beta_0,\Omega_0,\beta_1,\Omega_1,\beta_2,\Omega_2,\beta_3,\Omega_3\}$ 包括每层之间的偏置向量 $\beta_k$ 和权重矩阵 $\Omega_k$(见图 7.1)。 17 | 18 | ![Figure7.1](figures/chapter7/Train2BPIntuitions.svg) 19 | 20 | `图 7.1 反向传播过程中的正向传播阶段。目的是计算损失 l 对于每个权重(用箭头表示)和偏置(图中未展示)的导数。也就是说,我们希望了解每个参数的微小变化将如何影响损失。每个权重将其源头的隐藏单元的激活值乘以权重值,并将结果传递给目标隐藏单元。因此,任何权重的微小变化所产生的效果,都会根据源隐藏单元的激活水平而放大。比如,蓝色权重作用于第一层的第二个隐藏单元;如果该单元的激活值增加一倍,那么对蓝色权重的微小变化产生的影响也会相应增加一倍。因此,为了计算权重的导数,我们需要计算并记录下隐藏层的激活值。这一过程称为正向传播,因为它包括了按顺序执行网络方程的过程。` 21 | 22 | 此外,我们定义了单个损失项 $l_i$ 来返回基于模型预测 $f(x_i, \phi)$ 对训练输入 $x_i$ 的真实标签 $y_i$ 的负对数似然。例如,这可能是指最小平方损失 $l_i = (f(x_i, \phi) - y_i)^2$。总损失是所有训练数据上这些损失项的和: 23 | 24 | $$ 25 | L(\phi) = \sum_{i=1}^{I} l_i \tag{7.2} 26 | $$ 27 | 28 | 对于训练神经网络,最常用的优化方法是随机梯度下降(SGD),通过以下方式更新参数: 29 | 30 | $$ 31 | \phi_{t+1} \leftarrow \phi_t - \alpha \sum_{i \in B_t} \frac{\partial \mathcal{L}(i,\phi_t)}{\partial \phi} \tag{7.3} 32 | $$ 33 | 34 | 35 | 其中 $\alpha$ 表示学习率,$B_t$ 为迭代 $t$ 时的批次索引。要执行此更新,必须计算每个批次中索引 $i$ 对应的参数 $\{\beta_k, \Omega_k\}$ 在每一层 $k \in \{0, 1, \ldots, K\}$ 的导数: 36 | 37 | $$ 38 | \frac{\partial l_i}{\partial \beta_k}, \quad \text{and} \quad \frac{\partial l_i}{\partial \Omega_k} \tag{7.4} 39 | $$ 40 | 41 | 本章的首部分阐述了反向传播算法,该算法能够高效地计算上述导数。 42 | 43 | 在章节的第二部分,我们将讨论在训练开始前如何初始化网络参数。我们将介绍方法来选择初始权重 $\Omega_k$ 和偏置 $\beta_k$,确保训练过程的稳定性。 44 | ## 7.2 计算导数 45 | 46 | 损失函数的导数揭示了,当我们对模型参数进行细微调整时,损失值会如何变化。优化算法借此信息调整参数,以减少损失值。反向传播算法负责计算这些导数。鉴于涉及的数学细节较为复杂,我们先提出两个观点来帮助理解。 47 | 48 | **观察 1:** 每一个权重(属于 $\Omega_k$)都会乘上某个源隐藏单元的激活值,并将结果累加到下一层的目标隐藏单元中。这意味着,权重的任意微小调整都会受到源隐藏单元激活值的放大或衰减作用。因此,我们会对每批数据中的每个样本运行网络,并记录所有隐藏单元的激活值。这个过程称为 *前向传播*(图 7.1)。记录下来的激活值之后将用于梯度的计算。 49 | 50 | **观察 2:** 对偏置或权重的微小调整会在后续网络中引发一系列变化,这种变化会修改其目标隐藏单元的值。这又会导致下一层隐藏单元的值发生变化,接着是下下层,依此类推,直至模型输出和最终的损失值发生变化。 51 | 52 | 因此,要了解参数变化如何影响损失值,我们还需要知道每个后续隐藏层的变化如何进一步影响它们的后继层。这一逻辑同样适用于考虑同一或更早层次中的其他参数时。这意味着,我们可以一次性计算这些量,并在需要时复用。例如,设想计算对输入至隐藏层 $h_3$、$h_2$、$h_1$ 的权重进行微小调整的影响: 53 | 54 | - 要计算对隐藏层 $h_3$ 输入的权重或偏置的微小调整如何影响损失,我们需要知道 (i) $h_3$ 层变化如何影响模型输出 $f$,以及 (ii) 模型输出的变化如何影响损失(图 7.2a)。 55 | - 要计算对隐藏层 $h_2$ 输入的权重或偏置的微小调整如何影响损失,我们需要知道 (i) $h_2$ 层的变化如何影响 $h_3$ 层,(ii) $h_3$ 层的变化如何影响模型输出,以及 (iii) 模型输出的变化如何影响损失(图 7.2b)。 56 | - 要计算对隐藏层 $h_1$ 输入的权重或偏置的微小调整如何影响损失,我们需要知道 (i) $h_1$ 层的变化如何影响 $h_2$ 层,(ii) $h_2$ 层的变化如何影响 $h_3$ 层,(iii) $h_3$ 层的变化如何影响模型输出,以及 (iv) 模型输出的变化如何影响损失(图 7.2c)。 57 | 58 | 随着我们向网络的前端回溯,大部分必需的计算在前一步已经完成,因此无需重复计算。这种沿网络反向进行的计算导数的过程称为 *反向传播*。 59 | 60 | ![Figure7.2](figures/chapter7/Train2BPIntuitions2.svg) 61 | 62 | `图 7.2 反向传播过程中的反向传播阶段。a) 为了计算对第三层 h3(蓝色箭头指向的层)输入权重的改变如何影响损失,我们需要知道 h3 中的隐藏单元如何影响模型输出 f,以及 f 如何影响损失(橙色箭头指示的影响)。b) 为了计算对第二层 h2(蓝色箭头指向的层)输入权重的微小改变如何影响损失,我们需要了解 (i) h2 中的隐藏单元如何影响 h3,(ii) h3 如何影响 f,以及 (iii) f 如何影响损失(橙色箭头指示的影响)。c) 类似地,为了计算对第一层 h1(蓝色箭头指向的层)输入权重的微小改变如何影响损失,我们需要知道 h1 如何影响 h2,以及这些变化如何通过网络传递影响到损失(橙色箭头指示的影响)。反向传播首先在网络末端计算导数,然后逆向进行,以此利用这些计算过程中的固有重复性。` 63 | 64 | 虽然反向传播的概念相对容易理解,但其推导过程需要应用矩阵微积分,因为偏置和权重分别以向量和矩阵的形式存在。为了更好地理解其底层机理,下一节将为一个参数为标量的简化模型推导反向传播过程。之后,在第 7.4 节,我们将这一方法应用于深度神经网络。 65 | ## 7.3 示例 66 | 考虑一个含有八个标量参数 $\phi = [\beta_0, \omega_0, \beta_1, \omega_1, \beta_2, \omega_2, \beta_3, \omega_3]$ 的模型 $f(x_i, \phi)$,该模型是通过组合 $\sin[\cdot]$、$\exp[\cdot]$ 和 $\cos[\cdot]$ 函数而构成的: 67 | 68 | $$ 69 | f(x, \phi) = \beta_3 + \omega_3 \cdot \cos[\beta_2 + \omega_2 \cdot \exp[\beta_1 + \omega_1 \cdot \sin[\beta_0 + \omega_0 \cdot x]]] \tag{7.5} 70 | $$ 71 | 以及一个最小二乘损失函数 $L[\phi] = \sum_i \ell_i$,其中的每一项定义如下: 72 | $$ 73 | \ell_i = (f(x_i, \phi) - y_i)^2 \tag{7.6} 74 | $$ 75 | 76 | 其中,按照惯例,$x_i$ 表示第 $i$ 个训练输入,$y_i$ 表示第 $i$ 个训练输出。可以把这看作是一个简单的神经网络,它具有单个输入、单个输出、每层一个隐藏单元,并且每一层之间采用了不同的激活函数 $\sin[\cdot]$、$\exp[\cdot]$ 和 $\cos[\cdot]$。我们的目标是计算以下导数: 77 | 78 | $$ 79 | \frac{\partial \ell_i}{\partial \omega_0}, \frac{\partial \ell_i}{\partial \beta_1}, \frac{\partial \ell_i}{\partial \omega_1}, \frac{\partial \ell_i}{\partial \beta_2}, \frac{\partial \ell_i}{\partial \omega_2}, \frac{\partial \ell_i}{\partial \beta_3}, \text{ 和 } \frac{\partial \ell_i}{\partial \omega_3}. 80 | $$ 81 | 82 | 虽然我们理论上可以通过手工求解这些导数的表达式并直接计算它们,但是部分导数表达式的复杂度相当高。举个例子: 83 | 84 | $$ 85 | \frac{\partial \ell_i}{\partial \omega_0} = -2 \left[ (\beta_3 + \omega_3 \cdot \cos[\beta_2 + \omega_2 \cdot \exp[\beta_1 + \omega_1 \cdot \sin[\beta_0 + \omega_0 \cdot x_i]]] - y_i) \right. \\ 86 | \cdot \omega_1 \omega_2 \omega_3 \cdot x_i \cdot \cos[\beta_0 + \omega_0 \cdot x_i] \cdot \exp[\beta_1 + \omega_1 \cdot \sin[\beta_0 + \omega_0 \cdot x_i]] \\ 87 | \left. \cdot \sin[\beta_2 + \omega_2 \cdot \exp[\beta_1 + \omega_1 \cdot \sin[\beta_0 + \omega_0 \cdot x_i]]] \right] \tag{7.7} 88 | $$ 89 | 90 | 这些表达式的推导和编码不仅容易出错,而且未能充分利用其中的重复性元素;值得注意的是,三个指数函数项实际上是一致的。 91 | 92 | 反向传播算法是一种同时计算所有这些导数的高效方法,它主要分为两个步骤:(i)前向传播,在此过程中我们计算并保存一系列中间值及网络的输出结果;(ii)反向传播,在此过程中我们从网络的输出层开始,逆向计算每个参数的导数,同时复用之前阶段的计算结果。 93 | 94 | **前向传播:** 我们把损失计算过程视作一连串的计算步骤: 95 | 96 | 97 | $$ 98 | \begin{align*} 99 | f_0 &= \beta_0 + \omega_0 \cdot x_i \\ 100 | h_1 &= \sin[f_0] \\ 101 | f_1 &= \beta_1 + \omega_1 \cdot h_1 \\ 102 | h_2 &= \exp[f_1] \\ 103 | f_2 &= \beta_2 + \omega_2 \cdot h_2 \\ 104 | h_3 &= \cos[f_2] \\ 105 | f_3 &= \beta_3 + \omega_3 \cdot h_3 \\ 106 | \ell_i &= (f_3 - y_i)^2. 107 | \end{align*} \tag{7.8} 108 | $$ 109 | 110 | 我们计算并存储了中间变量 $f_k$ 和 $h_k$(图 7.3)的值。 111 | 112 | ![Figure7.3](figures/chapter7/Train2BP1.svg) 113 | 114 | `图 7.3 反向传播过程中的正向传播阶段。我们依次计算并记录每一个中间变量,直至最终计算出损失。` 115 | 116 | **第一次反向传播:** 接下来,我们计算损失函数 $\ell_i$ 对这些中间变量的偏导数,计算顺序与它们被计算出来的顺序相反: 117 | 118 | 119 | $$ 120 | \frac{\partial \ell_i}{\partial f_3'}, \frac{\partial \ell_i}{\partial h_3'}, \frac{\partial \ell_i}{\partial f_2'}, \frac{\partial \ell_i}{\partial h_2'}, \frac{\partial \ell_i}{\partial f_1'}, \frac{\partial \ell_i}{\partial h_1'}, \text{ and } \frac{\partial \ell_i}{\partial f_0'} \tag{7.9} 121 | $$ 122 | 123 | 首先计算的这个导数相对简单直接: 124 | 125 | $$ 126 | \frac{\partial \ell_i}{\partial f_3} = 2(f_3 - y_i) \tag{7.10} 127 | $$ 128 | 129 | 130 | 接下来的导数可以通过应用链式法则进行计算: 131 | 132 | $$ 133 | \frac{\partial \ell_i}{\partial h_3} = \frac{\partial f_3}{\partial h_3} \frac{\partial \ell_i}{\partial f_3} \tag{7.11} 134 | $$ 135 | 136 | 这里探讨的是当 $h_3$ 发生变化时,$\ell_i$ 会如何变化。我们可以将这个问题分解为两部分:(i) $h_3$ 发生变化导致 $f_3$ 如何变化;以及 (ii) $f_3$ 发生变化导致 $\ell_i$ 如何变化。根据原始方程,$h_3$ 的变化引起 $f_3$ 的变化,进一步影响 $\ell_i$,这些导数体现了这一连锁反应的效应。值得注意的是,我们已经计算出了这些导数中的第二个,而另一个导数是 $\beta_3 + \omega_3 \cdot h_3$ 对 $h_3$ 的导数,即 $\omega_3$。我们继续这样做,计算出输出相对于这些中间量的导数(图 7.4): 137 | 138 | $$ 139 | \frac{\partial \ell_i}{\partial f_2} = \frac{\partial h_3}{\partial f_2} \left( \frac{\partial f_3}{\partial h_3} \frac{\partial \ell_i}{\partial f_3} \right), \\ 140 | \frac{\partial \ell_i}{\partial h_2} = \frac{\partial f_2}{\partial h_2} \left( \frac{\partial h_3}{\partial f_2} \frac{\partial f_3}{\partial h_3} \frac{\partial \ell_i}{\partial f_3} \right), \\ 141 | \frac{\partial \ell_i}{\partial f_1} = \frac{\partial h_2}{\partial f_1} \left( \frac{\partial f_2}{\partial h_2} \frac{\partial h_3}{\partial f_2} \frac{\partial f_3}{\partial h_3} \frac{\partial \ell_i}{\partial f_3} \right), \\ 142 | \frac{\partial \ell_i}{\partial h_1} = \frac{\partial f_1}{\partial h_1} \left( \frac{\partial h_2}{\partial f_1} \frac{\partial f_2}{\partial h_2} \frac{\partial h_3}{\partial f_2} \frac{\partial f_3}{\partial h_3} \frac{\partial \ell_i}{\partial f_3} \right), \\ 143 | \frac{\partial \ell_i}{\partial f_0} = \frac{\partial h_1}{\partial f_0} \left( \frac{\partial f_1}{\partial h_1} \frac{\partial h_2}{\partial f_1} \frac{\partial f_2}{\partial h_2} \frac{\partial h_3}{\partial f_2} \frac{\partial f_3}{\partial h_3} \frac{\partial \ell_i}{\partial f_3} \right) \tag{7.12} 144 | $$ 145 | 146 | 在每个案例中,我们已经在上一步骤计算出了括号内的值,最后一项则有一个简洁的公式。这些建立在先前章节观察 2(图 7.2)的基础上;通过倒序计算这些导数,我们能够复用先前计算得到的导数。 147 | 148 | ![Figure7.4](figures/chapter7/Train2BP2.svg) 149 | 150 | `图 7.4 反向传播过程中的反向传播第一阶段。我们从函数的最末端开始逆向进行,计算损失 l 对于各个中间变量的导数 ∂ li /∂ f• 和 ∂ li /∂ h•。每个导数的计算都是基于前一个导数,并乘以形如 ∂fk/∂hk 或 ∂hk/∂fk−1 的项进行的。` 151 | 152 | **第二次反向传播:** 最终,我们分析改变参数 $\beta$ 和 $\omega$ 时,损失 $\ell_i$ 如何相应变化。我们再次应用链式法则(图 7.5): 153 | 154 | $$ 155 | \frac{\partial \ell_i}{\partial \beta_k} = \frac{\partial f_k}{\partial \beta_k} \frac{\partial \ell_i}{\partial f_k}, \\ 156 | \frac{\partial \ell_i}{\partial \omega_k} = \frac{\partial f_k}{\partial \omega_k} \frac{\partial \ell_i}{\partial f_k} \tag{7.13} 157 | $$ 158 | 159 | 对于每个案例,右侧的第二项已在方程式 7.12 中计算得出。当 $k > 0$,我们得到 $f_k = \beta_k + \omega_k \cdot h_k$,因此: 160 | 161 | $$ 162 | \frac{\partial f_k}{\partial \beta_k} = 1 \text{ and } \frac{\partial f_k}{\partial \omega_k} = h_k \tag{7.14} 163 | $$ 164 | 165 | 166 | 这与上一节的第一观察点一致;$\omega_k$ 的改变对效果与源变量 $h_k$ 的值呈正比(该值在前向传播中已被记录)。从项 $f_0 = \beta_0 + \omega \cdot x_i$ 得到的最终导数为: 167 | 168 | $$ 169 | \frac{\partial f_0}{\partial \beta_0} = 1 \text{ and } \frac{\partial f_0}{\partial \omega_0} = x_i \tag{7.15} 170 | $$ 171 | 172 | 反向传播不仅过程简化,相较于单独计算每个导数(如方程 7.7.1)的方式,效率更高。 173 | 174 | ![Figure7.5](figures/chapter7/Train2BP3.svg) 175 | 176 | `图 7.5 反向传播过程中的第二阶段。我们最终计算了导数 ∂ li /∂ β• 和 ∂ li /∂ ω•。每个导数的计算都是通过将 ∂li/∂fk 项乘以适当的 ∂fk/∂βk 或 ∂fk/∂ωk 来实现的。` 177 | ## 7.4 反向传播算法 178 | 现在我们针对一个三层网络重复这一过程(图 7.1)。尽管直觉和大部分的代数处理相似,但主要的不同在于中间变量 $f_k, h_k$ 是向量形式,偏置 $\beta_k$ 也是向量,权重 $\Omega_k$ 是矩阵,并且我们采用的是 ReLU 函数而不是如 $\cos[\cdot]$ 这类简单的代数函数。 179 | 180 | **前向传播过程:** 我们将网络描述为一系列连续的计算步骤: 181 | 182 | $$ 183 | \begin{align*} 184 | f_0 &= \beta_0 + \Omega_0x_i \\ 185 | h_1 &= a[f_0] \\ 186 | f_1 &= \beta_1 + \Omega_1h_1 \\ 187 | h_2 &= a[f_1] \\ 188 | f_2 &= \beta_2 + \Omega_2h_2 \\ 189 | h_3 &= a[f_2] \\ 190 | f_3 &= \beta_3 + \Omega_3h_3 \\ 191 | \ell_i &= l[f_3, y_i], 192 | \end{align*} \tag{7.16} 193 | $$ 194 | 195 | 这里 $f_{k-1}$ 指的是第 $k^{th}$ 隐藏层的预激活值(即在 ReLU 函数 $a^{[l]}$ 应用之前的值),$h_k$ 包含了第 $k^{th}$ 隐藏层的激活值(即在 ReLU 函数应用之后的值)。项 $l_{f_3, y}$ 表示损失函数(如最小二乘损失或二元交叉熵损失)。在前向传播阶段,我们按顺序完成这些计算并记录所有中间结果。 196 | 197 | **第一次反向传播过程:** 现在,我们探讨修改预激活 $f_0, f_1, f_2$ 时,损失如何变化。通过应用链式法则,我们得到了损失 $\ell_i$ 相对于 $f_2$ 的偏导数的表达方式: 198 | 199 | $$ 200 | \frac{\partial \ell_i}{\partial f_2} = \frac{\partial h_3}{\partial f_2} \frac{\partial f_3}{\partial h_3} \frac{\partial \ell_i}{\partial f_3} \tag{7.17} 201 | $$ 202 | 203 | 204 | 右侧的三个项的维度分别是 $D_3 \times D_3, D_3 \times D_f$ 和 $D_f \times 1$,这里 $D_3$ 表示第三层隐藏单元的数目,$D_f$ 表示模型输出 $f_3$ 的维度。 205 | 206 | 类似地,我们也可以分析当改变 $f_1$ 和 $f_0$ 时,损失的变化情况: 207 | 208 | $$ 209 | \frac{\partial \ell_i}{\partial f_1} = \frac{\partial h_2}{\partial f_1} \frac{\partial f_2}{\partial h_2}\left( \frac{\partial h_3}{\partial f_2} \frac{\partial f_3}{\partial h_3} \frac{\partial \ell_i}{\partial f_3} \right) \tag{7.18} 210 | $$ 211 | 212 | 213 | $$ 214 | \frac{\partial \ell_i}{\partial f_0} = \frac{\partial h_1}{\partial f_0} \frac{\partial f_1}{\partial h_1} \left( \frac{\partial h_2}{\partial f_1} \frac{\partial f_2}{\partial h_2} \frac{\partial h_3}{\partial f_2} \frac{\partial f_3}{\partial h_3} \frac{\partial \ell_i}{\partial f_3} \right) \tag{7.19} 215 | $$ 216 | 217 | 请注意,每种情况下,括号中的内容都已在前一步计算完成。通过反向遍历网络,我们可以复用先前的计算结果。此外,这些计算项本身都相对简单。从方程 7.17 的右侧向前回溯时,我们得到: 218 | - 损失 $\ell_i$ 对网络输出 $f_3$ 的偏导数 $\partial \ell_i/\partial f_3$ 取决于损失函数,但它通常有一个简单的公式形式。 219 | - 网络输出 $f_3$ 相对于隐藏层 $h_3$ 的偏导数 $\partial f_3/\partial h_3$ 为: 220 | 221 | 222 | $$ 223 | \frac{\partial f_3}{\partial h_3} = \frac{\partial}{\partial h_3} (\beta_3 + \Omega_3 h_3) = \Omega_3^T \tag{7.20} 224 | $$ 225 | 226 | 如果你对矩阵微积分不够熟悉,这个结果可能不是很直观。这一问题在问题 7.6 中有所探讨。 227 | 228 | - 激活函数的输出 $h_3$ 对其输入 $f_2$ 的偏导数 $\partial h_3/\partial f_2$ 取决于激活函数的种类。它是一个对角矩阵,因为每个激活值只与其对应的预激活值有关。对于 ReLU 函数,当 $f_2$ 小于零时对角项为零,否则为一(图 7.6)。我们不直接进行矩阵乘法,而是将对角项提取为向量 $[f_2 > 0]$ 进行逐元素乘法,这种做法更为高效。 229 | 230 | 方程 7.18 和 7.19 中右侧的项具有相似的结构。随着我们逐步回退网络,我们将交替执行 (i) 乘以权重矩阵 $\Omega_k$ 的转置和 (ii) 根据隐藏层的输入 $f_{k-1}$ 进行阈值判断。这些输入值在前向传播时已经被记录下来。 231 | 232 | ![Figure7.6](figures/chapter7/Train2ReLUDeriv.svg) 233 | 234 | `图 7.6 整流线性单元的导数。当输入小于零时,整流线性单元(橙色曲线)输出为零;当输入大于零时,输出为输入值。其导数(青色曲线)在输入小于零时为零(因为此处斜率为零),在输入大于零时为一(因为此处斜率为一)。` 235 | 236 | **第二次反向传播过程:** 现在我们已经掌握了如何计算损失对于 $f_k$ 的偏导数 $\partial \ell_i/\partial f_k$,我们可以集中注意力于计算损失对权重和偏置的导数。为了得到损失对偏置 $\beta_k$ 的导数,我们再次应用了链式法则: 237 | 238 | $$ 239 | \begin{align} 240 | \frac{\partial \ell_i}{\partial \beta_k} &= \frac{\partial f_k}{\partial \beta_k} \frac{\partial \ell_i}{\partial f_k} \\ 241 | &= \frac{\partial}{\partial \beta_k} (\beta_k + \Omega_k h_k) \frac{\partial \ell_i}{\partial f_k} \\ 242 | &= \frac{\partial \ell_i}{\partial f_k} \tag{7.21} 243 | \end{align} 244 | $$ 245 | 246 | 这部分我们已在方程 7.17 和 7.18 中完成了计算。 247 | 248 | 同样地,权重矩阵 $\Omega_k$ 的导数可以通过以下公式计算: 249 | 250 | $$ 251 | \begin{align} 252 | \frac{\partial \ell_i}{\partial \Omega_k} &= \frac{\partial f_k}{\partial \Omega_k} \frac{\partial \ell_i}{\partial f_k} \\ 253 | &= \frac{\partial}{\partial \Omega_k} (\beta_k + \Omega_k h_k) \frac{\partial \ell_i}{\partial f_k} \\ 254 | &= \frac{\partial \ell_i}{\partial f_k} h_k^T \tag{7.22} 255 | \end{align} 256 | $$ 257 | 258 | 从第二行过渡到第三行的逻辑并不直观,这一点在问题 7.9 中有所讨论。然而,这个结果是合理的。最终得到的是一个与 $\Omega_k$ 尺寸相同的矩阵。这个结果与 $h_k$ 线性相关,$h_k$ 在原表达式中与 $\Omega_k$ 相乘。这也验证了最初的直觉:$\Omega_k$ 中的权重导数将与它们乘的隐藏单元的值成比例。回顾之前,我们已经在前向传播阶段完成了这些计算。 259 | ### 7.4.1 反向传播算法概述 260 | 现在,让我们简要概述反向传播算法的最终形态。设想一个深度神经网络 $f_{i,x_i}$,它接收输入 $x_i$,包含 $K$ 个隐藏层,采用 ReLU 激活函数,并计算单个损失项 $\ell_i = l[f_{i,x_i}, y_i]$。反向传播的目标是求出损失 $\ell_i$ 对偏置 $\beta_k$ 和权重 $\Omega_k$ 的偏导数 $\partial \ell_i/\partial \beta_k$ 和 $\partial \ell_i/\partial \Omega_k$。 **前向传播过程:** 我们计算并记录下列数据: 261 | 262 | $$ 263 | \begin{align} 264 | &f_0 = \beta_0 + \Omega_0 x_i \\ 265 | &h_k = a[f_{k-1}] \quad k \in \{1,2,...,K\} \\ 266 | &f_k = \beta_k + \Omega_k h_k. \quad k \in \{1,2,...,K\} 267 | \end{align} \tag{7.23} 268 | $$ 269 | **反向传播过程:** 我们从损失函数 $\ell_i$ 相对于网络输出 $f_K$ 的偏导数 $\partial \ell_i/\partial f_K$ 开始,逆向遍历网络: 270 | 271 | $$ 272 | \begin{align} 273 | &\frac{\partial \ell_i}{\partial \beta_k} = \frac{\partial \ell_i}{\partial f_k} \\ 274 | &\frac{\partial \ell_i}{\partial \Omega_k} = \frac{\partial \ell_i}{\partial f_k} h_k^T \\ 275 | &\frac{\partial \ell_i}{\partial f_{k-1}} = \mathbf{1}[f_{k-1} > 0] \odot \left( \Omega_k^T \frac{\partial \ell_i}{\partial f_k} \right) 276 | \end{align} \tag{7.24} 277 | $$ 278 | 这里,$\odot$ 代表逐元素乘法,$\mathbf{1}[f_{k-1} > 0]$ 是一个向量,其在 $f_{k-1}$ 大于零的位置为 1,其余为 0。最终,我们求出第一组偏置和权重的偏导数: 279 | 280 | $$ 281 | \begin{align} 282 | &\frac{\partial \ell_i}{\partial \beta_0} = \frac{\partial \ell_i}{\partial f_0} \\ 283 | &\frac{\partial \ell_i}{\partial \Omega_0} = \frac{\partial \ell_i}{\partial f_0} x_i^T 284 | \end{align} \tag{7.25} 285 | $$ 286 | 287 | 我们对批次中的每一个训练实例计算这些偏导数,并将它们累加起来,以便为 SGD 更新计算出梯度。 288 | 289 | 需要注意的是,反向传播算法极为高效;无论是前向还是反向传播,最计算密集的步骤均为矩阵乘法(分别由 $\Omega$ 和 $\Omega^T$ 完成),仅涉及加法和乘法操作。然而,这种方法在内存使用上并不高效;因为前向传播中的所有中间值都需保存,这可能限制我们能够训练的模型规模。 290 | ### 7.4.2 算法微分 291 | 虽然理解反向传播算法是重要的,但实际上你可能不需要自己编写这些代码。现代深度学习框架,如 PyTorch 和 TensorFlow,能够根据模型的定义自动计算导数,这一过程称为*算法自动微分*。 292 | 293 | 框架内的每个功能组件(如线性变换、ReLU激活函数、损失函数)均能自行计算其导数。例如,PyTorch中的ReLU函数 $z_{out} = relu(z_{in})$ 能够计算出其输出 $z_{out}$ 相对于输入 $z_{in}$ 的导数。同理,一个线性函数 $z_{out} = \beta + \Sigma z_{in}$ 能够计算输出 $z_{out}$ 相对于输入 $z_{in}$,以及参数 $\beta$ 和 $\Omega$ 的导数。算法自动微分框架还掌握网络操作的顺序,因而具备执行前向传播和反向传播所需的全部信息。 294 | 295 | 这些框架充分利用了现代图形处理单元(GPU)的大规模并行处理能力。诸如矩阵乘法之类的运算(在前向和反向传递过程中均非常重要)天生适合并行处理。此外,如果模型和前向传播中的中间结果没有超出可用内存的限制,可以对整个批量数据的前向和反向传递同时并行处理。 296 | 297 | 因为训练算法现在能够并行处理整个批次,所以输入变为了多维*张量*。在此语境下,张量可视为矩阵向任意维度的扩展。因此,向量是一维张量,矩阵是二维张量,而三维张量则是一个三维数字网格。直到现在,训练数据都是一维的,所以反向传播的输入会是一个二维张量,其中第一维索引批次元素,第二维索引数据维度。在接下来的章节里,我们将探讨更为复杂的结构化输入数据。比如,在输入为RGB图像的模型中,原始数据样本是三维的(高 x 宽 x 通道)。这里,对学习框架的输入将是一个四维张量,额外的维度用于索引批次元素。 298 | ### 7.4.3 扩展至任意计算图 299 | 我们已经讨论了深度神经网络中自然顺序的反向传播过程,其中我们依次计算中间量 f0, f1, f2, ..., fk。然而,模型并不局限于顺序计算。在本书的后续部分,我们将介绍具有分支结构的模型。举例来说,我们可能会将隐藏层的值通过两个不同的子网络进行处理,然后再次组合。 300 | 301 | 幸运的是,即使计算图是无环的,反向传播的概念依然适用。现代算法自动微分框架,如 PyTorch 和 TensorFlow,能够处理任意的无环计算图。 302 | ## 7.5 参数初始化 303 | 反向传播算法计算的导数被随机梯度下降和 Adam 算法用于训练模型。在我们开始训练之前,如何初始化参数是一个关键问题。为了理解其重要性,考虑到在前向传播过程中,每一组预激活值 $f_k$ 是按照下面的方式计算的: 304 | 305 | $$ 306 | \begin{align} 307 | f_k &= \beta_k + \Omega_k h_k \\ 308 | &= \beta_k + \Omega_k a[h_{k-1}] \tag{7.26} 309 | \end{align} 310 | $$ 311 | 312 | 其中 $a[\cdot]$ 代表应用 ReLU 函数,$\Omega_k$ 和 $\beta_k$ 分别代表权重和偏置。假设我们将所有偏置初始化为零,并且 $\Omega_k$ 的元素按照均值为零、方差为 $\sigma^2$ 的正态分布进行初始化。设想以下两种情况: 313 | 314 | - 如果方差 $\sigma^2$ 非常小(比如,$10^{-5}$),那么 $\beta_k + \Omega_k h_k$ 的每个元素将是 $h_k$ 的一个小权重加权和;这样的结果可能会比输入值的幅度还小。此外,由于 ReLU 函数会将小于零的值设为零,$h_k$ 的取值范围将是 $f_{k-1}$ 的一半。因此,随着网络深入,隐藏层的预激活值的幅度会逐渐变小。 315 | 316 | - 如果方差 $\sigma^2$ 非常大(比如,$10^5$),那么 $\beta_k + \Omega_k h_k$ 的每个元素将是 $h_k$ 的一个大权重加权和;这样的结果可能会远大于输入值的幅度。尽管 ReLU 函数会将输入值的范围减半,但若 $\sigma^2$ 足够大,预激活值的幅度在网络中逐层增加。 317 | 318 | 在这两种极端情况下,预激活值可能变得极小或极大,以至于无法用有限精度的浮点数来表示。 319 | 320 | 即便前向传播过程可行,后向传播过程也面临同样的逻辑问题。每一次梯度更新(如方程 7.24 所示)涉及到乘以 $\Omega^T$。如果 $\Omega$ 的值未能合理初始化,那么在后向传播过程中,梯度的幅度可能会不受控制地减少或增加。这分别称为梯度消失问题和梯度爆炸问题。在前者情况下,模型的更新量变得极小;在后者情况下,更新变得不稳定。 321 | 322 | ### 7.5.1 前向传播的初始化 323 | 我们将展示该论点的数学表述。请考虑相邻预激活 $f$ 和 $f'$ 之间的计算过程,它们的维度分别是 $D_h$ 和 $D_{h'}$: 324 | 325 | $$ 326 | \begin{align} 327 | &h = a[f], \\ 328 | &f' = \beta + \Omega h 329 | \end{align} \tag{7.27} 330 | $$ 331 | 332 | 其中 $f$ 代表神经网络中的预激活值,$\Omega$ 和 $\beta$ 分别代表网络的权重和偏置,$a\{\}$ 表示激活函数。 333 | 334 | 假设在输入层 $f$ 中,预激活值 $f_j$ 的方差为 $\sigma^2$。将偏置 $\beta_j$ 初始化为 0,权重 $\Omega_{ij}$ 按照均值为 0、方差为 $\frac{\alpha^2}{D}$ 的正态分布进行初始化。接下来,我们将推导出下一层预激活值 $f'$ 的平均值和方差的表达式。 335 | 336 | 中间预激活值 $f_i$ 的期望(平均值)$E[f_i]$ 为: 337 | 338 | 339 | $$ 340 | \begin{align} 341 | E[f_i^\prime] &= E\left[\beta_i + \sum_{j=1}^{D_h} \Omega_{ij}h_j \right] \\ 342 | &= E[\beta_i] + \sum_{j=1}^{D_h} E[\Omega_{ij}h_j] \\ 343 | &= E[\beta_i] + \sum_{j=1}^{D_h} E[\Omega_{ij}] E[h_j] \\ 344 | &= 0 + \sum_{j=1}^{D_h} 0 \cdot E[h_j] = 0 , \tag{7.28} 345 | \end{align} 346 | $$ 347 | 348 | 其中 $D_h$ 代表输入层 $h$ 的维度。我们应用了期望操作的规则,并假设在第二行与第三行之间,隐藏单元 $h_j$ 与网络权重 $\Omega_{ij}$ 的分布互相独立。 349 | 350 | 基于这个结果,我们得出预激活值 $f'_i$ 的方差 $\sigma_{f'}^2$ 为: 351 | 352 | 353 | $$ 354 | \begin{align} 355 | \sigma_{f'}^2 &= E[f_i'^2] - E[f_i']^2 \\ 356 | &= E\left[\left(\beta_i + \sum_{j=1}^{D_h} \Omega_{ij}h_j \right)^2\right] - 0 \\ 357 | &= E\left[\left( \sum_{j=1}^{D_h} \Omega_{ij}h_j \right)^2\right] \\ 358 | &= \sum_{j=1}^{D_h} E[\Omega_{ij}^2] E[h_j^2] \\ 359 | &= \sum_{j=1}^{D_h} \sigma^2 E[h_j^2] = \sigma^2 \sum_{j=1}^{D_h} E[h_j^2], 360 | \end{align} \tag{7.29} 361 | $$ 362 | 363 | 我们应用了方差的定义 $\sigma^2 = E[(x - E[x])^2] = E[x^2] - E[x]^2$。再次,我们假定权重 $\Omega_{ij}$ 和隐藏单元 $h_j$ 在第三行与第四行之间的分布是相互独立的。 364 | 365 | 在假设预激活 $f_j$ 的输入分布在零点对称的前提下,一半的预激活值会被 ReLU 函数设置为零,这意味着隐藏单元的第二矩 $E[h_j^2]$ 将是 $f_j$ 的方差 $\sigma^2$ 的一半(参考问题 7.14): 366 | 367 | 368 | $$ 369 | \sigma_{f'}^2 = \sigma_\Omega^2 \sum_{j=1}^{D_h} \frac{\sigma_f^2}{2} = \frac{1}{2} D_h\sigma_\Omega^2\sigma_f^2. \tag{7.30} 370 | $$ 371 | 372 | 这也就意味着,若我们想让后续预激活值 $f'$ 的方差 $\sigma_{f'}^2$ 在前向传播过程中保持与原始预激活值 $f$ 的方差 $\sigma_f^2$ 相等,那么我们需要设定: 373 | 374 | 375 | $$ 376 | \sigma_{f'}^2 = \frac{2}{D_h} \tag{7.31} 377 | $$ 378 | 379 | 其中 $D_h$ 是应用权重的原始层的维度。这种初始化方法被称为 He 初始化。 380 | 381 | ### 7.5.2 反向传播的初始化 382 | 一个相似的论证说明了反向传播期间梯度 $\frac{\partial l}{\partial f_k}$ 的方差的变化情况。在反向传播过程中,我们将其与权重矩阵的转置 $\Omega^T$ 相乘(见方程 7.24),因此相应的表达式变为: 383 | $$ 384 | \sigma^2_n = \frac{2}{D_{h'}}, \tag{7.32} 385 | $$ 386 | 387 | 其中 $D_{h'}$ 表示权重作用的那一层的维度。 388 | ### 7.5.3 正向传播和反向传播的初始化 389 | 如果权重矩阵 \( \Omega \) 不是方阵(即,两个相邻层的隐藏单元数量不同,从而 \( D_h \) 和 \( D_{h'} \) 存在差异),则无法选择一个方差同时满足方程 7.31 和 7.32。一种可行的折衷方法是采用平均数 \( (D_h + D_{h'})/2 \) 作为项数,据此得到: 390 | 391 | $$ 392 | \sigma^2_n = \frac{4}{D_h + D_{h'}} \tag{7.33} 393 | $$ 394 | 395 | 396 | 图 7.7 通过实验数据表明,当参数进行适当的初始化后,正向传播过程中隐藏单元的方差以及反向传播过程中梯度的方差均能保持稳定。 397 | 398 | ![Figure7.7](figures/chapter7/Train2Exploding.svg) 399 | 400 | `图 7.7 权重初始化。设想一个具有 50 个隐藏层,每层有 Dh = 100 个隐藏单元的深度网络。该网络的 100 维输入 x 从标准正态分布中初始化,设定单一固定目标 y = 0,并使用最小二乘损失函数。偏置向量 βk 初始化为零,权重矩阵 Ωk 则采用均值为零的正态分布初始化,并设置五种不同的方差 σΩ2 ∈ {0.001, 0.01, 0.02, 0.1, 1.0}。a) 正向传播计算出的隐藏单元激活方差随网络层变化的函数图。对于 He 初始化(σΩ2 = 2/Dh = 0.02),激活方差保持稳定。但是,对于较大的值,方差迅速增加;对于较小的值,方差迅速减少(注意此处使用了对数刻度)。b) 反向传播中梯度的方差(用实线表示)延续了这一趋势;如果初始化值大于 0.02,梯度大小会随着网络反向传播而迅速增大。如果初始化值小于这个值,则梯度大小会减小。这两种情况分别被称为梯度爆炸和梯度消失问题。` 401 | ## 7.6 示例训练代码 402 | 本书主要专注于科学研究;并非旨在指导实现深度学习模型。然而,在图 7.8 中,我们呈现了一段 PyTorch 代码,该代码实践了迄今为止本书探讨的理念。该代码定义了一个神经网络并初始化了权重。它生成了随机的输入和输出数据集,并定义了一个最小二乘损失函数。模型通过在大小为 10 的批次中使用具有动量的 SGD 在 100 轮次(epoch)内进行训练,学习率从 0.01 开始,并每 10 轮次减半。 403 | 404 | 核心观点是,虽然深度学习的底层原理相当复杂,其实现过程却相对简单。比如,反向传播的所有细节都封装在了一行代码 `loss.backward()` 中。 405 | 406 | ![Figure7.8](figures/chapter7/code.png) 407 | 408 | `图 7.8 在随机数据上训练双层网络的示例代码。` 409 | ## 7.7 总结 410 | 上一章引入了随机梯度下降(SGD),一个旨在找到函数最小值的迭代优化算法。在神经网络的背景下,这一算法寻找能够最小化损失函数的参数。SGD 依赖于损失函数相对于参数的梯度,这需要在优化前进行初始化。本章解决了深度神经网络面临的这两大问题。 411 | 412 | 梯度必须对大量参数进行评估,针对每个批次中的每一个样本,以及每一次 SGD 迭代。因此,高效的梯度计算显得至关重要,为此引入了反向传播算法。此外,谨慎的参数初始化也极为关键。在正向传播过程中,隐藏单元激活的幅度可能会指数级地增加或减少。反向传播过程中,梯度幅度的变化同样可能出现,这种现象被称为梯度消失和梯度爆炸问题,它们都会阻碍训练过程,但可以通过恰当的初始化来避免。 413 | 414 | 至此,我们已经定义了模型及其损失函数,并可以针对特定任务训练模型。下一章将讨论如何评估模型性能。 415 | ## 笔记 416 | **反向传播 (Backpropagation)**:在计算图中计算梯度时,有效重复使用部分计算的技术已多次被发现,包括 Werbos (1974)、Bryson 等人 (1979)、LeCun (1985) 和 Parker (1985) 的研究。然而,这一理念最为人称道的描述出现在 Rumelhart 等人 (1985) 和 Rumelhart 等人 (1986) 的工作中,他们还首次提出了“反向传播”这一术语。这项后期工作引发了 80 年代和 90 年代神经网络研究的新浪潮;首次使得训练具有隐藏层的网络成为可能。不过,由于训练数据的缺乏、计算能力的限制以及使用 Sigmoid 激活函数,进展最终陷入停滞(事后看来)。直到 Krizhevsky 等人 (2012) 在图像分类方面取得显著成果,自然语言处理和计算机视觉领域才开始依赖神经网络模型,开启了深度学习的现代纪元。 417 | 418 | 在现代深度学习框架如 PyTorch 和 TensorFlow 中实施的反向传播,是逆模式算法微分 (reverse-mode algorithmic differentiation) 的一个例子。这与在计算图前向传播过程中累积链式法则导数的前向模式算法微分不同(参见问题 7.13)。有关算法微分的更多信息,请参阅 Griewank & Walther (2008) 和 Baydin 等人 (2018) 的工作。 419 | 420 | **初始化**:He 初始化最初由 He 等人 (2015) 提出。它紧跟 Glorot 或 Xavier 初始化(Glorot & Bengio, 2010),非常相似,但未考虑 ReLU 层的影响,因此有一定的差异。实际上,LeCun 等人 (2012) 早期就提出了本质上相同的方法,但其动机略有不同;在此,采用了 Sigmoid 激活函数,这种函数自然地规范了每层输出的范围,从而帮助避免隐藏单元幅度的指数级增长。然而,若预激活值过大,就会落入 Sigmoid 函数的平坦区域,导致梯度非常小。因此,合理地初始化权重仍然至关重要。Klambauer 等人 (2017) 引入了缩放指数线性单元 (SeLU) 并显示,在一定范围的输入下,该激活函数倾向于使网络层的激活自动趋向于零均值和单位方差。 421 | 422 | 完全不同的方法是通过网络传递数据后,根据实际观察到的方差进行规范化。层序列单位方差初始化 (Layer-sequential unit variance initialization)(Mishkin & Matas, 2016)就是这种方法的一个例子,其中权重矩阵以正交方式初始化。GradInit (Zhu 等人,2021) 随机初始化权重,并在学习每个权重矩阵的非负缩放因子时暂时固定它们。这些因子选取是为了在固定学习率的条件下最大化减少损失,同时限制最大梯度范数。激活规范化或 ActNorm 在每个网络层的每个隐藏单元后添加一个可学习的缩放和偏移参数。他们在网络上运行一个初始批次,然后调整偏移和比例,使得激活的平均值为零且方差为一。此后,这些额外的参数将作为模型的一部分进行学习。 423 | 424 | 与这些方法紧密相关的是如 BatchNorm(Ioffe & Szegedy, 2015)等方案,其中网络作为其每一步处理的一部分,规范化每批的方差。BatchNorm 及其变种将在第 11 章中讨论。其他针对特定架构的初始化方案包括用于卷积网络的 ConvolutionOrthogonal 初始化器(Xiao 等人,2018a)、残差网络的 Fixup(Zhang 等人,2019a)以及 Transformer 的 TFixup(Huang 等人,2020a)和 DTFixup(Xu 等人,2021b)。 425 | 426 | 减少内存需求:训练神经网络是一个内存密集型的过程。我们必须存储批次中每个成员的模型参数和隐藏单元的预激活值。减少内存需求的两种方法包括梯度检查点(Chen 等人,2016a)和微批处理(Huang 等人,2019)。在梯度检查点技术中,激活仅在前向传播的每 N 层存储一次。在反向传递期间,中间缺失的激活从最近的检查点重新计算。这样,我们可以在计算成本上执行前向传播两次的情况下大幅减少内存需求(参见问题 7.11)。在微批处理中,将批次细分为更小的部分,并在应用到网络之前聚合每个子批次的梯度更新。构建可逆网络(例如,Gomez 等人,2017)是一种完全不同的方法,在这种网络中,可以从当前层的激活计算出上一层的激活,因此在前向传播期间无需缓存任何内容(见第 16 章)。Sohoni 等人 (2019) 回顾了减少内存需求的方法。 427 | 428 | 分布式训练:对于大型模型,内存需求或所需总时间可能对于单个处理器来说过多。在这种情况下,我们必须采用分布式训练,训练过程在多个处理器上并行进行。并行方法有几种。在数据并行中,每个处理器或节点包含模型的完整副本,但只运行批次的一部分(参见 Xing 等人,2015;Li 等人,2020b)。每个节点的梯度在中央聚合,然后重新分配回每个节点,以确保模型保持一致。这称为同步训练。聚合和重新分配梯度所需的同步可能成为性能瓶颈,这引出了异步训练的概念。例如,在 Hogwild! 算法(Recht 等人,2011)中,节点的梯度被用来更新中心模型,一旦准备好即可。更新后的模型随后重新分配给该节点。这意味着每个节点可能在任何给定时间都有略微不同版本的模型,因此梯度更新可能是陈旧的;然而,实践证明这种方法效果良好。也开发了其他去中心化方案。例如,在 Zhang 等人 (2016a) 的研究中,个别节点以环形结构互相更新。 429 | 430 | 数据并行方法仍然假设整个模型可以存储在单个节点的内存中。管道模型并行不需要这样的前提,它将网络的不同层存储在不同节点上。在一种简单的实现中,第一个节点对批次的前几层进行前向传播,并将结果传递给下一个节点,该节点继续对接下来的几层进行前向传播,以此类推。在反向传递中,以相反的顺序更新梯度。这种方法的明显缺点是,每台机器在大多数时间里处于闲置状态。已经提出了各种方案来减少这种低效率,例如,让每个节点依次处理微批次(例如,Huang 等人,2019;Narayanan 等人,2021a)。最后,在张量模型并行中,单个网络层的计算在节点之间分布(例如,Shoeybi 等人,2019)。Narayanan 等人 (2021b) 提供了分布式训练方法的综述,他们结合张量、管道和数据并行训练了一个具有一万亿参数的语言模型,在 3072 个 GPU 上运行。 431 | ## Problems 432 | **问题 7.1** 一个包含两个隐藏层,每层有两个隐藏单元的双层网络可以被定义为: 433 | $$ 434 | \begin{align} 435 | y = \phi_0 &+ \phi_1a[\psi_{01} + \psi_{11}a[\theta_{01} + \theta_{11}x] + \psi_{21}a[\theta_{02} + \theta_{12}x]] \\ 436 | &+ \phi_2a[\psi_{02} + \psi_{12}a[\theta_{01} + \theta_{11}x] + \psi_{22}a[\theta_{02} + \theta_{12}x]] 437 | \end{align} \tag{7.34} 438 | $$ 439 | 440 | 其中函数 $a[\cdot]$ 是线性整流函数(ReLU 函数)。直接计算输出 $y$ 相对于各参数 $\phi_\cdot, \theta_{\cdot\cdot},$ 和 $\psi_{\cdot\cdot}$ 的导数(即,不采用反向传播算法)。线性整流函数(ReLU 函数)相对于其输入的导数 $\partial a(z)/\partial z$ 是指示函数 $I[z > 0]$,如果参数大于零则返回一,否则返回零(图 7.6)。 441 | 442 | **问题 7.2** 寻找等式 7.12 中每个导数链五个最终项的表达式。 443 | 444 | **问题 7.3** 等式 7.19 中每个项的尺寸是多少? 445 | 446 | **问题 7.4** 对于最小平方损失函数,计算导数 $\partial\ell_i/\partial f(x_i, \phi)$: 447 | 448 | $$ 449 | \ell_i = (y_i - f(x_i, \phi))^2. \tag{7.35} 450 | $$ 451 | 452 | **问题 7.5** 对于二分类损失函数,计算导数 $\partial\ell_i/\partial f(x_i, \phi)$: 453 | 454 | $$ 455 | \ell_i = -(1 - y_i)\log [ 1 - sig[f(x_i, \phi)] ] - y_i \log [sig[f(x_i, \phi)] ] \tag{7.36} 456 | $$ 457 | 458 | 其中函数 $sig[]$ 是逻辑 Sigmoid 函数,并被定义为: 459 | 460 | $$ 461 | sig[z] = \frac{1}{1 + \exp[-z]}. \tag{7.37} 462 | $$ 463 | 464 | 465 | **问题 7.6** 对于 $z = \beta + \Omega h$ 证明: 466 | $$ 467 | \frac{\partial z}{\partial h} = \Omega^T, 468 | $$ 469 | 其中 $\frac{\partial z}{\partial h}$ 是一个矩阵,包含项 $\frac{\partial z_i}{\partial h_j}$ 在其第 $i$ 列和第 $j$ 行。首先找出构成元素 $\frac{\partial z_i}{\partial h_j}$ 的表达式,然后确定矩阵 $\frac{\partial z}{\partial h}$ 的形式。 470 | 471 | **问题 7.7** 当使用逻辑 Sigmoid 函数(参见等式 7.37)作为激活函数时,即 $h = sig[f]$,计算此激活函数对 $f$ 的导数 $\frac{\partial h}{\partial f}$。当输入值是 (i) 一个很大的正数和 (ii) 一个很大的负数时,这个导数会怎样变化? 472 | 473 | **问题 7.8** 考虑使用 (i) Heaviside 函数和 (ii) 矩形函数作为激活函数: 474 | $$ 475 | Heaviside[z] = \begin{cases} 476 | 0 & z < 0 \\ 477 | 1 & z \geq 0 478 | \end{cases} \tag{7.38} 479 | $$ 480 | 481 | 和 482 | $$ 483 | rect[z] = \begin{cases} 484 | 0 & z < 0 \\ 485 | 1 & 0 \leq z \leq 1 \\ 486 | 0 & z > 1 487 | \end{cases} \tag{7.39} 488 | $$ 489 | 490 | 讨论这些函数为何在使用基于梯度的优化方法训练神经网络时会产生问题。 491 | 492 | **问题 7.9** 考虑损失函数 $\ell[f]$,其中 $f = \beta + \Omega h$。我们想要找出当改变 $\Omega$ 时,损失 $\ell$ 如何变化,用一个包含导数 $\partial\ell/\partial\Omega_{ij}$ 在第 $i$ 行和第 $j$ 列的矩阵来表示。找出 $\partial\ell/\partial\Omega_{ij}$ 的表达式,并使用链式法则证明: 493 | $$ 494 | \frac{\partial \ell}{\partial \Omega} = \frac{\partial \ell}{\partial h^T}. \tag{7.40} 495 | $$ 496 | 497 | **问题 7.10** 导出对于使用泄漏 ReLU 激活函数的网络反向传播算法的反向传递方程,定义为: 498 | $$ 499 | a[z] = ReLU[z] = \begin{cases} 500 | \alpha \cdot z & z < 0 \\ 501 | z & z \geq 0 502 | \end{cases} \tag{7.41} 503 | $$ 504 | 505 | 其中 $\alpha$ 是一个小的正值(通常为 0.1)。 506 | 507 | **问题 7.11** 考虑训练一个含有五十层的网络,在正向传播过程中,我们只有足够的内存来在每十个隐藏层保存一次预激活值。请解释在这种情况下如何利用梯度检查点技术计算导数。 508 | 509 | **问题 7.12** 本题探索在一般的有向无环图计算图上计算导数。考虑下列函数: 510 | 511 | $$ 512 | y = \exp [\exp[x] + \exp[x^2]] + \sin[\exp[x] + \exp[x^2]]. \tag{7.42} 513 | $$ 514 | 515 | 我们可以将这个过程分解为以下几步中间计算: 516 | $$ 517 | \begin{aligned} 518 | f_1 &= \exp[x] \\ 519 | f_2 &= f_1^2 \\ 520 | f_3 &= f_1 + f_2 \\ 521 | f_4 &= \exp[f_3] \\ 522 | f_5 &= \sin[f_3] \\ 523 | y &= f_4 + f_5. 524 | \end{aligned} \tag{7.43} 525 | $$ 526 | 527 | 相应的计算图展示在图 7.9 中。通过反向传播法计算 $\frac{\partial y}{\partial x}$ 的导数。也就是依次计算: 528 | 529 | $$ 530 | \frac{\partial y}{\partial f_5}, \frac{\partial y}{\partial f_4}, \frac{\partial y}{\partial f_3}, \frac{\partial y}{\partial f_2}, \frac{\partial y}{\partial f_1}, \frac{\partial y}{\partial x} \tag{7.44} 531 | $$ 532 | 533 | 每一步均应用链式法则,以利用之前已计算出的导数。 534 | 535 | ![Figure7.9](figures/chapter7/Train2CompGraph.svg) 536 | 537 | `图 7.9 针对问题 7.12 和问题 7.13 的计算图,根据 Domke (2010) 的研究进行了展示。` 538 | 539 | **问题 7.13** 对于问题 7.42 中相同的函数,通过正向传播法计算 $\frac{\partial y}{\partial x}$ 的导数。即依次计算: 540 | 541 | $$ 542 | \frac{\partial f_1}{\partial x}, \frac{\partial f_2}{\partial x}, \frac{\partial f_3}{\partial x}, \frac{\partial f_4}{\partial x}, \frac{\partial f_5}{\partial x}, \frac{\partial y}{\partial x} \tag{7.45} 543 | $$ 544 | 545 | 每一步均应用链式法则,以利用之前已计算出的导数。为什么在计算深度网络的参数梯度时,我们不采用正向传播法呢? 546 | 547 | **问题 7.14** 假设有一个随机变量 $a$,其方差 $\text{Var}[a] = \sigma^2$,且其分布在均值 $\mathbb{E}[a] = 0$ 周围对称。证明如果我们将这个变量通过 ReLU 函数处理: 548 | 549 | $$ 550 | b = \text{ReLU}[a] = \begin{cases} 551 | 0 & a < 0 \\ 552 | a & a \geq 0 553 | \end{cases}, \tag{7.46} 554 | $$ 555 | 556 | 那么,变换后变量的二阶矩(二次方期望)为 $\mathbb{E}[b^2] = \sigma^2/2$。 557 | 558 | **问题 7.15** 如果我们将网络中所有的权重和偏置初始化为零,你认为会发生什么情况? 559 | 560 | **问题 7.16** 使用 PyTorch 实现图 7.8 中的代码,并绘制训练过程中的损失与迭代次数的关系图。 561 | 562 | **问题 7.17** 修改图 7.8 中的代码以解决一个二元分类问题。你需要 (i) 将目标 $y$ 修改为二元值,(ii) 修改网络以预测介于 0 和 1 之间的数值,(iii) 适当修改损失函数。 563 | 564 | -------------------------------------------------------------------------------- /Chapter 8 Measuring performance.md: -------------------------------------------------------------------------------- 1 | Previous chapters described neural network models, loss functions, and training algo- rithms. This chapter considers how to measure the performance of the trained models. With sufficient capacity (i.e., number of hidden units), a neural network model will often perform perfectly on the training data. However, this does not necessarily mean it will generalize well to new test data. 2 | 3 | We will see that the test errors have three distinct causes and that their relative contributions depend on (i) the inherent uncertainty in the task, (ii) the amount of training data, and (iii) the choice of model. The latter dependency raises the issue of hyperparameter search. We discuss how to select both the model hyperparameters (e.g., the number of hidden layers and the number of hidden units in each) and the learning algorithm hyperparameters (e.g., the learning rate and batch size). 4 | 5 | ## 8.1 Training a simple model 6 | We explore model performance using the MNIST-1D dataset (figure 8.1). This consists of ten classes $y \in \{0,1,\ldots,9\}$, representing the digits 0–9. The data are derived from 1D templates for each of the digits. Each data example $x$ is created by randomly transforming one of these templates and adding noise. The full training dataset $\{x_i, y_i\}$ consists of $I=4000$ training examples, each consisting of $D_i=40$ dimensions representing the horizontal offset at 40 positions. The ten classes are drawn uniformly during data generation, so there are $\sim400$ examples of each class. 7 | 8 | We use a network with $D_i = 40$ inputs and $D_o = 10$ outputs which are passed through a softmax function to produce class probabilities (see section 5.5). The network has two hidden layers with $D = 100$ hidden units each. It is trained using stochastic gradient descent with batch size 100 and learning rate 0.1 for 6000 steps (150 epochs) with a multiclass cross-entropy loss (equation 5.24). Figure 8.2 shows that the training error decreases as training proceeds. The training data are classified perfectly after about 4000 steps. The training loss also decreases, eventually approaching zero. 9 | 10 | However, this doesn’t imply that the classifier is perfect; the model might have memorized the training set but be unable to predict new examples. To estimate the true performance, we need a separate test set of input/output pairs {xi,yi}. To this end, we generate 1000 more examples using the same process. Figure 8.2a also shows the errors for this test data as a function of the training step. These decrease as training proceeds, but only to around 40%. This is better than the chance error rate of 90% error rate but far worse than for the training set; the model has not generalized well to the test data. 11 | 12 | The test loss (figure 8.2b) decreases for the first 1500 training steps but then increases again. At this point, the test error rate is fairly constant; the model makes the same mistakes but with increasing confidence. This decreases the probability of the correct answers and thus increases the negative log-likelihood. This increasing confidence is a side-effect of the softmax function; the pre-softmax activations are driven to increasingly extreme values to make the probability of the training data approach one (see figure 5.10). 13 | 14 | ## 8.2 Sources of error 15 | We now consider the sources of the errors that occur when a model fails to generalize. To make this easier to visualize, we revert to a 1D linear least squares regression problem where we know exactly how the ground truth data were generated. Figure 8.3 shows a quasi-sinusoidal function; both training and test data are generated by sampling input values in the range [0, 1], passing them through this function, and adding Gaussian noise with a fixed variance. 16 | 17 | We fit a simplified shallow neural net to this data (figure 8.4). The weights and biases that connect the input layer to the hidden layer are chosen so that the “joints” of the function are evenly spaced across the interval. If there are D hidden units, then these jointswillbeat0,1/D,2/D,...,(D−1)/D. Thismodelcanrepresentanypiecewise linear function with D equally sized regions in the range [0, 1]. As well as being easy to understand, this model also has the advantage that it can be fit in closed form without the need for stochastic optimization algorithms (see problem 8.3). Consequently, we can guarantee to find the global minimum of the loss function during training. 18 | 19 | ### 8.2.1 Noise, bias, and variance 20 | There are three possible sources of error, which are known as noise, bias, and variance respectively (figure 8.5): 21 | 22 | Noise The data generation process includes the addition of noise, so there are multiple possible valid outputs y for each input x (figure 8.5a). This source of error is insurmount- able for the test data. Note that it does not necessarily limit the training performance; we will likely never see the same input x twice during training, so it is still possible to fit the training data perfectly. 23 | 24 | Noise may arise because there is a genuine stochastic element to the data generation process, because some of the data are mislabeled, or because there are further explanatory variables that were not observed. In rare cases, noise may be absent; for example, a network might approximate a function that is deterministic but requires significant computation to evaluate. However, noise is usually a fundamental limitation on the possible test performance. 25 | 26 | Bias A second potential source of error may occur because the model is not flexible enough to fit the true function perfectly. For example, the three-region neural network model cannot exactly describe the quasi-sinusoidal function, even when the parameters are chosen optimally (figure 8.5b). This is known as bias. 27 | 28 | Variance We have limited training examples, and there is no way to distinguish sys- tematic changes in the underlying function from noise in the underlying data. When we fit a model, we do not get the closest possible approximation to the true underly- ing function. Indeed, for different training datasets, the result will be slightly different each time. This additional source of variability in the fitted function is termed variance (figure 8.5c). In practice, there might also be additional variance due to the stochastic learning algorithm, which does not necessarily converge to the same solution each time. 29 | 30 | ### 8.2.2 Mathematical formulation of test error 31 | We now make the notions of noise, bias, and variance mathematically precise. Consider a 1D regression problem where the data generation process has additive noise with variance $\sigma^2$ (e.g., figure 8.3); we can observe different outputs $y$ for the same input $x$, so for each $x$, there is a distribution $Pr(y|x)$ with expected value (mean) $\mu[x]$: 32 | 33 | $$ 34 | \mu[x] = \mathbb{E}_y[\mu[x]] = \int y[x] Pr(y|x)dy, 35 | $$ 36 | 37 | and fixed noise $\sigma^2 = \mathbb{E}_y [(\mu[x] - y[x])^2]$. Here we have used the notation $y[x]$ to specify that we are considering the output $y$ at a given input position $x$. 38 | 39 | Now consider a least squares loss between the model prediction $f(x, \phi)$ at position $x$ and the observed value $y[x]$ at that position: 40 | 41 | $$ 42 | L[x] = (f(x, \phi) - y[x])^2 43 | $$ 44 | $$ 45 | = ((f(x, \phi) - \mu[x]) + (\mu[x] - y[x]))^2 46 | $$ 47 | $$ 48 | = (f(x, \phi) - \mu[x])^2 + 2(f(x, \phi) - \mu[x])(\mu[x] - y[x]) + (\mu[x] - y[x])^2, 49 | $$ 50 | 51 | where we have both added and subtracted the mean $\mu[x]$ of the underlying function in the second line and have expanded out the squared term in the third line. 52 | 53 | The underlying function is stochastic, so this loss depends on the particular y[x] we observe. The expected loss is: 54 | $$ 55 | \mathbb{E}_y[L[x]] = \mathbb{E}_y[(f(x, \phi) - \mu[x])^2 + 2(f(x, \phi) - \mu[x])(\mu[x] - y[x]) + (\mu[x] - y[x])^2] 56 | $$ 57 | $$ 58 | = (f(x, \phi) - \mu[x])^2 + 2(f(x, \phi) - \mu[x])(\mu[x] - \mathbb{E}_y[y[x]]) + \mathbb{E}_y[(\mu[x] - y[x])^2] 59 | $$ 60 | $$ 61 | = (f(x, \phi) - \mu[x])^2 + 2(f(x, \phi) - \mu[x]) \cdot 0 + \mathbb{E}_y[(\mu[x] - y[x])^2] 62 | $$ 63 | $$ 64 | = (f(x, \phi) - \mu[x])^2 + \sigma^2, 65 | $$ 66 | 67 | where we have made use of the rules for manipulating expectations. In the second line, we have distributed the expectation operator and removed it from terms with no dependence on $y[x]$, and in the third line, we note that the second term is zero since $\mathbb{E}_y[y[x]] = \mu[x]$ by definition. Finally, in the fourth line, we have substituted in the definition of the fixed noise $\sigma^2$. We can see that the expected loss has been broken down into two terms; the first term is the squared deviation between the model and the true function mean, and the second term is the noise. 68 | 69 | The first term can be further partitioned into bias and variance. The parameters $\phi$ of the model $f[x, \phi]$ depend on the training dataset $D = \{x_i, y_i\}$, so more properly, we should write $f[x, \phi[D]]$. The training dataset is a random sample from the data generation process; with a different sample of training data, we would learn different parameter values. The expected model output $f_\mu[x]$ with respect to all possible datasets $D$ is hence: 70 | 71 | $$ 72 | f_\mu[x] = \mathbb{E}_D[f[x, \phi[D]]]. 73 | $$ 74 | 75 | Returning to the first term of equation 8.3, we add and subtract $f_\mu[x]$ and expand: 76 | 77 | $$ 78 | (f[x, \phi[D]] - \mu[x])^2 79 | $$ 80 | $$ 81 | = ((f[x, \phi[D]] - f_\mu[x]) + (f_\mu[x] - \mu[x]))^2 82 | $$ 83 | $$ 84 | = (f[x, \phi[D]] - f_\mu[x])^2 + 2(f[x, \phi[D]] - f_\mu[x])(f_\mu[x] - \mu[x]) + (f_\mu[x] - \mu[x])^2. 85 | $$ 86 | 87 | We then take the expectation with respect to the training dataset $D$: 88 | 89 | $$ 90 | \mathbb{E}_D [(f[x, \phi[D]] - \mu[x])^2] = \mathbb{E}_D [(f[x, \phi[D]] - f_\mu[x])^2] + (f_\mu[x] - \mu[x])^2, 91 | $$ 92 | 93 | where we have simplified using similar steps as for equation 8.3. Finally, we substitute this result into equation 8.3: 94 | 95 | $$ 96 | \mathbb{E}_D[\mathbb{E}_y[L[x]]] = \mathbb{E}_D [(f[x, \phi[D]] - f_\mu[x])^2] + (f_\mu[x] - \mu[x])^2 + \sigma^2. 97 | $$ 98 | 99 | 100 | This equation says that the expected loss after considering the uncertainty in the training data D and the test data y consists of three additive components. The variance is uncertainty in the fitted model due to the particular training dataset we sample. The bias is the systematic deviation of the model from the mean of the function we are modeling. The noise is the inherent uncertainty in the true mapping from input to output. These three sources of error will be present for any task. They combine additively for linear regression with a least squares loss. However, their interaction can be more complex for other types of problems. 101 | 102 | ## 8.3 Reducing error 103 | 104 | In the previous section, we saw that test error results from three sources: noise, bias, and variance. The noise component is insurmountable; there is nothing we can do to circumvent this, and it represents a fundamental limit on model performance. However, it is possible to reduce the other two terms. 105 | 106 | ### 8.3.1  Reducing variance 107 | Recall that the variance results from limited noisy training data. Fitting the model to two different training sets results in slightly different parameters. It follows we can reduce the variance by increasing the quantity of training data. This averages out the inherent noise and ensures that the input space is well sampled. 108 | 109 | Figure 8.6 shows the effect of training with 6, 10, and 100 samples. For each dataset size, we show the best-fitting model for three training datasets. With only six samples, the fitted function is quite different each time: the variance is significant. As we increase the number of samples, the fitted models become very similar, and the variance reduces. In general, adding training data almost always improves test performance. 110 | 111 | ### 8.3.2  Reducing bias 112 | The bias term results from the inability of the model to describe the true underlying function. This suggests that we can reduce this error by making the model more flexible. This is usually done by increasing the model capacity. For neural networks, this means adding more hidden units and/or hidden layers. 113 | 114 | In the simplified model, adding capacity corresponds to adding more hidden units so that the interval [0, 1] is divided into more linear regions. Figures 8.7a–c show that (unsurprisingly) this does indeed reduce the bias; as we increase the number of linear regions to ten, the model becomes flexible enough to fit the true function closely. 115 | 116 | ### 8.3.3  Bias-variance trade-off 117 | However, figures 8.7d–f show an unexpected side-effect of increasing the model capac- ity. For a fixed-size training dataset, the variance term increases as the model capacity increases. Consequently, increasing the model capacity does not necessarily reduce the test error. This is known as the bias-variance trade-off. 118 | 119 | Figure 8.8 explores this phenomenon. In panels a–c), we fit the simplified three-region model to three different datasets of fifteen points. Although the datasets differ, the final model is much the same; the noise in the dataset roughly averages out in each linear region. In panels d–f), we fit a model with ten regions to the same three datasets. This model has more flexibility, but this is disadvantageous; the model certainly fits the data better, and the training error will be lower, but much of the extra descriptive power is devoted to modeling the noise. This phenomenon is known as overfitting. 120 | 121 | We’ve seen that as we add capacity to the model, the bias will decrease, but the variance will increase for a fixed-size training dataset. This suggests that there is an optimal capacity where the bias is not too large and the variance is still relatively small. Figure 8.9 shows how these terms vary numerically for the toy model as we increase the capacity, using the data from figure 8.8. For regression models, the total expected error is the sum of the bias and the variance, and this sum is minimized when the model capacity is four (i.e., with four hidden units and four linear regions). 122 | 123 | ## 8.4 Double descent 124 | In the previous section, we examined the bias-variance trade-off as we increased the capacity of a model. Let’s now return to the MNIST-1D dataset and see whether this happens in practice. We use 10,000 training examples, test with another 5,000 examples and examine the training and test performance as we increase the capacity (number of parameters) in the model. We train the model with Adam and a step size of 0.005 using a full batch of 10,000 examples for 4000 steps. 125 | 126 | Figure 8.10a shows the training and test error for a neural network with two hid- den layers as the number of hidden units increases. The training error decreases as the capacity grows and quickly becomes close to zero. The vertical dashed line represents the capacity where the model has the same number of parameters as there are training examples, but the model memorizes the dataset before this point. The test error de- creases as we add model capacity but does not increase as predicted by the bias-variance trade-off curve; it keeps decreasing. 127 | 128 | In figure 8.10b, we repeat this experiment, but this time, we randomize 15% of the training labels. Once more, the training error decreases to zero. This time, there is more randomness, and the model requires almost as many parameters as there are data points to memorize the data. The test error does show the typical bias-variance trade-off as we increase the capacity to the point where the model fits the training data exactly. However, then it does something unexpected; it starts to decrease again. Indeed, if we add enough capacity, the test loss reduces to below the minimal level that we achieved in the first part of the curve. 129 | 130 | This phenomenon is known as double descent. For some datasets like MNIST, it is present with the original data (figure 8.10c). For others, like MNIST-1D and CIFAR-100 (figure 8.10d), it emerges or becomes more prominent when we add noise to the labels. The first part of the curve is referred to as the classical or under-parameterized regime, and the second part as the modern or over-parameterized regime. The central part where the error increases is termed the critical regime. 131 | 132 | ### 8.4.1 Explanation 133 | 134 | The discovery of double descent is recent, unexpected, and somewhat puzzling. It results from an interaction of two phenomena. First, the test performance becomes temporarily worse when the model has just enough capacity to memorize the data. Second, the test performance continues to improve with capacity even after the training performance is perfect. The first phenomenon is exactly as predicted by the bias-variance trade-off. The second phenomenon is more confusing; it’s unclear why performance should be better in the over-parameterized regime, given that there are now not even enough training data points to constrain the model parameters uniquely. 135 | 136 | To understand why performance continues to improve as we add more parameters, note that once the model has enough capacity to drive the training loss to near zero, the model fits the training data almost perfectly. This implies that further capacity cannot help the model fit the training data any better; any change must occur between the training points. The tendency of a model to prioritize one solution over another as it extrapolates between data points is known as its inductive bias. 137 | 138 | The model’s behavior between data points is critical because, in high-dimensional space, the training data are extremely sparse. The MNIST-1D dataset has 40 dimensions, and we trained with 10,000 examples. If this seems like plenty of data, consider what would happen if we quantized each input dimension into 10 bins. There would be 1040 bins in total, constrained by only 105 examples. Even with this coarse quantization, there will only be one data point in every 1035 bins! The tendency of the volume of high-dimensional space to overwhelm the number of training points is termed the curse of dimensionality. 139 | 140 | The implication is that problems in high dimensions might look more like figure 8.11a; there are small regions of the input space where we observe data with significant gaps between them. The putative explanation for double descent is that as we add capacity to the model, it interpolates between the nearest data points increasingly smoothly. In the absence of information about what happens between the training points, assuming smoothness is sensible and will probably generalize reasonably to new data. 141 | 142 | This argument is plausible. It’s certainly true that as we add more capacity to the model, it will have the capability to create smoother functions. Figures 8.11b–f show the smoothest possible functions that still pass through the data points as we increase the number of hidden units. When the number of parameters is very close to the number of training data examples (figure 8.11b), the model is forced to contort itself to fit the training data exactly, resulting in erratic predictions. This explains why the peak in the double descent curve is so pronounced. As we add more hidden units, the model has the ability to construct smoother functions that are likely to generalize better to new data. 143 | 144 | However, this does not explain why over-parameterized models should produce smooth functions. Figure 8.12 shows three functions that can be created by the simplified model with 50 hidden units. In each case, the model fits the data exactly, so the loss is zero. If the modern regime of double descent is explained by increasing smoothness, then what exactly is encouraging this smoothness? 145 | 146 | ## 8.5 Choosing hyperparameters 147 | 148 | In the previous section, we discussed how test performance changes with model capac- ity. Unfortunately, in the classical regime, we don’t have access to either the bias (which requires knowledge of the true underlying function) or the variance (which requires mul- tiple independently sampled datasets to estimate). In the modern regime, there is no way to tell how much capacity should be added before the test error stops improving. This raises the question of exactly how we should choose model capacity in practice. 149 | 150 | For a deep network, the model capacity depends on the numbers of hidden layers and hidden units per layer as well as other aspects of architecture that we have yet to introduce. Furthermore, the choice of learning algorithm and any associated parameters (learning rate, etc.) also affects the test performance. These elements are collectively termed hyperparameters. The process of finding the best hyperparameters is termed hyperparameter search or (when focused on network structure) neural architecture search. 151 | 152 | Hyperparameters are typically chosen empirically; we train many models with differ- ent hyperparameters on the same training set, measure their performance, and retain the best model. However, we do not measure their performance on the test set; this would admit the possibility that these hyperparameters just happen to work well for the test set but don’t generalize to further data. Instead, we introduce a third dataset known as a validation set. For every choice of hyperparameters, we train the associated model using the training set and evaluate performance on the validation set. Finally, we select the model that worked best on the validation set and measure its performance on the test set. In principle, this should give a reasonable estimate of the true performance. 153 | 154 | The hyperparameter space is generally smaller than the parameter space but still too large to try every combination exhaustively. Unfortunately, many hyperparameters are discrete (e.g., the number of hidden layers), and others may be conditional on one another (e.g., we only need to specify the number of hidden units in the tenth hidden layer if there are ten or more layers). Hence, we cannot rely on gradient descent methods as we did for learning the model parameters. Hyperparameter optimization algorithms intelligently sample the space of hyperparameters, contingent on previous results. This procedure is computationally expensive since we must train an entire model and measure the validation performance for each combination of hyperparameters. 155 | 156 | ## 8.6 Summary 157 | 158 | To measure performance, we use a separate test set. The degree to which performance is maintained on this test set is known as generalization. Test errors can be explained by three factors: noise, bias, and variance. These combine additively in regression problems with least squares losses. Adding training data decreases the variance. When the model capacity is less than the number of training examples, increasing the capacity decreases bias but increases variance. This is known as the bias-variance trade-off, and there is a capacity where the trade-off is optimal. 159 | 160 | However, this is balanced against a tendency for performance to improve with ca- pacity, even when the parameters exceed the training examples. Together, these two phenomena create the double descent curve. It is thought that the model interpolates more smoothly between the training data points in the over-parameterized “modern regime,” although it is unclear what drives this. To choose the capacity and other model and training algorithm hyperparameters, we fit multiple models and evaluate their per- formance using a separate validation set. 161 | 162 | ## Notes 163 | 164 | Bias-variance trade-off: We showed that the test error for regression problems with least squares loss decomposes into the sum of noise, bias, and variance terms. These factors are all present for models with other losses, but their interaction is typically more complicated (Friedman, 1997; Domingos, 2000). For classification problems, there are some counter-intuitive predictions; for example, if the model is biased toward selecting the wrong class in a region of the input space, then increasing the variance can improve the classification rate as this pushes some of the predictions over the threshold to be classified correctly. 165 | 166 | Cross-validation: We saw that it is typical to divide the data into three parts: training data (which is used to learn the model parameters), validation data (which is used to choose the hyperparameters), and test data (which is used to estimate the final performance). This approach is known as cross-validation. However, this division may cause problems where the total number of data examples is limited; if the number of training examples is comparable to the model capacity, then the variance will be large. 167 | 168 | One way to mitigate this problem is to use k-fold cross-validation. The training and validation data are partitioned into K disjoint subsets. For example, we might divide these data into five parts. We train with four and validate with the fifth for each of the five permutations and choose the hyperparameters based on the average validation performance. The final test performance is assessed using the average of the predictions from the five models with the best hyperparameters on an entirely different test set. There are many variations of this idea, but all share the general goal of using a larger proportion of the data to train the model, thereby reducing variance. 169 | 170 | Capacity: We have used the term capacity informally to mean the number of parameters or hidden units in the model (and hence indirectly, the ability of the model to fit functions of increasing complexity). The representational capacity of a model describes the space of possible functions it can construct when we consider all possible parameter values. When we take into account the fact that an optimization algorithm may not be able to reach all of these solutions, what is left is the effective capacity. 171 | 172 | The Vapnik-Chervonenkis (VC) dimension (Vapnik & Chervonenkis, 1971) is a more formal measure of capacity. It is the largest number of training examples that a binary classifier can label arbitrarily. Bartlett et al. (2019) derive upper and lower bounds for the VC dimension in terms of the number of layers and weights. An alternative measure of capacity is the Rademacher complexity, which is the expected empirical performance of a classification model (with optimal parameters) for data with random labels. Neyshabur et al. (2017) derive a lower bound on the generalization error in terms of the Rademacher complexity. 173 | 174 | Double descent: The term “double descent” was coined by Belkin et al. (2019), who demon- strated that the test error decreases again in the over-parameterized regime for two-layer neural networks and random features. They also claimed that this occurs in decision trees, although Buschjäger & Morik (2021) subsequently provided evidence to the contrary. Nakkiran et al. (2021) show that double descent occurs for various modern datasets (CIFAR-10, CIFAR-100, IWSLT’14 de-en), architectures (CNNs, ResNets, transformers), and optimizers (SGD, Adam). The phenomenon is more pronounced when noise is added to the target labels (Nakkiran et al., 2021) and when some regularization techniques are used (Ishida et al., 2020). 175 | 176 | Nakkiran et al. (2021) also provide empirical evidence that test performance depends on effective model capacity (the largest number of samples for which a given model and training method can achieve zero training error). At this point, the model starts to devote its efforts to interpolating smoothly. As such, the test performance depends not just on the model but also on the training algorithm and length of training. They observe the same pattern when they study a model with fixed capacity and increase the number of training iterations. They term this epoch-wise double descent. This phenomenon has been modeled by Pezeshki et al. (2022) in terms of different features in the model being learned at different speeds. 177 | 178 | Double descent makes the rather strange prediction that adding training data can sometimes worsen test performance. Consider an over-parameterized model in the second descending part of the curve. If we increase the training data to match the model capacity, we will now be in the critical region of the new test error curve, and the test loss may increase. 179 | 180 | Bubeck & Sellke (2021) prove that overparameterization is necessary to interpolate data smoothly in high dimensions. They demonstrate a trade-off between the number of parameters and the Lipschitz constant of a model (the fastest the output can change for a small input change). A review of the theory of over-parameterized machine learning can be found in Dar et al. (2021). 181 | 182 | Curse of dimensionality: As dimensionality increases, the volume of space grows so fast that the amount of data needed to densely sample it increases exponentially. This phenomenon is known as the curse of dimensionality. High-dimensional space has many unexpected properties, and caution should be used when trying to reason about it based on low-dimensional exam- ples. This book visualizes many aspects of deep learning in one or two dimensions, but these visualizations should be treated with healthy skepticism. 183 | 184 | Surprising properties of high-dimensional spaces include: (i) Two randomly sampled data points from a standard normal distribution are very close to orthogonal to one another (relative to the origin) with high likelihood. (ii) The distance from the origin of samples from a standard normal distribution is roughly constant. (iii) Most of a volume of a high-dimensional sphere (hypersphere) is adjacent to its surface (a common metaphor is that most of the volume of a high- dimensional orange is in the peel, not in the pulp). (iv) If we place a unit-diameter hypersphere inside a hypercube with unit-length sides, then the hypersphere takes up a decreasing proportion of the volume of the cube as the dimension increases. Since the volume of the cube is fixed at size one, this implies that the volume of a high-dimensional hypersphere becomes close to zero. (v) For random points drawn from a uniform distribution in a high-dimensional hypercube, the ratio of the Euclidean distance between the nearest and furthest points becomes close to one. For further information, consult Beyer et al. (1999) and Aggarwal et al. (2001). 185 | 186 | Real-world performance: In this chapter, we argued that model performance could be evalu- ated using a held-out test set. However, the result won’t be indicative of real-world performance if the statistics of the test set don’t match those of real-world data. Moreover, the statistics of real-world data may change over time, causing the model to become increasingly stale and performance to decrease. This is known as data drift and means that deployed models must be carefully monitored. 187 | 188 | There are three main reasons why real-world performance may be worse than the test perfor- mance implies. First, the statistics of the input data x may change; we may now be observing parts of the function that were sparsely sampled or not sampled at all during training. This is known as covariate shift. Second, the statistics of the output data y may change; if some output values are infrequent during training, then the model may learn not to predict these in ambiguous situations and will make mistakes if they are more common in the real world. This is known as prior shift. Third, the relationship between input and output may change. This is known as concept shift. These issues are discussed in Moreno-Torres et al. (2012). 189 | 190 | Hyperparameter search: Finding the best hyperparameters is a challenging optimization task. Testing a single configuration of hyperparameters is expensive; we must train an entire model and measure its performance. We have no easy way to access the derivatives (i.e., how performance changes when we make a small change to a hyperparameter). Moreover, many of the hyperparameters are discrete, so we cannot use gradient descent methods. There are multiple local minima and no way to tell if we are close to the global minimum. The noise level is high since each training/validation cycle uses a stochastic training algorithm; we expect different results if we train a model twice with the same hyperparameters. Finally, some variables are conditional and only exist if others are set. For example, the number of hidden units in the third hidden layer is only relevant if we have at least three hidden layers. 191 | 192 | A simple approach is to sample the space randomly (Bergstra & Bengio, 2012). However, for continuous variables, it is better to build a model of performance as a function of the hyperparameters and the uncertainty in this function. This can be exploited to test where the uncertainty is great (explore the space) or home in on regions where performance looks promising (exploit previous knowledge). Bayesian optimization is a framework based on Gaussian processes that does just this, and its application to hyperparameter search is described in Snoek et al. (2012). The Beta-Bernoulli bandit (see Lattimore & Szepesvári, 2020) is a roughly equivalent model for describing uncertainty in results due to discrete variables. 193 | 194 | The sequential model-based configuration (SMAC) algorithm (Hutter et al., 2011) can cope with continuous, discrete, and conditional parameters. The basic approach is to use a random forest to model the objective function where the mean of the tree predictions is the best guess about the objective function, and their variance represents the uncertainty. A completely different approach that can also cope with combinations of continuous, discrete, and conditional param- eters is Tree-Parzen Estimators (Bergstra et al., 2011). The previous methods modeled the probability of the model performance given the hyperparameters. In contrast, the Tree-Parzen estimator models the probability of the hyperparameters given the model performance. 195 | 196 | Hyperband (Li et al., 2017b) is a multi-armed bandit strategy for hyperparameter optimization. It assumes that there are computationally cheap but approximate ways to measure performance (e.g., by not training to completion) and that these can be associated with a budget (e.g., by training for a fixed number of iterations). A number of random configurations are sampled and run until the budget is used up. Then the best fraction η of runs is kept, and the budget is multiplied by 1/η. This is repeated until the maximum budget is reached. This approach has the advantage of efficiency; for bad configurations, it does not need to run the experiment to the end. However, each sample is just chosen randomly, which is inefficient. The BOHB algorithm (Falkner et al., 2018) combines the efficiency of Hyperband with the more sensible choice of hyperparameters from Tree Parzen estimators to construct an even better method. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # UnderstandingDeepLearning-ZH-CN 2 | Understanding DeepLearning 中文翻译 3 | 4 | 原版来自: https://udlbook.github.io/udlbook/ 5 | by Simon J.D. Prince 6 | Published by MIT Press Dec 5th 2023. 7 | 8 | 本仓库暂时基于2023-12-23版本的原书进行翻译,只翻译正文部分,不包括前言和附录。使用ChatGPT进行机翻并进行人工审核,如有翻译错误还请指正。后续原书若有修改,本仓库不一定会及时更新,还请各位以原版内容为准,也欢迎大家提交PR一起优化翻译。 9 | 10 | 本书正文一共21章,涵盖了深度学习领域的许多关键概念,无论是初学者还是已经有工作经验的开发者都有极高的阅读价值。 11 | ## 目录 12 | - [x] Chapter 1 - Introduction 介绍 13 | - [x] Chapter 2 - Supervised learning 监督学习 14 | - [x] Chapter 3 - Shallow neural networks 浅层神经网络 15 | - [x] Chapter 4 - Deep neural networks 深度神经网络 16 | - [x] Chapter 5 - Loss functions 损失函数 17 | - [x] Chapter 6 - Fitting models 训练模型 18 | - [x] Chapter 7 - Gradients and initialization 梯度和初始化 19 | - [ ] Chapter 8 - Measuring performance 性能评估 20 | - [ ] Chapter 9 - Regularization 正则化 21 | - [ ] Chapter 10 - Convolutional networks 卷积网络 22 | - [ ] Chapter 11 - Residual networks 残差网络 23 | - [ ] Chapter 12 - Transformers 变形金刚😄 24 | - [ ] Chapter 13 - Graph neural networks 图神经网络 25 | - [ ] Chapter 14 - Unsupervised learning 无监督学习 26 | - [ ] Chapter 15 - Generative adversarial networks 生成对抗网络 27 | - [ ] Chapter 16 - Normalizing flows 标准化流 28 | - [ ] Chapter 17 - Variational autoencoders 变分自编码器 29 | - [ ] Chapter 18 - Diffusion models 扩散模型 30 | - [ ] Chapter 19 - Deep reinforcement learning 深度强化学习 31 | - [ ] Chapter 20 - Why does deep learning work? 为什么深度学习有效? 32 | - [ ] Chapter 21 - Deep learning and ethics 深度学习与伦理 -------------------------------------------------------------------------------- /figures/chapter3/ShallowReLU.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 20 | 45 | 47 | 50 | 54 | 59 | 60 | 64 | 69 | 70 | 74 | 79 | 80 | 81 | 82 | 84 | 85 | 87 | image/svg+xml 88 | 90 | 91 | 92 | 93 | 94 | 99 | 148 | 153 | 158 | 162 | 168 | 174 | 180 | 186 | 192 | 198 | 204 | 210 | 216 | 222 | 228 | 229 | 235 | 241 | 247 | 253 | 259 | 265 | 271 | 277 | 283 | 289 | 295 | 301 | 314 | 317 | 320 | 325 | 326 | 329 | 334 | 339 | 340 | 343 | 348 | 349 | 352 | 357 | 358 | 361 | 366 | 367 | 370 | 375 | 376 | 377 | 378 | 391 | 394 | 397 | 402 | 403 | 404 | 405 | 413 | 427 | 429 | 432 | 436 | 441 | 442 | 446 | 451 | 452 | 456 | 461 | 462 | 463 | 464 | 468 | 471 | 475 | 480 | 481 | 485 | 490 | 491 | 495 | 500 | 501 | 502 | 503 | 504 | 518 | 520 | 523 | 527 | 532 | 533 | 537 | 542 | 543 | 547 | 552 | 553 | 554 | 555 | 559 | 562 | 566 | 571 | 572 | 576 | 581 | 582 | 586 | 591 | 592 | 593 | 594 | 595 | 608 | 611 | 614 | 620 | 626 | 632 | 633 | 634 | 635 | 648 | 651 | 654 | 660 | 666 | 672 | 678 | 679 | 680 | 681 | 694 | 697 | 700 | 706 | 712 | 718 | 724 | 725 | 726 | 727 | 740 | 743 | 746 | 752 | 758 | 764 | 765 | 766 | 767 | 768 | 769 | -------------------------------------------------------------------------------- /figures/chapter7/code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/guowenfei-mathsfan/UnderstandingDeepLearning-ZH-CN/53f8dbebe5974407c6c3766fff05b2979cf13467/figures/chapter7/code.png --------------------------------------------------------------------------------