第 4 章 深层神经网络(Deep neural networks)

返回目录

本章一句话:把多个隐藏层“堆叠”起来就得到深层神经网络;用 ReLU 时它和浅层网络一样描述分段线性映射,但在同样的参数预算下,深层网络能切出指数级更多的线性区域,因此能更高效地表达一大类复杂函数。

读这章的收获:理解“组合/堆叠”如何让网络变深、深为何比宽更划算(线性区域随深度指数增长、深度高效性)、隐藏单元/层的矩阵与权重偏置记法,以及深 vs 浅的真实权衡。


本章速览

  • 从浅到深:把一个浅层网络的输出喂给第二个浅层网络(“组合”),就能造出更复杂的函数;而这其实只是两个隐藏层的深层网络的一个特例。
  • 折叠视角:第一层把输入空间“折叠”到自己身上,于是多个不同的输入落到同一个输出上;第二层施加的函数在所有被折叠重叠的地方被复制多份。
  • 裁剪视角:每一层的 ReLU 把分段线性函数在多处“裁剪/夹断”,每次裁剪都新增“拐点(joints)”,从而不断切出新的线性区域。
  • 指数级增长:浅层网络 \(D\) 个隐藏单元最多切 \(D+1\) 个区域;深层网络 \(K\) 层、每层 \(D\) 个单元最多可切到 \((D+1)^K\) 个区域——区域数随深度指数增长
  • 超参数:层数叫深度(depth),每层单元数叫宽度(width),总单元数衡量网络的容量(capacity)。它们在训练前就定下来,是“超参数”。
  • 矩阵记法:把每层写成 \(h_{k+1}=a[\beta_k+\Omega_k h_k]\),权重存进矩阵 \(\Omega_k\)、偏置存进向量 \(\beta_k\),整个网络可写成一层套一层的嵌套函数。
  • 深 vs 浅:两者都能逼近任意函数;但深层网络每个参数能换来更多线性区域、对某些函数有指数级的深度高效性、更适合图像这类大型结构化输入,实践中也更好训练、泛化更好。

4.1 组合神经网络(Composing neural networks)

要理解深层网络的行为,先从最朴素的做法入手:把两个浅层网络首尾相接——第一个网络的输出当作第二个网络的输入。

直觉:设两个浅层网络各有 3 个隐藏单元。第一个网络吃输入 \(x\)、吐输出 \(y\):

\[ h_1 = a[\theta_{10}+\theta_{11}x],\quad h_2 = a[\theta_{20}+\theta_{21}x],\quad h_3 = a[\theta_{30}+\theta_{31}x], \]

\[ y = \phi_0+\phi_1 h_1+\phi_2 h_2+\phi_3 h_3 . \]

