Skip to content

第4章 深度神经网络

上一章介绍了只有单个隐藏层的浅层神经网络。本章介绍具有多个隐藏层的深度神经网络。使用 ReLU 激活函数时,浅层和深度网络都描述了从输入到输出的分段线性映射。

随着隐藏单元数量的增加,浅层神经网络的描述能力提高。事实上,只要有足够多的隐藏单元,浅层网络可以描述高维空间中任意复杂的函数。然而,对于某些函数,所需的隐藏单元数量大到不切实际。在给定参数数量下,深度网络比浅层网络能产生多得多的线性区域。因此,从实用的角度看,深度网络可以描述更广泛的函数族。

4.1 组合神经网络

为了深入理解深度神经网络的行为,我们首先考虑将两个浅层网络组合起来,使第一个网络的输出成为第二个网络的输入。考虑两个各有三个隐藏单元的浅层网络(图 4.1a)。第一个网络接收输入 x 并返回输出 y,定义为:

(4.1)h1=a[θ10+θ11x],h2=a[θ20+θ21x],h3=a[θ30+θ31x],

以及

(4.2)y=ϕ0+ϕ1h1+ϕ2h2+ϕ3h3.

第二个网络以 y 为输入并返回 y,定义为:

(4.3)h1=a[θ10+θ11y],h2=a[θ20+θ21y],h3=a[θ30+θ31y],

以及

(4.4)y=ϕ0+ϕ1h1+ϕ2h2+ϕ3h3.

使用 ReLU 激活时,这个组合模型同样描述了一族分段线性函数。然而,线性区域的数量可能远多于具有六个隐藏单元的浅层网络。要理解这一点,考虑选择第一个网络使其产生三个正负斜率交替的线性区域(图 4.1b)。这意味着三段不同范围的 x 被映射到相同的输出范围 y[1,1],而第二个网络从该范围到 y 的后续映射被应用了三次。总体效果是第二个网络定义的函数被复制了三次,产生了九个线性区域。在更高维度中同样原理成立(图 4.2)。

另一种理解方式是:第一个网络将输入空间 x "折叠"到自身上,使得多个输入产生相同的输出。然后第二个网络在折叠后的空间上应用函数,该函数在所有折叠重合的点上被复制(图 4.3)。

图 4.2

图 4.2 具有二维输入的组合神经网络。a) 第一个网络有三个隐藏单元,接收两个输入 x1x2 并返回标量输出 y,传入第二个具有两个隐藏单元的网络产生 y。b) 第一个网络产生由七个线性区域组成的函数。c) 第二个网络定义 y[1,1] 上具有两个线性区域的函数。d) 组合后,第一个网络的六个非平坦区域各被分为两个新区域,共产生 13 个线性区域。

图 4.3

图 4.3 深度网络与输入空间折叠。a) 第一个网络将输入空间"折叠"到自身上。b) 第二个网络在折叠后的空间上应用函数。c) "展开"后得到最终输出。

图 4.1

图 4.1 组合两个各有三个隐藏单元的单层网络。a) 第一个网络的输出 y 成为第二个网络的输入。b) 第一个网络将 x[1,1] 映射为具有三个正负交替斜率的线性区域的函数。三段不同的 x 被映射到相同的输出 y(灰色圆圈映射到青色圆圈)。c) 第二个网络定义一个具有三个线性区域的函数。d) 组合效果是第二个网络的函数被复制了三次,产生九个线性区域。

4.2 从组合网络到深度网络

上一节说明了通过将一个浅层网络的输出传入另一个可以创建复杂函数。我们现在证明这是具有两个隐藏层的深度网络的一种特殊情况。

第一个网络的输出(y=ϕ0+ϕ1h1+ϕ2h2+ϕ3h3)是隐藏单元激活值的线性组合。第二个网络的第一步操作(方程 4.3 中计算 θ10+θ11yθ20+θ21yθ30+θ31y)是 y 的线性函数。将一个线性函数应用到另一个线性函数上仍然得到线性函数。将 y 的表达式代入方程 4.3 得到:

h1=a[ψ10+ψ11h1+ψ12h2+ψ13h3]h2=a[ψ20+ψ21h1+ψ22h2+ψ23h3](4.6)h3=a[ψ30+ψ31h1+ψ32h2+ψ33h3],

其中 ψ10=θ10+θ11ϕ0ψ11=θ11ϕ1ψ12=θ11ϕ2,依此类推。结果就是一个具有两个隐藏层的网络(图 4.4)。

由此可知,具有两个隐藏层的网络可以表示通过将一个单层网络的输出传入另一个而创建的函数族。事实上,它表示一个更广泛的函数族,因为在方程 4.6 中,九个斜率参数 ψ11,ψ21,,ψ33 可以取任意值,而在组合形式中这些参数被约束为外积 [θ11,θ21,θ31]T[ϕ1,ϕ2,ϕ3]

4.3 深度神经网络

上一节说明组合两个浅层网络产生具有两个隐藏层的深度网络。现在考虑一般情况:具有两个隐藏层、每层三个隐藏单元的深度网络(图 4.4)。第一层定义为:

