Swin Transformer

https://www.bilibili.com/video/BV13L4y1475U

swin Transformer是一个用了移动窗口的层级Transformer

作者来自MSRA微软亚洲研究院。resnet也是在这里完成的。这里阅读的版本是8.17号作者重新上传的版本。

概要

这篇论文提出了一个新的vision Transformer。它可以被用来做计算机视觉领域一个通用的骨干网络。Vit论文中只是做了分类任务,没有说明检测和分割任务。因此在vit之后大家并不确定Transformer能否完成所有的视觉任务。Swin Transformer就做了这一个工作。但是直接把Transformer用到视觉领域中是存在挑战的,其中一个是尺度(人在图片中可大可小,但是nlp就没有这个问题),另一个问题是分辨率,如果我们要以像素点作为基本单位的话,这个序列的长度就会变得非常长。所以后续的工作要么是用特征图来当做Transformer的输入,要么就是把图片打成patch来减少分辨率。swin Transformer中的特征是通过移动窗口来进行学习的。移动窗口不仅带来了更高的效率。自注意力是在窗口内进行计算的,大大降低了序列长度。通过移动的操作让相邻的窗口有了交互。上下层之间可以有跨窗口的关系,从而达到全局建模的能力。这种层级结构的好处是提供各个尺度的特征信息,同时因为自注意力是在小窗口内进行计算的。计算复杂度是随着图像大小而线性增长。而不是平方级增长。因为swin Transformer拥有类似CNN一样分层的结构,有了多尺度的特征,所以很容易迁移到下游任务中。所以作者不仅在分类问题,还在物体分割问题上得到了良好的表现。比最好的成绩提升了3个点(1个点都能发论文了)。所以它在视觉领域非常有用。对于MLP的这种架构shifted window的方法也能提升性能。

引言

作者在这里是想证明Transformer可以作为通用的骨干网络。

右边的是vision transformer,作为对比vit做的事情是:每次transformer看到的token都是16倍的下采样率。但是这样的话对于多尺寸特征的把握能力就会弱一些。对于视觉任务,特别是目标检测和分割来说,多尺寸的把握能力是非常重要的。

对于目标检测任务,之前最流行的是FPN。每一次卷积操作带来的感受野是不一样的。如何捕捉物体在不同尺寸的特征,从而处理不同尺寸的问题。在unet中,为了处理物体不同尺寸的问题。在U-net中每次拿取特征不仅从之前expansive path拿取,还从对应的contracting path进行特征提取。

但是在vit中处理的特征都是单一尺寸的低分辨率特征。可能不适合用来处理密集预测形的任务。而且对于vit来说它的操作始终是在最大的窗口上进行的。所以它的复杂度是和图像成平方的增长的。随着分辨率越来越高,性能会显著下降。swin transformer选择在小窗口内计算自注意力,而不是和vit一样在整图上算自注意力。这样只要窗口大小是固定的。自注意力的计算复杂度就是固定的。只会和图片成线性增长的关系。这利用了卷积神经网络中局部性的先验知识-同一个物体的不同部位,或者语义相近的不同物体大概率会出现在相邻的地方。所以即便在小范围的窗口内算自注意力也是够用的。那么如何生成多尺度的特征呢?卷积神经网络为什么有多尺度的特征呢?因为有池化这个操作。池化能够增大卷积核能够看到的感受野。从而使得每次池化后的特征可以抓住物体不同的尺寸。相同的swin transformer也提出了一个类似于池化的操作叫做patch mergeing,把相邻的小patch合并成大patch。合并的大patch就能看到之前四个小patch看到的内容。也就增大了感受野并捕捉多尺度的特征。swin最开始的patch是4x4大小的。因此swin transformer可以当做通用的骨干网络,而不单是图像分类。

swin transformer的关键就是移动窗口的操作。上图主要是讲解shift操作是如何完成得的。swin中默认每个窗口有7x7=49个小patch。第二张图可以看做第一张图的窗口像左上角移动俩个patch。这样的话窗口与窗口之间就可以进行互动了。如果我们按照原来的方式,窗口之间都是不重叠的。如果每次操作只是在小窗口内进行就达不到使用transformer的初衷了(更好的理解上下文,但窗口是不重叠的)。这样窗口之间就可以交互了。加上之后提出的mergeing操作,就可以达到一个全局自注意力的功能了。

模型架构

比如我们一张224x224X3的图片,第一步就是和vit一样吧图片打成patch。在swin Transformer中patch是4x4。得到的就是56x56x48,这里的56就是224/4,这个48是因为4x4x3=48。然后进行线性的嵌入,将向量的维度变为预先设置好的值。在swin中这个超参数为C默认是96。经过了这里之后输入的尺寸变为了56x56x96=3136x96(前面的维度被拉直了)。在这一部分和vit没什么区别,但是这个大小还是太大了。作者在这里提出了patch merging的操作,把临近的小patch下采样为大patch已实现下采样的效果。

比如要下采样俩倍就会隔一个点采一个样本。这样我们原来的一个张量就变成了四个张量。尺寸缩小一杯,堆叠四次(相当于用空间维度换通道数)。为了只让通道数翻倍而不是四倍,这里使用了1x1的卷积去降维通道数。最后的结果是空间大小减半通道数x2。

传统的卷积神经网络(CNN)设计中,随着网络层数的增加,空间尺寸逐渐减小而通道数逐渐增多的原因主要是为了在特征表达的丰富性和计算效率之间取得平衡

swin中没有像vit中使用cls token。而是得到最后的输出之后用了全局平均池化(图中并没有展现,因为只有分类任务才会用)。swin中只会在一个窗口中进行注意力的计算。

窗口自注意力

窗口之间无法通信会限制全局建模的能力。我们最好还是能让窗口之间通信。作者就提出了移动窗口的方式。所以swin中先算一次窗口自注意力,再算一次移动窗口自注意力。

图中的ln是(layer normalization)层归一化,然后是窗口自注意力。然后经过ln和nlp。之后的操作块和前面一样但是要做移动自注意力。

论文中使用的是绝对位置编码而不是相对位置编码。

为了提高计算效率还采用了掩码的方式。

窗口移动有一个问题,图中2x2的窗口变成了3x3的窗口,增大了计算量。理论上可以直接padding成相同大小,但是这也增加了计算量。

作者这里进行了循环移位。

但是这样导致相邻的像素挨在一起。因此他们之间不应该做自注意力操作。添加掩码做自注意力计算之后,再把循环位移还原回去。保证图片整体的相对信息和语义是不变的。

掩码的操作简单来说就是当对和自己原来位置不相邻的图片像素做自注意力的时候,可以把对应矩阵乘法的结果给mask掉。作者具体mask掉的方式是,取一个预定义好的矩阵,然后和结果的矩阵相加。需要掩码掉的部分设置为很大的复数。俩个矩阵相加之后经过softmax就会变成0了。

Last modification:November 14, 2024
如果觉得我的文章对你有用,请随意赞赏