主题
字号
CHAPTER 03 ≈ 40 MIN READ

前馈神经网络与卷积神经网络

从线性到非线性

线性模型的局限

逻辑回归的决策边界是一条直线(超平面)。如果数据不是线性可分的(比如 XOR 问题),线性模型无能为力。

XOR 问题

画在平面上,没有任何一条直线能把 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{(激活函数)}$$

三部分:

  1. 输入:接收 $d$ 个信号 $x_1, \ldots, x_d$
  2. 加权求和:每个输入乘以对应权重,再加偏置
  3. 激活函数:引入非线性

如果没有激活函数(或用恒等函数 $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)})$$

其中:

"全连接"的含义

第 $l$ 层的每个神经元都与第 $l-1$ 层的所有神经元连接。$\boldsymbol{W}^{(l)}$ 的每一行对应一个神经元,每一列对应一个输入。

参数量计算

第 $l$ 层的参数:

示例 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]$$

问题

现在主要用于输出层(二分类概率),隐藏层已不再使用。

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}$$

优势

问题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}$$

激活函数对比

函数 正区间梯度 负区间梯度 梯度消失 计算量 输出中心
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)

动机

全连接网络处理图像的三大问题:

  1. 参数爆炸:$224 \times 224 \times 3$ 的图像 = 150,528 维输入,一层全连接到 1000 个神经元就有 1.5 亿参数
  2. 忽视空间结构:打乱像素顺序对全连接网络没有影响——它不知道相邻像素是相关的
  3. 缺乏平移不变性:一只猫在图像左上角和右下角,全连接网络需要分别学习

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$$

常见设置

运算量计算详解

示例:输入 $7 \times 7$,核 $3 \times 3$,步幅 1,无填充。

另一个示例:输入 $7 \times 7$,核 $5 \times 5$,步幅 1。

步幅 2:输入 $7 \times 7$,2 个 $3 \times 3$ 核,步幅 2。

多通道卷积

现实中输入不是单通道灰度图,而是 $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 参数少的本质原因

  1. 参数共享:同一个卷积核在整个输入上滑动复用。$3\times3$ 的核无论输入多大,永远只有 9 个参数。
  2. 局部连接:每个输出位置只"看"局部的 $k\times k$ 区域,不需要和所有输入连接。
  3. 层级特征提取:浅层学边缘,深层学形状/物体——每层只需少量核。

空洞卷积(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$:

示例:$7\times7$ 输入的卷积运算量

(1)1 个 $3\times3$ 核,步幅 1,无填充

(2)1 个 $5\times5$ 核,步幅 1,无填充

(3)2 个 $3\times3$ 核,步幅 2,无填充

(4)1 个 $3\times3$ 核,步幅 1,等宽卷积(Same Convolution,$P=1$)

(5)先做 (1) 得到 $5\times5$,再做一次 $3\times3$ 卷积

两次 $3\times3$ 堆叠 vs 一次 $5\times5$

参数更少但计算量稍多——现代网络选择堆叠小核(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)$$

结论:堆叠小核可以达到大核的感受野,同时参数更少、非线性更强。


全连接层 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 层,解决退化问题

本章核心要点

  1. 单个神经元 = 线性变换 + 激活函数
  2. 万能近似定理:一个隐藏层足以逼近任意连续函数(但不保证能训练到)
  3. 全连接参数量:$(n_{in}+1) \times n_{out}$,对图像来说参数爆炸
  4. 卷积核心公式:输出尺寸 $(N-F+2P)/S + 1$,参数量 $C_{out}(k^2 C_{in}+1)$
  5. CNN 三宝:参数共享、局部连接、层级特征
  6. 1×1 卷积:通道维度的全连接,改变通道数
  7. 池化:无参数,降分辨率,Max 保最强特征,Avg 保全局信息
  8. 堆叠小核 > 一个大核:更多非线性,更少参数,同等感受野

补充:多通道卷积的完整数学

单输入通道 → 多输出通道

输入 $\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,无填充:


补充: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}$ 维向量——逐像素的全连接层

用途

  1. 降维:$C_{in}=256 \to C_{out}=64$,减少后续层的计算量
  2. 升维:$C_{in}=64 \to C_{out}=256$,增加特征空间
  3. 跨通道信息融合:不改变空间尺寸,只混合通道信息
  4. 引入非线性:$1\times1$ Conv + ReLU = 逐像素的非线性变换

参数量

$C_{out} \times (C_{in} + 1)$(远少于 $3\times3$ 或更大的核)


补充:从全连接到卷积的数学联系

全连接层可以看作卷积核大小等于整个输入的"超大核卷积":

所以 CNN 的"局部连接"本质是限制了核的大小(只看局部),"参数共享"是强制核在不同位置相同。

这两个约束将参数量从 $O(N^2)$(全连接)降到 $O(k^2)$(卷积),但代价是每个输出只能"看到"局部信息——需要通过堆叠多层来扩大感受野。