(4.7)h1=a[θ10+θ11x],h2=a[θ20+θ21x],h3=a[θ30+θ31x],

第二层为:

h1=a[ψ10+ψ11h1+ψ12h2+ψ13h3]h2=a[ψ20+ψ21h1+ψ22h2+ψ23h3](4.8)h3=a[ψ30+ψ31h1+ψ32h2+ψ33h3],

输出为:

(4.9)y=ϕ0+ϕ1h1+ϕ2h2+ϕ3h3.

分析这些方程可以从另一个角度理解网络如何构造越来越复杂的函数(图 4.5):

  1. 第一层的三个隐藏单元 h1,h2,h3 按照通常方式计算——对输入做线性函数然后通过 ReLU 激活函数(方程 4.7)。
  2. 第二层的预激活值通过对这些隐藏单元取三个新的线性函数来计算(方程 4.8 的参数部分)。此时,我们实际上得到了一个具有三个输出的浅层网络;我们有三个分段线性函数,它们的线性区域之间的"折点"在相同位置(见图 3.6)。
  3. 在第二隐藏层,另一个 ReLU 函数 a[] 被应用到每个函数上,截断它们并在每个函数中增加新的"折点"。
  4. 最终输出是这些隐藏单元的线性组合(方程 4.9)。

总之,我们可以将每一层理解为"折叠"输入空间,或者理解为截断函数(创建新的区域)然后重新组合。无论哪种描述都只提供了部分洞见。重要的是不要忘记,这仍然只是一个将输入 x 关联到输出 y 的方程。

图 4.4

图 4.4 具有一个输入、一个输出和两个隐藏层(每层三个隐藏单元)的神经网络。

图 4.5

图 4.5 图 4.4 中深度网络的计算过程。a–c) 第二隐藏层的输入(即预激活值)是三个分段线性函数,其线性区域间的"折点"在相同位置(见图 3.6)。d–f) 每个分段线性函数被 ReLU 激活函数截断。g–i) 截断后的函数分别乘以权重 ϕ1,ϕ2,ϕ3。j) 加权截断函数相加,加上控制整体高度的偏移 ϕ0

4.3.1 超参数

我们可以将深度网络构造扩展到两个以上的隐藏层;现代网络可能有一百多层,每层有数千个隐藏单元。每层中隐藏单元的数量称为网络的宽度(width),隐藏层的数量称为深度(depth)。隐藏单元的总数是网络容量(capacity)的度量。

我们将层数记为 K,每层的隐藏单元数记为 D1,D2,,DK。这些都是超参数(hyperparameters)的例子——在学习模型参数(即斜率和截距项)之前选择的量。对于固定的超参数(例如 K=2 层,每层 Dk=3 个隐藏单元),模型描述一族函数,参数决定特定的函数。因此,当我们也考虑超参数时,可以把神经网络看作表示一族函数族。

4.4 矩阵表示

我们已经看到深度神经网络由线性变换与激活函数交替组成。我们可以用矩阵符号等价地描述方程 4.7–4.9:

(4.11)[h1h2h3]=a[[θ10θ20θ30]+[θ11θ21θ31]x],(4.12)[h1h2h3]=a[[ψ10ψ20ψ30]+[ψ11ψ12ψ13ψ21ψ22ψ23ψ31ψ32ψ33][h1h2h3]],

以及

(4.13)y=ϕ0+[ϕ1ϕ2ϕ3][h1h2h3],

或更紧凑地:

(4.14)h=a[θ0+θx],h=a[ψ0+Ψh],y=ϕ0+ϕh,

其中函数 a[] 对向量输入的每个元素分别应用激活函数。

4.4.1 一般公式

上述符号对于层数很多的网络变得繁琐。因此,从现在起我们将第 k 层的隐藏单元向量记为 hk,贡献到第 k+1 层的偏置向量(截距)记为 βk,应用于第 k 层并贡献到第 (k+1) 层的权重(斜率)记为 Ωk。具有 K 层的一般深度网络 y=f[x,ϕ] 可写为:

h1=a[β0+Ω0x]h2=a[β1+Ω1h1]h3=a[β2+Ω2h2]hK=a[βK1+ΩK1hK1](4.15)y=βK+ΩKhK.

模型参数 ϕ 包含所有这些权重矩阵和偏置向量 ϕ={βk,Ωk}k=0K。如果第 k 层有 Dk 个隐藏单元,则偏置向量 βk1 大小为 Dk。第一个权重矩阵 Ω0 大小为 D1×DiDi 是输入维度)。最后一个权重矩阵 ΩK 大小为 Do×DKDo 是输出维度)。其余矩阵 Ωk 大小为 Dk+1×Dk(图 4.6)。

我们也可以将网络等价地写为单个函数:

(4.16)y=βK+ΩKa[βK1+ΩK1a[β2+Ω2a[β1+Ω1a[β0+Ω0x]]]].

图 4.6

