ResNext
本人对论文的翻译:翻译
网络对比ResNet
图1. 上图左结构为ResNet的一个block
右结构为ResNext的一个block,cardinality(基数)=32,左右结构复杂度大致相同
ResNext的block图层显示为(channels,filter size,out channels)
ResNext的简单介绍
译文:
我们的方法表明,除了宽度和深度之外,基数(转换集合的大小)是一个具有中心重要性的具体的、可测量的维度。实验表明,增加基数是一种比增加深度或增加宽度更有效的获得准确性的方法,特别是当深度和宽度开始为现有模型带来递减的回报时。
译文:
我们的神经网络,命名为ResNeXt(暗示下一个维度),在ImageNet分类数据集上优于ResNet-101/152[14]、ResNet200[15]、Inception-v3[39]和Inception- ResNet -v2[37]。特别是,101层的ResNeXt能够达到比resnet - 200[15]更好的精度,但复杂度只有50%。此外,ResNeXt展示的设计比所有Inception模型都要简单得多。
ResNeXt是我们提交ILSVRC 2016分类任务的基础,我们在该任务中获得了第二名。本文进一步评估了ResNeXtona largerimagenet - 5kset和COCOobject检测数据集[27],始终显示出比ResNet同类数据集更好的准确性。我们希望ResNeXt也能很好地推广到其他视觉(和非视觉)识别任务。
译文:
表1。(左)ResNet-50。(右)ResNeXt-50和32×4d模板(使用图3©重新构建中的网络结构)。在括号的内部是一个残余块的形状,和括号的外部是堆叠块的数量在一个阶段上。“C=32”建议使用32组分组卷积[24]。这两种模型的参数数和浮点数是相似的。
回顾简单神经元
译文:
人工神经网络中最简单的神经元执行内积(加权和),这是由全连通和卷积层完成的初等变换。内积可以看作是一种聚集变换形式:
∑
i
=
1
D
w
i
x
i
\sum_{i=1}^Dw_ix_i
i=1∑Dwixi
其中
x
=
[
x
1
,
x
2
,
.
.
.
,
x
D
]
x=[x_1,x_2,...,x_D]
x=[x1,x2,...,xD]是神经元的一个具有D通道的输入向量,并且
w
i
w_i
wi是一个卷积核第
i
i
i通道的权重。这个操作(通常包括一些输出非线性)被称为“神经元”。参见图2。
译文:
可以将上述操作重铸为分裂、转换和聚合的组合。
(i)分割:将向量
x
x
x切片为低维嵌入,其中为单维子空间
x
i
x_i
xi。
(ii)变换:对低维表示进行变换,并对其进行简单缩放:
w
i
x
i
w_ix_i
wixi。
这里的低维表示被变换为高维的
w
i
w_i
wi和高维的
x
i
x_i
xi的内积
(iii)聚合:所有嵌入的变换由
∑
i
=
1
D
\sum_{i=1}^D
∑i=1D聚合
聚合转换
译文:
考虑到以上对单个神经元的分析,我们考虑用更一般的函数代替初等变换(
w
i
x
i
w_ix_i
wixi),它本身也可以是一个网络。与原来增加深度维度的“网络中的网络”[26]相比,我们的“神经元中的网络”沿着一个新的维度扩展
形式上,我们将聚合转换表示为
F
(
x
)
=
∑
i
=
1
C
T
i
(
x
)
F(x)=\sum_{i=1}^CT_i(x)
F(x)=i=1∑CTi(x)
其中
T
i
(
x
)
T_i(x)
Ti(x)可以是任意函数。类似于一个简单的神经元,
T
i
T_i
Ti应该将
x
x
x投影到一个(可选的低维)嵌入,然后将其转换
译文:
在Eqn.(2)中,
C
C
C是要聚合的转换集合的大小。我们把C称为基数[2]。在Eqn.(2)中C的位置与Eqn.(1)中的D相似,但C不必等于D,可以是一个任意的数。虽然宽度的维度与简单转换(内积)的数量有关,但我们认为基数的维度控制更复杂转换的数量。我们通过实验表明基数是一个基本的维度,可以比宽度和深度的维度更有效。
译文:
在本文中,我们考虑了一种简单的设计变换函数的方法:所有的
T
i
T_i
Ti具有相同的拓扑。这扩展了vgg风格的策略,即重复相同形状的层,这有助于隔离一些因素并扩展到任何大量的转换。我们将个别的转换
T
i
T_i
Ti设置为瓶颈型架构[14],如图1(右)所示。在本例中,每个
T
i
T_i
Ti中的第一个1×1层产生低维嵌入
译文:
图3.等价的ResNext的构建块。
(a):聚合的残差变换,与图1右部分相同
(b):相当于(a)的一个块,实现为提前串联
(c):等价于(a,b)的一个块,实现为分组卷积
粗体文本的符号将突出显示重新构建的改变。一个层表示为(input channels,filter size,output channels)
Eqn.(2)中的聚合变换作为残差函数(图1右):
y
=
x
+
∑
i
=
1
C
T
i
(
x
)
y=x+\sum_{i=1}^CT_i(x)
y=x+i=1∑CTi(x)
其中
y
y
y是输出
与Inception-ResNet的关系.
一些张量处理表明,图1(右)中的模块(图3(a)中也展示了)等价于图3(b)。图3(b)与Inception-ResNet[37]的块相似,它在残差函数中涉及分支和串联。但与所有Inception或Inception- resnet模块不同的是,我们在多个路径之间共享相同的拓扑结构。我们的模块需要最少的额外努力设计每个路径。
与分组卷积的关系。使用分组卷积[24].4的表示法,上面的模块变得更加简洁。图3©说明了这种重新构建的结构。所有的低维嵌入(第一个1×1层)都可以用一个更宽的单一层代替(如图3©中的1×1, 128-d)。分裂本质上是由分组卷积层完成的,当它把输入通道分成组时。图3( c)中的分组卷积层进行了32组卷积,其输入和输出通道为四维。(这里将输入128通道分为32组,每组4个通道)
分组的卷积层将它们串联起来作为层的输出。图3©中的区块与图1(左)中的原始瓶颈剩余区块相似,但图3©是一个较宽但连接稀疏的模块。
译文:
上图左右两边的结构是等价的。
ResNext原理解释
在此之前,要了解到卷积神经网络参数个数计算的方式:卷积神经网络参数个数的计算
原理的入门解释:ResNeXt网络结构-解析视频
ResNext原理基于Inception的结构,但ResNext的残差卷积块分离都是同一尺度卷积,Inception的分离基于不同尺度的卷积,实际Inception在运行时在加入ResNet前训练效果非常好,是基于不同尺度的卷积模块的设计得到的,加入ResNet改进后训练效果的提升只体现在速度上,最终的结果没有特别明显的改进。而这里ResNext将原本Inception不同尺度的卷积修改成相同尺度的卷积,实际上丢失很多不同尺度的特征融合,但方便了GPU加速训练(相同尺度参数一致),总体来说Xception的结构很强大,只是不方便GPU加速,这里主要讲ResNext的结构。
分组卷积原理
操作解析
图(a)分析:
- 第一卷积层256通道的输入,用128个1x1大小,256通道的卷积核进行卷积,最终得到128通道的输出,将这些输出按通道分为32组,每组输出为4个通道输送到第二卷积层(与分组前输出128通道数据相同,只是将输出分组输出,没有改变输出性质)
- 第二卷积层在未分组前接收128通道的输入,用128个3x3大小,128通道的卷积核进行卷积,最终得到128通道的输出。改进后,将这些接收输入的128个的卷积核分为32组,每组4个卷积核,每组接收输入只接收一组4通道的输入,一 一对应。最后每组卷积后输出4通道的数据输入到第三卷积层
- 第三卷积层接收128通道的输入,用256个1x1大小,128通道的卷积核进行卷积,最终得到256通道的输出。这里第三卷积层的输入为32组4通道的输入,原先要用256个128通道的1x1大小的卷积核进行卷积,现在将卷积核的通道分为32组(注意这里不是将卷积核分组,而是将卷积核的通道分组),再用256个1x1大小,4通道的卷积核分别进行卷积。注意这一层对每一组输入数据进行的卷积使用的卷积核是这一层的所有卷积核,即256个卷积核。(看似分组,实际没有分组,等价于用所有的卷积核对每一组4通道输入数据进行卷积,最后聚合这32组卷积后得到的256通道输出,这里主要分组的是第二卷积层)最后每个卷积核组都输出了256通道的数据,但是数据还没有累加起来(正常的卷积操作是卷积核对输入数据的所有通道进行卷积后的数据要累加起来),这里数据都分散了,分散成32组,所以输出是32组经过256个卷积核得到的32组分散的待聚合的256通道的数据。
- 聚合,对第三卷积层的输出进行聚合操作: F ( x ) = ∑ i = 1 C T i ( x ) F(x)=\sum_{i=1}^CT_i(x) F(x)=∑i=1CTi(x),得到整个残差块的输出。
- 将残差块和恒等捷径连接的输出聚合在一起: y = x + ∑ i = 1 C T i ( x ) y=x+\sum_{i=1}^CT_i(x) y=x+∑i=1CTi(x)
图a,b,c其实是等价的,图(b)实际上唯一的改动就是:对第二卷积层到第三卷积层加一个concatenate层,对第二卷积层输出进行拼接,再输入到第三卷积层,相比图(a),相当于把聚合操作提前了一层,输出等价。
图( c )的描述更简单,隐藏了这些操作,只显示了分组卷积。
原理解释
我们知道,卷积神经网络的参数数量是:
i
n
_
c
h
a
n
n
e
l
s
×
f
i
l
t
e
r
_
s
i
z
e
×
o
u
t
_
c
h
a
n
n
e
l
s
in\_channels\times filter\_size\times out\_channels
in_channels×filter_size×out_channels
对于
n
n
n个
k
×
k
k\times k
k×k大小的卷积核,对
C
i
n
C_{in}
Cin通道的输入进行卷积时,网络的的参数为:
k
×
k
×
C
i
n
×
n
k \times k\times C_{in} \times n
k×k×Cin×n
由上图的分组卷积可知(第二卷积层为分组卷积层),为方便讨论,假设分为g组,经过分组后,原本
n
n
n个卷积核被分为了
g
g
g组,每组有
n
g
\frac{n}{g}
gn个卷积核。第一卷积层的输出原本是
C
i
n
C_{in}
Cin通道,经过分组后,被分为
g
g
g组
C
i
n
g
\frac{C_{in}}{g}
gCin通道的输出。由此可知,在第二卷积层,每组的参数数量为:
k
×
k
×
C
i
n
g
×
n
g
k \times k\times \frac{C_{in}}{g} \times \frac{n}{g}
k×k×gCin×gn
因此第二卷积层的所有组的参数数量加起来为:
(
k
×
k
×
C
i
n
g
×
n
g
)
×
g
(k \times k\times \frac{C_{in}}{g} \times \frac{n}{g})\times g
(k×k×gCin×gn)×g
即
k
×
k
×
C
i
n
×
n
×
1
g
k \times k\times C_{in} \times n\times \frac{1}{g}
k×k×Cin×n×g1
个人理解:看到这,分组卷积针对的主要是对卷积核的分组,对卷积核通道的分组是次要的(卷积核通道分组后不影响整体结果,卷积核通道的分组是为了适配卷积核分组后的卷积操作)这里分组卷积之所以会减少参数,是因为卷积核分组前
n
n
n个卷积核要对
C
i
n
C_in
Cin通道的输入进行卷积。分组后,
n
g
\frac{n}{g}
gn个卷积核只需对
C
i
n
g
\frac{C_{in}}{g}
gCin个通道进行卷积,无需对其他通道进行卷积,从这里可看出参数减少了是由于卷积核减少了对通道的卷积次数。
注意:以上的参数数量计算公式并不严谨,因为上述公式是基于带有偏置的卷积神经网络参数数量,而实际实现的时候因为网络带有
B
a
t
c
h
N
o
r
m
a
l
i
z
a
t
i
o
n
Batch Normalization
BatchNormalization没有使用偏置,参数的数量计算公式有出入,上述公式仅供理解用,具体参数数量的计算还得按照实际网络运用计算。
由此可见分组卷积降低了参数的数量,但这样的分组卷积结构相比普通的卷积结构有何不同?参数数量减少会不会丢失一些特征?见如下分析
这里讲以下卷积核的分组降低了参数数量后的情况。
上面提到分组后, n g \frac{n}{g} gn个卷积核只需对 C i n g \frac{C_{in}}{g} gCin个通道进行卷积,无需对其他通道进行卷积,从这里可看出参数减少了是由于卷积核减少了对通道的卷积次数。这里就可以看出卷积核没有对一些通道进行卷积,得到的最后结果相比分组前的卷积肯定是不同的,至于为何这个结构比之前的结构能得到好的结果,这里论文作者是基于Inception改进的,也就是GoogleNet,详情请看GoogleNet的论文。
InceptionV1,V2,V3,V4,Xception论文中对上述ResNext卷积核分组的一些解释
Inception的V2V3论文:Rethinking the Inception Architecture for Computer Vision中有说道(如上图),一个总体的原则中的第3个说明了上述原理的一些假设,并且基于该假设进行了实验,并且也得到了相对好的结果,说明了该结构的有效性,当然这只是从实验方面来验证,确实效果好,理论的验证作者没有解释太多,更多地解释是描述性的。
如想了解更多请移步Inception论文系列:
- InceptionV1-Going Deeper with Convolutions-GoogLeNet
- InceptionV2V3-Rethinking the Inception Architecture for Computer Vision
- Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning
- Xception: Deep Learning with Depthwise Separable Convolutions
Xception提出一种深度可分离卷积的模式,可以将训练的参数减少非常多,关于深度可分离卷积可参考以下博客的解释,解释得非常全面:各种卷积层的理解(深度可分离卷积、分组卷积、扩张卷积、反卷积)
这里讲一下卷积核通道的分组为何不影响结果,如图(a)中第三卷积层卷积操作及输出聚合的过程,该分组卷积前后的结果是等价的。
正常卷积操作流程如上图
分组卷积之后入上图,两者结果相同,参数数量也一致。
论文一些理解的问题
这里右图说比左图要宽
我个人理解:如下图所示
左图要比右图长
下一步的计划
研究特征金字塔用于目标检测的论文,yolov1论文,以及RCNN论文。