D2L 现代卷积神经网络:架构设计与演进

记录现代卷积神经网络的架构设计、模块化方法、分类结构与训练经验。

数学与基础 学习笔记 持续修订 系列: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 块内部的四条路径属于并行关系,b3b4b5 中的多个 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 块后使用最大汇聚 模块之间使用最大汇聚 过渡块使用平均汇聚
分类结构 大型全连接分类器 大型全连接分类器 类别响应图与全局平均汇聚 全局平均汇聚与线性输出层 全局平均汇聚与线性输出层
主要贡献 建立大规模端到端视觉学习范式 建立清晰、可复用的块式网络设计 引入逐位置微型网络与全局平均汇聚 结合多尺度卷积、通道瓶颈与并行模块 建立跨层直接特征复用与短梯度路径

小结

  1. AlexNet 通过更深、更宽的卷积网络以及 ReLU、最大汇聚和暂退法建立了大规模端到端视觉学习范式。
  2. VGG 使用统一的小卷积核与可重复卷积块,使网络结构能够通过块深度和通道宽度系统配置。
  3. 卷积层通过增加卷积核组产生更多输出通道,每个输出通道都会综合局部窗口内的全部输入通道。
  4. NiN 的普通卷积负责收集邻域信息,$1\times1$ 卷积负责在每个位置混合通道特征并增加非线性表示能力。
  5. NiN 使用十张类别响应图和全局平均汇聚生成十个 logits,避免大型全连接分类器。
  6. GoogLeNet 使用 Inception 块并行提取不同尺度的特征,以 $1\times1$ 瓶颈控制计算量,并沿通道维拼接各路径输出。
  7. 批量规范化在 MLP 中按特征统计,在 CNN 中按通道统计;$\gamma$ 与 $\beta$ 由任务损失优化,运行均值与方差由训练批次持续估计。
  8. DenseNet 通过通道拼接保留稠密块入口与全部先前特征,并使用过渡块压缩通道与空间尺寸。
  9. 单次异常训练结果可能来自随机因素触发的优化不稳定,完整曲线与多次实验用于区分正常波动和持续失稳。

阅读来源