本文用于记录自己在学习Swin Transformer中理解,方便日后复习,文章中所使用图片全部来自于参考文章中所列文章或视频,仅用于个人学习使用。
Swin Transformer
Compare Vit and Swin-Transformer
Swin-Transformer具有层次性,随着层次加深,高宽减小,而Transformer是直接下采样16倍,之后保持不变;
Swin-Transformer是将特征图分割,并且没有重叠,而transformer中没有分割(可以降低参数量 );
Swin transformer network
每经过一个stage,宽和高下采样两倍,但是channel也会扩大两倍。
Patch Partition和Linear Embedding(包含Layer Norm)都可以通过卷积层完成
每个Swin Transformer Block都是重复偶数次,因为每个Swin Transformer Block中都是右侧两个Block重复使用(将多头自注意力MSA替换为W-MAS和SW-MAS。
Patch Partition
将一个通道上的内容,用patch_size为4*4进行分割,然后在通道维再进行展平,
Patch Partition和Linear Embedding(包含Layer Norm)都可以通过卷积层完成。
Patch Merging
以4 * 4 * 1图像为例,窗口大小为2 * 2,会将每个窗口的第i个元素取出来,然后在通道方向堆叠。并在通道方向进行layer nrom。相比输入,长宽缩小二倍,通道扩大二倍。
W-MSA
MSA是对特征图中的每个像素计算与其它像素之间的QKV,而W-MS A是对每个窗口中的每个像素计算QKV,而窗口和窗口之间没有任何交互。窗口之间无法进行交互会导致感受野变小,无法看到全局视野。
Shifted Windows MSA
实现不同窗口之间的信息交互,如果layeri用的MSA,那么layeri+1就要用SW-MSA。
其实就是将每个window向右、向下移动两个像素,这样再次划分的窗口就会不同。
移动像素之后对新的特征图再次划分窗口,可以看到划分以后的新的特征图中窗口数变多,并且尺寸不同,如果想要进行并行计算,就必须把小于4*4的窗口重现填充为,这样就相当于计算9个windows,计算量又增加。
所以,作者提出一种高效的方法。
对划分window后的区域重新分类,如上面第一张图,然后把1,2合并起来称为C,把3,6合并起来称为B。最后吧第一行移动到最下面,再把最左边一行移动到最右面,就是上面第二张图的效果。此时,将3,5合并,8,6,2,0合并,1,7合并就是四个4*4的window。这样子的计算量就和之前一样。
但是又有新的问题,以3,5为例,这里把3,5强行看成一个区域,原本这两个区域就不是相邻的,直接计算QKV是有问题的。 所以作者引入mask去解决这个问题。
先依次计算q,可以看到 $ \alpha_{0,2},\alpha_{0,3},…$等是5和3之间不需要的内容,这里对他们的值-100,之后再通过softmax对应位置的值就会变为0,这样就达到了同时只计算5区域和3区域内的Q,其它区域同理。注意,计算完之后还要把对应数据还原。
Relative position bias
$ Attention(Q,K,V) = SoftMax(QK^{T}/\sqrt{d}+B)V$
Relative position index
在此之前先要介绍一下相对位置索引
以window_size=2为例,绝对位置索引就是用行,列代表,而相对位置索引就是用当前匹配的像素位置索引为参考点,减去其它像素的位置索引,如上图所示。然后将其在行方向上展平。
但是这里使用的是二维坐标,而作者在原论文中使用的是一维坐标。如果只是简单的行列相加,就会令(0,-1)和(-1,0)原本不是同一位置的地方取到相同的值。作者是这样做的:(M代表窗口大小)
经过这样的操作,可以看到原本位置相同仍然可以取到相同的索引,位置不同但行列和相同的取到了不同的坐标。
然后就可以根据relative position index从中取到bias。
为什么 relative position bias table的长度是(2M-1)*(2M-1)呢?
对于window_size=M,能取到的索引点的最大位置就是[-M+1, M-1],所以,行/列索引可取到的数就有2M-1种可能,所以最后relative position bias table的长度就是(2M-1)*(2M-1)。
相对位置索引是为了在相对位置偏执中取参数,训练过程中真正训练的是relative position bias table中的内容。
参考文章(视频)
12.1 Swin-Transformer网络结构详解_哔哩哔哩_bilibili