ResNet:神来之“路”

ResNet:神来之“路”

0.引言

深度残差网络(Deep Residual Network, ResNet)的提出是基于卷积算法处理图像问题领域的一件里程碑事件。ResNet在2015年发表当年取得了图像分类、检测等5项大赛第一,并再次刷新了CNN模型在ImageNet上的历史记录。直到今天,各种最先进的模型中依然处处可见残差连接的身影,其论文引用量是计算机视觉领域第一名。ResNet的作者何恺明也因此摘得2016年计算机视觉顶级会议CVPR的最佳论文奖,当然何博士的成就远不止于此,感兴趣的读者可以搜索一下他后来的辉煌战绩。

ResNet论文名称:Deep Residual Learning for Image Recognition

下载地址:https://openaccess.thecvf.com/content_cvpr_2016/html/He_Deep_Residual_Learning_CVPR_2016_paper.html

视频讲解:https://www.aideeplearning.cn/mcv_lesson/776/

1.深度学习网络退化问题

从经验来看,网络的深度对模型的性能至关重要,当增加网络层数后,网络可以进行更加复杂的特征提取,所以当模型更深时理论上可以取得更好的结果,例如VGG网络就证明了更深的网络可以带来更好的效果。但是更深的网络其性能一定会更好吗?

实验发现深度网络出现了退化问题(Degradation Problem):当网络深度持续增加时,网络准确度出现饱和,甚至出现下降。下图节选自ResNet原文,不管是训练阶段还是验证阶段,56层的网络比20层网络错误率更高,效果更差,训练阶段如图1(a)所示,测试阶段如图1(b)所示。究竟是什么原因导致的这一问题?

图片[1]-ResNet:神来之“路”-VenusAI
图1 退化问题

首先想到的是神经网络中的一个普遍问题:过拟合问题。但是,过拟合的主要表现是在训练阶段效果良好,但在测试阶段表现欠佳,这与图1情况是不相符的。

因此,造成网络性能下降的原因可能是梯度爆炸或梯度消失。为了理解梯度不稳定性的原因,首先回顾一下反向传播的知识:

反向传播结果的数值大小不仅取决于导数计算公式,同时也取决于输入数据的大小。因为神经网络的计算本质其实是矩阵的连乘,当计算图每次输入的值都大于1,那么经过很多层回传,梯度将不可避免地呈几何倍数增长,直到不可计量,这就是梯度爆炸现象。反之,如果每个阶段的输入值都小于1,则梯度将会几何级别地下降,最终可能会趋近于0,这就是梯度消失。由于目前神经网络的参数更新基于反向传播,因此梯度不稳定性看似是一个非常重要的问题。

然而,事实并非如此简单。现在无论用PyTorch还是TensorFlow,都会自然而然地加上BN操作(详见GoogLeNetV2),而BN操作的作用本质上也是控制每层输入的模值,因此梯度的爆炸、梯度消失现象理论上应该在很早就被解决了,至少解决了大部分。

在模型表现退化的问题上,可以排除过拟合和梯度不稳定的可能性。这引出了一个困境:尽管卷积神经网络并未遇到这两个典型的问题,但随着模型深度的增加,其性能却出现了下降。在没有数学证明的情况下,这个现象显得与预期相悖。

模型性能退化的现象在直觉上似乎违反了常理。通常认为当模型层数增加时,其性能应该提升。例如,如果一个浅层网络已经能达到良好的效果,那么即使在其上添加更多层,即使这些额外的层并不进行任何操作,模型的性能理论上也不应该下降。然而,实际情况却并非如此。实际上,“什么也不做”恰恰是现有神经网络最难实现的一点。

也许赋予神经网络无限可能性的“非线性”让神经网络模型走得太远,使得特征随着层层前向传播得到完整保留,什么也不做的可能性都微乎其微。用学术点的话说,这种“不忘初心”的品质在神经网络领域被称之为恒等映射(Identity Mapping)。因此,残差学习的初衷是为了让模型至少有一定的恒等映射能力,以确保在叠加网络的过程中,模型不会因继续叠加而产生退化。

