第 3 章 浅层神经网络(Shallow neural networks)
本章一句话:浅层神经网络就是“先算几条直线 → 各自过一道 ReLU 折一折 → 再加权求和”,由此拼出一个分段线性函数;只要隐藏单元够多,它能以任意精度逼近任何连续函数。
读这章的收获:彻底搞懂一个最简单的神经网络是怎么算的,理解 ReLU 为什么把网络变成“折线/折面”,看清隐藏单元数 ↔ 关节数 ↔ 线性区域数的对应关系,直觉上明白“通用逼近定理”为什么成立,并记住一层网络的全套术语。
本章速览
- 从直线到折线:第 2 章的线性回归只能画一条直线;浅层网络能画分段线性函数(折线/折面),表达力强得多。
- 三步走:① 对输入算若干条线性函数;② 每条结果过一个激活函数(最常用 ReLU);③ 把这些激活值加权求和再加偏置,得到输出。
- ReLU 是关键:\(a[z]=\mathrm{ReLU}[z]=\max(0,z)\)——正数原样通过,负数一律压成 0。正是这个“折一下”让网络变成分段线性。
- 关节 = 隐藏单元:每个隐藏单元贡献一个“关节(joint)”。\(D\) 个隐藏单元 → 最多 \(D\) 个关节 → 最多 \(D+1\) 个线性区域。隐藏单元越多,能拟合的函数越复杂。
- 通用逼近定理:隐藏单元足够多时,浅层网络能以任意精度逼近紧集上的任意连续函数——因为线性区域越多,每段越短,用直线逼近就越准。
- 多元输入/输出:多个输出 = 共享同一批隐藏单元、各自做不同的线性组合;多个输入 = 隐藏单元变成超平面,把输入空间切成凸多面体区域。
- 高维爆炸:输入维度一高,线性区域数量增长极快(\(D=500\)、\(D_i=100\) 时可超过 \(10^{107}\) 个区域)。
- 一堆术语:层、神经元、权重、偏置、预激活/激活、MLP、前馈、全连接——本章把它们一次讲清。
3.1 神经网络示例
浅层神经网络是一个带参数 \(\boldsymbol\phi\) 的函数 \(\mathbf{y}=\mathrm{f}[\mathbf{x},\boldsymbol\phi]\),把多元输入 \(\mathbf{x}\) 映射到多元输出 \(\mathbf{y}\)。完整定义留到 3.4 节,这里先用一个最小例子把核心思想讲透:它把标量输入 \(x\) 映射到标量输出 \(y\),一共有十个参数 \(\boldsymbol\phi=\{\phi_0,\phi_1,\phi_2,\phi_3,\theta_{10},\theta_{11},\theta_{20},\theta_{21},\theta_{30},\theta_{31}\}\):
\[ y=\mathrm{f}[x,\boldsymbol\phi]=\phi_0+\phi_1\,a[\theta_{10}+\theta_{11}x]+\phi_2\,a[\theta_{20}+\theta_{21}x]+\phi_3\,a[\theta_{30}+\theta_{31}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\)。
ReLU:最常用的激活函数
激活函数 \(a[\cdot]\) 有很多选择,最常用的是修正线性单元(rectified linear unit, ReLU):
\[ a[z]=\mathrm{ReLU}[z]=\begin{cases}0 & z<0\\[2pt] z & z\ge 0\end{cases}=\max(0,z). \]
直觉很简单:输入为正就原样返回,为负就压成 0(如图 3.1 所示)——也就是把负值“剪掉”。还有许多别的激活函数(见 3.5 节末),但 ReLU 最常用、也最容易理解。
公式里这一族函数到底长什么样并不直观。但第 2 章的思路依然适用:方程代表一族函数,具体是哪一个由十个参数 \(\boldsymbol\phi\) 决定。知道参数就能做推断(给定 \(x\) 算 \(y\));给定训练集 \(\{x_i,y_i\}\),可定义最小二乘损失 \(L[\boldsymbol\phi]\),训练就是搜索使损失最小的 \(\hat{\boldsymbol\phi}\)。
3.1.1 神经网络直觉:为什么是分段线性?
事实上,上面那个方程代表的是一族连续的分段线性函数,最多有四个线性区域(如图 3.2 所示:换一组参数,关节位置、各段斜率、整体高度都会变,但都是折线)。为了看清这一点,把函数拆成两部分。
先引入三个中间量,称为隐藏单元(hidden units):
\[ 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. \]
逐步来看这条折线是怎么“拼”出来的(如图 3.3 所示):
- 每个隐藏单元里装着一条输入的直线 \(\theta_{\bullet 0}+\theta_{\bullet 1}x\),这条直线被 ReLU 在零以下剪平。
- 三条直线穿过零点的位置,就变成最终输出的三个“关节(joint)”。
- 三条被剪过的线分别乘以权重 \(\phi_1,\phi_2,\phi_3\),再求和。
- 最后加上偏置 \(\phi_0\),它控制整条函数的整体高度。
活跃 / 不活跃:每段斜率从哪来
最终折线的每个线性区域,都对应隐藏单元的一种“活跃模式(activation pattern)”:
| 术语 | 含义 |
|---|---|
| 不活跃(inactive) | 该单元的输入被 ReLU 剪掉了(落在零以下),对输出无贡献 |
| 活跃(active) | 该单元没被剪,原样把斜率传下去 |
举例:某个区域里 \(h_1,h_3\) 活跃、\(h_2\) 不活跃,那么这一段的斜率就只由活跃单元决定——等于 \(\theta_{11}\phi_1+\theta_{31}\phi_3\)(每个活跃输入的原始斜率 \(\theta_{\bullet 1}\) 乘以后续权重 \(\phi_{\bullet}\),再相加)。
关节数 ↔ 区域数:每个隐藏单元贡献一个关节,所以三个隐藏单元最多切出四个线性区域。不过这四段的斜率只有三个是独立的:第四段要么是 0(所有单元都不活跃),要么是其它几段斜率的组合。
3.1.2 神经网络的画法
上面这个“一输入、一输出、三隐藏单元”的网络通常画成一张图(如图 3.4 所示):输入在左、隐藏单元在中、输出在右,计算从左流向右。每条连线代表十个参数之一(斜率参数 + 偏置参数)。为简化,画图时通常省略偏置(截距)参数、ReLU 标记和参数名,只留下骨架。
小贴士:本书约定,形如 \(z'=\phi_0+\sum_i\phi_i z_i\) 的函数叫线性函数(严格说带偏置应叫“仿射”,但机器学习里常混用,本书统称线性)。其余都叫非线性——ReLU 以及含它的整个网络都是非线性的。
3.2 通用逼近定理(Universal approximation theorem)
把上面的例子稍作推广:考虑有 \(D\) 个隐藏单元的情形,第 \(d\) 个隐藏单元为
\[ h_d=a[\theta_{d0}+\theta_{d1}x], \]
再线性组合成输出:
\[ y=\phi_0+\sum_{d=1}^{D}\phi_d\,h_d. \]
隐藏单元的个数 \(D\) 衡量了网络的容量(capacity)。用 ReLU 时,\(D\) 个隐藏单元的网络输出最多有 \(D\) 个关节,因而是一个最多 \(D+1\) 个线性区域的分段线性函数。加的隐藏单元越多,模型能逼近的函数就越复杂。
直觉:为什么“足够多就能逼近一切”
只要容量(隐藏单元)足够多,浅层网络就能以任意精度逼近实轴某个紧集上的任意连续 1D 函数。直觉如下(如图 3.5 所示):
- 每加一个隐藏单元,就给函数多加一个线性区域。
- 区域越多,每个区域覆盖的目标函数片段就越短。
- 而任何一小段光滑曲线,用一条直线去近似都会越来越准。
把这个想法推广到 \(D_i\) 维:通用逼近定理证明,对任意连续函数,总存在一个浅层网络能把它逼近到任意指定精度。换句话说,“一层就够”——表达力上不存在原则性障碍(代价是可能需要海量隐藏单元)。
3.3 多元输入与输出(Multivariate inputs and outputs)
前面的例子是“一个标量输入 → 一个标量输出”。但通用逼近定理对更一般的情形同样成立:输入可以是向量 \(\mathbf{x}=[x_1,\dots,x_{D_i}]^\top\),输出也可以是向量 \(\mathbf{y}=[y_1,\dots,y_{D_o}]^\top\)。下面先看多元输出,再看多元输入。
3.3.1 多元输出:共享隐藏单元,各算各的线性组合
要让网络输出多个值,只需对每个输出用一套不同的线性组合——隐藏单元还是同一批。比如“标量输入 \(x\)、四个隐藏单元、2D 输出 \(\mathbf{y}=[y_1,y_2]^\top\)”:
\[ h_1=a[\theta_{10}+\theta_{11}x],\ h_2=a[\theta_{20}+\theta_{21}x],\ h_3=a[\theta_{30}+\theta_{31}x],\ h_4=a[\theta_{40}+\theta_{41}x], \]
\[ y_1=\phi_{10}+\phi_{11}h_1+\phi_{12}h_2+\phi_{13}h_3+\phi_{14}h_4,\qquad y_2=\phi_{20}+\phi_{21}h_1+\phi_{22}h_2+\phi_{23}h_3+\phi_{24}h_4. \]
两个输出是同一批隐藏单元的两个不同线性函数。
关键约束:折线的关节由“输入直线被 ReLU 剪在何处”决定,而 \(y_1,y_2\) 共享同一批隐藏单元,所以它们的四个关节位置完全相同;但各段的斜率和整体高度可以不同(如图 3.6 所示)。
3.3.2 多元输入:折线变折面,区域变凸多边形
要处理多元输入,只需把“输入 → 隐藏单元”的线性关系扩展成多元。例如“两个输入 \(\mathbf{x}=[x_1,x_2]^\top\)、三个隐藏单元、一个标量输出”:
\[ h_1=a[\theta_{10}+\theta_{11}x_1+\theta_{12}x_2],\ h_2=a[\theta_{20}+\theta_{21}x_1+\theta_{22}x_2],\ h_3=a[\theta_{30}+\theta_{31}x_1+\theta_{32}x_2], \]
\[ y=\phi_0+\phi_1 h_1+\phi_2 h_2+\phi_3 h_3. \]
现在每个输入都有一个斜率参数。处理过程的几何图像是(如图 3.8 所示):
- 每个隐藏单元收到两个输入的线性组合,在 3D 输入/输出空间里对应一个有方向的平面。
- 激活函数把平面的负值部分剪成零(剪切线就相当于 1D 情形里的“关节”)。
- 被剪的平面再做一次线性组合(加权求和),拼成一个连续的分段线性曲面,由若干凸多边形区域组成。
- 每个区域对应一种活跃模式。例如中央三角形区域里,第一、三个单元活跃,第二个不活跃。
输入超过两维就难以可视化了,但道理一样:输出是输入的连续分段线性函数,只不过线性区域变成了高维空间里的凸多胞形(convex polytope)。
高维下区域数爆炸
输入维度一升高,线性区域的数量增长得极快(如图 3.9、3.10 所示)。直觉是:每个隐藏单元定义一个超平面,把空间分成“该单元活跃 / 不活跃”两半。
| 输入维度 \(D_i\) | 用 \(D_i\) 个(对齐坐标轴的)隐藏单元能切出 |
|---|---|
| 1 维 | 1 个关节 → 2 段 |
| 2 维 | 2 条线 → 4 个象限 |
| 3 维 | 3 个平面 → 8 个卦限 |
| \(D_i\) 维 | \(D_i\) 个超平面 → \(2^{D_i}\) 个区域 |
而浅层网络的隐藏单元数通常多于输入维度,所以实际区域数往往超过 \(2^{D_i}\)。一个直观的震撼数字:\(D=500\) 个隐藏单元、输入维度 \(D_i=100\) 时,区域数可超过 \(10^{107}\)——而这个模型只有约 51001 个参数,按现代标准还算非常小。
3.4 浅层网络一般形式(Shallow neural networks: general case)
把前面所有例子统一起来。一个浅层神经网络 \(\mathbf{y}=\mathrm{f}[\mathbf{x},\boldsymbol\phi]\) 把多维输入 \(\mathbf{x}\in\mathbb{R}^{D_i}\) 映射到多维输出 \(\mathbf{y}\in\mathbb{R}^{D_o}\),用 \(D\) 个隐藏单元。每个隐藏单元为
\[ h_d=a\!\left[\theta_{d0}+\sum_{i=1}^{D_i}\theta_{di}\,x_i\right], \]
再线性组合成各个输出:
\[ y_j=\phi_{j0}+\sum_{d=1}^{D}\phi_{jd}\,h_d, \]
其中 \(a[\cdot]\) 是非线性激活函数,模型参数为 \(\boldsymbol\phi=\{\theta_{\bullet\bullet},\phi_{\bullet\bullet}\}\)(如图 3.11 所示:三输入、三隐藏单元、两输出,共二十个参数)。
为什么激活函数必须非线性
激活函数让模型能描述输入与输出之间的非线性关系,因此它自己必须是非线性的:
如果没有激活函数(或用线性激活函数),整个“输入 → 输出”的映射就会退化成纯线性——叠多少层、加多少单元都还是一条直线/一个平面,白搭。
许多激活函数都被尝试过,但最常用的还是 ReLU,好处是易于解释:用 ReLU 时,网络把输入空间切成一堆凸多胞形(由各 ReLU“关节”所对应超平面的交错切割形成),每个多胞形里装着一个不同的线性函数。多胞形的划分对所有输出都相同,但每个多胞形里装的线性函数可以因输出而异。
3.5 术语(Terminology)
神经网络术语繁杂,这一节集中扫清。一个浅层网络可看成由层(layer)组成(如图 3.12 所示):
| 术语 | English | 含义 |
|---|---|---|
| 输入层 | Input layer | 最左侧,接收输入 \(\mathbf{x}\) |
| 隐藏层 | Hidden layer | 中间,本章网络只有一个隐藏层 |
| 输出层 | Output layer | 最右侧,给出输出 \(\mathbf{y}\) |
| 神经元 / 隐藏单元 | Neuron / Hidden unit | 隐藏层里的变量 \(h_d\) |
| 预激活 | Pre-activation | 进入隐藏单元、ReLU 之前的值 |
| 激活 | Activation | 隐藏单元处、ReLU 之后的值 |
| 权重 | Weight | 连线代表的斜率参数 \(\theta_{\bullet\bullet},\phi_{\bullet\bullet}\) |
| 偏置 | Bias | 偏移(截距)参数 \(\theta_{\bullet 0},\phi_{j0}\)(画图时常省略) |
几个常见“身份标签”:
- 多层感知机(multi-layer perceptron, MLP):出于历史原因,任何至少有一个隐藏层的网络都叫 MLP。
- 浅层网络(shallow network):只有一个隐藏层(即本章)。
- 深层网络(deep network):有多个隐藏层(下一章)。
- 前馈网络(feed-forward network):连接构成无环图(没有回路,本章所有例子都是)。
- 全连接网络(fully connected):上一层每个变量都连到下一层每个变量(本章所有例子都是)。
一句历史八卦:这些图看着像大脑里密集相连的神经元,“神经”网络由此得名。但实际上二者关系很牵强——几乎没有证据表明大脑就是这么算的,往后不必再往生物学上联想。
本章小结
- 浅层神经网络只有一个隐藏层,干三件事:① 算若干个输入的线性函数;② 每个结果过一道激活函数;③ 把这些激活值做线性组合得到输出。
- 用 ReLU 时,网络把输入空间切成一片连续的分段线性区域(折线 / 折面 / 凸多胞形),在每个区域内是线性的。
- 隐藏单元数 = 容量:\(D\) 个隐藏单元 → 最多 \(D\) 个关节 → 最多 \(D+1\) 个线性区域(1D 情形);高维下区域数随单元数和输入维度急剧增长。
- 通用逼近定理:隐藏单元足够多,浅层网络可以把任意连续函数逼近到任意精度——一层在表达力上就已足够。
- 多元输出 = 共享隐藏单元、各做线性组合(关节位置相同,斜率/高度可不同);多元输入 = 隐藏单元变超平面,把空间切成凸多胞形。
- 激活函数必须非线性,否则整个网络退化成线性映射。
- 下一章的深层网络就是在本章基础上叠更多隐藏层;第 5–7 章讲怎么训练这些模型。
关键术语对照
| 中文 | English | 一句话含义 |
|---|---|---|
| 浅层神经网络 | Shallow neural network | 只有一个隐藏层的网络 |
| 隐藏单元 / 神经元 | Hidden unit / Neuron | 隐藏层里的中间变量 \(h_d\) |
| 激活函数 | Activation function | 给网络注入非线性的逐元素函数 |
| ReLU(修正线性单元) | Rectified linear unit | \(\max(0,z)\):正数通过、负数归零 |
| 分段线性函数 | Piecewise linear function | 由若干直线段/平面拼成的连续函数 |
| 关节 | Joint | 折线斜率改变的转折点(= 输入直线穿零处) |
| 线性区域 | Linear region | 网络输出在其中为线性的一块空间 |
| 活跃 / 不活跃 | Active / Inactive | 隐藏单元是否被 ReLU 剪切 |
| 通用逼近定理 | Universal approximation theorem | 足够宽的一层网络能逼近任意连续函数 |
| 容量 | Capacity | 网络表达力,近似由隐藏单元数衡量 |
| 预激活 / 激活 | Pre-activation / Activation | ReLU 之前 / 之后的值 |
| 权重 / 偏置 | Weight / Bias | 斜率参数 / 截距参数 |
| 凸多胞形 | Convex polytope | 多元输入下的线性区域形状 |
| 多层感知机(MLP) | Multi-layer perceptron | 至少含一个隐藏层的网络统称 |
| 前馈 / 全连接 | Feed-forward / Fully connected | 无环图 / 层间变量两两相连 |
返回目录 | 上一章:第 2 章 有监督学习 | 下一章:第 4 章 深层神经网络