文章目录
一、Vision Transformer
1. ViT 模型架构
根据VIT模型的网络结构,我们将模型分为3个部分:
- Embedding 层(Linear Projection of Flattened Patches)
- Transformer Encoder层
- MLP Head(最终用于分类的层结构)
首先,输入一张图片,然后将图片分成一个个patches。如对于模型VIT-L/16,这里的16代表每个patches的大小是16x16的。
其次,将每一个patches输入到Embedding层(Linear Projection of Flattened Patches),通过Embedding层之后,可以得到一个个向量称为Token,每个Patch对应得到一个Token。在Token最前面增加了一个带*的Token,专门用来分类的class token。
接下来,需要增加一个位置信息Position Embedding,即对应上图Embedding层得到的0~9标识的向量。
然后,将得到的一系列Token输入到Transformer Encoder中,网络将Encoder Block重复堆叠L次。
最后,将class token的所对应的输出,输入到MLP Head中,得到我们最终的分类结果。
2. 每个模块详解
(1)Embedding 层
对于标准的Transformer模块,要求输入的是token向量序列,即二维矩阵[num_token,token_dim]
在代码的实现中,直接通过一个卷积层来实现。以VIT-B/16为例,使用卷积核大小为16x16,stride为16,卷积核个数为768(对应token的维度):
- 对输入为224 x 224 x 3的图片,经过卷积后得到14 x 14 x 768的特征矩阵,然后将宽高纬度信息展平,得到输出特征矩阵196 x 768,对应的是196个纬度为768的token。
- 紧接着加上一个class token,通过初始化一个可训练的参数,纬度为1x768。与将图片的patches通过embedding层之后得到196x768的特征矩阵进行concate拼接,得到197x768的特征矩阵。
- 将得到的特征矩阵输入Transformer Embedding之前,需要叠加一个Position Embedding,纬度为197 x 768 。
如果不是用 Position Embedding 得到的结果是 0.61382,使用一维的位置编码得到的结果是0.64206,明显比不使用位置编码高了三个百分点。
论文中提到,假设输入图片大小为224 x 224,patches的大小为32, 会得到7x7个token,在每个token上会加一个Position Embedding。训练得到的位置编码与其他位置编码之间的余弦相似度如下图所示,可以看出位置编码与它所在行和列的余弦相似度比较大。
(2)Transformer Encoder层
Transformer Encoder就是将我们的Encoder Block重复堆叠L次。
将Embedding层的输出经过Layer Norm层归一化,紧接着通过Mutli-Head Attention,然后通过dropout层或者DropPath层(DropPath的效果会更好),得到的输出与捷径分支的输出进行Add相加操作。再将输出通过Layer Norm、MLP Block、Dropout/DropParh一系列操作的输出与捷径分支的输出进行Add相加操作。
其中,MLP Block是通过全连接层,GELU激活函数,Dropout,全连接层以及最后Dropout层得到输出。
(3)MLP Head层
提取出[class]token生成的对应结果,即[197, 768]中抽取出[class]token对应的[1, 768],便可通过MLP Head得到最终的分类结果。
注意:训练ImageNet21K时是由 Linear+tanh激活函数+Linear ;但是迁移到ImageNet1K上或者自己的数据上时,只有一个 Linear。
3. Hybrid混合模型
Hybrid混合模型,就是将传统CNN特征提取和Transformer进行结合。
- R50的卷积层采用的StdConv2d 不是传统的Conv2d
- 将所有的BatchNorm层替换成 GroupNorm层
- 把stage4中的3个Block移至 stage3中
通过R50 Backbone进行特征提取后,得到的特征矩阵shape是[14, 14, 1024],接着再输入Patch Embedding层,注意Patch Embedding中卷积层Conv2d的kernel_size和stride都变成了1,只是用来调整channel。
二、Swin Transformer
Swin Transformer与Vision Transformer对比:
- Swin Transformer使用了类似卷积神经网络中的层次化构建方法,特征图尺寸中有对图像下采样4倍的,8倍的以及16倍的,有助于在此基础上构建目标检测,实例分割等任务;
- 在Swin Transformer中使用了W-MSA的概念,在4倍下采样和8倍下采样中,将特征图划分成了多个不相交的区域,并且Multi-Head Self-Attention只在每个窗口内进行,这样能够减少计算量。
1. 网络整体框架
如图a,假设输入一张[H, W, 3]的RGB三通道图片,首先通过Patch Partition模块,图像shape变成了 [H/4, W/4, 48],接下来依次通过通过四个Stage构建不同大小的特征图,除了Stage1中先通过一个Linear Embeding层外,剩下三个stage都是先通过一个Patch Merging层进行下采样。然后都是重复堆叠Swin Transformer Block。注意,每下采样两倍,channel会进行一次翻倍操作。
如图b,Block有两种结构,这两种结构的不同之处仅在于一个使用了W-MSA结构,一个使用了SW-MSA结构。而且这两个结构是成对使用的,先使用一个W-MSA结构再使用一个SW-MSA结构。所以你会发现堆叠Swin Transformer Block的次数都是偶数。
2. Patch Merging
假设输入Patch Merging的是一个4x4大小的单通道特征图,以2x2大小划分为每一个patch,取出每个patch中相同位置(同一颜色)像素,拼在一起得到4个特征矩阵。接着将这四个特征矩阵在channel深度方向进行concat拼接,然后在通过一个LayerNorm层。最后通过一个全连接层,对每一个像素的深度方向进行一个线性映射,将特征矩阵的深度由C变成C/2,此时得到的结构就是Patch Merging输出的特征图。
由此可知,通过Patch Merging层后,feature map的高和宽会减半,深度会翻倍。
3. W-MSA
普通的Multi-head Self-Attention(MSA)模块,对于feature map中的每个像素(或称作token,patch)在Self-Attention计算过程中需要和所有的像素去计算。
在使用Windows Multi-head Self-Attention(W-MSA)模块时,首先将feature map按照MxM(例子中的M=2)大小划分成一个个Windows,然后单独对每个Windows内部进行Self-Attention。
- 目的:减少计算量
- 缺点:窗口之间无法进行信息交互
两者的计算量对比:
4. SW-MSA
采用W-MSA模块时,只会在每个窗口内进行自注意力计算,所以窗口与窗口之间是无法进行信息传递的。为了解决这个问题,引入SW-MSA模块,即进行偏移的W-MSA。
根据左右两幅图对比能够发现窗口发生了偏移可以理解成窗口从左上角分别向右侧和下方各偏移了
⌊
M
2
⌋
\left \lfloor \frac {M} {2} \right \rfloor
⌊2M⌋个像素。
通过将窗口进行偏移后,由原来的4个窗口变成9个窗口了。再对每个窗口内部进行MSA,则增大了计算量,进而提出了Efficient batch computation for shifted configuration,一种更加高效的计算方法。
5. Relative position bias相对位置偏置
假设输入的feature map高宽都为2,首先可以构建出每个像素的绝对位置(左下方的矩阵),对于每个像素的绝对位置是使用行号和列号表示的。
再看相对位置索引。例如蓝色的像素,在蓝色像素使用q与所有像素k进行匹配过程中,是以蓝色像素为参考点。然后用蓝色像素的绝对位置索引与其他位置索引进行相减,就得到其他位置相对蓝色像素的相对位置索引。
同样方法也能得到相对黄色、红色以及绿色像素的相对位置索引矩阵。接下来将每个相对位置索引矩阵按行展平,并拼接在一起可以得到下面的4x4矩阵 。
首先在原始的相对位置索引上加上M-1(M为窗口的大小,M=2),加上之后索引中就不会有负数了。接着将所有的行标都乘上2M-1。最后将行标和列标进行相加。这样即保证了相对位置关系,而且不会出现上述0 + ( − 1 ) = ( − 1 ) + 0的问题了。
真正使用到的可训练参数
B
^
\hat{B}
B^ 是保存在relative position bias table表里的,这个表的长度是等于
(
2
M
−
1
)
(
2
M
−
1
)
×
(
2
M
−
1
)
(2M-1)(2M−1)×(2M−1)
(2M−1)(2M−1)×(2M−1)的。那么上述公式中的相对位置偏执参数B是根据上面的相对位置索引表根据查relative position bias table表得到的,如下图所示。
三、ConvNeXt
作者首先利用训练vision Transformers的策略去训练原始的ResNet50模型,发现比原始效果要好很多,并将此结果作为后续实验的基准baseline。接下来实验包含以下部分:
1. Macro Design
(1)改变阶段计算比率。在Swin Transformer中,stage3堆叠block的占比更高。将ResNet50中的堆叠次数由(3, 4, 6, 3)调整成(3, 3, 9, 3),和Swin-T拥有相似的FLOPs。用计算规模增大的代价换来了准确率的提升
(2)更改stem。Swin-T 网络中的 stem 层为一个卷积核大小为 4,步距为 4 的卷积层,而经典的 ResNet50 的 stem 层是由一个卷积核大小为 7,步距为 2 的卷积层加一个核大小为 3,步距为 2 的最大池化层构成的。因此,ConvNeXt 网络将 stem 层换成了与 Swin-T 网络相同的卷积核大小为 4,步距为 4 的卷积层,其准确率和 GFLOPs 均有少量的进步。
2. ResNeXt-ify
ResNeXt相比普通的ResNet而言在FLOPs以及accuracy之间做到了更好的平衡。这里作者采用的是更激进的depthwise convolution,即即group数和通道数channel相同。在牺牲部分准确度的前提下大幅度的减少网络的参数规模。
3. Inverted bottleneck
Transformer 网络当中的 MLP 模块与 MobileNet V2 中的 Inverted Bottleneck 模块类型,均是“两头细,中间粗”的反瓶颈结构。因此,ConvNeXt 网络也参照设计了一个类似的 Inverted bottleneck 结构,见下图所示。
图a是ReNet中采用的Bottleneck模块,图b是MobileNetV2采用的Inverted Botleneck模块,图c是ConvNeXt采用的是Inverted Bottleneck模块。
4. Large Kernel Sizes
(1)depthwise conv模块上移。由于 Transformer block 中的 MSA (Multi-head Self-Attention) 是在 MLP 模型之前的,而 MSA 与 depth-wise convolution 类似,因此 depth-wise conv 也应该在 1×1 的卷积之前,也就是将 depth-wise conv 上移。那么1x1 conv -> depthwise conv -> 1x1 conv就变成了depthwise conv -> 1x1 conv -> 1x1 conv。即上图的 © 部分。通过上移 depth-wise conv,网络的参数规模和准确率均有一定程度的降低。
(2)增加卷积核大小。将depthwise conv的卷积核大小由3x3改成了7x7(和Swin Transformer一样),网络的准确率和参数规模达到最优,其准确率的提升已经达到饱和。
5. Various Layer-wise Micro Designs
(1)将ReLU 替换成GELU。传统的 CNN 网络中通常使用 RELU 作为网络的激活函数,而目前 Transformer 类型的网络主流上采用 GELU 激活函数。因此 ConvNeXt 网络将 RELU 替换为更常用的 GELU 激活函数,使网络的性能有微弱的提升。
(2)使用更少的激活函数。Swin-T 网络的每一个 Swin Transformer Block 中均只含有一个激活函数,因此受 Swin-T 的启发,ConvNeXt 网络减少了激活函数的使用,每个块只使用一个激活函数,部署在在第二层之后。使得准确率由 80.6% 上升到 81.3%,增加了 0.7%。
(3)使用更少的Normalization。同样在Transformer中,Normalization使用的也比较少,接着作者也减少了ConvNeXt Block中的Normalization层,只保留了depthwise conv后的Normalization层。此时准确率已经达到了81.4%,已经超过了Swin-T。
(4)将BN全部替换成LN。
(5)单独的下采样层。参考 Swin-T 网络中的 Patch Merging 模块,ConvNeXt 网络单独设计了一个下采样层对特征进行单独的下采样操作。通过一个Laryer Normalization加上一个卷积核大小为2步距为2的卷积层构成。更改后准确率就提升到了82.0%。
每个方案对最终结果的影响如下图所示:
新网络在同样的参数规模下,其准确率由 Swin-T 网络的 81.3% 提升至 82.0%,提升了大约 0.7%,这表明 CNN 网络在图像识别和分类领域仍然能够达到有竞争力的性能表现。