前面一章我们讨论了只有一个隐藏层的浅层神经网络。本章,我们将转向深度神经网络,这种网络拥有多个隐藏层。无论是浅层还是深层网络,当使用 ReLU (Rectified Linear Unit) 激活函数时,它们都能实现从输入到输出的分段直线式的变换。
浅层神经网络的能力随着隐藏单元数量的增加而提升。实际上,如果隐藏单元足够多,这些网络甚至能够模拟高维空间中极其复杂的函数。但是,对于某些特定的函数,所需的隐藏单元数量可能非常庞大,以至于实际应用变得不现实。相比之下,深度神经网络能够在相同数量的参数条件下创造出更多的线性判断区域。因此,从实际应用的角度来看,深度网络能够描述更加广泛的函数类型。
为了更深入地理解深度神经网络的行为特征,我们首先考虑将两个浅层网络进行组合,使得第一个网络的输出成为第二个网络的输入。设想两个各有三个隐藏单元的浅层网络(见图 4.1a)。第一个网络接收输入 x,并产生输出 y,其定义如下: $$ \begin{align} h_1 = a[\theta_{10}+\theta_{11}x] \ h_2 = a[\theta_{20}+\theta_{21}x] \ h_3 = a[\theta_{30}+\theta_{31}x] \end{align} \tag{4.1} $$ 以及 $$ y = \phi_0 + \phi_1h_1 + \phi_2h_2 + \phi_3h_3 \tag{4.2} $$ 第二个网络以 y 作为输入,产生输出 y′,定义如下: $$ \begin{align} h^\prime_1 = a[\theta^\prime_{10}+\theta^\prime_{11}y] \ h^\prime_2 = a[\theta^\prime_{20}+\theta^\prime_{21}y] \ h^\prime_3 = a[\theta^\prime_{30}+\theta^\prime_{31}y] \end{align} \tag{4.3} $$ 以及 $$ y^\prime = \phi^\prime_0 + \phi^\prime_1h^\prime_1 + \phi^\prime_2h^\prime_2 + \phi^\prime_3h^\prime_3 \tag{4.2} $$ 在使用 ReLU(线性整流单元)激活函数的情况下,该模型描述了一系列分段线性函数。然而,与拥有六个隐藏单元的浅层网络相比,这种组合网络的线性区域数量潜在地更多。例如,若第一个网络产生三个正负斜率交替的区域(见图 4.1b),这意味着三个不同范围的 x 值被映射到同一输出范围 y ∈ [−1, 1]。接下来,从该 y 范围到 y′ 的映射被重复应用三次。最终的效果是,第二个网络定义的函数被复制三次,从而形成九个线性区域。这一原理在更高维度同样适用(见图 4.2)。
组合网络的另一种思考方式是,第一个网络将输入空间 x 折叠回自身,使得多个输入产生相同的输出。随后,第二个网络在所有重叠点上应用同一函数,实现了函数在这些点上的复制(见图 4.3)。
上一节我们展示了通过将一个浅层神经网络的输出传递给另一个网络,可以创建复杂的函数。现在我们将说明,这实际上是一个包含两个隐藏层的深层网络的特例。
第一个网络的输出($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,可以得到:
$$ \begin{align} 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] \ 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] \ 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] \end{align} \tag{4.5} $$
进一步重写为:
$$ \begin{align} h'1 = a[\psi_0 + \psi{11} h_1 + \psi_{12} h_2 + \psi_{13} h_3] \ h'2 = a[\psi_0 + \psi{21} h_1 + \psi_{22} h_2 + \psi_{23} h_3] \ h'3 = a[\psi_0 + \psi{31} h_1 + \psi_{32} h_2 + \psi_{33} h_3], \end{align} \tag{4.6} $$
其中
因此,一个含有两层的网络能够表示那些通过将单层网络的输出传递给另一个网络而创建的函数族。实际上,它能表示一个更广泛的函数族,因为在方程 4.6 中,九个斜率参数
在上一节中,我们展示了将两个浅层网络组合起来可以形成一个有两个隐藏层的特殊深度网络。现在,我们将探讨一个一般情况下的深度网络,它具有两个隐藏层,每层含有三个隐藏单元(见图 4.4)。
第一层由以下公式定义:
接着是第二层:
$$ \begin{align} h'1 = a[\psi{10} + \psi_{11}h_1 + \psi_{12}h_2 + \psi_{13}h_3] \ h'2 = a[\psi{20} + \psi_{21}h_1 + \psi_{22}h_2 + \psi_{23}h_3] \ h'3 = a[\psi{30} + \psi_{31}h_1 + \psi_{32}h_2 + \psi_{33}h_3] \end{align} \tag{4.8} $$
以及输出层:
基于这些方程,我们可以用另一种方式思考网络是如何构建出越来越复杂的函数(见图 4.5):
- 第一层的三个隐藏单元
$h_1,h_2,h_3$ 通过对输入形成线性函数,然后通过 ReLU 激活函数来计算(参见方程 4.7)。 - 第二层的激活前状态是通过对这些隐藏单元形成三个新的线性函数来计算的(参见方程 4.8)。此时,我们实际上构建了一个有三个输出的浅层网络,计算了三个具有相同转折点位置的分段线性函数(参见图 3.6)。
- 在第二隐藏层,我们对每个函数应用另一个 ReLU 函数 a[⋅] (参见方程 4.8),这会对函数进行裁剪并在每个函数中添加新的转折点。
- 最终的输出是这些隐藏单元的线性组合(参见方程 4.9)。
总的来说,我们可以从两个角度来理解每一层的作用:一是将输入空间进行“折叠”处理,二是创造新的函数,这些函数经过剪切(形成新的区域)后被重新组合。前者强调了输出函数的依赖关系,但没有突出剪切如何创造新的转折点;而后者则侧重于剪切和转折点的产生,但忽视了输出函数中的依赖性。最终,这两种描述都只能提供对深度神经网络运作方式的部分理解。然而,重要的是不要忘记,这些都只是描述输入 x 与输出 y′ 之间关系的方程式。实际上,我们可以将方程式 4.7 到 4.9 结合起来,得到一个更全面的表达式:
$$ \begin{align} 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]] \ &+ \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]] \ &+ \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]] \end{align} \tag{4.10} $$
尽管这个表达式确实有些难以理解,但它提供了对深度神经网络内部操作更加全面的视角。
我们可以将深度网络的结构扩展到不止两个隐藏层;现代的网络可能包含超过一百层,每层拥有数千个隐藏单元。每层隐藏单元的数量称为网络的宽度,而隐藏层的数量则称为网络的深度。隐藏单元的总数量是衡量网络容量的重要指标。
我们用
我们已经了解到深度神经网络是由线性变换和激活函数交替构成的。我们也可以用矩阵表示法来等效地描述方程式 4.7 到 4.9:
以及
或者更简洁地用矩阵表示法表示为:
在每种情况下,函数
对于层数众多的网络,上述的表示方法可能显得过于复杂。因此,我们从现在开始将第
这个模型的参数
如果第
我们也可以将整个网络等效地表示为一个单一函数:
第 3 章讨论了单隐藏层的浅层网络,而本章我们讨论了多隐藏层的深层网络。现在,我们来比较这两种模型。
在第 3.2 节,我们提出了一个观点:具备足够容量(隐藏单元)的浅层神经网络能够极其接近地模拟任何连续函数。本章我们了解到,一个包含两个隐藏层的深层网络能够实现两个浅层网络的功能组合。如果其中一个网络执行恒等函数,那么这个深层网络就等同于一个浅层网络。因此,它也能在拥有足够容量的情况下非常接近地逼近任何连续函数。
一个有一个输入、一个输出和
图 4.7a 展示了对于将标量输入
尽管这听起来很吸引人,但函数的灵活性仍然受到参数数量的限制。深度网络能够创建大量的线性区域,但这些区域中存在着复杂的依赖性和对称性。我们在之前讨论过深层网络如何通过“折叠”输入空间来实现这一点(参见图 4.3)。因此,除非我们希望逼近的现实世界函数中存在相似的对称性,或者我们有理由相信输入到输出的映射真的涉及到简单函数的组合,否则更多的区域数量并不一定是一个优势。
深层和浅层网络都能模拟任意函数,但某些函数使用深层网络进行逼近会更有效率。事实上,已经发现某些函数需要浅层网络有指数级更多的隐藏单元才能与深层网络实现同等水平的逼近。这种现象被称为神经网络的“深度效率”。虽然这听起来很有吸引力,但目前尚不清楚我们想要逼近的真实世界函数是否符合这种特性。
我们讨论了每一层的每个元素都与下一层的每个元素相连的完全连接网络。但这种网络对于像图像这样的大型结构化输入来说并不实际,因为输入可能包含大约 10^6 个像素。参数数量会非常庞大,而且我们希望图像的不同部分以类似的方式进行处理;没有必要在图像的每个可能位置都独立学习识别同一对象。
解决方案是并行处理图像的局部区域,然后逐步整合来自更大区域的信息。这种由局部到全局的处理方式在没有多层结构的情况下很难实现(参见第 10 章)。
深层网络相比于浅层网络的另一个潜在优势是它们更容易训练;通常训练中等深度的网络比浅层网络要容易(参见图 20.2)。这可能是因为过度参数化的深层模型存在许多大致相同且易于找到的解决方案。然而,随着隐藏层的增加,训练又变得更加困难,尽管已经发展了许多缓解这一问题的方法(参见第 11 章)。
深度神经网络在泛化到新数据方面似乎也比浅层网络表现更佳。在实际应用中,大多数任务的最佳结果是通过使用数十甚至数百层的网络实现的。这两种现象都尚未被充分理解,我们将在第 20 章中进一步探讨这些主题。
本章首先探讨了组合两个浅层网络时所发生的情况。我们认为,第一个网络对输入空间进行了“折叠”,随后第二个网络应用了一个分段线性函数。在输入空间被折叠到其自身时,第二个网络的效果得到了复制。
接着,我们证明了这种浅层网络组合实际上是具有两个隐藏层的深层网络的一种特例。我们解释了每一层中的 ReLU 函数如何在多个位置剪切输入函数,并在输出函数中创建更多的“关节”。我们引入了超参数的概念,对于我们目前讨论的网络而言,它包括了隐藏层的数量和每层中隐藏单元的数量。
最后,我们对浅层和深层网络进行了比较。我们发现:(i) 给定足够容量,两种网络都能逼近任何函数;(ii) 相比之下,深层网络每个参数能产生更多的线性区域;(iii) 某些函数可以通过深层网络更有效率地逼近;(iv) 像图像这样的大型结构化输入更适合通过多阶段处理;(v) 实践中,大多数任务使用多层的深层网络能达到最佳效果。
了解了深层和浅层网络模型后,我们接下来将关注它们的训练过程。在下一章,我们将讨论损失函数,它对于任何给定的参数值 φ,提供了一个指标,显示模型输出与训练数据集中的真实预测之间的差异。在第 6 章和第 7 章中,我们将深入训练过程本身,探索如何寻找使损失最小化的参数值。
深度学习:长期以来人们已经理解,通过组合浅层神经网络或发展具有多个隐藏层的网络,可以构建更复杂的函数。事实上,“深度学习”这个术语最早由 Dechter 在 1986 年使用。然而,由于实际问题,人们对此的兴趣有限;无法很好地训练这些网络。深度学习的现代时代是由 Krizhevsky 等人在 2012 年报告的图像分类方面的惊人改进所启动的。这一突破性进展可以说是由四个因素的汇聚造成的:更大的训练数据集、训练时更强大的处理能力、使用 ReLU 激活函数和使用随机梯度下降(见第 6 章)。LeCun 等人在 2015 年提供了现代深度学习早期进展的概览。
线性区域数量:对于使用总共
如果
这个表达式中的第一项对应于网络的前
隐藏单元分配给每个输入维度以创建这些折叠。这个方程中的最后一项(二项式系数之和)是浅层网络可以创建的区域数量,归因于最后一层。更多信息,请参考 Montufar 等人(2014)、Pascanu 等人(2013)和 Montufar(2017)。
通用逼近定理:我们在 4.5.1 节中讨论了一个观点,即如果深度网络的各层包含足够多的隐藏单元,那么宽度版本的通用逼近定理将适用。这意味着存在一种网络结构,它能够在
深度效率:近期研究显示,某些函数可以被深度网络实现,但无法被容量上限呈指数级增长的浅层网络所表达。换言之,浅层网络要准确描述这些函数,需要指数级增加其单元数量。这种现象被称为神经网络的深度效率。
Telgarsky (2016) 指出,对于任意整数
宽度效率:Lu et al. (2017) 探讨了这样一个问题:是否存在宽而浅的网络(即,隐藏单元众多的浅层网络),而这些网络却无法通过深度不显著增加的窄网络来实现。他们发现,确实存在一类宽而浅的网络,只有通过深度为多项式级别的窄网络才能表达。这被称为神经网络的_宽度效率_。相对于深度的指数级下界限制,宽度的多项式级下界限制显得更为宽松,这表明在网络设计中,深度比宽度更为重要。Vardi et al. (2022) 进一步证明,对于带有 ReLU 激活函数的网络,减小宽度的代价仅是网络深度的线性增加。
问题 4.1* 考虑组合图 4.8 中的两个神经网络。请绘制一张图,展示当输入
问题 4.2 请确定图 4.6 中的四个超参数。
问题 4.3 利用 ReLU(修正线性单元)函数的非负同质性质(见问题 3.5),证明以下等式: $$ 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} $$
其中
问题 4.4 编写一个深度神经网络的方程,该网络有
问题 4.5 考虑一个深度神经网络,它有
问题 4.6 考虑一个网络,它有
问题 4.7 为方程 3.1 中的浅层神经网络选择参数
问题 4.8* 图 4.9 展示了一个浅层网络(如图 3.3 所示)中三个隐藏单元的激活情况。隐藏单元的斜率分别为 1.0, 1.0 和 -1.0,隐藏单元的“关节”位置分别在 1/6, 2/6 和 4/6。找出
图 4.9: 针对问题 4.8 的隐藏单元激活情况。a) 第一个隐藏单元在 x = 1/6 的位置形成一个拐点,其激活区域的斜率为正一。b) 第二个隐藏单元在 x = 2/6 的位置形成一个拐点,其激活区域的斜率同样为正一。c) 第三个隐藏单元在 x = 4/6 的位置形成一个拐点,但其激活区域的斜率为负一。
问题 4.9* 继续问题 4.8,使用一个有两个隐藏单元的浅层网络,能否创建一个具有三个线性区域的函数,其输出值在零和一之间来回摆动?使用一个有四个隐藏单元的浅层网络,能否创建一个以同样方式摆动的具有五个线性区域的函数?
问题 4.10 考虑一个深度神经网络,它有一个输入、一个输出,以及
问题 4.11* 考虑两个将标量输入
图 4.1: 结合了各含三个隐藏单元的两个单层网络。a) 第一个网络的输出 y 成为第二个网络的输入。b) 第一个网络通过一个包含三个线性区域的函数,将输入 x(取值范围为 [−1, 1])映射到输出 y(取值范围为 [−1, 1])。这些线性区域的设计目的是让它们的斜率符号交替出现。因此,多个输入 x(以灰色圆圈表示)可以被映射到同一个输出 y(以青色圆圈表示)。c) 第二个网络定义了一个包含三个线性区域的函数,它将输入 y 转换为输出 y′(即将青色圆圈映射到棕色圆圈)。d) 当这两个函数结合后,它们共同作用的结果是:(i) 第一个网络能将三个不同的输入 x 映射到任意一个特定的输出 y,以及 ((ii) 第二个网络以相同的方式处理这些输出;这导致第二个网络在面板 (c) 中定义的函数被重复三次,并根据面板 (b) 中各区域的斜率不同,进行了相应的翻转和缩放处理。
图 4.2: 结合了两个神经网络,输入为二维。a) 第一个网络(源自图 3.8)包含三个隐藏单元,它接收两个输入 x1 和 x2,并输出一个标量 y。这个输出随后被送入一个含有两个隐藏单元的第二网络,生成输出 y′。b) 第一个网络构建的函数包含七个线性区域,其中一个区域保持水平。c) 第二个网络定义了一个在 y ∈ [−1, 1] 范围内包含两个线性区域的函数。d) 当这两个网络结合时,第一个网络中的六个非平坦区域每个都被第二网络划分为两个新的区域,总共形成了 13 个线性区域。
图 4.3: 深层网络用于折叠输入空间。a) 对于图 4.1 中的第一个网络,一种理解方式是它把输入空间折叠,使其叠加在自身之上。b) 第二个网络则在这个已被折叠的空间上施加其功能。c) 最终的输出结果,是在再次展开这些折叠后得到的。
图 4.4: 一个神经网络,它有一个输入、一个输出,并包含两个隐藏层,每层有三个隐藏单元。
图 4.5: 图 4.4 中深层网络的计算过程。a–c) 第二隐藏层接收的输入(即预激活值)是三个分段线性函数,这些函数在相同的位置连接(参见图 3.6)。d–f) ReLU 激活函数将每个分段线性函数的值截断为零。g–i) 接着,这些被截断的函数分别以参数 φ′1、\φ′2 和 φ′3 进行加权处理。j) 最终,这些被截断且加权的函数被相加,并加上一个调节总体高度的偏移 φ′0。
图 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 层包含三个隐藏单元。
图 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 个线性区域。
图 4.8: 针对问题 4.1,展示了两个网络的组合。a) 第一个网络的输出 y 转化为第二个网络的输入。b) 第一个网络在输出值 y ∈ [−1, 1] 的范围内计算该函数。c) 第二个网络则在输入范围 y ∈ [−1, 1] 内计算该函数。