Swin Transformer
(2021.3.25)微软
和PVT思想类似,提出了一种包含滑窗操作,具有层级设计的Swin Transformer。
解读:https://zhuanlan.zhihu.com/p/367111046
论文地址:https://arxiv.org/pdf/2103.14030.pdf
开源代码:https://github.com/microsoft/Swin-Transformer
问题
目前Transformer应用到图像领域主要有两大挑战:
- 视觉实体变化大,在不同场景下视觉Transformer性能未必很好
- 图像分辨率高,像素点多,Transformer基于全局自注意力的计算导致计算量较大
其中滑窗操作包括不重叠的local window,和重叠的cross-window。将注意力计算限制在一个窗口中,一方面能引入CNN卷积操作的局部性,另一方面能节省计算量。
方法
Patch Partition
Patch Partition在源码中对应patch embedding,将图片切成一个个不重叠的图块,并嵌入到Embedding。
具体是对原始图片裁成一个个 patch_size * patch_size的窗口大小,然后进行嵌入。这里通过二维卷积层,将stride,kernelsize设置为patch_size大小。设定输出通道来确定嵌入向量的大小。(同PVT)
Linear Embedding
与Vit的positional embedding中一样,默认采用学习(训练的)的1-D positional embedding,在输入transformer的encoder之前直接将patch embeddings和positional embedding相加。
#Vit分类
# 这里多1是为了后面要说的class token,embed_dim即patch embed_dim
self.pos_embed = nn.Parameter(torch.zeros(1, num_patches, embed_dim))
# patch emded + pos_embed
x = x + self.pos_embed
Patch Merging
在每个Stage开始前做降采样,用于缩小分辨率,调整通道数进而形成层次化的设计,同时也能节省一定运算量。
每次降采样是两倍,因此在行方向和列方向上,间隔2选取元素。然后拼接在一起作为一整个张量,最后展开。此时通道维度会变成原先的4倍(因为H,W各缩小2倍),此时再通过一个全连接层再调整通道维度为原来的两倍。
Swin transformer block
传统的Transformer都是基于全局来计算注意力的,因此计算复杂度十分高。Swin Transformer将注意力的计算限制在每个窗口内,进而减少了计算量。计算公式如下
A t t e n t i o n ( Q , K , V ) = S o f t m a x ( Q K T d + B ) V Attention(Q,K,V)=Softmax(\frac{QK^T}{\sqrt{d}}+B)V Attention(Q,K,V)=Softmax(dQKT+B)V
主要区别是在原始计算Attention的公式中的Q,K时加入了相对位置编码。后续实验有证明相对位置编码的加入提升了模型性能。
Window Attention是在每个窗口下计算注意力的,为了更好的和其他window进行信息交互,Swin Transformer还引入了shifted window操作。通过对特征图移位,并给Attention设置mask来间接实现的。能在保持原有的window个数下,最后的计算结果等价。