图 4.6 矩阵符号表示。具有 Di=3 维输入 xDo=2 维输出 yK=3 个隐藏层 h1,h2,h3(维度分别为 D1=4,D2=2,D3=3)的网络。权重存储在矩阵 Ωk 中,偏置存储在向量 βk 中。

4.5 浅层网络与深度网络的比较

第 3 章讨论了浅层网络(单个隐藏层),本章描述了深度网络(多个隐藏层)。现在我们来比较这两种模型。

4.5.1 逼近不同函数的能力

在 3.2 节中,我们论证了只要容量(隐藏单元)足够,浅层神经网络可以以任意精度建模任何连续函数。在本章中,我们看到具有两个隐藏层的深度网络可以表示两个浅层网络的组合。如果第二个网络计算恒等函数,则该深度网络就等同于一个浅层网络。因此,只要容量足够,深度网络同样可以以任意精度逼近任何连续函数。

4.5.2 每参数的线性区域数

具有一个输入、一个输出和 D>2 个隐藏单元的浅层网络最多可创建 D+1 个线性区域,由 3D+1 个参数定义。具有一个输入、一个输出、K 层(每层 D>2 个隐藏单元)的深度网络则可创建多达 (D+1)K 个线性区域,使用 3D+1+(K1)D(D+1) 个参数。

图 4.7a 展示了对于标量输入到标量输出的网络,最大线性区域数如何随参数数量增长。在固定参数预算下,深度网络比浅层网络能创建多得多的线性区域。输入维度 Di 增加时(图 4.7b),这一效应更加显著。

图 4.7

图 4.7 每参数的线性区域数。a) 对于标量输入到标量输出的网络,最大线性区域数随参数数量的增长关系。深度网络(多层)比浅层网络(单层)能用相同数量的参数创建更多线性区域。b) 输入维度 Di 增加时,深度网络的优势更加显著。

这看起来很有吸引力,但函数的灵活性仍受参数数量限制。深度网络可以创建极大量的线性区域,但这些区域包含复杂的依赖关系和对称性。正如我们在"折叠"输入空间时看到的(图 4.3),更多区域是否真的有优势并不明确——除非 (i) 我们要逼近的真实世界函数中存在类似的对称性,或 (ii) 我们有理由相信从输入到输出的映射确实涉及更简单函数的组合。

4.5.3 深度效率

深度和浅层网络都能建模任意函数,但某些函数用深度网络可以更高效地逼近。研究发现存在这样的函数:浅层网络需要指数级更多的隐藏单元才能达到与深度网络相同的逼近效果。这种现象被称为神经网络的深度效率(depth efficiency)。这一性质同样很有吸引力,但目前尚不清楚我们想要逼近的真实世界函数是否属于这一类别。

4.5.4 大规模结构化输入

我们讨了全连接网络,其中每一层的每个元素都连接到下一层的每个元素。然而,对于大规模结构化输入(如图像,可能包含约 106 个像素),这种方式并不实用。参数数量将令人望而却步,而且我们希望图像的不同部分以类似方式处理;没有必要独立地学习在图像的每个可能位置识别同一物体。

解决方案是并行处理局部图像区域,然后逐步整合越来越大区域的信息。这种从局部到全局的处理方式在没有多层的情况下很难实现(见第 10 章)。

4.5.5 训练与泛化

深度网络相对于浅层网络的另一个可能优势是其易于拟合;训练中等深度的网络通常比训练浅层网络更容易(见图 20.2)。这可能是因为过参数化的深度模型(即参数多于训练样本的模型)拥有大量近似等价的、容易找到的解。但随着隐藏层数增加,训练又变得更加困难。已有许多方法来缓解这一问题(见第 11 章)。

深度神经网络似乎也比浅层网络更好地泛化到新数据。实践中,大多数任务的最佳结果都是用具有数十甚至数百层的网络实现的。这些现象都尚未被充分理解,我们将在第 20 章回到这些问题。

4.6 总结

本章首先考察了组合两个浅层网络会发生什么。我们论证了第一个网络"折叠"输入空间,然后第二个网络应用分段线性函数。第二个网络的效果在输入空间折叠重合的地方被复制。

然后我们证明了浅层网络的组合是具有两个隐藏层的深度网络的一种特殊情况。我们将每层的 ReLU 函数解释为在多处截断输入函数并在输出函数中创建更多"折点"。我们引入了超参数的概念——对于目前讨论的网络,包括层数和每层的隐藏单元数。

最后,我们比较了浅层和深度网络。我们发现:(i) 在容量足够的情况下,两者都能逼近任何函数;(ii) 深度网络每参数产生更多线性区域;(iii) 某些函数可以用深度网络更高效地逼近;(iv) 图像等大规模结构化输入最适合多阶段处理;(v) 实践中大多数任务的最佳结果都使用多层深度网络获得。

现在我们理解了深度和浅层网络模型,接下来将关注如何训练它们。下一章讨论损失函数。对于任意给定的参数值 ϕ,损失函数返回一个标量,表示模型输出与训练数据集真实值之间的不匹配程度。在第 6 章和第 7 章中,我们处理训练过程本身——即寻找使损失最小化的参数值。

基于 CC-BY-NC-ND 许可协议