六、ResNet 变种
6.1 恒等映射修正
- 在论文
《Identity Mappings in Deep Residual Networks》
中,ResNet
的作者通过实验证明了恒等映射的重要性,并且提出了一个新的残差单元来简化恒等映射。
6.1.1 新残差块
新的残差单元中,恒等映射添加到
ReLU
激活函数之后。它使得训练变得更简单,并且提高了网络的泛化能力。假设 是第 个残差单元的输入特征; 为一组与第 个残差单元相关的权重(包括偏置项), 是残差单元中的层的数量; 代表残差函数。则第 个残差单元的输出为(它也等价于第 个残差单元的输入):
考虑递归,对于任意深的残差单元 ,则有:
因此,对任意深的单元 ,其输入特征 可以表示为浅层单元 的特征 加上一个形如 的残差函数。
这意味着:任意单元 和 之间都具有残差性。
对于任意深的单元 ,其输入特征 可以表示为: 。即:之前所有残差函数输出的总和,再加上 。
与之形成鲜明对比的是常规网络中,输入特征 是一系列矩阵向量的乘积。即为: (忽略了激活函数和
BN
)。新的残差单元也更具有良好的反向传播特性。对于损失函数 ,有:
可以看到:
梯度 可以分解为两个部分:
- :直接传递信息而不涉及任何权重。它保证了信息能够直接传回给任意浅层 。
- :通过各权重层来传递。
在一个
mini-batch
中,不可能出现梯度消失的情况。可能对于某个样本,存在 的情况,但是不可能出现
mini-batch
中所有的样本满足 。这意味着:哪怕权重是任意小的,也不可能出现梯度消失的情况。
对于旧的残差单元,由于恒等映射还需要经过
ReLU
激活函数,因此当 时饱和,其梯度为0 。根据
3.
和4.
的讨论表明:在前向和反向阶段,信号都能够直接传递到任意单元。
6.1.2 快捷连接验证
假设可以对快捷连接执行缩放(如线性的
1x1
卷积),第 个残差单元的缩放因子为 ,其中 也是一个可以学习的参数。此时有: ,以及: 。令:,则有:
对于特别深的网络:如果 , 则 发生梯度爆炸;如果 , 则 发生梯度消失。这会丧失快捷连接的好处。
如果对快捷连接执行的不是线性缩放,而是一个复杂的函数 ,则上式括号中第一部分变成: 。其中 为 的导数。
这也会丧失快捷连接的好处,阻碍梯度的传播。
下图所示为对快捷连接进行的各种修改:
为了简化,这里没有画出
BN
层。每个权重层的后面实际上都有一个BN
层。(a)
:原始的、旧的残差块。(b)
:对所有的快捷连接设置缩放。其中缩放因子 。残差有两种配置:缩放(缩放因子 0.5)、不缩放。
(c)
:对快捷连接执行门控机制。残差由 来缩放,快捷连接由 来缩放。其中 , 。
(d)
:对快捷连接执行门控机制,但是残差并不进行缩放。(e)
: 对快捷连接执行1x1
卷积。(f)
:对快捷连接执行dropout
,其中遗忘比例为0.5 。在统计学上,它等效于一个缩放比例为0.5的缩放操作。
在
CIFAR-10
上利用ResNet-110
的测试误差如下:(fail
表示测试误差超过 20% )on shortcut
和on F
列分别给出了快捷连接、残差块上的缩放比例。最终结果表明:快捷连接是信息传递最直接的路径,快捷连接中的各种操作都会阻碍信息的传递,以致于对优化造成困难。
理论上,对快捷连接执行
1x1
卷积,会引入更多的参数。它应该比恒等连接具备更强大的表达能力。事实上,其训练误差要比恒等连接的训练误差高的多。这意味着模型退化是因为优化问题,而不是网络表达能力的问题。
6.1.3 激活函数验证
设残差块之间的函数为 ,即:
+
之后引入 :前面的理论推导均假设 为恒等映射 ,而上面的实验中 。因此接下来考察 的影响。
如下图所示,组件都相同,但是不同的组合导致不同的残差块或 。
(a)
:原始的、旧的残差块, 。(b)
:将BN
移动到addition
之后, 。(c)
:将ReLU
移动到addition
之前,。这种结构问题较大,因为理想的残差块的输出范围是 。这里的残差块经过个
ReLU
之后的输出为非负,从而使得残差的输出为 ,从而使得前向信号会逐级递增。这会影响网络的表达能力。(d)
:将ReLU
移动到残差块之前,。(e)
: 将BN
和ReLU
移动到残差块之前,。
最终结果表明:
full pre-activation
效果最好。有两个原因:快捷连接通路是顺畅的,这使得优化更加简单。
对两个权重层的输入都执行了
BN
。所有其它四组结构中,只有第二个权重层的输入的到了标准化,第一个权重层的输入并未的到标准化。
6.1.4 网络性能
在
ILSVRC 2012
验证集上的评估结果:方法 数据集增强 train crop test crop top-1 误差 top-5 误差 ResNet-152,原始残差块 scale 224x224 224x224 23.0% 6.7% ResNet-152,原始残差块 scale 224x224 320x320 21.3% 5.5% ResNet-152,full pre-activation scale 224x224 320x320 21.1% 5.5% ResNet-200,原始残差块 scale 224x224 320x320 21.8% 6.0% ResNet-200,full pre-activation scale 224x224 320x320 20.7% 5.3% ResNet-200,full pre-activation scale + asp ratio 224x224 320x320 20.1% 4.8% Inception v3 scale + asp ratio 299x299 299x299 21.2% 5.6%
6.2 ResNeXt
通常提高模型准确率的方法是加深网络深度或者加宽网络宽度,但这些方法会增加超参数的数量、参数数量和计算量。
ResNeXt
网络可以在不增加网络参数复杂度的前提下提高准确率,同时还减少了超参数的数量。ResNeXt
的设计参考了VGG
和Inception
的设计哲学。VGG
:网络通过简单地层叠相同结构的层来实现,因此网络结构简单。其缺点是网络参数太多,计算量太大。Inception
:通过执行分裂-变换-合并
策略来精心设计拓扑结构,使得网络参数较少,计算复杂度较低。这种分裂-变换-合并
行为预期能够达到一个大的dense
层的表达能力,但是计算复杂度要低的多。其缺点是:
- 每个“变换”中,滤波器的数量和尺寸等超参数都需要精细的设计。
- 一旦需要训练新的任务(如新任务是一个
NLP
任务),可能需要重新设计网络结构。因此可扩展性不高。
ResNeXt
结合了二者的优点:- 网络结构也是通过简单地层叠相同结构的层来实现。
- 网络的每一层都执行了
分裂-变换-合并
策略。
在相同的参数数量和计算复杂度的情况下,
ResNeXt
的预测性能要优于ResNet
。- 它在
ILSVRC 2016
分类任务中取得了第二名的成绩。 101
层的ResNeXt
就能够获得超过200
层ResNet
的准确率,并且计算量只有后者的一半。
- 它在
ResNeXt
改进了ResNet
网络结构,并提出了一个新的维度,称作“基数”cardinality
。基数是网络的深度和网络的宽度之外的另一个重要因素。作者通过实验表明:增加基数比增加网络的深度或者网络的宽度更有效。
6.2.1 分裂-变换-合并
考虑全连接网络中的一个神经元。假设输入为 ,为一个一度的输入向量(长度为 )。假设对应的权重为 。不考虑偏置和激活函数,则神经元的输出为: 。
它可以视作一个最简单的“分裂-变换-合并”:
- 分裂:输入被分割成 个低维(维度为零)嵌入。
- 变换:每个低维嵌入通过对应的权重 执行线性变换。
- 合并:变换之后的结果通过直接相加来合并。
Inception
的“分裂-变换-合并”策略:- 分裂:输入通过
1x1
卷积被分割成几个低维嵌入。 - 变换:每个低维嵌入分别使用一组专用滤波器(
3x3
、5x5
等) 执行变换。 - 合并:变换之后的结果进行合并(沿深度方向拼接)。
- 分裂:输入通过
对一个
ResNeXt
块,其“分裂-变换-合并”策略用公式表述为:其中:
- 为任意函数,它将 映射为 的一个低维嵌入,并对该低维嵌入执行转换。
- 为转换的数量,也就是基数
cardinality
。
在
ResNeXt
中,为了设计方便 采取以下设计原则:所有的 具有相同的结构。这是参考了
VGG
的层叠相同结构的层的思想。的结构通常是:
- 第一层:执行
1x1
的卷积来产生 的一个低维嵌入。 - 第二层 ~ 倒数第二层:执行卷积、池化等等变换。
- 最后一层:执行
1x1
的卷积来将结果提升到合适的维度。
- 第一层:执行
6.2.2 ResNeXt 块
一个
ResNeXt
模块执行了一组相同的“变换”,每一个“变换”都是输入的一个低维嵌入,变换的数量就是基数C
。如下所示:左图为
ResNet
块;右图为ResNeXt
块。ResNeXt
模块有两种等效的形式:图(a)
为标准形式,图(b)
类似Inception-ResNet
模块。其中图(b)
的拼接是沿着深度方向拼接。等效的原因是:输入通道数为
128
的1x1
卷积可以如下拆分:( 设输入张量为 ,输出张量为 ,核张量为 )经过这种拆分,图
(b)
就等效于图(a)
。其中: 表示输出单元位于 通道, 表示输入单元位于 通道, 表示通道中的坐标。本质原因是
1x1
卷积是简单的对通道进行线性相加。它可以拆分为:先将输入通道分组,然后计算各组的子通道的线性和(1x1
卷积);然后将所有组的和相加。图
(b)
与Inception-ResNet
模块的区别在于:这里每一条路径都是相同的。图
(c)
是一个分组卷积的形式,它就是用分组卷积来实现图(b)
。它也是图(b)
在代码中的实现方式。
![](/projects/huaxiaozhuan-ai/412f72cf50ee1edb06338fa6959033ff.png)
通常
ResNeXt
模块至少有三层。事实上它也可以有两层,此时它等效于一个宽的、密集模块。- 此时并没有通过
1x1
卷积进行降维与升维,而是在降维的过程中同时进行变换,在升维的过程中也进行变换。 - 如下图所示,它等价于图
(c)
中,去掉中间的变换层(128,3x3,128
层),同时将第一层、第三层的1x1
替换为3x3
卷积层。
- 此时并没有通过
6.2.3 网络性能
ResNeXt
的两种重要超参数是:基数C
和颈宽d
。- 基数
C
:决定了每个ResNeXt
模块有多少条路径。 - 颈宽(
bottleneck width
)d
:决定了ResNeXt
模块中第一层1x1
卷积降维的维度。
这二者也决定了
ResNeXt
模块等价形式中,通道分组卷积的通道数量为Cxd
。- 基数
ResNeXt
的网络参数和计算量与同等结构的ResNet
几乎相同。以ResNet-50
为例(输入图片尺寸224x224
):ResNeXt-50(32x4d)
意思是:基数C=32
,颈宽d=4
。在
ImageNet
上进行的对比实验(验证集误差,single crop
):基数 vs 颈宽:基数越大越好。
模型 配置 top-1 error(%) ResNet-50 C=1,d=64 23.9 ResNeXt-50 C=2,d=40 23.0 ResNeXt-50 C=4,d=24 22.6 ResNeXt-50 C=8,d=14 22.3 ResNeXt-50 C=32,d=4 22.2 ResNet-101 C=1,d=64 22.0 ResNeXt-101 C=2,d=40 21.7 ResNeXt-101 C=4,d=24 21.4 ResNeXt-101 C=8,d=14 21.3 ResNeXt-101 C=32,d=4 21.2 基数 vs 深度/宽度:基数越大越好。
与其它模型的预测能力比较(验证集误差,
single crop
):ResNet/ResNeXt
的图片尺寸为224x224
和320x320
;Inception
的图片尺寸为299x299
。
6.3 随机深度网络
随机深度网络提出了训练时随机丢弃网络层的思想,从而能够让网络深度增加到超过1000层,并仍然可以减少测试误差。
如图所示:在
CIFAR-10
上,1202
层的ResNet
测试误差要高于110
层的ResNet
,表现出明显的过拟合。而1202
层的随机深度网络(结合了ResNet
)的测试误差要低于110
层的ResNet
。神经网络的表达能力主要由网络深度来决定,但是过深的网络会带来三个问题:反向传播过程中的梯度消失、前向传播过程中的
feature
消失、训练时间过长。虽然较浅的网络能够缓解这几个问题,但是较浅的网络表达能力不足,容易陷入欠拟合。
随机深度网络解决这一矛盾的策略是:构建具有足够表达能力的深度神经网络(具有数百层甚至数千层),然后:
在网络训练期间,对每个
mini batch
随机地移除部分层来显著的减小网络的深度。移除操作:删除对应的层,并用跳跃连接来代替。
在网络测试期间,使用全部的网络层。
随机深度的思想可以和
ResNet
结合。因为ResNet
已经包含了跳跃连接,因此可以直接修改。
6.3.1 随机深度
假设
ResNet
有 个残差块,则有: 。其中:- 表示第 个残差块的输出, 为第 个残差块的输入(它也是第 个残差块的输出)。
- 为一组与第 个残差单元相关的权重(包括偏置项), 是残差单元中的层的数量。
- 代表残差函数。
假设第 个残差块是否随机丢弃由伯努利随机变量 来指示:当 时,第 个残差块被丢弃;当 时,第 个残差块被保留。
因此有: 。
对随机变量 ,令:
其中 称做保留概率或者存活概率,它是一个非常重要的超参数。
的选择有两个策略:
所有残差块的存活概率都相同: 。
所有残差块的存活概率都不同,且根据残差块的深度进行线性衰减:
其背后的思想是:靠近输入的层提取的是被后续层使用的低级特征,因此更应该被保留下来。
给定第 个残差块的保留概率 ,则网络的深度 的期望为(以残差块数量为单位): 。
对于均匀存活:
对于线性衰减存活:
当 时,无论是均匀存活还是线性衰减存活,都满足 。因此随机深度网络在训练时具有更短的期望深度,从而节省了训练时间。
的选择策略,以及 的大小的选取需要根据实验仔细选择。
- 根据作者的实验结果,作者推荐使用线性衰减存活概率,并选择 。此时有:
- 如果选择更小的 将会带来更大的测试误差,但是会更大的加速训练过程。
测试时,需要调整残差块的输出: 。
随机深度网络能够大大减少训练时间和测试误差。
训练时间减小是因为:网络训练时,期望深度减小。
测试误差减小是因为:
- 网络训练时期望深度的减少,使得梯度链变短,从而加强了反向传播期间靠近输入层的梯度。
- 随机深度网络可以被理解为一系列不同深度的网络的隐式集成的集成模型。
随机深度网络可以视作 个隐式的神经网络的集成,这些被集成的网络都是权重共享的,类似于
Dropout
。- 在训练时,对每个
mini batch
,只有其中之一得到了权重更新。 - 在测试时,取所有被集成的网络的平均。
- 在训练时,对每个
随机深度网络和
Dropout
都可以被理解为一系列网络的隐式集成。- 随机深度集网络成了一系列具有不同深度的神经网络,而
Dropout
集成了一系列具有不同宽度的神经网络。 Dropout
与BN
配合使用时会失效,而随机深度可以和BN
配合使用。
- 随机深度集网络成了一系列具有不同深度的神经网络,而
- 在随机深度网络中,由于训练时的随机深度,模型的测试误差的抖动相对于
ResNet
会偏大。
6.3.2 网络性能
对
ResNet
(固定深度和随机深度)在三个数据集上进行比较,测试误差的结果如下:+
表示执行了数据集增强。随机深度网络采用 。
CIFAR10/100
采用 110 层ResNet
,ImageNet
采用 152 层ResNet
。虽然在
ImageNet
上随机深度模型没有提升,但是作者表示这是因为网络本身比较简单(相对ImageNet
数据集)。如果使用更深的ResNet
,则容易看到随机深度模型的提升。虽然这里模型的测试误差没有提升,但是训练速度大幅提升。
网络 CIFAR10+ CIFAR100+ ImageNet ResNet(固定深度) 6.41 27.76 21.78 ResNet(随机深度) 5.25 24.98 21.98 在
CIFAR-10
上,ResNet
随机深度网络的深度 、概率 与测试集误差的关系: