论文:https://arxiv.org/pdf/2107.00652.pdf
代码:https://github.com/microsoft/CSWin-Transformer
目前,基于transformer的方法在 CV 领域基本实现了和CNN相当的效果,其好的效果来源于内部多头自注意力机制对远距离依赖的建模能力,这对以高分辨率数据作为输入的下游方法(检测、分割等)都很有帮助。但另外,由于 Transormer 结构是全注意力结构,计算量很大。
其他 transformer 的问题所在:
本文 CSwin:
CSwin 和 Swin 的不同:
CSwin 和 Swin 的相同:
为了提高速度,一个典型的方法是限制 attention 计算的区域,也就是进行 local/windowed attention,为了建立不同 window 之间的联系,一些作者使用转移window的方法来实现。但是这些方法随着深度的增加,感受野的大小提升的很慢,并且需要堆叠更多的 blocks 来实现全局的attention。但是,下游的任务往往都需要足够大的感受野,所以,如果在获得大的感受野的同时来保证计算量较低是很重要的。
本文作者提出了一种名叫 Cross-Shaped Window (CSwin) self-attention,作者并行的进行垂直和水平两个方向的 self-attention 计算。 如图1所示。
CSWin Transformer Block 和其他基于多头 self-attention 的 transformer 结构的不同:
本文作者提出了一种名叫 Cross-Shaped Window (CSwin) self-attention,作者并行的进行垂直和水平两个方向的 self-attention 计算。 如图1所示。
如何得到stripe:通过把输入特征切成等宽的stripes来得到
stripe 的宽度非常重要:因为该宽度决定了本文算法的模型建模能力和计算速度的平衡
作者如果确定切分的宽度:通过网络的宽度来确定,即浅层的宽度小,深层的宽度大。
如何并行进行水平和垂直的 attention 计算:
作者将多头注意力分成并行的 groups,并且对不同的 group 使用不同的 self-attention 操作方式。
这种并行的机制没有引入额外的计算量,并且能够提高参与self-attention计算的面积。
Horizontal and Vertical Stripes:
对于水平 stripe self-attention,输入 X 被均分成无重叠的水平 stripe,宽度都为 s w sw sw,每个 stripes 包含 s w × W sw \times W sw×W 个 token,此处 s w sw sw 为 stripe 的宽度,且可以用来平衡模型学习效果和计算复杂度。
假设第 k 个 head 的 q/k/v 维度都为 d k d_k dk,则第 k 个 head 的水平 stripes self-attention 的输出为:
假设图像没有带方向的偏置,作者将 K 个 heads 分成两个 group,每个 group 有 K / 2 K/2 K/2 个heads,第一个 group 进行水平 stripe self-attention,第二个 group 进行垂直 stripe self-attention,最后将两者的输出进行 concat。
计算复杂度分析:
CSWin 的计算复杂度如下:
Locally-Enhanced Positional Encoding
由于 self-attention 是对排列方式不敏感的,会忽略 2D 图像的位置信息。
现有的很多方法都为了把位置信息加回来而做了很多工作:
假设不同 value v i v_i vi 和 v j v_j vj 之间的边缘可以用向量 e i j v ∈ E e_{ij}^v \in E eijv∈E 来表示,则:
如果计算 E 中的所有关联信息,则计算量很大,作者假设对应特定的元素,最重要的位置信息来源于其周围的邻域,所以作者提出了一种 locally-enhanced positional encoding(LePE),并且联合深度可分离卷积来作用于 value V V V:
由上述的 self-attention 机制和 position embedding 机制组成的 CSWin Transformer block 的形式如下:
为了更好的和其他 Transformer baseline 进行对比,作者建立了 CSWin 的不同变体,这些变体的不同在于改变了base channel 的通道数和 transformer block 的个数,如表 1 所示:
在所有变体中,每个 MLP 的 expansion ratio 都为4
前三个变体的 4 个stage 的 head 个数都为 2,4,8,16,最后一个变体的 head 数为 6,12,24,48。
作者在 ImageNet,COCO,ADE20K上分别做了分类,检测,分割的实验。