Dive into Deep Learning: 设计卷积神经网络架构
本文最后更新于 2024年3月14日 下午
本文为 Dive into Deep Learning (中文译名:动手学深度学习)英文版 8.8 节的学习笔记。笔者之前阅读过中文版的 D2L,近期看了看英文版的目录,发现比中文版多出了许多有意思的内容,于是在这里进行一些简单的整理。
虽然 2022 年后 ViT (vision Transformer) 在大规模图像分类领域处于领先定位,证明了可拓展性(scalability)能够战胜归纳偏差(inductive biases),但是笔者认为 CNN 所具有的高性能和低训练成本的特性,让其能够在低成本硬件上进行实时的计算机视觉的相关任务,这是 Transformer 所不具备的。因此在如今学习 CNN 的架构设计仍然具有一定意义。
自从 AlexNet 在 ImageNet 上击败了传统的计算机视觉模型,通过堆叠卷积网络块构建深度网络变得非常热门。一些常用的网络构建常常从如下几点出发:
- $3 \times 3$ 卷积核构建卷积层 (VGG)
- $1 \times 1$ 卷积核增加局部非线性性 (NiN)
- Global Average Pooling 聚合所有位置的信息 (Nin)
- 添加不同卷积宽度的网络分支 (GoogLeNet)
- 残差块拟合 $f(x) - x$ 添加归纳偏置 (ResNet)
- 分组卷积平衡参数量和计算量 (ResNeXt)
- 不同位置间的高效信息交换 (SENet)
这些网络设计通常是经验主义的,我们忽略了尝试通过神经结构搜索(neural architecture search, NAS)的方法获得的网络。但这种忽略是有原因的,通常进行网络搜索的成本非常高昂。
在后续的讨论中,我们会关注于从优秀的网络结构中尝试归纳出一些科学的特征,以相对较低的计算成本得到相对高质量的结果。接下来将会介绍 Radosavovic 等人的网络设计策略。该策略结合了人工设计的和 NAS 的长处,尝试从网络的分布着手进行网络结构优化,来提升网络族的整体表现。
AnyNet Design Space
(本书中的)CNN 设计通常包括一个 stem,一个 body 和一个 head。其中,
- Stem 进行图片的初始处理。通常使用一个比较大的卷积核对图像进行卷积。
- Body 将图像转换为更加高阶抽象的物体表示形式。通常包含了非常多的网络块进行信息转换,降低分辨率,提高维度。
- Head 将上一层的网络输出转换到我们所希望的输出空间。通常使用 softmax 回归或者多分类器。
这种设计模式,AnyNet,在 CNN 网络中是通用的。
如图,AnyNet 的结构通常包含以下参数
- $d_i$ - 网络深度
- $c_i$ - 输出通道数
- $r_i$ - 图像分辨率
- $k_i$ - Bottleneck ratio
- $g_i$ - 卷积分组数量
其中 Bottleneck 是在 ResNet 原始论文中提到的一个特殊的层,其参数量比输入和输出的层都要小,通过降维以强迫神经网络捕捉最重要的视觉特征,从而减小神经网络的计算量。
看起来能够调整的参数量十分多。因此我们需要一些工具来减小参数空间以提升设计效率。
Design Space 中的分布和参数
正如前文中提到的,由于计算量的限制,完全搜索参数是不可能的。我们应该需要一些简单的规则来整合瓶颈率、通道数、网络深度、卷积分组数。我们可以根据 Radosavovic 等人的提出的以下四种假设进行探索:
- 通用的设计原则是存在的。满足这些要求就可以得到不错的表现。因此,探索网络的分布似乎是一个可行的策略。
- 不需要让网络拟合就能判断网络的好坏。我们可以使用间接或者近似的结果来判断,极大减少了计算需求。
- 小规模的网络结构能够泛化到大规模网络。
- 设计元素可以被分解。这意味着我们可以独立改变参数来测试效果。
我们可以通过分析误差/精度的分布,来评估参数的选择对于网络的影响。记 $F(e)$ 为给定设计空间(Design Space)中的网络的累计误差分布,使用网络的概率分布 $p$ 绘制。也就是说,
$$
F(e, p) \overset{\text{def}}{=} P_{\text{net}\sim p} \{e(\text{net} \leq e)\}
$$
我们的目标是找到一个网络分布 $p$,其中大多数网络都具有较低的错误率,并且 $p$ 是简单清晰的(也就是说参数的选取规则应该很简单)。当然,直接对 $p$ 进行精确计算是在计算上不可行的。我们考虑转换思路,对于从 $p$ 中采样的一个包含了多个网络的样本 $\mathcal{Z} \overset{\text{def}}{=} \{\text{net}_1, \dots, \text{net}_n\}$,我们使用 empirical CDF $\hat{F} (e, \mathcal{Z})$ 来表示:
$$
\hat{F} (e, \mathcal{Z}) = \frac{1}{n}\sum_{i=1}^n 1[e_i\leq e]
$$
当对于某一参数不同选择的模型分布 $p$ 的 CDF 相似的时候,我们可以说这个参数的选择其实是无关紧要的,或者说其他的参数影响更大。
根据 Rodosavovic 等人的研究,他们尝试固定了瓶颈比 $k_i=k$ 和分组卷积宽度 $g_i=g$,发现固定这两个参数并不影响模型的性能。这可以从下图中 1、2 子图的实验结果中看出。
而通道数量的变化和深度具有影响。AnyNetX 表明当模型更深的时候,通常通道数量应该增加,也就是说 $c_i \geq c_{i-1}$;并且在更后面的阶段,块的数量也应该增加,也就是说 $d_i \geq d_{i-1}$。这可以从上图 3、4 子图的实验结果中看出。
结论:RegNet Design Principles
从上述结论中,导出了 4 条简单的设计规则:
- 对于所有阶段 $i$ 共享瓶颈率 $k_i=k$
- 对于所有阶段 $i$ 共享卷积分组数量 $g_i=g$
- 随着阶段提升通道数量(网络宽度)$c_i \leq c_{i+1}$
- 随着阶段提升网络深度 $d_i \leq d_{i+1}$
后续的一些针对表现最佳的网络的研究表明,在理想的情况下网络层宽度应该近似线性地随着层在网络块的下标提高而提高,也就是说 $c_j=c_0+c_a j$,其中 $j$ 层在为网络块中的下标。进一步的实验同时也证明了 $k=1$ 时的网络表现最佳,也就是说我们完全不需要使用 bottleneck 层。