第二个网络吃 \(y\)、吐 \(y'\):

\[ h_1' = a[\theta_{10}'+\theta_{11}'y],\quad h_2' = a[\theta_{20}'+\theta_{21}'y],\quad h_3' = a[\theta_{30}'+\theta_{31}'y], \]

\[ y' = \phi_0'+\phi_1' h_1'+\phi_2' h_2'+\phi_3' h_3' . \]

用 ReLU 时,这个组合模型同样描述一族分段线性函数。关键问题是:它能切出多少线性区域?

图像描述(区域如何相乘):想象第一个网络被刻意调成这样——它把输入 \(x\) 映射成一条有三段、坡度正负交替的折线,于是 \(x\) 的三个不同区间都被压到同一段输出范围 \(y\in[-1,1]\) 里(不同的 \(x\) 落到同一个 \(y\))。接着第二个网络把这段 \(y\) 再映射到 \(y'\)。由于这同一段 \(y\) 对应着三个不同的 \(x\) 区间,第二个网络的函数就被复制了三遍(按第一段折线各自的坡度翻转、缩放),最终切出 9 个线性区域——远多于一个有 6 个隐藏单元的浅层网络。高维情形同理。

另一种看法——“折叠”:第一个网络把输入空间“折叠”回它自己身上,让多个输入叠到同一处;然后第二个网络施加它的函数,这个函数在所有被折叠重叠的位置上被同时复制


4.2 从组合网络到深层网络(From composing networks to deep networks)

上一节用“拼接两个网络”造出了复杂函数。现在说明:这只是一个有两个隐藏层的深层网络的特例

推导直觉:第一个网络的输出 \(y=\phi_0+\phi_1 h_1+\phi_2 h_2+\phi_3 h_3\) 是隐藏单元的线性组合;而第二个网络的第一步(算 \(\theta_{j0}'+\theta_{j1}'y\))又是对 \(y\) 的线性运算。线性函数套线性函数还是线性函数——把 \(y\) 代进去,第二层的预激活就变成了直接对 \(h_1,h_2,h_3\) 的线性组合:

\[ 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], \]

其中新参数由旧参数合并而来,例如 \(\psi_{10}=\theta_{10}'+\theta_{11}'\phi_0\)、\(\psi_{11}=\theta_{11}'\phi_1\)、\(\psi_{12}=\theta_{11}'\phi_2\),依此类推。这正是一个两隐藏层的网络。

关键洞察:两层网络不仅能表示“拼接两个浅层网络”得到的所有函数,还能表示更广的一族。原因在于:在新写法里,9 个斜率参数 \(\psi_{11},\psi_{21},\dots,\psi_{33}\) 可以取任意值;而在“拼接”写法里,这些参数被约束成外积 \([\theta_{11}',\theta_{21}',\theta_{31}']^{\mathsf T}[\phi_1,\phi_2,\phi_3]\) 的形式,自由度更小。换句话说,真正的深层网络比简单拼接更灵活


4.3 深层神经网络(Deep neural networks)

现在考虑一般的两隐藏层深层网络:两层、每层 3 个隐藏单元。第一层:

\[ h_1 = a[\theta_{10}+\theta_{11}x],\quad h_2 = a[\theta_{20}+\theta_{21}x],\quad h_3 = a[\theta_{30}+\theta_{31}x], \]

第二层:

\[ 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], \]

输出:

\[ y' = \phi_0'+\phi_1' h_1'+\phi_2' h_2'+\phi_3' h_3' . \]

网络如何一步步造出复杂函数(裁剪视角)

  1. 第一层:照常对输入做三个线性函数,再过 ReLU,得到 \(h_1,h_2,h_3\)。
  2. 算第二层的预激活:对这三个隐藏单元再取三个新的线性组合(即第二层 ReLU 的输入)。此刻相当于一个有三个输出的浅层网络——得到三条分段线性函数,且它们的“拐点位置完全相同”。
  3. 第二层 ReLU:对每条函数再施加一次 ReLU,把它们在零处裁剪/夹断,于是每条都新增了“拐点”。
  4. 输出:把这些隐藏单元做线性组合得到最终输出。

两种视角各有侧重:把每层看成“折叠输入空间”强调了输出函数里的依赖关系,但说不清裁剪如何产生新拐点;把每层看成“裁剪并重组函数”则正相反。两者都只给出部分洞察。但别忘了:这归根结底仍只是一个把输入 \(x\) 映射到输出 \(y'\) 的方程。把三层合起来可写成一个(确实不太好读的)表达式:

\[ y' = \phi_0'+\sum_{j=1}^{3}\phi_j'\, a\!\Big[\psi_{j0}+\sum_{i=1}^{3}\psi_{ji}\,a[\theta_{i0}+\theta_{i1}x]\Big]. \]

4.3.1 超参数(Hyperparameters)

这套构造可推广到更多层——现代网络可能有上百层、每层数千个单元。术语:

  • 宽度(width):每层的隐藏单元数。
  • 深度(depth):隐藏层数。
  • 容量(capacity):隐藏单元总数,衡量网络表达能力。

记层数为 \(K\),各层单元数为 \(D_1,D_2,\dots,D_K\)。这些都是超参数:在学习模型参数(斜率、截距)之前就要选定。给定超参数(如 \(K=2\) 层、每层 \(D_k=3\)),模型描述的是一族函数,具体参数才确定其中某一个。所以连超参数一起看,神经网络代表的是“一族族”输入到输出的关系。


4.4 矩阵记法(Matrix notation)

深层网络说穿了就是线性变换与激活函数交替。把上面的方程用矩阵写出来更紧凑。第一层:

\[ \begin{bmatrix}h_1\\h_2\\h_3\end{bmatrix} = a\!\left[\begin{bmatrix}\theta_{10}\\\theta_{20}\\\theta_{30}\end{bmatrix} +\begin{bmatrix}\theta_{11}\\\theta_{21}\\\theta_{31}\end{bmatrix}x\right], \]

第二层:

\[ \begin{bmatrix}h_1'\\h_2'\\h_3'\end{bmatrix} = a\!\left[\begin{bmatrix}\psi_{10}\\\psi_{20}\\\psi_{30}\end{bmatrix} +\begin{bmatrix}\psi_{11}&\psi_{12}&\psi_{13}\\\psi_{21}&\psi_{22}&\psi_{23}\\\psi_{31}&\psi_{32}&\psi_{33}\end{bmatrix} \begin{bmatrix}h_1\\h_2\\h_3\end{bmatrix}\right], \]

输出:

\[ y' = \phi_0'+\begin{bmatrix}\phi_1'&\phi_2'&\phi_3'\end{bmatrix} \begin{bmatrix}h_1'\\h_2'\\h_3'\end{bmatrix}. \]

更紧凑地:

\[ h = a[\theta_0+\theta x],\qquad h' = a[\psi_0+\Psi h],\qquad y' = \phi_0'+\phi' h', \]

其中 \(a[\cdot]\) 对向量的每个元素分别施加激活函数。

4.4.1 一般形式(General formulation)

层数一多,上面的记号就太啰嗦。约定:第 \(k\) 层的隐藏单元向量记作 \(h_k\);贡献给第 \(k+1\) 层的偏置(截距)向量记作 \(\beta_k\);作用于第 \(k\) 层、贡献给第 \(k+1\) 层的权重(斜率)矩阵记作 \(\Omega_k\)。于是 \(K\) 层深层网络 \(y=f[x,\phi]\) 写成:

\[ \begin{aligned} h_1 &= a[\beta_0+\Omega_0 x],\\ h_2 &= a[\beta_1+\Omega_1 h_1],\\ h_3 &= a[\beta_2+\Omega_2 h_2],\\ &\ \ \vdots\\ h_K &= a[\beta_{K-1}+\Omega_{K-1} h_{K-1}],\\ y &= \beta_K+\Omega_K h_K . \end{aligned} \]

模型参数就是所有权重矩阵与偏置向量:\(\phi=\{\beta_k,\Omega_k\}_{k=0}^{K}\)。

各矩阵/向量的尺寸(设第 \(k\) 层有 \(D_k\) 个单元,输入维度 \(D_i\)、输出维度 \(D_o\)):

  • 偏置 \(\beta_{k-1}\) 的长度是 \(D_k\);最后一个偏置 \(\beta_K\) 长度为输出维度 \(D_o\)。
  • 第一个权重矩阵 \(\Omega_0\) 尺寸为 \(D_1\times D_i\);最后一个 \(\Omega_K\) 为 \(D_o\times D_K\);中间的 \(\Omega_k\) 为 \(D_{k+1}\times D_k\)。

记忆口诀:权重矩阵 \(\Omega_k\) 把“前一层的激活”乘出“后一层的预激活”;偏置向量 \(\beta_k\) 的维度等于它汇入的那一层的单元数。

整个网络也可写成一个一层套一层的嵌套函数:

\[ y = \beta_K+\Omega_K\, a\big[\beta_{K-1}+\Omega_{K-1}\,a[\dots\,\beta_1+\Omega_1\,a[\beta_0+\Omega_0 x]\dots]\big]. \]


4.5 浅层 vs 深层网络(Shallow vs. deep neural networks)

第 3 章讲了浅层(单隐藏层)网络,本章讲了深层(多隐藏层)网络。下面比较两者。

4.5.1 逼近不同函数的能力

第 3 章说过:容量足够大的浅层网络能任意逼近任意连续函数。本章又看到:两隐藏层的深层网络能表示“两个浅层网络的组合”。如果让第二个网络计算恒等函数,深层网络就退化成一个浅层网络。所以容量足够时,深层网络同样能任意逼近任意连续函数。结论:论“能不能逼近”,深浅平手

4.5.2 每个参数能换来多少线性区域

这才是深层网络的优势所在:

  • 浅层(1 输入 1 输出、\(D>2\) 个隐藏单元):最多切 \(D+1\) 个线性区域,用 \(3D+1\) 个参数。
  • 深层(1 输入 1 输出、\(K\) 层、每层 \(D>2\) 个单元):最多切 \((D+1)^K\) 个区域,用 \(3D+1+(K-1)D(D+1)\) 个参数。

也就是说,在固定的参数预算下,深层网络能造出复杂得多的函数;区域数随深度 \(K\) 指数增长。输入维度越高,这种优势越被放大(虽然此时精确计算区域数更难)。

一个量化的例子:\(K=5\) 层、每层 \(D=10\) 个单元,只用 471 个参数,却能切出 161,051 个线性区域。若输入是 10 维、\(K=5\) 层、每层 \(D=50\),1 万多个参数就能造出超过 \(10^{40}\) 个区域。

但要泼盆冷水:函数的灵活度终究受参数数量限制。深层网络切出的海量区域之间存在复杂的依赖与对称性(回想“折叠”那张图——这些区域之间带有由折叠造成的对称性)。所以“区域多”不一定是优势,除非:(i) 我们要逼近的真实函数本身就带类似的对称性;或 (ii) 有理由相信“输入→输出”的映射确实是若干简单函数的复合

4.5.3 深度高效性(Depth efficiency)

深浅都能建模任意函数,但有些函数用深层网络逼近要高效得多。已经找到这样的函数:浅层网络要达到与深层网络相同的逼近效果,需要指数级更多的隐藏单元。这一现象叫深度高效性。它同样诱人,但也存疑:不清楚现实中我们想逼近的函数是否真属于这一类。

4.5.4 大型、结构化的输入

前面讨论的都是全连接网络——每层每个元素都贡献给下一层每个元素。但对图像这类输入(可能有约 \(10^6\) 个像素),全连接不实用:参数量会爆炸;而且我们希望图像不同位置被同样地处理——没必要在每个可能的位置上各自独立地学“识别同一个物体”。

解决之道:并行处理局部图像区域,再逐步整合越来越大区域的信息。这种“由局部到全局”的处理很难不靠多层来实现(见第 10 章)。

4.5.5 训练与泛化

深层相对浅层还有两个实践优势:

  • 更易训练:训练中等深度的网络通常比训练浅层网络更容易。可能的原因是:过参数化(参数比训练样本还多)的深层模型存在一大族大致等价、且容易找到的解。不过层数过多时训练又会变难,已有许多方法缓解(见第 11 章)。
  • 泛化更好:深层网络在新数据上似乎也比浅层泛化得更好。实践中,绝大多数任务的最好结果都来自几十到上百层的网络。

上面这两个现象目前都没有被很好地理解,本书会在第 20 章再回头讨论。


本章小结

  • 先看“组合两个浅层网络”:第一个网络“折叠”输入空间,第二个网络施加分段线性函数,其效果在折叠重叠处被复制。
  • 再证明这种组合只是两层深层网络的特例;并把每层的 ReLU 理解为在多处裁剪输入函数、添加新“拐点”,从而切出更多区域。
  • 引入超参数(目前是层数与每层单元数);约定用 \(h_k,\beta_k,\Omega_k\) 的矩阵/权重偏置记法统一描述任意深度的网络。
  • 比较深浅得到五点结论:(i) 容量够大时两者都能逼近任意函数;(ii) 深层每个参数能换来更多线性区域;(iii) 某些函数深层逼近指数级更高效;(iv) 图像等大型结构化输入最好分多阶段处理;(v) 实践中最佳结果几乎都来自多层深层网络
  • 模型已就绪,下一步是训练。下一章讲损失函数:给定参数 \(\phi\),它返回一个数,衡量模型输出与真实标签之间的差距;第 6、7 章再讲如何调参数去最小化这个损失。

关键术语对照

中文 English 一句话含义
深层神经网络 Deep neural network 含一个以上隐藏层的网络
浅层神经网络 Shallow neural network 只含单个隐藏层的网络
组合 / 堆叠 Composing / Stacking 把一个网络的输出当作下一个的输入
隐藏层 / 隐藏单元 Hidden layer / Hidden unit 输入与输出之间的中间层及其神经元
折叠(输入空间) Folding (input space) 把输入空间叠到自身,使多输入对应同一输出
裁剪 / 夹断 Clipping ReLU 把函数在零处截断,新增“拐点”
线性区域 Linear region 分段线性函数中斜率不变的一段
拐点 Joint 相邻线性区域之间的折点
深度 / 宽度 Depth / Width 层数 / 每层的隐藏单元数
容量 Capacity 隐藏单元总数,衡量表达能力
超参数 Hyperparameter 训练前选定的量(如层数、每层单元数)
权重矩阵 / 偏置向量 Weight matrix \(\Omega_k\) / Bias vector \(\beta_k\) 层间的斜率矩阵 / 截距向量
全连接网络 Fully connected network 每个单元都连接到下一层每个单元
深度高效性 Depth efficiency 某些函数深层逼近所需单元远少于浅层
通用逼近定理 Universal approximation theorem 容量够大即可任意逼近任意连续函数

返回目录 | 上一章:第 3 章 浅层神经网络 | 下一章:第 5 章 损失函数