前馈神经网络与卷积神经网络
从线性到非线性
线性模型的局限
逻辑回归的决策边界是一条直线(超平面)。如果数据不是线性可分的(比如 XOR 问题),线性模型无能为力。
XOR 问题:
- $(0,0) \to 0$,$(1,1) \to 0$
- $(0,1) \to 1$,$(1,0) \to 1$
画在平面上,没有任何一条直线能把 0 和 1 分开。
解决思路:如果我们先用一个变换把数据"扭"到另一个空间,在新空间中变成线性可分,再用线性分类器——这就是神经网络的直觉。
神经元
单个人工神经元
模拟生物神经元的简化数学模型:
$$z = \sum_{j=1}^d w_j x_j + b = \boldsymbol{w}^T\boldsymbol{x} + b \quad \text{(加权求和)}$$
$$a = f(z) \quad \text{(激活函数)}$$
三部分:
- 输入:接收 $d$ 个信号 $x_1, \ldots, x_d$
- 加权求和:每个输入乘以对应权重,再加偏置
- 激活函数:引入非线性
如果没有激活函数(或用恒等函数 $f(z)=z$),多层网络退化为单层线性模型(线性函数的复合还是线性函数)。
感知机(Perceptron)
最早的神经网络模型(1958 年)。激活函数是阶跃函数:
$$\hat{y} = \text{sign}(\boldsymbol{w}^T\boldsymbol{x} + b) = \begin{cases} 1, & \boldsymbol{w}^T\boldsymbol{x} + b > 0 \\ -1, & \text{otherwise} \end{cases}$$
Minsky & Papert (1969) 证明单层感知机无法表示 XOR → 第一次 AI 低谷。
万能近似定理(Universal Approximation Theorem)
定理:一个含有足够多隐藏单元的单隐层前馈网络,配合非线性激活函数,可以以任意精度逼近 $\mathbb{R}^n$ 上的任意连续函数。
意义:理论上一层就够。但实践中:
- "足够多"可能意味着指数级的神经元数量
- 深层网络用更少的参数达到同样的表达力
- 深层结构更容易通过梯度下降训练
多层前馈网络(MLP)
网络结构
一个 $L$ 层的全连接网络(Multi-Layer Perceptron):
第 $l$ 层($l = 1, 2, \ldots, L$):
$$\boldsymbol{z}^{(l)} = \boldsymbol{W}^{(l)}\boldsymbol{h}^{(l-1)} + \boldsymbol{b}^{(l)}$$ $$\boldsymbol{h}^{(l)} = f(\boldsymbol{z}^{(l)})$$
其中:
- $\boldsymbol{h}^{(0)} = \boldsymbol{x}$(输入层)
- $\boldsymbol{W}^{(l)} \in \mathbb{R}^{n_l \times n_{l-1}}$(第 $l$ 层权重矩阵)
- $\boldsymbol{b}^{(l)} \in \mathbb{R}^{n_l}$(第 $l$ 层偏置向量)
- $n_l$:第 $l$ 层神经元数量
- $f$:激活函数(逐元素作用)
"全连接"的含义
第 $l$ 层的每个神经元都与第 $l-1$ 层的所有神经元连接。$\boldsymbol{W}^{(l)}$ 的每一行对应一个神经元,每一列对应一个输入。
参数量计算
第 $l$ 层的参数:
- 权重:$n_l \times n_{l-1}$ 个
- 偏置:$n_l$ 个
- 总计:$n_l \times (n_{l-1} + 1)$
示例 1:大型全连接网络
输入 160,000 → 隐藏层1 40,000 → 隐藏层2 2,000 → 输出 100
| 层 | 输入维度 | 输出维度 | 参数量 |
|---|---|---|---|
| 1 | 160,000 | 40,000 | $(160000+1) \times 40000 = 6{,}400{,}040{,}000$ |
| 2 | 40,000 | 2,000 | $(40000+1) \times 2000 = 80{,}002{,}000$ |
| 3 | 2,000 | 100 | $(2000+1) \times 100 = 200{,}100$ |
| 总计 | ≈ 6.5 × 10⁹ |
65 亿参数!仅仅是一个三层网络。全连接网络处理高维输入(如图像)时参数量爆炸。
前向传播的运算量
对于每层 $n$ 个输入、$n$ 个输出的网络(共 $L$ 层):
每层:矩阵乘法 $\boldsymbol{W}\boldsymbol{h}$ 需要 $n^2$ 次乘法,$n^2 - n \approx n^2$ 次加法(再加 $n$ 个偏置加法)。
整个网络前向传播总乘法:$L \cdot n^2$
激活函数
为什么需要激活函数
如果所有层都是线性变换 $\boldsymbol{h} = \boldsymbol{W}\boldsymbol{x}$,那么 $L$ 层网络等价于: $$\boldsymbol{y} = \boldsymbol{W}^{(L)}\boldsymbol{W}^{(L-1)}\cdots\boldsymbol{W}^{(1)}\boldsymbol{x} = \boldsymbol{W}'\boldsymbol{x}$$
多层线性 = 单层线性。激活函数引入非线性,使深层网络能表示复杂函数。
Sigmoid
$$\sigma(z) = \frac{1}{1+e^{-z}}, \quad \sigma'(z) = \sigma(z)(1-\sigma(z)) \in (0, 0.25]$$
问题:
- 梯度最大 0.25 → 深层连乘 → 梯度消失
- 输出不以 0 为中心 → 梯度更新效率低
- 指数运算计算量大
现在主要用于输出层(二分类概率),隐藏层已不再使用。
ReLU(Rectified Linear Unit)
$$\text{ReLU}(z) = \max(0, z) = \begin{cases} z, & z > 0 \\ 0, & z \le 0 \end{cases}$$
$$\text{ReLU}'(z) = \begin{cases} 1, & z > 0 \\ 0, & z \le 0 \end{cases}$$
优势:
- 正区间梯度恒为 1 → 不会梯度消失
- 计算极快(只需判断正负)
- 稀疏激活(约 50% 的神经元输出 0)
问题:Dead ReLU——如果某个神经元的 $z$ 总是负数(因为权重初始化不好或学习率太大),它永远输出 0,梯度永远为 0,再也学不到东西——"死了"。
Leaky ReLU
$$\text{LeakyReLU}(z) = \begin{cases} z, & z > 0 \\ \alpha z, & z \le 0 \end{cases}, \quad \alpha = 0.01 \text{(小正数)}$$
负半轴也有小梯度 $\alpha$,不会"死"。
PReLU(Parametric ReLU)
$$\text{PReLU}(z) = \begin{cases} z, & z > 0 \\ \alpha z, & z \le 0 \end{cases}, \quad \alpha \text{是可学习参数}$$
$\alpha$ 不再是固定常数,而是通过训练数据学出来的。
ELU(Exponential Linear Unit)
$$\text{ELU}(z) = \begin{cases} z, & z > 0 \\ \alpha(e^z - 1), & z \le 0 \end{cases}$$
- 负半轴连续且平滑
- 输出均值更接近零
- 但含指数运算,计算比 ReLU 慢
激活函数对比
| 函数 | 正区间梯度 | 负区间梯度 | 梯度消失 | 计算量 | 输出中心 |
|---|---|---|---|---|---|
| Sigmoid | $\le 0.25$ | $\le 0.25$ | 严重 | 高 | 0.5 |
| ReLU | 1 | 0 | 正区间无 | 极低 | >0 |
| Leaky ReLU | 1 | $\alpha$ | 无 | 极低 | ≈0 |
| PReLU | 1 | 学习的 $\alpha$ | 无 | 低 | ≈0 |
| ELU | 1 | 连续变化 | 无 | 中 | ≈0 |
卷积神经网络(CNN)
动机
全连接网络处理图像的三大问题:
- 参数爆炸:$224 \times 224 \times 3$ 的图像 = 150,528 维输入,一层全连接到 1000 个神经元就有 1.5 亿参数
- 忽视空间结构:打乱像素顺序对全连接网络没有影响——它不知道相邻像素是相关的
- 缺乏平移不变性:一只猫在图像左上角和右下角,全连接网络需要分别学习
CNN 用三个核心设计解决这些问题:局部连接、参数共享、池化。
卷积运算(Cross-correlation)
严格来说 CNN 中实现的是互相关(cross-correlation),不是数学上的卷积(需要翻转核),但深度学习界习惯称之为"卷积"。
二维卷积:输入 $\boldsymbol{X} \in \mathbb{R}^{H \times W}$,卷积核 $\boldsymbol{K} \in \mathbb{R}^{k_h \times k_w}$:
$$Y_{i,j} = \sum_{m=0}^{k_h-1}\sum_{n=0}^{k_w-1} K_{m,n} \cdot X_{i+m, j+n}$$
核在输入上"滑动",每个位置做一次逐元素乘法再求和。
输出尺寸公式
输入尺寸 $N$,核尺寸 $F$,步幅 $S$(stride),填充 $P$(padding):
$$\text{输出尺寸} = \left\lfloor\frac{N - F + 2P}{S}\right\rfloor + 1$$
常见设置:
- 普通卷积($P=0$):输出变小
- 等宽卷积(Same,$P = \lfloor F/2 \rfloor$,$S=1$):输出尺寸 = 输入尺寸
- 步幅卷积($S>1$):降采样
运算量计算详解
示例:输入 $7 \times 7$,核 $3 \times 3$,步幅 1,无填充。
- 输出尺寸:$(7-3)/1 + 1 = 5$,即 $5 \times 5$
- 输出中有 $5 \times 5 = 25$ 个位置
- 每个位置:$3 \times 3 = 9$ 次乘法,$9 - 1 = 8$ 次加法
- 总乘法:$25 \times 9 = 225$
- 总加法:$25 \times 8 = 200$
另一个示例:输入 $7 \times 7$,核 $5 \times 5$,步幅 1。
- 输出尺寸:$(7-5)/1 + 1 = 3$,即 $3 \times 3$
- 总乘法:$9 \times 25 = 225$
步幅 2:输入 $7 \times 7$,2 个 $3 \times 3$ 核,步幅 2。
- 输出尺寸:$(7-3)/2 + 1 = 3$,即 $3 \times 3$,每个核输出 9 个位置
- 每个核总乘法:$9 \times 9 = 81$
- 2 个核:$81 \times 2 = 162$
多通道卷积
现实中输入不是单通道灰度图,而是 $C_{\text{in}}$ 个通道(如 RGB 3 通道)。
一个卷积核的完整形状:$k_h \times k_w \times C_{\text{in}}$
对所有通道分别卷积后求和,得到一个输出通道。
用 $C_{\text{out}}$ 个这样的核,就得到 $C_{\text{out}}$ 个输出通道。
参数量:
$$\text{一层卷积参数} = C_{\text{out}} \times (k_h \times k_w \times C_{\text{in}} + 1)$$
$+1$ 是每个核的偏置。
1×1 卷积
核大小 $1 \times 1$,对每个空间位置的 $C_{\text{in}}$ 个通道做线性组合,相当于对通道维度做全连接。
用途:
- 改变通道数(升维/降维)
- 几乎不增加参数就能增加非线性
池化(Pooling)
在固定窗口内压缩特征图,降低分辨率。
最大池化(Max Pooling):取窗口内最大值 平均池化(Average Pooling):取窗口内均值
特点:
- 没有可学习参数
- 提供一定的平移不变性
- 减小特征图尺寸(降低后续计算量)
CNN 参数量计算完整示例
输入 160,000(如 $400 \times 400$),网络结构如下:
| 层 | 配置 | 参数量计算 | 参数量 |
|---|---|---|---|
| Conv1 | 3 个 $5\times5$ 核,输入 1 通道 | $3 \times (5\times5\times1 + 1)$ | 78 |
| MaxPool | $2\times2$ | 0 | 0 |
| Conv2 | 5 个 $4\times4$ 核,输入 3 通道 | $5 \times (4\times4\times3 + 1)$ | 245 |
| MaxPool | 0 | 0 | |
| Conv3 | 5 个 $4\times4$ 核,输入 5 通道 | $5 \times (4\times4\times5 + 1)$ | 405 |
| MaxPool | 0 | 0 | |
| FC | 400 → 100 | $(400+1)\times100$ | 40,100 |
| 总计 | 40,828 |
对比全连接网络的 65 亿参数——CNN 只用 4 万参数!减少了 5 个数量级。
CNN 参数少的本质原因
- 参数共享:同一个卷积核在整个输入上滑动复用。$3\times3$ 的核无论输入多大,永远只有 9 个参数。
- 局部连接:每个输出位置只"看"局部的 $k\times k$ 区域,不需要和所有输入连接。
- 层级特征提取:浅层学边缘,深层学形状/物体——每层只需少量核。
空洞卷积(Dilated / Atrous Convolution)
在核元素之间插入空洞(dilation rate $d$),等效核大小变大但参数量不变。
等效感受野 = $k + (k-1)(d-1)$
例如 $3\times3$ 核,dilation=2,等效感受野 = $3 + 2\times1 = 5$,但只有 9 个参数。
用途:在不降低分辨率的情况下扩大感受野(语义分割中常用)。
卷积运算量计算
卷积层虽然参数少,但计算量(乘法和加法次数)也是重要指标。
基本公式
设输入特征图 $N \times N$,核 $F \times F$,步幅 $S$,填充 $P$:
- 输出特征图大小:$O = \frac{N - F + 2P}{S} + 1$
- 输出位置数:$O \times O$(二维情况)
- 每个位置的乘法次数:$F \times F$(核的元素个数)
- 每个位置的加法次数:$F \times F - 1$($F^2$ 个乘积相加需要 $F^2-1$ 次加法)
- 总乘法次数:$O^2 \times F^2$
- 总加法次数:$O^2 \times (F^2 - 1)$
示例:$7\times7$ 输入的卷积运算量
(1)1 个 $3\times3$ 核,步幅 1,无填充
- 输出大小:$(7-3)/1 + 1 = 5$,即 $5\times5 = 25$ 个位置
- 每个位置:$3\times3 = 9$ 次乘法
- 总乘法:$25 \times 9 = 225$
- 总加法:$25 \times 8 = 200$
(2)1 个 $5\times5$ 核,步幅 1,无填充
- 输出大小:$(7-5)/1 + 1 = 3$,即 $3\times3 = 9$ 个位置
- 总乘法:$9 \times 25 = 225$
- 总加法:$9 \times 24 = 216$
(3)2 个 $3\times3$ 核,步幅 2,无填充
- 输出大小:$(7-3)/2 + 1 = 3$,即 $3\times3 = 9$ 个位置
- 每个核的乘法:$9 \times 9 = 81$
- 两个核总乘法:$81 \times 2 = 162$
- 总加法:$9 \times 8 \times 2 = 144$
(4)1 个 $3\times3$ 核,步幅 1,等宽卷积(Same Convolution,$P=1$)
- 输出大小:$(7-3+2)/1 + 1 = 7$,即 $7\times7 = 49$ 个位置
- 总乘法:$49 \times 9 = 441$
- 总加法:$49 \times 8 = 392$
(5)先做 (1) 得到 $5\times5$,再做一次 $3\times3$ 卷积
- 第一次:输入 $7\times7$ → 输出 $5\times5$,乘法 225
- 第二次:输入 $5\times5$ → 输出 $3\times3 = 9$ 个位置,乘法 $9 \times 9 = 81$
- 总乘法:$225 + 81 = 306$
两次 $3\times3$ 堆叠 vs 一次 $5\times5$:
- 两次 $3\times3$:等效感受野 $5\times5$,但参数 $2 \times 9 = 18$,计算量 306 次
- 一次 $5\times5$:参数 $25$,计算量 225 次
参数更少但计算量稍多——现代网络选择堆叠小核(VGGNet 的核心思想),因为更多非线性(每层都有激活函数)且参数效率高。
感受野(Receptive Field)
定义
某一层输出的一个像素"看到"的输入区域大小。
递推计算
若第 $l$ 层的感受野为 $r_l$,核大小 $k_l$,步幅 $s_l$:
$$r_{l} = r_{l-1} + (k_l - 1) \times \prod_{i=1}^{l-1} s_i$$
对于全部步幅 1 的情况简化为:
$$r_l = r_{l-1} + (k_l - 1)$$
- 一层 $3\times3$(步幅 1):感受野 $= 1 + 2 = 3$
- 两层 $3\times3$(步幅 1):感受野 $= 3 + 2 = 5$
- 三层 $3\times3$(步幅 1):感受野 $= 5 + 2 = 7$
结论:堆叠小核可以达到大核的感受野,同时参数更少、非线性更强。
全连接层 vs 卷积层 vs 池化层对比
| 性质 | 全连接层 | 卷积层 | 池化层 |
|---|---|---|---|
| 可学习参数 | $(n_{in}+1) \times n_{out}$ | $C_{out}(k^2 C_{in} + 1)$ | 0 |
| 连接方式 | 全部连接 | 局部连接 | 局部窗口 |
| 参数共享 | ✗ | ✓(同一核滑动) | — |
| 平移不变性 | ✗ | ✓ | ✓ |
| 输出尺寸 | 任意 | 由 $N, k, S, P$ 决定 | 通常缩小一半 |
| 主要作用 | 全局组合特征 | 提取局部模式 | 降分辨率/不变性 |
典型 CNN 架构演进(了解)
| 网络 | 年份 | 核心贡献 |
|---|---|---|
| LeNet-5 | 1998 | CNN 的开山之作,手写数字识别 |
| AlexNet | 2012 | 深层 CNN + GPU 训练,ImageNet 冠军 |
| VGGNet | 2014 | 全部用 $3\times3$ 核堆叠,证明深度比宽度重要 |
| GoogLeNet | 2014 | Inception 模块(并行多尺度卷积) |
| ResNet | 2015 | 残差连接,训练 152 层,解决退化问题 |
本章核心要点
- 单个神经元 = 线性变换 + 激活函数
- 万能近似定理:一个隐藏层足以逼近任意连续函数(但不保证能训练到)
- 全连接参数量:$(n_{in}+1) \times n_{out}$,对图像来说参数爆炸
- 卷积核心公式:输出尺寸 $(N-F+2P)/S + 1$,参数量 $C_{out}(k^2 C_{in}+1)$
- CNN 三宝:参数共享、局部连接、层级特征
- 1×1 卷积:通道维度的全连接,改变通道数
- 池化:无参数,降分辨率,Max 保最强特征,Avg 保全局信息
- 堆叠小核 > 一个大核:更多非线性,更少参数,同等感受野
补充:多通道卷积的完整数学
单输入通道 → 多输出通道
输入 $\boldsymbol{X} \in \mathbb{R}^{H \times W}$(1 个通道),用 $C_{out}$ 个核各生成 1 个输出通道:
$$Y_c = \boldsymbol{X} * \boldsymbol{K}_c, \quad c = 1, 2, \ldots, C_{out}$$
输出 $\boldsymbol{Y} \in \mathbb{R}^{C_{out} \times H' \times W'}$。
多输入通道 → 单输出通道
输入 $\boldsymbol{X} \in \mathbb{R}^{C_{in} \times H \times W}$,一个核 $\boldsymbol{K} \in \mathbb{R}^{C_{in} \times k \times k}$:
$$Y_{i,j} = \sum_{c=1}^{C_{in}} \sum_{m=0}^{k-1}\sum_{n=0}^{k-1} K_{c,m,n} \cdot X_{c, i+m, j+n}$$
对所有输入通道做卷积后求和,得到 1 个输出通道。
多输入通道 → 多输出通道(一般情况)
$C_{out}$ 个核,每个核形状 $C_{in} \times k \times k$:
$$Y_{c', i, j} = \sum_{c=1}^{C_{in}} \sum_{m=0}^{k-1}\sum_{n=0}^{k-1} K_{c', c, m, n} \cdot X_{c, i+m, j+n} + b_{c'}$$
参数总量:$C_{out} \times (C_{in} \times k \times k + 1)$
具体计算示例
输入 3 通道(RGB),$32\times32$。用 16 个 $5\times5$ 核,步幅 1,无填充:
- 每个核参数:$3 \times 5 \times 5 + 1 = 76$
- 16 个核总参数:$16 \times 76 = 1216$
- 输出尺寸:$(32-5)/1+1 = 28$,即 $16 \times 28 \times 28$
- 每个输出位置的乘法:$3 \times 5 \times 5 = 75$ 次
- 总乘法次数:$16 \times 28 \times 28 \times 75 = 940,800$
补充:1×1 卷积的数学本质
为什么 $1\times1$ 卷积有意义?
虽然空间上只看一个像素,但它在通道维度上是全连接的。
输入 $\boldsymbol{X} \in \mathbb{R}^{C_{in} \times H \times W}$,$1\times1$ 卷积核 $\boldsymbol{K} \in \mathbb{R}^{C_{out} \times C_{in} \times 1 \times 1}$:
对于每个空间位置 $(i,j)$: $$Y_{c', i, j} = \sum_{c=1}^{C_{in}} K_{c', c} \cdot X_{c, i, j} + b_{c'}$$
这就是对 $C_{in}$ 维向量做线性变换得到 $C_{out}$ 维向量——逐像素的全连接层。
用途
- 降维:$C_{in}=256 \to C_{out}=64$,减少后续层的计算量
- 升维:$C_{in}=64 \to C_{out}=256$,增加特征空间
- 跨通道信息融合:不改变空间尺寸,只混合通道信息
- 引入非线性:$1\times1$ Conv + ReLU = 逐像素的非线性变换
参数量
$C_{out} \times (C_{in} + 1)$(远少于 $3\times3$ 或更大的核)
补充:从全连接到卷积的数学联系
全连接层可以看作卷积核大小等于整个输入的"超大核卷积":
- 输入 $7\times7$,核 $7\times7$,无填充 → 输出 $1\times1$
- 这和全连接层完全等价!
所以 CNN 的"局部连接"本质是限制了核的大小(只看局部),"参数共享"是强制核在不同位置相同。
这两个约束将参数量从 $O(N^2)$(全连接)降到 $O(k^2)$(卷积),但代价是每个输出只能"看到"局部信息——需要通过堆叠多层来扩大感受野。