本文主要是介绍[ICCV2021]Swin Transformer: Hierarchical Vision Transformer using Shifted Windows,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
标题:Swin Transformer: Hierarchical Vision Transformer using Shifted Windows
链接:https://arxiv.org/pdf/2103.14030
动机
现在在CV中使用transformer的最大问题是运算量太大,因为图片的信息量远远大过NLP中文本的信息量,然后再做self attention会导致N平方的复杂度,这是不可以接受的,因此如何减少运算量是很重要的。而这篇文章就是提出了一个线性计算量的transformer结构
方法
之前的ViT考虑的是直接将一个图片分割,然后每个小块做embedding取到局部特征(?),然后再对所有分割的块做self attention取到全局特征。这样的计算复杂度是随着图片增大而呈平方增大的。
而这篇文章提出的Swin Transformer是按照hierarchical的方式来一层层做transformer的。
大体结构就是先将图片分成小区,然后针对每个小区块做embedding,之后输入一个swing transformer block,然后将相邻区块合并,成为稍微大点的区,再输入另一个swing transformer block,之后类似的操作还会做两次,从而得到最终的输出。
其中最主要的点就是swing transformer block是啥。swing transformer block实际上是由两层组成的,第一层就是一个简单的transformer block(self attention+feedforward),第二层结构类似第一层,只不过attention层变成了shift window multihead self attention,本质上就是比前面的那个self attention多了一个shift功能。
这个shift功能是用来处理边界问题的。因为在将图片分成不同区域之后,区域与区域之间的交互信息就丢失了,而这个shift就是说将原本的2*2的窗口变成3*3个窗口,就像下面这个图这样:
然后再对每个小窗口内部做self attention,从而获得了边界上的交互信息。但是由于这么划分之后区域变多
了,反而增加了运算量,因此本文使用了mask attention,结合他们提出的cyclic shift来简化运算。如下图所示:
也就是说划分完九块之后,正中间的大方块和右上,左下的小方块不动,然后将左上角的A,B,C三个块移动到右下角,从而重新拼成一个正方形。之后再对四个方块里的每部分做masked self attention就可以得到原来九个区域的self attention结果了。计算完后再将A,B,C移动回去就可以继续下一步操作。
结果
结果来说,swin transformer不仅减少了运算量,而且在众多CV任务上都取得了很大的进步,之后的衍生文章打破了很多SOTA。
这篇关于[ICCV2021]Swin Transformer: Hierarchical Vision Transformer using Shifted Windows的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!