D2L 现代卷积神经网络:架构设计与演进
记录现代卷积神经网络的架构设计、模块化方法、分类结构与训练经验。
摘要
- AlexNet 使用更深的卷积结构、ReLU、最大汇聚和暂退法,将图像分类从手工特征提取推进到端到端的特征学习。
- VGG 将若干个 $3\times3$ 卷积层与一个 $2\times2$ 最大汇聚层组织为可重复的卷积块,使网络深度与通道宽度可以通过结构配置统一描述。
- NiN 在普通卷积后加入两个 $1\times1$ 卷积,在每个空间位置上完成共享的通道变换,并使用类别响应图和全局平均汇聚替代大型全连接分类器。
- GoogLeNet 使用多条并行路径同时提取不同尺度的特征,并通过 $1\times1$ 卷积控制通道数与计算成本。
- 批量规范化按特征或通道规范化中间激活值,并使用可学习的缩放与平移参数保持表示能力。
- DenseNet 将稠密块内各层产生的特征沿通道维持续拼接,使后续层能够直接复用原始输入与全部先前特征。
- 随机初始化、小批量顺序和暂退掩码会使训练轨迹发生变化。训练稳定性需要通过完整曲线、多个随机种子和合适的优化参数进行判断。
从 LeNet 到现代卷积网络
LeNet 建立了卷积特征提取器与全连接分类器的基本分工。现代卷积网络继续沿用这一数据流,并通过更深的网络、更宽的通道、统一的模块和新的分类结构提高表示能力。
| 网络 | 主要设计 | 分类部分 |
|---|---|---|
| AlexNet | 扩大网络深度和通道数,引入 ReLU 与暂退法 | 两个大型全连接隐藏层与一个输出层 |
| VGG | 使用可重复的 $3\times3$ 卷积块描述网络 | 两个大型全连接隐藏层与一个输出层 |
| NiN | 使用普通卷积与 $1\times1$ 卷积组成局部微型网络 | 类别响应图与全局平均汇聚 |
| GoogLeNet | 使用并行的多尺度卷积路径组成 Inception 块 | 全局平均汇聚与线性输出层 |
| DenseNet | 使用稠密连接持续拼接已有特征 | 全局平均汇聚与线性输出层 |
这些网络都通过卷积逐步增加特征通道,并通过汇聚降低空间分辨率。通道数量描述当前位置可以保存的特征种类,空间尺寸描述这些特征在图像中的分布位置。
AlexNet 的深层特征学习
AlexNet 由五个卷积层和三个全连接层组成。前部卷积层通过较大的卷积核与步幅快速压缩输入,后续卷积层继续组合局部特征。最大汇聚降低特征图尺寸,全连接层将空间特征转换为类别 logits。
D2L 针对 Fashion-MNIST 使用单通道 $224\times224$ 输入,其主要数据流为:
| 阶段 | 主要运算 | 作用 |
|---|---|---|
| 初始卷积 | $11\times11$ 卷积,步幅为 4,输出 96 个通道 | 扩大早期感受野并快速降低分辨率 |
| 中间卷积 | $5\times5$ 与多个 $3\times3$ 卷积 | 逐层组合纹理、轮廓和部件特征 |
| 最大汇聚 | 三次空间下采样 | 压缩特征图并扩大后续单元的有效感受范围 |
| 全连接分类器 | $6400\rightarrow4096\rightarrow4096\rightarrow10$ | 汇总整幅图像并输出十个类别分数 |
AlexNet 使用 ReLU 代替 Sigmoid。ReLU 在正区间保持梯度,能够减轻深层网络中的梯度衰减。两个全连接隐藏层包含大量参数,因此分别在激活后使用 Dropout(0.5),降低隐藏特征之间的固定依赖。最后一层直接输出 logits,不使用暂退法。
Fashion-MNIST 原图只有 $28\times28$。将其插值到 $224\times224$ 能够匹配 AlexNet 的原始空间压缩结构,插值过程只增加采样点,不产生新的服装细节。本机保存的一次十周期训练得到 0.879 的测试准确率,说明该结构能够完成任务,同时承担了明显高于原生分辨率网络的计算成本。
VGG 的块式设计
VGG 将卷积结构封装为重复使用的块。一个 VGG 块包含若干个保持空间尺寸的 $3\times3$ 卷积层,块末使用 $2\times2$ 最大汇聚将高度和宽度减半:
\[\underbrace{ \operatorname{Conv}_{3\times3} \rightarrow\operatorname{ReLU} \rightarrow\cdots \rightarrow\operatorname{Conv}_{3\times3} \rightarrow\operatorname{ReLU} }_{\text{重复若干次}} \rightarrow\operatorname{MaxPool}_{2\times2}.\]D2L 使用 conv_arch 描述各块的卷积层数量与输出通道数:
conv_arch = (
(1, 64),
(1, 128),
(2, 256),
(2, 512),
(2, 512),
)
每个二元组表示一个 VGG 块。(2, 256) 表示该块包含两个卷积层,并统一输出 256 个通道。第一个卷积层完成上一块通道数到 256 的变换,第二个卷积层保持 256 个通道。块之间的输入通道数由前一块的输出通道数自动确定。
卷积层增加通道时会学习更多卷积核。若输入包含 $C_{\mathrm{in}}$ 个通道,输出包含 $C_{\mathrm{out}}$ 个通道,卷积核大小为 $K\times K$,则权重形状为:
\[\mathbf W\in \mathbb R^{C_{\mathrm{out}}\times C_{\mathrm{in}}\times K\times K}.\]每个输出通道对应一组覆盖全部输入通道的卷积核。通道增加来源于更多卷积核产生更多特征图,不依赖张量拼接。conv_arch 中的数值属于超参数,配置需要同时满足显存、计算量、空间尺寸和任务复杂度要求。
D2L 的 VGG 实现只在两个大型全连接隐藏层后使用暂退法。VGG 卷积块本身由卷积、ReLU 和最大汇聚组成。该位置安排针对参数量集中的全连接分类器进行正则化。
NiN 的逐位置通道变换
普通多通道卷积在每个输出位置读取一个局部三维区域。该区域包含 $K\times K$ 的空间邻域与全部输入通道。卷积层使用 $C_{\mathrm{out}}$ 组卷积核,在该位置产生包含 $C_{\mathrm{out}}$ 个特征的输出向量。
$1\times1$ 卷积是 $K=1$ 时的特殊情形。它不读取相邻位置,只读取同一位置上的全部通道。设位置 $(i,j)$ 的通道向量为 $\mathbf x_{i,j}\in\mathbb R^{C_{\mathrm{in}}}$,则 $1\times1$ 卷积计算为:
\[\mathbf y_{i,j} = \mathbf W\mathbf x_{i,j}+\mathbf b, \qquad \mathbf W\in\mathbb R^{C_{\mathrm{out}}\times C_{\mathrm{in}}}.\]同一组权重会在所有空间位置复用,因此该运算等价于在每个位置应用同一个全连接层。普通 $K\times K$ 卷积同时混合邻域空间信息与通道信息,$1\times1$ 卷积只混合同一位置的通道信息。
一个 NiN 块依次包含:
K×K卷积 → ReLU → 1×1卷积 → ReLU → 1×1卷积 → ReLU
第一层卷积收集邻域信息,后两个 $1\times1$ 卷积对当前位置的通道向量进行连续的非线性变换。该结构相当于把一个共享的小型多层感知机滑过整张特征图,使每个局部区域能够经过比单次线性卷积更复杂的特征组合。
NiN 最后使用输出通道数等于类别数的 NiN 块。Fashion-MNIST 的类别数为 10,因此最后得到 10 张类别响应图。全局平均汇聚分别对每张响应图的全部空间位置取平均:
\[o_c = \frac{1}{HW} \sum_{i=1}^{H} \sum_{j=1}^{W} Y_{c,i,j}.\]十个平均值直接构成十个类别 logits。该结构取消大型全连接层,显著降低分类部分的参数量,并使每个通道具有清晰的类别对应关系。
D2L 的 NiN 在最后一个高级特征块与类别输出块之间使用一次 Dropout(0.5)。暂退法扰动进入分类块的高级特征,使类别响应图需要综合多种特征证据。该位置与通道数量的增加没有必然关系,使用一次属于教学实现采用的正则化配置。
GoogLeNet 的并行多尺度结构
GoogLeNet 将 Inception 块作为基本组件。一个 Inception 块让同一输入同时经过四条路径:
| 路径 | 计算过程 | 最终输出通道数 |
|---|---|---|
| 一 | $1\times1$ 卷积 | $c_1$ |
| 二 | $1\times1$ 卷积后接 $3\times3$ 卷积 | $c_2[1]$ |
| 三 | $1\times1$ 卷积后接 $5\times5$ 卷积 | $c_3[1]$ |
| 四 | $3\times3$ 最大汇聚后接 $1\times1$ 卷积 | $c_4$ |
四条路径接收完整的输入张量,并保持相同的高度和宽度。它们的输出沿通道维拼接,因此 Inception 块的输出通道数为:
\[C_{\mathrm{out}} = c_1+c_2[1]+c_3[1]+c_4.\]例如 Inception(192, 64, (96, 128), (16, 32), 32) 接收 192 个输入通道。四条路径最终分别输出 64、128、32 和 32 个通道,拼接后得到 256 个通道。下一个 Inception 块以 256 作为输入通道数。
第二条和第三条路径先使用 $1\times1$ 卷积压缩通道,再执行计算成本较高的 $3\times3$ 或 $5\times5$ 卷积。该瓶颈结构降低参数量与乘加次数,同时保留多尺度特征提取能力。第四条路径中的最大汇聚只改变局部特征值,通道数保持为 in_channels,后续 $1\times1$ 卷积再将其映射为 $c_4$ 个通道。
Inception 块内部的四条路径属于并行关系,b3、b4 和 b5 中的多个 Inception 块属于串联关系。前一个块拼接得到的输出会作为后一个块的完整输入。D2L 使用 $96\times96$ 的 Fashion-MNIST 输入时,各模块的数据形状依次为:
| 阶段 | 主要结构 | 单个样本的输出形状 |
|---|---|---|
b1 |
初始卷积与最大汇聚 | $64\times24\times24$ |
b2 |
两个卷积层与最大汇聚 | $192\times12\times12$ |
b3 |
两个 Inception 块与最大汇聚 | $480\times6\times6$ |
b4 |
五个 Inception 块与最大汇聚 | $832\times3\times3$ |
b5 |
两个 Inception 块与全局平均汇聚 | $1024\times1\times1$ |
| 输出层 | 展平与线性变换 | $10$ |
GoogLeNet 将 NiN 的 $1\times1$ 通道变换与多尺度空间卷积结合,并使用全局平均汇聚压缩空间维度。该结构能够增加网络深度与特征种类,同时避免 VGG 式大型全连接分类器的主要参数开销。
批量规范化的统计与参数更新
批量规范化通常作用于线性变换或卷积产生的中间激活值。对一组待规范化数值,先使用当前小批量的均值与方差完成标准化,再进行可学习的缩放和平移:
\[\hat{x}_i = \frac{x_i-\mu_B}{\sqrt{\sigma_B^2+\epsilon}}, \qquad y_i=\gamma\hat{x}_i+\beta.\]$\epsilon$ 保证数值稳定,$\gamma$ 与 $\beta$ 分别控制特征的尺度和中心位置。两者根据最终任务损失进行反向传播,其梯度为:
\[\frac{\partial L}{\partial\gamma} = \sum_i\frac{\partial L}{\partial y_i}\hat{x}_i, \qquad \frac{\partial L}{\partial\beta} = \sum_i\frac{\partial L}{\partial y_i}.\]| 网络 | 激活形状 | 统计范围 | PyTorch 层 |
|---|---|---|---|
| MLP | $(B,d)$ | 每个特征分别在 $B$ 个样本上统计 | BatchNorm1d(d) |
| CNN | $(N,C,H,W)$ | 每个通道分别在 $N\times H\times W$ 个数值上统计 | BatchNorm2d(C) |
MLP 中的每个隐藏特征拥有一组 $\gamma_j,\beta_j$。CNN 中的每个通道拥有一组 $\gamma_c,\beta_c$,同一通道的所有空间位置共享这组参数。常见计算顺序为 Linear/Conv → BatchNorm → ReLU。紧接批量规范化的线性层或卷积层通常可以设置 bias=False,因为中心化操作会消除固定偏移,批量规范化本身也包含可学习的 $\beta$。
训练阶段使用当前批次的均值与方差,并持续更新运行统计量。PyTorch 默认使用指数移动平均:
\[\mu_{\mathrm{running}}^{(t)} = (1-m)\mu_{\mathrm{running}}^{(t-1)} +m\mu_B^{(t)},\]运行方差采用相同形式。默认 $m=0.1$,因此运行统计量是多个训练批次的平滑估计,而不是所有历史批次的简单算术平均。model.eval() 模式使用已积累的运行均值与运行方差,同时继续使用训练完成的 $\gamma$ 与 $\beta$。运行统计量通过前向统计更新,$\gamma$ 与 $\beta$ 通过优化器更新。
DenseNet 的稠密特征复用
DenseNet 的稠密块让每个卷积层接收块入口与全部先前卷积层的输出。设块入口为 $X_0$,第 $l$ 层的变换为 $H_l$,则该层计算为:
\[X_l=H_l([X_0,X_1,\ldots,X_{l-1}]),\]其中方括号表示沿通道维拼接。ResNet 使用逐元素相加合并残差路径,DenseNet 通过通道拼接保留各层特征。后续层能够直接使用浅层纹理与深层语义,反向梯度也可以沿多条短路径传向前部层。
若块入口包含 $C_0$ 个通道,每个卷积层固定产生 $k$ 个新通道,则第 $i$ 个卷积层接收 $C_0+ik$ 个通道。包含 $L$ 个卷积层的稠密块最终输出:
\[C_{\mathrm{out}}=C_0+Lk.\]$k$ 称为增长率。增长率固定每层新增的特征数量,卷积层的输入通道数随已有特征的累积而线性增加。D2L 配置中的 [4, 4, 4, 4] 表示四个稠密块分别包含四个卷积层。Python 表达式 *blks 将模块列表解包,使各稠密块和过渡块依次成为 nn.Sequential 的独立子模块。
相邻稠密块之间使用过渡块。过渡块依次执行批量规范化、ReLU、$1\times1$ 卷积和步幅为 2 的平均汇聚。$1\times1$ 卷积压缩累计通道,平均汇聚降低空间分辨率,从而控制稠密拼接带来的计算量与内存占用。
训练随机性与结果判断
当前教学代码使用随机 Xavier 初始化、随机小批量、普通 SGD 和暂退法。每次调用 d2l.train_ch6 都会重新初始化卷积层和全连接层,因此重复运行会产生新的训练轨迹。
小批量损失的短暂变化来自样本难度与暂退掩码的变化。整轮训练长期停留在随机猜测水平时,需要继续检查学习率、初始化、梯度和训练是否完整结束。固定随机种子可以提高同一环境中的可复现性,降低学习率、增加训练周期或使用批量规范化可以提高优化稳定性。模型表现应根据完整训练曲线和多个随机种子的结果进行判断。
结构对照
| 维度 | AlexNet | VGG | NiN | GoogLeNet | DenseNet |
|---|---|---|---|---|---|
| 卷积组织 | 不同尺寸卷积层顺序堆叠 | 重复使用统一的 VGG 块 | 普通卷积后连接两个 $1\times1$ 卷积 | Inception 块并行组合四条路径 | 稠密块内逐层拼接全部已有特征 |
| 通道变化 | 随网络阶段增加后适当收缩 | 由 conv_arch 逐块指定 |
每个 NiN 块统一到指定输出通道数 | 四条路径分别生成特征后按通道拼接 | 按增长率逐层增加,过渡块负责压缩 |
| 空间压缩 | 最大汇聚与首层大步幅卷积 | 每个块末使用最大汇聚 | 每个主要 NiN 块后使用最大汇聚 | 模块之间使用最大汇聚 | 过渡块使用平均汇聚 |
| 分类结构 | 大型全连接分类器 | 大型全连接分类器 | 类别响应图与全局平均汇聚 | 全局平均汇聚与线性输出层 | 全局平均汇聚与线性输出层 |
| 主要贡献 | 建立大规模端到端视觉学习范式 | 建立清晰、可复用的块式网络设计 | 引入逐位置微型网络与全局平均汇聚 | 结合多尺度卷积、通道瓶颈与并行模块 | 建立跨层直接特征复用与短梯度路径 |
小结
- AlexNet 通过更深、更宽的卷积网络以及 ReLU、最大汇聚和暂退法建立了大规模端到端视觉学习范式。
- VGG 使用统一的小卷积核与可重复卷积块,使网络结构能够通过块深度和通道宽度系统配置。
- 卷积层通过增加卷积核组产生更多输出通道,每个输出通道都会综合局部窗口内的全部输入通道。
- NiN 的普通卷积负责收集邻域信息,$1\times1$ 卷积负责在每个位置混合通道特征并增加非线性表示能力。
- NiN 使用十张类别响应图和全局平均汇聚生成十个 logits,避免大型全连接分类器。
- GoogLeNet 使用 Inception 块并行提取不同尺度的特征,以 $1\times1$ 瓶颈控制计算量,并沿通道维拼接各路径输出。
- 批量规范化在 MLP 中按特征统计,在 CNN 中按通道统计;$\gamma$ 与 $\beta$ 由任务损失优化,运行均值与方差由训练批次持续估计。
- DenseNet 通过通道拼接保留稠密块入口与全部先前特征,并使用过渡块压缩通道与空间尺寸。
- 单次异常训练结果可能来自随机因素触发的优化不稳定,完整曲线与多次实验用于区分正常波动和持续失稳。
阅读来源
- A. Zhang 等,D2L:7.1 深度卷积神经网络(AlexNet)。
- A. Zhang 等,D2L:7.2 使用块的网络(VGG)。
- A. Zhang 等,D2L:7.3 网络中的网络(NiN)。
- A. Zhang 等,D2L:7.4 含并行连结的网络(GoogLeNet)。
- A. Zhang 等,D2L:7.5 批量规范化。
- A. Zhang 等,D2L:7.7 稠密连接网络(DenseNet)。
- M. Lin、Q. Chen、S. Yan,Network In Network。