CSPNet
摘要
作者提出了跨阶段部分网络(CSPNet),以缓解以往工作需从网络架构的角度进行大量推理计算的问题。作者将此问题归因于网络优化中梯度信息的重复。所提出的网络通过集成网络阶段开始和结束的特征图来尊重梯度的可变性,在作者的实验中,在ImageNet数据集上以同等甚至更高的精度减少了20%的计算量,并且在MS COCO目标检测数据集上的AP50方面显著优于 SOTA
1.引言
设计CSPNet的主要目的是使该体系结构能够实现更丰富的梯度组合,同时减少计算量。这一目标是通过将基础层的特征图划分为两个部分,然后通过提出的跨阶段层次结构将它们合并来实现的。
主要概念是通过拆分梯度流,使梯度流在不同的网络路径上传播。通过这种方式,作者证实了通过切换拼接 (switching concatenation) 和转换步骤 (transition steps),传播的梯度信息可以有很大的相关差异。此外,CSPNet 可以大大减少计算量,提高推理速度和精度,如图1所示。作者提出的基于cspnet的目标检测器解决了以下三个问题:
- 增强 CNN 的学习能力
所提出的CSPNet可以很容易地应用于ResNet、ResNeXt和DenseNet。在上述网络上应用CSPNet后,计算量可从10%减少到20%,但在ImageNet上进行图像分类任务时,其准确率优于ResNet、ResNeXt、DenseNet、HarDNet、Elastic和Res2Net - 消除计算瓶颈
- 降低存储成本
3.方法
3.1Cross Stage Partial Network
k k k 层 CNN 的输出可以表示为
F F F 是输入 x 0 x_0 x0 到目标 y y y 的映射函数,也是整个 CNN 模型, H k H_k Hk 是 CNN 第 k k k 层的运算函数。通常, H k H_k Hk 由一组卷积层和一个非线性激活函数组成。以 ResNet 和 DenseNet 为例,分别用公式 2 和公式 3 表示,如下所示:
其中 R R R 和 D D D 分别代表残差层和 Dense Layer 的计算算子,这些算子通常由 2 ~ 3 个卷积层组成
在残差网络(ResNet)或密集网络(DenseNet)中,每个卷积层的输入都接收到前面所有层的输出(ResNet 是元素级加法,DenseNet 是通道维度 concatenation)。这种设计能够减少梯度路径的长度,从而在反向传播过程中使梯度流传播更加高效。然而,这种架构设计也会导致第 k k k 层将梯度传递给所有 k − 1 k-1 k−1、 k − 2 k-2 k−2、…、 1 1 1 层,并用这些梯度来更新权重,这样做会导致重复学习冗余的信息。
简单来说,虽然这种设计可以提高梯度传播的效率,但同时也带来了梯度信息的重复使用问题,这可能会导致网络学习效率降低,因为它在多个层之间重复利用相同的梯度信息来进行学习。
最近,一些研究尝试使用筛选后的 H k ( ⋅ ) H_k(\cdot) Hk(⋅) 输入来提高学习能力和参数利用率。
最先进的方法将重点放在优化每一层的 H i H_i Hi 函数上,作者建议 CSPNet 直接优化 F F F 函数如下:
其中 x 0 x_0 x0 沿通道维度分割成两部分,可被表示为: x 0 = [ x 0 ′ , x 0 ′ ′ ] x_0 = [x_{0^{'}}, x_{0^{''}}] x0=[x0′,x0′′], T T T 是用于截断梯度流 H 1 H_1 H1, H 2 H_2 H2, … … …, H k H_k Hk 的转换函数(transition function)。
M M M 是用于混合两个被分割部分的转换函数(transition function)。接下来,作者展示如何将 CSPNet 集成到 DenseNet 中的示例,并解释如何解决 CNN 中重复信息的学习问题。
这张图展示了两种不同的神经网络架构的比较:传统的DenseNet(图a)和提出的Cross Stage Partial DenseNet(CSPDenseNet,图b)。
图 (a) DenseNet:
在DenseNet架构中,每一个Dense Layer(密集层)的输出不仅会被送入下一个层,而且会与之前所有层的输出进行连接(concat)。例如,在Dense Layer 1完成处理后,它的输出 x 1 x_1 x1 会被复制并与输入 x 0 x_0 x0 连接,作为Dense Layer 2的输入。这个过程在所有的Dense Layers中重复进行。这样,随着网络深度的增加,每个层都会积累越来越多的特征,直到在Transition Layer(转换层)中进行某种形式的维度缩减(通常是通过卷积操作)。
图 (b) Cross Stage Partial DenseNet(CSPDenseNet):
在CSPDenseNet架构中,输入特征图 x 0 x_0 x0 被分成两部分,其中一部分 x 0 ′ x_0' x0′ 直接传递到阶段 (stage) 的末尾,而另一部分 x 0 ′ ′ x_0'' x0′′ 则经过一系列的Dense Layers。在这些Dense Layers中,特征图依旧会进行复制和连接操作,但仅限于 x 0 ′ ′ x_0'' x0′′ 的部分。在经过了 k k k 个Dense Layers之后,这些处理过的特征图会与 x 0 ′ x_0' x0′ 进行连接,并通过一个Partial Transition Layer(部分转换层)进行特征整合和维度变换,输出 x U x_U xU。
总的来说,CSPDenseNet通过在每个阶段初分割输入特征图,减少了冗余信息的传递,并试图通过这种方式平衡梯度流,提高网络学习的多样性,从而提高效率和减少计算资源的需求。这种结构对于在资源受限的设备上部署深度学习模型特别有价值。
DenseNet
DenseNet 的每个阶段(操作空间尺寸相同的特征图)包含一个密集块和一个过渡层,每个密集块由 k k k 个密集层(非线性映射层)组成。第 i i i 个密集层的输出将与第 i i i 个密集层的输入进行连接,连接后的结果将成为第 ( i + 1 ) (i + 1) (i+1) 个密集层的输入。表示上述机理的方程可表示为:
其中 ∗ * ∗ 表示卷积算子, [ x 0 , x 1 , … ] [x_0, x_1,…] [x0,x1,…] 表示连接(concatenation) x 0 , x 1 , … , x_0, x_1,…, x0,x1,…,
w i w_i wi 和 x i x_i xi 分别是第 i i i 个密集层的权值和输出。
如果利用反向传播来更新权值,则权值更新的方程可以写成:
其中, f i f_i fi 为第 i i i 个密集层的权值更新函数, g i g_i gi 为传播到第 i i i 个密集层的梯度。可以发现,在更新不同密度层的权重时,大量的梯度信息被重用。这将导致不同的密集层反复学习复制的梯度信息。
在这里,每个 w k ′ w'_k wk′ 表示第 k k k 层之后的权重更新,而 f k f_k fk 是更新函数,它依赖于当前层的权重 w k w_k wk 和所有前面层的梯度信息 g 0 ,