2. 残差连接

ResNet模型解决网络退化问题的方法是设计了残差连接,最简单的残差如图2所示。其中右侧的曲线被称为残差连接(Residual Connection),通过跳接在激活函数前,将上一层(或几层)之前的输出与本层计算的输出相加,将求和的结果输入到激活函数中作为本层的输出。

这里一个Block中必须至少含有两个Layer,否则网络将退化成一个简单的神经网络:y = (wx + b) + x 等价于 y = wx + (b+x)。即,w为权重,b+x为偏置的一层神经网络。

图片[2]-ResNet:神来之“路”-VenusAI
图2 残差连接

在第1节中分析得出,如果深层网络后面的层都是恒等映射,那么模型就可以等价转化为一个浅层网络。事实上,已有的神经网络很难拟合潜在的恒等映射函数 H(x) = x。但如果把网络设计为 H(x) = F(x) + x,即直接把恒等映射作为网络要学习并输出的一部分,就可以把问题转化为学习一个残差函数 F(x)。

所谓残差连接指的就是将浅层的输出和深层的输出求和作为下一阶段的输入,这样做的结果就是本来这一层权重需要学习是一个对 x 到 H(x) 的映射。使用残差连接以后,权重需要学习的映射从 x 变成了 H(x)-x。

这样在反向传播的过程中,小损失的梯度更容易抵达浅层的神经元。其实这个和循环神经网络LSTM中控制门的原理也是一样的。

3 ResNet模型的网络结构

ResNet网络是基于VGG-19网络进行改进的,并引入了短路机制来添加残差连接。与VGG-19相比,ResNet直接使用步长为2的卷积来进行下采样(取代了VGGNet中的池化),并使用全局平均池化层替换了全连接层,这样可以接收不同尺寸的输入图像,并且模型层数更深。与VGG-19类似,两者都是通过堆叠 3×3 的卷积进行特征提取。

ResNet的一个重要设计原则是:当特征图大小减半时,特征图的数量增加一倍。这一定程度上减轻了因减少特征图尺寸而带来的信息损失,从而将输入信息的特征从空间维度提取到通道维度上。

在ResNet原文中,给出了五个不同层次的模型结构,分别是第18层、34层、50层、101层、152层。所有模型的结构参数见表1。

Layer nameoutput size18-layer34-layer50-layer101-layer152-layer
convl112×1127×7,64,stride 2
conv2 x56×563×3 max pool,stride 2
Basic Blockx23×3×64Basic Blockx23×3×64Bottleneck Blockx33×3×256Bottleneck Blockx33×3×256Bottleneck Blockx33×3×256
Conv3_x28×28Basic Blockx23×3×128Basic Blockx43×3×128Bottleneck Blockx43×3×512Bottleneck Blockx43×3×512Bottleneck Blockx83×3×512
Conv4_x14×14Basic Blockx23×3×256Basic Blockx63×3×256Bottleneck Blockx63×3×1024Bottleneck Blockx233×3×1024Bottleneck Blockx363×3×1024
Conv5_x7×7Basic Blockx23×3×512Basic Blockx33×3×512Bottleneck Blockx33×3×2048Bottleneck Blockx33×3×2048Bottleneck Blockx33×3×2048
 1×1average pool, 1000-d fc,softmax
表1 模型结构参数

值得注意的是:50层、101层和152层使用的残差模块与之前介绍的不同。主要原因是深层次的网络中参数量太大,为了减少参数,模型设计在 3×3 卷积前可以先通过 1×1 卷积对特征通道维度进行降维处理(其灵感应该是来自GoogLeNetV3中提出了网络设计准则,详见GoogLeNetV3)。

浅层模型用的残差结构如图3(a)所示;深层模型用的残差结构如图3(b)所示。

注意:对于残差,只有当输入和输出维度一致时,才可以直接将输入加到输出上。但是当维度不一致时,不能直接相加。这时可以采用新的映射(Projection Shortcut),比如一般采用 1×1 的卷积对残差传递的信息做维度调整。

图片[3]-ResNet:神来之“路”-VenusAI
图3 改进的残差连接

4 残差的调参

其实残差连接有多种调整方式,比如激活函数的位置、BN操作的位置、连接跨越的卷积数量等,都是可以调整的地方。因此,有文献对这些变体残差做了研究并实验。最后根据实验结果提出了一个效果更好的残差方式,如图4所示。改进前后一个明显的变化是后者进行了预激活(Pre-activation),BN操作和ReLU函数都放置在了卷积层前面。

图片[4]-ResNet:神来之“路”-VenusAI
图4 残差方法

5 残差连接的渊源

其实残差连接可以看成一种特殊的跳跃连接,早在2015年的时候,一篇题为Highway Networks的论文中使用了类似的结构,在旁路中设置了可训练参数。

传统的神经网络对输入 x 使用一个非线性变换H来得到输出,公式如下:

$$
\boldsymbol{y}=\mathrm{H}\left(\boldsymbol{x}, \boldsymbol{W}_H\right)
$$

Highway network 基于门机制引入了两个非线性函数, 转换门 \(\mathrm{T}\) (Transform gate \(\mathrm{T}\) )和携带门 C (Carry Gate C), 输出是由转换输入和携带输入两部分组成, 公式如下:
$$
\boldsymbol{y}=H\left(\boldsymbol{x}, \boldsymbol{W}_H\right) \cdot T\left(\boldsymbol{x}, \boldsymbol{W}_T\right)+\boldsymbol{x} \cdot C\left(\boldsymbol{x}, \boldsymbol{W}_c\right)
$$
\(\mathrm{T}\) 为转换门 (输出须经 \(\mathrm{H}\) 处理), \(\mathrm{C}\) 为携带门 (直接输出原始信息 \(x\) )。它们分别表示通过转换输入和携带输入分别产生多少输出。为了简单起见, 我们设定 \(C=1-T\), 也就是 \(C=T-1\) 。公式变为:
$$
\boldsymbol{y}=H\left(\boldsymbol{x}, \boldsymbol{W}_H\right) \cdot \boldsymbol{T}\left(\boldsymbol{x}, \boldsymbol{W}_T\right)+\boldsymbol{x} \cdot\left(1-\boldsymbol{T}\left(\boldsymbol{x}, \boldsymbol{W}_T\right)\right)
$$

特别地:

$$
\boldsymbol{y}=\left\{\begin{array}{cc}
\boldsymbol{x} & \text { 如果 } T\left(\boldsymbol{x}, \boldsymbol{W}_T\right)=0 \\
H\left(\boldsymbol{x}, \boldsymbol{W}_H\right) & \text { 如果 } T\left(\boldsymbol{x}, \boldsymbol{W}_T\right)=1
\end{array}\right.
$$

可以看到 Highway Network 模型其实就是对输入的一部分输入数据进行处理 (和传统神经网络相同), 另一部分输入数据则直接通过。其实, ResNet 可以看成 Highway Network 模型的一种特殊情况。即: \(T\left(\boldsymbol{x}, \boldsymbol{W}_T\right)\) 和 \(\left(1-T\left(\boldsymbol{x}, \boldsymbol{W}_T\right)\right)\) 都等于 1 的情况。不过 ResNet 模型效果更好, 似乎就验证了保持旁路畅通无阻(恒等映射)的重要性。高速公路网络这个名字就很形象,因为这样的结构使得特定信息可以无损地通过 “高速公路” 直达目的地。

6 残差连接有效性的解释

对于残差连接的有效性,除了原论文提出的学习恒等映射的解释以外。笔者觉得有两个更加合理的解释:

第一,把残差网络展开,相当于集成(Ensemble)了多个神经网络,这是一种典型的集成学习的思想(Ensemble Learning),如图5所示。

图片[5]-ResNet:神来之“路”-VenusAI
图5残差集成学习

残差网络看似是单路的网络结果,如图5(a)所示,其实如果把信息前向计算的可能路径全部画出来,此时可以看作是很多单路网络集成在一起形成的多路网络结构,如图5(b)所示。

Deep Networks with Stochastic Depth这篇论文指出,ResNet模型的深度可能过于深,某些层是多余的。可以通过在训练过程中随机丢弃一些层来优化深度残差网络的训练过程,使网络变得更简单。

具体的实现是通过Drop Path正则化:假设残差网络表达为公式 y = H(x) + x,Stochastic Depth Net模型训练时,加入了随机变量 b(伯努利随机变量),通过 y = b * H(x) + x,对ResBlock的残差部分做了随机丢弃。如果 b=1,则简化为原始的ResNet结构;如果 b=0,则这个ResBlock未被激活,降为恒等函数。此外,Stochastic Depth Net模型还使用线性衰减的生存概率原则来随机丢弃整个模型中不同深度的层级结构,将“线性衰减规律”应用于每层的生存概率,由于较早的层会提取低级特征,而这些低级特征会被后面的层所利用,所以这些层不应该频繁地被丢弃。最终生存概率生成的规则如图6所示。

图片[6]-ResNet:神来之“路”-VenusAI
图6深度随机的深度网络

实际上,Stochastic Depth Net的Drop Path操作与AelxNet中提出的Dropout操作大同小异;只是两者的作用对象不同:Dropout是作用在神经元级别上的;而Drop Path是作用在网络的层级结构上的。Drop Path方法在后期的模型中被广泛应用,例如ViT、Swin Transformer等。

Drop Path也是一种集成学习的思想,因为每次训练模型时随机失活的层级结构都不一样,等同于每次都训练了一个全新的子模型;在测试过程(推理预测)中,所有的网络层都将保持被激活状态,以充分利用整个长度网络的所有模型容量,这实际上是集成了训练时期的所有子模型来做推理。这个现象似乎表明,残差网络并不能完全解决模型深度的问题,而是因为隐含了集成神经网络的结构,所以即使在某些神经元失效时,仍然可以保证模型的整体效果。Drop Path结构如图7(a)所示,前向传播过程如图7(b)所示。

图片[7]-ResNet:神来之“路”-VenusAI
图7 残差关联的下降路径

第二, 残差连接更有利于梯度传播:
$$
z^{(l)}=H\left(\alpha^{(l-1)}\right)=\alpha^{(l-1)}+F\left(\alpha^{(l-1)}\right)
$$

考虑公式(5-12)这样的残差块组成的前馈神经网络, 为了讨论简便, 暂且假设残差块不适用任何激活函数, 即:
$$
\boldsymbol{\alpha}^{(l)}=z^{(l)}
$$

考虑任意两层数 \(l_2>l_1\), 递归地展开上面两个公式:
$$
\begin{aligned}
\boldsymbol{\alpha}^{\left(l_2\right)} & =\boldsymbol{\alpha}^{\left(l_2-1\right)}+\mathcal{F}\left(\boldsymbol{\alpha}^{\left(l_2-1\right)}\right) \\
& =\left(\boldsymbol{\alpha}^{\left(l_2-2\right)}+\mathcal{F}\left(\boldsymbol{\alpha}^{\left(l_2-2\right)}\right)\right)+\mathcal{F}\left(\boldsymbol{\alpha}^{\left(l_2-1\right)}\right) \\
& =\cdots
\end{aligned}
$$

可以得到:
$$
\boldsymbol{\alpha}^{\left(l_2\right)}=\boldsymbol{\alpha}^{\left(l_1\right)}+\sum_{i=l_1}^{l_2-1} \mathcal{F}\left(\boldsymbol{\alpha}^{(i)}\right)
$$

根据上式, 在前向传播时, 输入信号可以从任意底层直接传播到高层。由于包含了一个天然的恒等映射, 一定程度上可以解决网络退化问题。
这样, 最终的损失 \(\varepsilon\), 对某低层输出的梯度可以展开为:

$$
\frac{\partial \boldsymbol{\varepsilon}}{\partial \boldsymbol{\alpha}^{\left(l_1\right)}}=\frac{\partial \varepsilon}{\partial \boldsymbol{\alpha}^{\left(l_2\right)}} \frac{\partial \alpha^{\left(l_2\right)}}{\partial \boldsymbol{\alpha}^{\left(l_1\right)}}=\frac{\partial \boldsymbol{\varepsilon}}{\partial \boldsymbol{\alpha}^{\left(l_2\right)}}\left(1+\frac{\partial}{\partial \boldsymbol{\alpha}^{\left(l_1\right)}} \sum_{i=l_1}^{l_2-1} \mathcal{F}\left(\boldsymbol{\alpha}^{(i)}\right)\right)
$$

或展开写为:
$$
\frac{\partial \varepsilon}{\partial \boldsymbol{\alpha}^{\left(l_1\right)}}=\frac{\partial \varepsilon}{\partial \boldsymbol{\alpha}^{\left(l_2\right)}}+\frac{\partial \varepsilon}{\partial \boldsymbol{\alpha}^{\left(l_2\right)}} \frac{\partial}{\partial \boldsymbol{\alpha}^{\left(l_1\right)}} \sum_{i=l_1}^{l_2-1} \mathcal{F}\left(\boldsymbol{\alpha}^{(i)}\right)
$$

根据上式, 损失对某低层输出的梯度被分解为了两项, 前一项 \(\frac{\partial \varepsilon}{\partial \boldsymbol{\alpha}^{\left(l_2\right)}}\) 表明, 反向传播时, 错误信号可以不经过任何中间权重矩阵变换直接传播到低层, 一定程度上可以缓解梯度弥散问题(即便中间层矩阵权重很小,梯度也基本不会消失)。
综上, 可以认为残差连接使得信息前后向传播更加顺畅。

7 ResNeXt

研发动机

传统的模型优化方法主要依赖于增加网络的深度或宽度。然而,随着网络参数数量的增长,调整参数、设计网络和计算成本等问题也随之增加。当超参数过多时,往往很难保证所有参数都被优化到最佳状态。此外,传统模型训练出的网络对超参数的依赖性较强,使得模型在不同的数据集上需要频繁调整参数,这对模型的可扩展性造成了影响。

ResNeXt模型的出现,希望在提高准确率的同时,不增加甚至降低模型复杂度,并减少超参数的数量。其使用的分组卷积方法,提供了一种新的优化思路。

实验结果表明,ResNeXt在可扩展性、简单性、模块化设计以及超参数数量上都表现出优越性。在参数数量相同的情况下,ResNeXt的表现优于其它模型。例如,ResNeXt-101的准确率与ResNet-200相当,但计算量却减少了一半。这种优化使得ResNeXt模型在深度学习领域具有重要价值。

模型架构

ResNeXt模型架构的设计理念十分简洁:它将ResNet中的 3×3 卷积层替换为分组卷积层。模型里增加了一个参数Cardinality(类似于组卷积中的Group的概念),并讨论了相较于增加网络的宽度和深度,简单地增加参数Cardinality会更好。

正常的残差块如图8所示。

图片[8]-ResNet:神来之“路”-VenusAI
图8正常的残差块

ResNeXt的残差块如下图所示,可以看出ResNeXt先对 1×1 的卷积进行了一个分组(Cardinality为32);注意:ResNeXt残差块经过第一个 1×1 卷积后的维度是 32×4=128,相比原始残差块64的维度来说,是上升的。由于分组卷积可以减少很多参数量,所有这里即便维度上升了,总参数量也是下降的。

图片[9]-ResNet:神来之“路”-VenusAI
图9 ResNeXt 残差块

ResNeXt模型融合了Inception和ResNet的优势。如图9所示,ResNet的优势在于其残差连接,而Inception的优势则在于多个特征图的融合。Inception通过使用不同尺寸的卷积核生成多个特征图,从而实现了多尺度特征图的融合。然而,ResNeXt中的多个并行特征图是由相同尺寸的卷积核生成的,这种设计的含义是什么呢?具体解释将在下节中进行。

另外,根据实验验证,图9中展示的三种操作基本上具有相同的效果:具体来说,图9(a)表示的操作是先分组卷积再相加,最后加上残差连接;图9(b)表示的操作是先分组,再拼接,再通过 1×1 卷积升维,最后再加上残差连接;图9(c)表示的操作是先 1×1 升维,再分组卷积,再 1×1 升维。因此,在工程实践上直接采用最简单的操作,即图9(c)表示的操作。

ResNeXt的详细网络结构见表2。

stageoutputResNet-50ResNeXt-50(32×4d)
conv1112×1127×7×64, stride 27×7×64, stride 2
conv256×563×3 max pool, stride 23×3 max pool,stride 2
 1×1,643×3,641×1,256×3 1×1,1283×3,128,C=321×1,256×3
conv328×28 1×1,1283×3,1281×1,512×4 1×1,2563×3,256,C=321×1,512×4
conv414×141×1,2563×3,2561×1,1024×6 1×1,5123×3,512,C=321×1,1024×6
conv57×71×1,5123×3,5121×1,2048×3 1×1,10243×3,1024,C=321×1,2048×3
 1×1global average pool1000-d fc,softmaxglobal average pool1000-d fc,softmax
#params.25.5×10625.0×10⁶
表2 ResNeXt配置

8 ResNeXt为什么有效

ResNeXt中引入参数Cardinality的实际意义是将组卷积中的“组”概念重新定义。为了探究ResNeXt的有效性,需要思考分组卷积为何有效。

众所周知,在卷积过程中,设计多个卷积核的作用是期望每个卷积核能够学习到特征图所能表征的不同特征。类比于人类思考问题的方式,希望能够从不同的角度思考问题。同理,在卷积核提取特征时也希望可以从不同的角度提取特征(多个卷积核就是多个不同的角度)。那么分组卷积就是以另一种方式来实现这个目标。

不同的组之间实际上是不同的子空间,它们确实可以学习到更多样化的特征表示。这一点是有迹可循的,可以追溯到AlexNet提出的时候(AlexNet将网络分成两组,这种设计实际上是为了适应当时的硬件限制,通过分组来减少显存占用。然而,这种设计意外地引发了一些有趣的现象,可以被视为一种意料之外的发现),如图10所示。两组子网络,一组倾向于学习黑白的信息(下图的前三行特征),而另一组倾向于学习到彩色的信息(下图的后三行特征)。

图片[10]-ResNet:神来之“路”-VenusAI
图10 用两个 GPU训练的AlexNet

在AlexNet的论文中,虽然没有明确提出组卷积这一概念,也没有明确指出不同组卷积可以学习更多元的特征表示,但是实际上这一现象确实存在,分组卷积这样操作导致了不同组的卷积核可以学习更多样的不同特征表示。现在看来,相比分组卷积带来的参数量减少这一好处,分组卷积可以学习更多元的特征表示这一好处显得更加重要。因为后面的研究发现,分组卷积即便能减少大量参数,但是其在硬件上的实际运行时间并没有很快。

此外,这个思路还被应用到了Transformer网络中的多头注意力(Multi-Head Attention)机制中。

由此可以看到,ResNeXt或者多头注意力,相比于原始的ResNet或者单头注意力(Single-Head Attention)会具有更强的表征能力,这里引用一下Transformer原文的一句Multi-head Attention Allows the Model to Jointly Attend to Information from Different Representation Subspaces。简单来说,这句话的意思是,多头注意力机制使得模型能够从不同的表示子空间(representation subspaces)中同时关注和提取信息。在这里,“表示子空间”可以理解为不同的特征空间或信息空间,即模型学习和编码输入数据的不同方式。多头注意力机制允许模型在这些不同的子空间中同时寻找和关注信息,这样可以提取出更丰富和多样化的特征,从而提高模型的性能。

ResNeXt既有残差结构(便于训练),又对特征层进行了分组训练(对特征多角度理解)。这就类似于模型融合了,把具有不同优点的子模型融合在一起,效果会更好。另外,有文献表明这种分组的操作或许能起到网络正则化的作用。

© 版权声明
THE END
共同营造AI社区,喜欢就支持一下吧~
点赞2432 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容