Swin Transformer論文精讀【論文精讀】

Swin transformer: Hierarchical vision?transformer?using shifted windows
Swin Transformer是 ICCV 21的最佳論文,它之所以能有這么大的影響力主要是因?yàn)樵?ViT 之后,Swin Transformer通過(guò)在一系列視覺(jué)任務(wù)上的強(qiáng)大表現(xiàn)?,進(jìn)一步證明了Transformer是可以在視覺(jué)領(lǐng)域取得廣泛應(yīng)用的
Swin Transformer是3月份傳到 arxiv上的,4月份代碼庫(kù)就放出來(lái)了,緊接著5月12號(hào)又放出來(lái)了自監(jiān)督版本的Swin Transformer--moby,其實(shí)就是把MoCo的前兩個(gè)字母和 BYOL 的前兩個(gè)字母合在了一起,從方法上和性能上其實(shí)和MoCo v3和DINO都差不多,只是換了個(gè)骨干網(wǎng)絡(luò),所以在上一篇對(duì)比學(xué)習(xí)串講中也沒(méi)有提這篇論文
接下來(lái)過(guò)了一個(gè)月,Swin Transformer就被用到了視頻領(lǐng)域,推出了Video-Swin-Transformer,在一系列數(shù)據(jù)集上都取得了非常好的效果
- 比如說(shuō)在 k-400這個(gè)數(shù)據(jù)集上就已經(jīng)達(dá)到了84.9的準(zhǔn)確度
7月初的時(shí)候,因?yàn)榭吹搅擞?MLP Mixer 這篇論文,把 Swin 的思想用到了 MLP 里,推出了 Swin MLP
8月初的時(shí)候,把 Swin Transformer 用到了半監(jiān)督的目標(biāo)檢測(cè)里,然后取得了非常好的效果
10月份的時(shí)候獲得了ICCV 的最佳論文獎(jiǎng)
12月份受到了 BEiT 和 MAE 的推動(dòng),用 Swin Transformer 基于掩碼自監(jiān)督學(xué)習(xí)的方式做了一個(gè)叫 SimMIM 的論文
所以說(shuō)在這大半年的時(shí)間里,原作者團(tuán)隊(duì)就以每個(gè)月一篇論文的速度,基本把視覺(jué)領(lǐng)域所有的任務(wù)都刷了個(gè)遍,而且 Swin Transformer 不光應(yīng)用范圍廣,效果也非常的炸裂
Paperswithcode網(wǎng)站上可以看到它在每個(gè)數(shù)據(jù)集上的表現(xiàn)如何,鑒于 Swin Transformer 的提出主要是用來(lái)做視覺(jué)的下游任務(wù),所以主要看一下 COCO 和 ADE20K這兩個(gè)數(shù)據(jù)集上的表現(xiàn)

- 上圖展示了各種模型在 COCO 數(shù)據(jù)集上的表現(xiàn)
- 在 COCO 數(shù)據(jù)集的排行榜上排名第一的是一個(gè)叫 Swin V2 的模型,其實(shí)也是作者原班人馬提出的 Version2,就是做了一個(gè)更大版本的 Swin Transformer,有30億參數(shù)而且提出了一系列技術(shù)使得 Swin Transformer 可以在1536*1536的圖片上做預(yù)訓(xùn)練,最后下游任務(wù)的效果就非常的好,COCO 都已經(jīng)被刷到63.1了(去年大家用卷積神經(jīng)網(wǎng)絡(luò)的時(shí)候還在54、55的準(zhǔn)確度上掙扎
- 排名第二的是一個(gè)叫 Florence 的模型,這是一個(gè)多模態(tài)的工作,它里面負(fù)責(zé)視覺(jué)的那部分用的是一個(gè)叫 CoSwin 的模型,也是 Swin Transformer 的一個(gè)變體
- 再往下?GLIP 也是用的 Swin large,?Soft Teacher 也是 Swin large,DyHead 也是 Swin large,總之排名前十的方法全都用到了 Swin Transformer

- 上圖展示了各種模型在 ADE20K 數(shù)據(jù)集上的表現(xiàn)
- 排名第一的還是 Swin V2 ,因?yàn)槟P蛯?shí)在是太大了
- 排名二、三、四的都是一個(gè)叫 SeMask 的論文,也是基于 Swin large 的
- 第五名 BEiT 用的是 ViT,而不是 Swin
- 緊接著后面排名6、7、8、9全都還是用的是 Swin Transformer
所以說(shuō),在 Swin Transformer 作者團(tuán)隊(duì)不懈的努力下,Swin Transformer 在大部分視覺(jué)領(lǐng)域很多數(shù)據(jù)集上都取得了最好的結(jié)果,這就導(dǎo)致 Swin Transformer 成了視覺(jué)領(lǐng)域一個(gè)繞不開(kāi)的Basline,接下來(lái)再想在這些數(shù)據(jù)集上刷分或者說(shuō)再想發(fā)這些領(lǐng)域的論文,多多少少都得提到 Swin Transformer 或者跟它比,所以說(shuō)它的影響力是巨大的
題目
Swin Transformer是一個(gè)用了移動(dòng)窗口的層級(jí)式的Vision Transformer
- Swin:來(lái)自于 Shifted Windows?,S 和 win,Shifted Window(移動(dòng)窗口)也是 Swin Transformer這篇論文的主要貢獻(xiàn)
- 層級(jí)式 Hierarchical
其實(shí) Swin Transformer就是想讓 Vision Transformer像卷積神經(jīng)網(wǎng)絡(luò)一樣,也能夠分成幾個(gè) block,也能做層級(jí)式的特征提取,從而導(dǎo)致提出來(lái)的特征有多尺度的概念
作者團(tuán)隊(duì)來(lái)自 MSRA
- MSRA 經(jīng)常被譽(yù)為是研究者的黃埔軍校,從里面出來(lái)了一眾大佬,而且產(chǎn)出了一系列非常有影響力的工作,比如說(shuō)大家耳熟能詳?shù)?、現(xiàn)在單篇引用已經(jīng)超過(guò)10萬(wàn)的 ResNet,也是四位作者都在 MSRA 的時(shí)候完成的工作
摘要
這次精讀的版本是作者在8月17號(hào)又重新上傳的一個(gè)更新版本,里面的內(nèi)容和細(xì)節(jié)都更多一些
這篇論文提出了一個(gè)新的 Vision Transformer 叫做 Swin Transformer,它可以被用來(lái)作為一個(gè)計(jì)算機(jī)視覺(jué)領(lǐng)域一個(gè)通用的骨干網(wǎng)絡(luò)
- 之所以這么說(shuō),是因?yàn)閂iT 在結(jié)論的部分指出,他們那篇論文只是做了分類任務(wù),把下游任務(wù)比如說(shuō)檢測(cè)和分割留給以后的人去探索,所以說(shuō)在 ViT 出來(lái)之后,大家雖然看到了Transformer在視覺(jué)領(lǐng)域的強(qiáng)大潛力,但是并不確定Transformer能不能把所有視覺(jué)的任務(wù)都做掉,所以 Swin Transformer這篇論文的研究動(dòng)機(jī)就是想告訴大家用 Transformer沒(méi)毛病,絕對(duì)能在方方面面上取代卷積神經(jīng)網(wǎng)絡(luò),接下來(lái)大家都上 Transformer 就好了
但是直接把Transformer從 NLP 用到 Vision 是有一些挑戰(zhàn)的,這個(gè)挑戰(zhàn)主要來(lái)自于兩個(gè)方面
- 一個(gè)就是尺度上的問(wèn)題。因?yàn)楸热缯f(shuō)現(xiàn)在有一張街景的圖片,里面有很多車和行人,里面的物體都大大小小,那這時(shí)候代表同樣一個(gè)語(yǔ)義的詞,比如說(shuō)行人或者汽車就有非常不同的尺寸,這種現(xiàn)象在 NLP 中就沒(méi)有
- 另外一個(gè)挑戰(zhàn)是圖像的 resolution太大了,如果要以像素點(diǎn)作為基本單位的話,序列的長(zhǎng)度就變得高不可攀,所以說(shuō)之前的工作要么就是用后續(xù)的特征圖來(lái)當(dāng)做Transformer的輸入,要么就是把圖片打成 patch 減少這個(gè)圖片的 resolution,要么就是把圖片畫(huà)成一個(gè)一個(gè)的小窗口,然后在窗口里面去做自注意力,所有的這些方法都是為了減少序列長(zhǎng)度
基于這兩個(gè)挑戰(zhàn),本文的作者就提出了 hierarchical Transformer,它的特征是通過(guò)一種叫做移動(dòng)窗口的方式學(xué)來(lái)的
- 移動(dòng)窗口的好處:不僅帶來(lái)了更大的效率,因?yàn)楦暗墓ぷ饕粯樱F(xiàn)在自注意力是在窗口內(nèi)算的,所以這個(gè)序列的長(zhǎng)度大大的降低了;同時(shí)通過(guò) shifting 移動(dòng)的這個(gè)操作,能夠讓相鄰的兩個(gè)窗口之間有了交互,所以上下層之間就可以有 cross-window connection,從而變相的達(dá)到了一種全局建模的能力
然后作者說(shuō)這種層級(jí)式的結(jié)構(gòu)不僅非常靈活,可以提供各個(gè)尺度的特征信息,同時(shí)因?yàn)樽宰⒁饬κ窃谛〈翱谥畠?nèi)算的,所以說(shuō)它的計(jì)算復(fù)雜度是隨著圖像大小而線性增長(zhǎng),而不是平方級(jí)增長(zhǎng),這其實(shí)也為作者之后提出 Swin V2 鋪平了道路,從而讓他們可以在特別大的分辨率上去預(yù)訓(xùn)練模型
因?yàn)?Swin Transformer 擁有了像卷積神經(jīng)網(wǎng)絡(luò)一樣分層的結(jié)構(gòu),有了這種多尺度的特征,所以它很容易使用到下游任務(wù)里,所以在這篇論文里,作者不光是在 ImageNet-1K 上做了實(shí)驗(yàn),而且達(dá)到了非常好的準(zhǔn)確度87.3;而且還在密集預(yù)測(cè)型的任務(wù)上,比如說(shuō)物體檢測(cè)、物體分割上取得了很好的成績(jī),比如說(shuō)在 COCO 上刷到58.7的 AP,比之前最好的方法高了2.7個(gè)點(diǎn);然后在語(yǔ)義分割上,ADE上 也刷到了53.5,比之前最好的方法高了3.2個(gè)點(diǎn)
這些數(shù)據(jù)集其實(shí)都是大家常刷的數(shù)據(jù)集,在上面往往只要能提升一個(gè)點(diǎn),甚至可能不到一個(gè)點(diǎn),只要故事講的好可能都能發(fā)論文,但是 Swin Transformer 都提的大概3個(gè)點(diǎn),提升是相當(dāng)顯著的,所以作者說(shuō)這種基于 Transformer 的模型在視覺(jué)領(lǐng)域是非常有潛力的
為了凸顯這篇文章的貢獻(xiàn),也就是 Shifted Windows 移動(dòng)窗口的作用,這個(gè)版本又加了一句話:對(duì)于 MLP 的架構(gòu)用 shift window 的方法也能提升,這句話其實(shí)這個(gè)版本才加入的,之前第一個(gè)版本就是投稿上那篇論文其實(shí)沒(méi)有這句話,因?yàn)楫?dāng)時(shí)還沒(méi)有 MLP Mixer 這篇論文
引言
引言的前兩段其實(shí)跟 ViT 非常一致,都是先說(shuō)在視覺(jué)領(lǐng)域,之前卷積神經(jīng)網(wǎng)絡(luò)是主導(dǎo)地位,但是Transformer在 NLP 領(lǐng)域用的這么好,所以也想把Transformer用到視覺(jué)領(lǐng)域里面
但因?yàn)?ViT 已經(jīng)把這件事干了,所以說(shuō)Swin Transformer在第三段的開(kāi)始說(shuō)他們的研究動(dòng)機(jī),是想證明Transformer是可以用作一個(gè)通用的骨干網(wǎng)絡(luò),就是對(duì)所有視覺(jué)的任務(wù),不光是分類,在檢測(cè)、分割視頻上也都能取得很好的效果

- 圖一如上圖所示,作者先說(shuō)了一下 Vision Transformer,把它放在右邊做對(duì)比
- Vision Transformer就是把圖片打成 patch,因?yàn)?ViT 里用的 patch size 是16*16的,所以說(shuō)這里的16 ×,也就意味著是16倍的下采樣率,這也就意味著每一個(gè) patch,也就是每一個(gè) token,自始至終代表的尺寸都是差不多的;每一層的Transformer block 看到token的尺寸都是16倍下采樣率。雖然它可以通過(guò)這種全局的自注意力操作,達(dá)到全局的建模能力,但是它對(duì)多尺寸特征的把握就會(huì)弱一些
- 對(duì)于視覺(jué)任務(wù),尤其是下游任務(wù)比如說(shuō)檢測(cè)和分割來(lái)說(shuō),多尺寸的特征是至關(guān)重要的,比如說(shuō)對(duì)目標(biāo)檢測(cè)而言,運(yùn)用最廣的一個(gè)方法就是 FPN(a feature pyramid network:當(dāng)有一個(gè)分層式的卷積神經(jīng)網(wǎng)絡(luò)之后,每一個(gè)卷積層出來(lái)的特征的 receptive field (感受野)是不一樣的,能抓住物體不同尺寸的特征,從而能夠很好的處理物體不同尺寸的問(wèn)題;對(duì)于物體分割任務(wù)來(lái)說(shuō),那最常見(jiàn)的一個(gè)網(wǎng)絡(luò)就是 UNet,UNet 里為了處理物體不同尺寸的問(wèn)題,提出來(lái)一個(gè)叫做 skip connection 的方法,當(dāng)一系列下采樣做完以后,去做上采樣的時(shí)候,不光是從 bottleneck 里去拿特征,還從之前也就是每次下采樣完之后的東西里去拿特征,這樣就把那些高頻率的圖像細(xì)節(jié)又全都能恢復(fù)出來(lái)了,當(dāng)然分割里大家常用的網(wǎng)絡(luò)結(jié)構(gòu)還有 PspNet 、DeepLab,這些工作里也有相應(yīng)的處理多尺寸的方法,比如說(shuō)使用空洞卷積、使用 psp 和 aspp 層
- 總之,對(duì)于計(jì)算機(jī)視覺(jué)的下游任務(wù),尤其是密集預(yù)測(cè)型的任務(wù)(檢測(cè)、分割),有多尺寸的特征是至關(guān)重要的
但是在 ViT 里處理的特征都是單一尺寸,而且是 low resolution,也就是說(shuō)自始至終都是處理的16倍下采樣率過(guò)后的特征,所以說(shuō),它可能就不適合處理這種密集預(yù)測(cè)型的任務(wù),同時(shí)對(duì) ViT 而言,自注意力始終都是在最大的窗口上進(jìn)行,也就是說(shuō)始終都是在整圖上進(jìn)行的,所以它是一個(gè)全局建模,它的復(fù)雜度是跟隨圖像的尺寸進(jìn)行平方倍的增長(zhǎng),像檢測(cè)和分割領(lǐng)域,一般現(xiàn)在常用的輸入尺寸都是800乘以800或者1000乘1000,之前雖然用 patch size 16能處理 224*224 的圖片,但是當(dāng)圖片變到這么大的時(shí)候,即使用patch size16,序列長(zhǎng)度還是會(huì)上千,計(jì)算復(fù)雜度還是難以承受的
所以基于這些挑戰(zhàn),作者提出了 Swin Transformer,Swin Transformer 其實(shí)是借鑒了很多卷積神經(jīng)網(wǎng)絡(luò)的設(shè)計(jì)理念以及先驗(yàn)知識(shí)
- 比如說(shuō)為了減少序列的長(zhǎng)度、降低計(jì)算復(fù)雜度,Swin Transformer采取了在小窗口之內(nèi)算自注意力,而不是像 ViT 一樣在整圖上算自注意力,這樣只要窗口大小是固定的,自注意力的計(jì)算復(fù)雜度就是固定的,整張圖的計(jì)算復(fù)雜度就會(huì)跟圖片的大小而成的線性增長(zhǎng)關(guān)系,就是說(shuō)圖片增大了 x 倍,窗口數(shù)量也增大了 x 倍,計(jì)算復(fù)雜度也就乘以 x,而不是乘以 x 的平方
- 這個(gè)就算是利用了卷積神經(jīng)網(wǎng)絡(luò)里的 Locality 的 Inductive bias,就是利用了局部性的先驗(yàn)知識(shí),同一個(gè)物體的不同部位或者語(yǔ)義相近的不同物體還是大概率會(huì)出現(xiàn)在相連的地方,所以即使是在一個(gè) Local,一個(gè)小范圍的窗口算自注意力也是差不多夠用的,全局計(jì)算自注意力對(duì)于視覺(jué)任務(wù)來(lái)說(shuō),其實(shí)是有點(diǎn)浪費(fèi)資源的
- 另外一個(gè)挑戰(zhàn)是如何生成多尺寸的特征,卷積神經(jīng)網(wǎng)絡(luò)為什么會(huì)有多尺寸的特征?主要是因?yàn)橛?Pooling (池化)這個(gè)操作,池化能夠增大每一個(gè)卷積核能看到的感受野,從而使得每次池化過(guò)后的特征抓住物體的不同尺寸,所以類似的 ,Swin Transformer也提出來(lái)了一個(gè)類似于池化的操作叫做 patch merging,就是把相鄰的小 patch 合成一個(gè)大 patch,這樣合并出來(lái)的這一個(gè)大patch其實(shí)就能看到之前四個(gè)小patch看到的內(nèi)容,它的感受野就增大了,同時(shí)也能抓住多尺寸的特征

- 所以所上圖中圖一左邊所示,Swin Transformer 剛開(kāi)始的下采樣率是4倍,然后變成了8倍、16倍,之所以剛開(kāi)始是4×的,是因?yàn)樽铋_(kāi)始的 patch 是4乘4大小的,一旦有了多尺寸的特征信息,有了這種4x、8x、16x的特征圖,那自然就可以把這些多尺寸的特征圖輸給一個(gè) FPN,從而就可以去做檢測(cè)了
- 同樣的道理,有了這些多尺寸的特征圖以后,也可以把它扔給一個(gè) UNET,然后就可以去做分割了
- 所以這就是作者在這篇論文里反復(fù)強(qiáng)調(diào)的,Swin Transformer是能夠當(dāng)做一個(gè)通用的骨干網(wǎng)絡(luò)的,不光是能做圖像分類,還能做密集預(yù)測(cè)性的任務(wù)
第四段主要就開(kāi)始講 Swin Transformer一個(gè)關(guān)鍵的設(shè)計(jì)因素----移動(dòng)窗口的操作,如下圖中圖二所示

- 如果在 Transformer 第 L 層把輸入或者特征圖分成小窗口的話,就會(huì)有效的降低序列長(zhǎng)度,從而減少計(jì)算復(fù)雜度
- 圖中每一個(gè)灰色的小 patch 是最基本的元素單元,也就是圖一中4*4的 patch;每個(gè)紅色的框是一個(gè)中型的計(jì)算單元,也就是一個(gè)窗口
- 在 Swin Transformer 這篇論文里,一個(gè)小窗口里面默認(rèn)有七七四十九個(gè)小patch的
shift 的操作

- 如果用一個(gè)大的藍(lán)色的正方形來(lái)描述整體的特征圖,其實(shí) shift 操作就是往右下角的方向整體移了兩個(gè) patch,也就變成了像下圖中右圖的格式

- 然后在新的特征圖里把它再次分成四方格,如下圖中右圖所示

- 最后 shift 完就能得到下圖中紅線標(biāo)出的結(jié)果了

這樣的好處是窗口與窗口之間可以進(jìn)行互動(dòng),因?yàn)槿绻凑赵瓉?lái)的方式,就是沒(méi)有 shift,這些窗口之間都是不重疊的,如果每次自注意力的操作都在小的窗口里頭進(jìn)行了,每個(gè)窗口里的 patch 就永遠(yuǎn)無(wú)法注意到別的窗口里的 patch 的信息,這就達(dá)不到使用 Transformer 的初衷
- 因?yàn)門ransformer的初衷就是更好的理解上下文,如果窗口都是不重疊的,那自注意力真的就變成孤立自注意力,就沒(méi)有全局建模的能力
- 但如果加上 shift 的操作,每個(gè) patch 原來(lái)只能跟它所在的窗口里的別的 patch 進(jìn)行交互,但是 shift 之后,這個(gè) patch就可以跟新的窗口里的別的 patch就進(jìn)行交互了,而這個(gè)新的窗口里所有的 patch 其實(shí)來(lái)自于上一層別的窗口里的 patch,這也就是作者說(shuō)的能起到 cross-window connection,就是窗口和窗口之間可以交互了
再配合上之后提出的 patch merging,合并到 Transformer 最后幾層的時(shí)候,每一個(gè) patch 本身的感受野就已經(jīng)很大了,就已經(jīng)能看到大部分圖片了,然后再加上移動(dòng)窗口的操作,它所謂的窗口內(nèi)的局部注意力其實(shí)也就變相的等于是一個(gè)全局的自注意力操作了
- 這樣就是既省內(nèi)存,效果也好
第五段作者再次展示了一下結(jié)果,因?yàn)?Swin Transformer 的結(jié)果確實(shí)非常好,最后一段作者就展望了一下,作者說(shuō)他們堅(jiān)信一個(gè) CV 和NLP 之間大一統(tǒng)的框架是能夠促進(jìn)兩個(gè)領(lǐng)域共同發(fā)展的
- 確實(shí)如此,因?yàn)槿嗽趯W(xué)習(xí)的過(guò)程中也是一個(gè)多模態(tài)的學(xué)習(xí)過(guò)程,但 Swin Transformer還是利用了更多視覺(jué)里的先驗(yàn)知識(shí),從而在視覺(jué)任務(wù)上大殺四方
- 但是在模型大一統(tǒng)上,也就是 unified architecture 上來(lái)說(shuō),其實(shí) ViT 還是做的更好的,因?yàn)樗娴目梢允裁炊疾桓模裁聪闰?yàn)信息都不加,就能讓Transformer在兩個(gè)領(lǐng)域都能用的很好,這樣模型不僅可以共享參數(shù),而且甚至可以把所有模態(tài)的輸入直接就拼接起來(lái),當(dāng)成一個(gè)很長(zhǎng)的輸入,直接扔給Transformer去做,而不用考慮每個(gè)模態(tài)的特性
結(jié)論
這篇論文提出了 Swin Transformer,它是一個(gè)層級(jí)式的Transformer,而且它的計(jì)算復(fù)雜度是跟輸入圖像的大小呈線性增長(zhǎng)的
Swin Transformerr 在 COCO 和 ADE20K上的效果都非常的好,遠(yuǎn)遠(yuǎn)超越了之前最好的方法,所以作者說(shuō)基于此,希望 Swin Transformer 能夠激發(fā)出更多更好的工作,尤其是在多模態(tài)方面
因?yàn)樵赟win Transformer 這篇論文里最關(guān)鍵的一個(gè)貢獻(xiàn)就是基于 Shifted Window 的自注意力,它對(duì)很多視覺(jué)的任務(wù),尤其是對(duì)下游密集預(yù)測(cè)型的任務(wù)是非常有幫助的,但是如果 Shifted Window 操作不能用到 NLP 領(lǐng)域里,其實(shí)在模型大一統(tǒng)上論據(jù)就不是那么強(qiáng)了,所以作者說(shuō)接下來(lái)他們的未來(lái)工作就是要把 Shifted Windows用到 NLP 里面,而且如果真的能做到這一點(diǎn),那 Swin Transformer真的就是一個(gè)里程碑式的工作了,而且模型大一統(tǒng)的故事也就講的圓滿了
相關(guān)工作
跟 ViT 的相關(guān)工作非常相似,作者先大概講了一下卷積神經(jīng)網(wǎng)絡(luò),然后又講了一下自注意力或者 Transformer 是如何用來(lái)幫助卷積神經(jīng)網(wǎng)絡(luò)的,最后純 Transformer 用來(lái)做視覺(jué)里的骨干網(wǎng)絡(luò)
方法
主要分為兩大塊
- 大概把整體的流程講了一下,主要就是過(guò)了一下前向過(guò)程,以及提出的 patch merging 操作是怎么做的
- 基于 Shifted Window 的自注意力,Swin Transformer怎么把它變成一個(gè)transformer block 進(jìn)行計(jì)算
模型總覽圖如下圖所示

前向過(guò)程
- 假設(shè)說(shuō)有一張224*224*3(ImageNet 標(biāo)準(zhǔn)尺寸)的輸入圖片
- 第一步就是像 ViT 那樣把圖片打成 patch,在 Swin Transformer 這篇論文里,它的 patch size 是4*4,而不是像 ViT 一樣16*16,所以說(shuō)它經(jīng)過(guò) patch partition?打成 patch 之后,得到圖片的尺寸是56*56*48,56就是224/4,因?yàn)?patch size 是4,向量的維度48,因?yàn)?*4*3,3 是圖片的 RGB 通道
- 打完了 patch ,接下來(lái)就要做 Linear Embedding,也就是說(shuō)要把向量的維度變成一個(gè)預(yù)先設(shè)置好的值,就是 Transformer 能夠接受的值,在 Swin Transformer 的論文里把這個(gè)超參數(shù)設(shè)為 c,對(duì)于 Swin tiny 網(wǎng)絡(luò)來(lái)說(shuō),也就是上圖中畫(huà)的網(wǎng)絡(luò)總覽圖,它的 c 是96,所以經(jīng)歷完 Linear Embedding 之后,輸入的尺寸就變成了56*56*96,前面的56*56就會(huì)拉直變成3136,變成了序列長(zhǎng)度,后面的96就變成了每一個(gè)token向量的維度,其實(shí) Patch Partition 和 Linear Embedding 就相當(dāng)于是 ViT 里的Patch Projection 操作,而在代碼里也是用一次卷積操作就完成了,
- 第一部分跟 ViT 其實(shí)還是沒(méi)有區(qū)別的,但緊接著區(qū)別就來(lái)了
- 首先序列長(zhǎng)度是3136,對(duì)于 ViT 來(lái)說(shuō),用 patch size 16*16,它的序列長(zhǎng)度就只有196,是相對(duì)短很多的,這里的3136就太長(zhǎng)了,是目前來(lái)說(shuō)Transformer不能接受的序列長(zhǎng)度,所以 Swin Transformer 就引入了基于窗口的自注意力計(jì)算,每個(gè)窗口按照默認(rèn)來(lái)說(shuō),都只有七七四十九個(gè) patch,所以說(shuō)序列長(zhǎng)度就只有49就相當(dāng)小了,這樣就解決了計(jì)算復(fù)雜度的問(wèn)題
- 所以也就是說(shuō), stage1中的swin transformer block 是基于窗口計(jì)算自注意力的,現(xiàn)在暫時(shí)先把 transformer block當(dāng)成是一個(gè)黑盒,只關(guān)注輸入和輸出的維度,對(duì)于 Transformer 來(lái)說(shuō),如果不對(duì)它做更多約束的話,Transformer輸入的序列長(zhǎng)度是多少,輸出的序列長(zhǎng)度也是多少,它的輸入輸出的尺寸是不變的,所以說(shuō)在 stage1 中經(jīng)過(guò)兩層Swin Transformer block 之后,輸出還是56*56*96
- 到這其實(shí) Swin Transformer的第一個(gè)階段就走完了,也就是先過(guò)一個(gè) Patch Projection 層,然后再過(guò)一些 Swin Transformer block,接下來(lái)如果想要有多尺寸的特征信息,就要構(gòu)建一個(gè)層級(jí)式的 transformer,也就是說(shuō)需要一個(gè)像卷積神經(jīng)網(wǎng)絡(luò)里一樣,有一個(gè)類似于池化的操作
這篇論文里作者就提出 Patch Merging 的操作,Patch Merging 其實(shí)在之前一些工作里也有用到,它很像 Pixel Shuffle 的上采樣的一個(gè)反過(guò)程,Pixel Shuffle 是 lower level 任務(wù)中很常用的一個(gè)上采樣方式
Patch Merging 操作舉例如下圖所示

- 假如有一個(gè)張量, Patch Merging 顧名思義就是把臨近的小 patch?合并成一個(gè)大 patch,這樣就可以起到下采樣一個(gè)特征圖的效果了
- 這里因?yàn)槭窍胂虏蓸觾杀叮哉f(shuō)在選點(diǎn)的時(shí)候是每隔一個(gè)點(diǎn)選一個(gè),也就意味著說(shuō)對(duì)于這個(gè)張量來(lái)說(shuō),每次選的點(diǎn)是1、1、1、1

- 其實(shí)在這里的1、2、3、4并不是矩陣?yán)镉械闹担墙o它的一個(gè)序號(hào),同樣序號(hào)位置上的 patch 就會(huì)被 merge 到一起,這個(gè)序號(hào)只是為了幫助理解
- 經(jīng)過(guò)隔一個(gè)點(diǎn)采一個(gè)樣之后,原來(lái)的這個(gè)張量就變成了四個(gè)張量,也就是說(shuō)所有的1都在一起了,2在一起,3在一起,4在一起,如果原張量的維度是 h * w * c?,當(dāng)然這里 c 沒(méi)有畫(huà)出來(lái),經(jīng)過(guò)這次采樣之后就得到了4個(gè)張量,每個(gè)張量的大小是 h/2、w/2,它的尺寸都縮小了一倍
- 現(xiàn)在把這四個(gè)張量在 c 的維度上拼接起來(lái),也就變成了下圖中紅線所畫(huà)出來(lái)的形式,張量的大小就變成了 h/2 * w/2 * 4c,相當(dāng)于用空間上的維度換了更多的通道數(shù)

- 通過(guò)這個(gè)操作,就把原來(lái)一個(gè)大的張量變小了,就像卷積神經(jīng)網(wǎng)絡(luò)里的池化操作一樣,為了跟卷積神經(jīng)網(wǎng)絡(luò)那邊保持一致(不論是 VGGNet 還是 ResNet,一般在池化操作降維之后,通道數(shù)都會(huì)翻倍,從128變成256,從256再變成512),所以這里也只想讓他翻倍,而不是變成4倍,所以緊接著又再做了一次操作,就是在 c 的維度上用一個(gè)1乘1的卷積,把通道數(shù)降下來(lái)變成2c,通過(guò)這個(gè)操作就能把原來(lái)一個(gè)大小為 h*w*c 的張量變成 h/2 * w/2 *2c 的一個(gè)張量,也就是說(shuō)空間大小減半,但是通道數(shù)乘2,這樣就跟卷積神經(jīng)網(wǎng)絡(luò)完全對(duì)等起來(lái)了
整個(gè)這個(gè)過(guò)程就是 Patch Merging,經(jīng)歷過(guò)這次Patch Merging操作之后,輸出的大小就從56*56*96變成了28*28*192,經(jīng)過(guò)stage2中的 Transformer block,尺寸是不變的,所以出來(lái)之后還是28*28*192

這樣第二階段也就完成了,第三和第四階段都是同理,都是先進(jìn)來(lái)做一次Patch Merging,然后再通過(guò)一些 Swin Transformer block,所以維度就進(jìn)一步降成了14*14*384以及7*7*768
這里其實(shí)會(huì)發(fā)現(xiàn),特征圖的維度真的跟卷積神經(jīng)網(wǎng)絡(luò)好像,因?yàn)槿绻叵霘埐罹W(wǎng)絡(luò)的多尺寸的特征,就是經(jīng)過(guò)每個(gè)殘差階段之后的特征圖大小也是56*56、28*28、14*14,最后是7*7

而且為了和卷積神經(jīng)網(wǎng)絡(luò)保持一致,Swin Transformer這篇論文并沒(méi)有像 ViT 一樣使用 CLS token,ViT 是給剛開(kāi)始的輸入序列又加了一個(gè) CLS token,所以這個(gè)長(zhǎng)度就從196變成了197,最后拿 CLS token 的特征直接去做分類,但 Swin Transformer 沒(méi)有用這個(gè) token,它是像卷積神經(jīng)網(wǎng)絡(luò)一樣,在得到最后的特征圖之后用global average polling,就是全局池化的操作,直接把7*7就取平均拉直變成1了
- 作者這個(gè)圖里并沒(méi)有畫(huà),因?yàn)?Swin Transformer的本意并不是只做分類,它還會(huì)去做檢測(cè)和分割,所以說(shuō)它只畫(huà)了骨干網(wǎng)絡(luò)的部分,沒(méi)有去畫(huà)最后的分類頭或者檢測(cè)頭,但是如果是做分類的話,最后就變成了1*768,然后又變成了1*1,000

- 如果是做ImageNet的話,這樣就完成了整個(gè)一個(gè)分類網(wǎng)絡(luò)的前向過(guò)程
所以看完整個(gè)前向過(guò)程之后,就會(huì)發(fā)現(xiàn) Swin Transformer 有四個(gè) stage,還有類似于池化的 patch merging 操作,自注意力還是在小窗口之內(nèi)做的以及最后還用的是 global average polling,所以說(shuō) Swin Transformer 這篇論文真的是把卷積神經(jīng)網(wǎng)絡(luò)和 Transformer 這兩系列的工作完美的結(jié)合到了一起,也可以說(shuō)它是披著Transformer皮的卷積神經(jīng)網(wǎng)絡(luò)
主要貢獻(xiàn)
這篇論文的主要貢獻(xiàn)就是基于窗口或者移動(dòng)窗口的自注意力,這里作者又寫了一段研究動(dòng)機(jī),就是為什么要引入窗口的自注意力,其實(shí)跟之前引言里說(shuō)的都是一個(gè)事情,就是說(shuō)全局自注意力的計(jì)算會(huì)導(dǎo)致平方倍的復(fù)雜度,同樣當(dāng)去做視覺(jué)里的下游任務(wù),尤其是密集預(yù)測(cè)型的任務(wù),或者說(shuō)遇到非常大尺寸的圖片時(shí)候,這種全局算自注意力的計(jì)算復(fù)雜度就非常貴了,所以就用窗口的方式去做自注意力
窗口劃分舉例
原圖片會(huì)被平均的分成一些沒(méi)有重疊的窗口,拿第一層之前的輸入來(lái)舉例,它的尺寸就是56*56*96,也就說(shuō)有一個(gè)維度是56*56張量,然后把它切成一些不重疊的方格,也就是下圖中用橘黃色表示的方格

- 每一個(gè)橘黃色的方格就是一個(gè)窗口,但是這個(gè)窗口并不是最小的計(jì)算單元,最小的計(jì)算單元其實(shí)還是之前的那個(gè) patch,也就意味著每一個(gè)小窗口里其實(shí)還有 m * m 個(gè) patch,在 Swin Transformer 這篇論文里一般 m 默認(rèn)為7,也就是說(shuō),一個(gè)橘黃色的小方格里有七七四十九個(gè)小 patch
- 現(xiàn)在所有自注意力的計(jì)算都是在這些小窗口里完成的,就是說(shuō)序列長(zhǎng)度永遠(yuǎn)都是七七四十九
- 原來(lái)大的整體特征圖到底里面會(huì)有多少個(gè)窗口呢?其實(shí)也就是每條邊56/7就8個(gè)窗口,也就是說(shuō)一共會(huì)有8*8等于64個(gè)窗口,就是說(shuō)會(huì)在這64個(gè)窗口里分別去算它們的自注意力
基于窗口的自注意力模式的計(jì)算復(fù)雜度
說(shuō)到底,基于窗口的自注意力計(jì)算方式能比全局的自注意力方式省多少呢?在Swin Transformer這篇論文里作者就給出了一個(gè)大概的估計(jì),它給出了兩個(gè)公式如下圖所示

- 公式(1)對(duì)應(yīng)的是標(biāo)準(zhǔn)的多頭自注意力的計(jì)算復(fù)雜度
- 每一個(gè)圖片大概會(huì)有 h*w 個(gè) patch,在剛才的例子里,h 和 w 分別都是56,c 是特征的維度
- 公式(2)對(duì)應(yīng)的是基于窗口的自注意力計(jì)算的復(fù)雜度,這里的 M 就是剛才的7,也就是說(shuō)一個(gè)窗口的某條邊上有多少個(gè)patch
公式推算
以標(biāo)準(zhǔn)的多頭自注意力為例

- 如果現(xiàn)在有一個(gè)輸入,自注意力首先把它變成 q k v 三個(gè)向量,這個(gè)過(guò)程其實(shí)就是原來(lái)的向量分別乘了三個(gè)系數(shù)矩陣
- 一旦得到 query 和 k 之后,它們就會(huì)相乘,最后得到 attention,也就是自注意力的矩陣
- 有了自注意力之后,就會(huì)和 value 做一次乘法,也就相當(dāng)于是做了一次加權(quán)
- 最后因?yàn)槭嵌囝^自注意力,所以最后還會(huì)有一個(gè) projection layer,這個(gè)投射層會(huì)把向量的維度投射到我們想要的維度
如果這些向量都加上它們?cè)撚械木S度,也就是說(shuō)剛開(kāi)始輸入是 h*w*c

- 首先,to_q_k_v()函數(shù)相當(dāng)于是用一個(gè) h*w*c 的向量乘以一個(gè) c*c 的系數(shù)矩陣,最后得到了 h*w*c。所以每一個(gè)計(jì)算的復(fù)雜度是 h*w*c^2,因?yàn)橛腥尾僮?,所以是三倍?h*w*c^2
- 然后,算自注意力就是 h*w*c乘以 k 的轉(zhuǎn)置,也就是 c*h*w,所以得到了 h*w*h*w,這個(gè)計(jì)算復(fù)雜度就是(h*w)^2*c
- 接下來(lái),自注意力矩陣和value的乘積的計(jì)算復(fù)雜度還是 (h*w)^2*c,所以現(xiàn)在就成了2*(h*w)^2*c
- 最后一步,投射層也就是h*w*c乘以 c*c 變成了 h*w*c ,它的計(jì)算復(fù)雜度就又是 h*w*c^2
- 最后合并起來(lái)就是最后的公式(1)
基于窗口的自注意力計(jì)算復(fù)雜度又是如何得到的呢?
- 因?yàn)樵诿總€(gè)窗口里算的還是多頭自注意力,所以可以直接套用公式(1),只不過(guò)高度和寬度變化了,現(xiàn)在高度和寬度不再是 h * w,而是變成窗口有多大了,也就是 M*M,也就是說(shuō)現(xiàn)在 h 變成了 M,w 也是 M,它的序列長(zhǎng)度只有 M * M 這么大
- 所以當(dāng)把 M 值帶入到公式(1)之后,就得到計(jì)算復(fù)雜度是4 * M^2 * c^2 + 2 * M^4 * c,這個(gè)就是在一個(gè)窗口里算多頭自注意力所需要的計(jì)算復(fù)雜度
- 那我們現(xiàn)在一共有 h/M * w/M 個(gè)窗口,現(xiàn)在用這么多個(gè)窗口乘以每個(gè)窗口所需要的計(jì)算復(fù)雜度就能得到公式(2)了
對(duì)比公式(1)和公式(2),雖然這兩個(gè)公式前面這兩項(xiàng)是一樣的,只有后面從 (h*w)^2變成了 M^2 * h * w,看起來(lái)好像差別不大,但其實(shí)如果仔細(xì)帶入數(shù)字進(jìn)去計(jì)算就會(huì)發(fā)現(xiàn),計(jì)算復(fù)雜的差距是相當(dāng)巨大的,因?yàn)檫@里的 h*w 如果是56*56的話, M^2 其實(shí)只有49,所以是相差了幾十甚至上百倍的
這種基于窗口計(jì)算自注意力的方式雖然很好地解決了內(nèi)存和計(jì)算量的問(wèn)題,但是窗口和窗口之間沒(méi)有通信,這樣就達(dá)不到全局建模了,也就文章里說(shuō)的會(huì)限制模型的能力,所以最好還是要有一種方式能讓窗口和窗口之間互相通信起來(lái),這樣效果應(yīng)該會(huì)更好,因?yàn)榫哂猩舷挛牡男畔ⅲ宰髡呔吞岢鲆苿?dòng)窗口的方式
移動(dòng)窗口就是把原來(lái)的窗口往右下角移動(dòng)一半窗口的距離,如果Transformer是上下兩層連著做這種操作,先是 window再是 shifted window 的話,就能起到窗口和窗口之間互相通信的目的了
所以說(shuō)在 Swin Transformer里, transformer block 的安排是有講究的,每次都是先要做一次基于窗口的多頭自注意力,然后再做一次基于移動(dòng)窗口的多頭自注意力,這樣就達(dá)到了窗口和窗口之間的互相通信。如下圖所示

- 每次輸入先進(jìn)來(lái)之后先做一次 Layernorm,然后做窗口的多頭自注意力,然后再過(guò) Layernorm 過(guò) MLP,第一個(gè) block 就結(jié)束了
- 這個(gè) block 結(jié)束以后,緊接著做一次Shifted window,也就是基于移動(dòng)窗口的多頭自注意力,然后再過(guò) MLP 得到輸出
- 這兩個(gè) block 加起來(lái)其實(shí)才算是 Swin Transformer 一個(gè)基本的計(jì)算單元,這也就是為什么stage1、2、3、4中的 swin transformer block 為什么是 *2、*2、*6、*2,也就是一共有多少層 Swin Transformer block 的數(shù)字總是偶數(shù),因?yàn)樗冀K都需要兩層 block連在一起作為一個(gè)基本單元,所以一定是2的倍數(shù)
到此,Swin Transformer整體的故事和結(jié)構(gòu)就已經(jīng)講完了,主要的研究動(dòng)機(jī)就是想要有一個(gè)層級(jí)式的 Transformer,為了這個(gè)層級(jí)式,所以介紹了 Patch Merging 的操作,從而能像卷積神經(jīng)網(wǎng)絡(luò)一樣把 Transformer 分成幾個(gè)階段,為了減少計(jì)算復(fù)雜度,爭(zhēng)取能做視覺(jué)里密集預(yù)測(cè)的任務(wù),所以又提出了基于窗口和移動(dòng)窗口的自注意力方式,也就是連在一起的兩個(gè)Transformer block,最后把這些部分加在一起,就是 Swin Transformer 的結(jié)構(gòu)
其實(shí)作者后面還講了兩個(gè)點(diǎn)
- 一個(gè)是怎樣提高移動(dòng)窗口的計(jì)算效率,他們采取了一種非常巧妙的 masking(掩碼)的方式
- 另外一個(gè)點(diǎn)就是這篇論文里沒(méi)有用絕對(duì)的位置編碼,而是用相對(duì)的位置編碼
但這兩個(gè)點(diǎn)其實(shí)都是為了提高性能的一些技術(shù)細(xì)節(jié),跟文章整體的故事已經(jīng)沒(méi)有多大關(guān)系了

- 上圖是一個(gè)基礎(chǔ)版本的移動(dòng)窗口,就是把左邊的窗口模式變成了右邊的窗口方式
- 雖然這種方式已經(jīng)能夠達(dá)到窗口和窗口之間的互相通信了,但是會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題,就是原來(lái)計(jì)算的時(shí)候,特征圖上只有四個(gè)窗口,但是做完移動(dòng)窗口操作之后得到了9個(gè)窗口,窗口的數(shù)量增加了,而且每個(gè)窗口里的元素大小不一,比如說(shuō)中間的窗口還是4*4,有16個(gè) patch,但是別的窗口有的有4個(gè) patch,有的有8個(gè) patch,都不一樣了,如果想做快速運(yùn)算,就是把這些窗口全都?jí)撼梢粋€(gè) patch直接去算自注意力,就做不到了,因?yàn)榇翱诘拇笮〔灰粯?/li>
- 有一個(gè)簡(jiǎn)單粗暴的解決方式就是把這些小窗口周圍再 pad 上0?,把它照樣pad成和中間窗口一樣大的窗口,這樣就有9個(gè)完全一樣大的窗口,這樣就還能把它們壓成一個(gè)batch,就會(huì)快很多
- 但是這樣的話,無(wú)形之中計(jì)算復(fù)雜度就提升了,因?yàn)樵瓉?lái)如果算基于窗口的自注意力只用算4個(gè)窗口,但是現(xiàn)在需要去算9個(gè)窗口,復(fù)雜度一下提升了兩倍多,所以還是相當(dāng)可觀的
- 那怎么能讓第二次移位完的窗口數(shù)量還是保持4個(gè),而且每個(gè)窗口里的patch數(shù)量也還保持一致呢?作者提出了一個(gè)非常巧妙的掩碼方式,如下圖所示

- 上圖是說(shuō),當(dāng)通過(guò)普通的移動(dòng)窗口方式,得到9個(gè)窗口之后,現(xiàn)在不在這9個(gè)窗口上算自注意力,先再做一次循環(huán)移位( cyclic shift )
- 經(jīng)過(guò)這次循環(huán)移位之后,原來(lái)的窗口(虛線)就變成了現(xiàn)在窗口(實(shí)線)的樣子,那如果在大的特征圖上再把它分成四宮格的話,我在就又得到了四個(gè)窗口,意思就是說(shuō)移位之前的窗口數(shù)也是4個(gè),移完位之后再做一次循環(huán)移位得到窗口數(shù)還是4個(gè),這樣窗口的數(shù)量就固定了,也就說(shuō)計(jì)算復(fù)雜度就固定了
- 但是新的問(wèn)題就來(lái)了,雖然對(duì)于移位后左上角的窗口(也就是移位前最中間的窗口)來(lái)說(shuō),里面的元素都是互相緊挨著的,他們之間可以互相兩兩做自注意力,但是對(duì)于剩下幾個(gè)窗口來(lái)說(shuō),它們里面的元素是從別的很遠(yuǎn)的地方搬過(guò)來(lái)的,所以他們之間,按道理來(lái)說(shuō)是不應(yīng)該去做自注意力,也就是說(shuō)他們之間不應(yīng)該有什么太大的聯(lián)系
- 解決這個(gè)問(wèn)題就需要一個(gè)很常規(guī)的操作,也就是掩碼操作,這在Transformer過(guò)去的工作里是層出不窮,很多工作里都有各式各樣的掩碼操作
- 在 Swin Transformer這篇論文里,作者也巧妙的設(shè)計(jì)了幾種掩碼的方式,從而能讓一個(gè)窗口之中不同的區(qū)域之間也能用一次前向過(guò)程,就能把自注意力算出來(lái),但是互相之間都不干擾,也就是后面的 masked Multi-head Self Attention(MSA)
- 算完了多頭自注意力之后,還有最后一步就是需要把循環(huán)位移再還原回去,也就是說(shuō)需要把A、B、C再還原到原來(lái)的位置上去,原因是還需要保持原來(lái)圖片的相對(duì)位置大概是不變的,整體圖片的語(yǔ)義信息也是不變的,如果不把循環(huán)位移還原的話,那相當(dāng)于在做Transformer的操作之中,一直在把圖片往右下角移,不停的往右下角移,這樣圖片的語(yǔ)義信息很有可能就被破壞掉了
- 所以說(shuō)整體而言,上圖介紹了一種高效的、批次的計(jì)算方式,比如說(shuō)本來(lái)移動(dòng)窗口之后得到了9個(gè)窗口,而且窗口之間的patch數(shù)量每個(gè)都不一樣,為了達(dá)到高效性,為了能夠進(jìn)行批次處理,先進(jìn)行一次循環(huán)位移,把9個(gè)窗口變成4個(gè)窗口,然后用巧妙的掩碼方式讓每個(gè)窗口之間能夠合理地計(jì)算自注意力,最后再把算好的自注意力還原,就完成了基于移動(dòng)窗口的自注意力計(jì)算
掩碼操作舉例
掩碼可視化

- 作者通過(guò)這種巧妙的循環(huán)位移的方式和巧妙設(shè)計(jì)的掩碼模板,從而實(shí)現(xiàn)了只需要一次前向過(guò)程,就能把所有需要的自注意力值都算出來(lái),而且只需要計(jì)算4個(gè)窗口,也就是說(shuō)窗口的數(shù)量沒(méi)有增加,計(jì)算復(fù)雜度也沒(méi)有增加,非常高效的完成了這個(gè)任務(wù)
在方法的最后一節(jié)也就是3.3節(jié),作者大概介紹了一下他們提出的 Swin Transformer的幾個(gè)變體
- Swin Tiny
- Swin Small
- Swin Base
- Swin Large
Swin Tiny的計(jì)算復(fù)雜度跟 ResNet-50 差不多,Swin Small 的復(fù)雜度跟 ResNet-101 是差不多的,這樣主要是想去做一個(gè)比較公平的對(duì)比
這些變體之間有哪些不一樣呢?,其實(shí)主要不一樣的就是兩個(gè)超參數(shù)
- 一個(gè)是向量維度的大小 c
- 另一個(gè)是每個(gè) stage 里到底有多少個(gè) transform block
這里其實(shí)就跟殘差網(wǎng)絡(luò)就非常像了,殘差網(wǎng)絡(luò)也是分成了四個(gè) stage,每個(gè) stage 有不同數(shù)量的殘差塊
實(shí)驗(yàn)
首先是分類上的實(shí)驗(yàn),這里一共說(shuō)了兩種預(yù)訓(xùn)練的方式
- 第一種就是在正規(guī)的ImageNet-1K(128萬(wàn)張圖片、1000個(gè)類)上做預(yù)訓(xùn)練
- 第二種方式是在更大的ImageNet-22K(1,400萬(wàn)張圖片、2萬(wàn)多個(gè)類別)上做預(yù)訓(xùn)練
當(dāng)然不論是用ImageNet-1K去做預(yù)訓(xùn)練,還是用ImageNet-22K去做預(yù)訓(xùn)練,最后測(cè)試的結(jié)果都是在ImageNet-1K的測(cè)試集上去做的,結(jié)果如下表所示

- 上半部分是ImageNet-1K預(yù)訓(xùn)練的模型結(jié)果
- 下半部分是先用ImageNet-22K去預(yù)訓(xùn)練,然后又在ImageNet-1K上做微調(diào),最后得到的結(jié)果
- 在表格的上半部分,作者先是跟之前最好的卷積神經(jīng)網(wǎng)絡(luò)做了一下對(duì)比,RegNet 是之前 facebook 用 NASA 搜出來(lái)的模型,EfficientNet 是 google 用NASA 搜出來(lái)的模型,這兩個(gè)都算之前表現(xiàn)非常好的模型了,他們的性能最高會(huì)到 84.3
- 接下來(lái)作者就寫了一下之前的 Vision Transformer 會(huì)達(dá)到什么效果,對(duì)于 ViT 來(lái)說(shuō),因?yàn)樗鼪](méi)有用很好的數(shù)據(jù)增強(qiáng),而且缺少偏置歸納,所以說(shuō)它的結(jié)果是比較差的,只有70多
- 換上 DeiT 之后,因?yàn)橛昧烁玫臄?shù)據(jù)增強(qiáng)和模型蒸餾,所以說(shuō) DeiT Base 模型也能取得相當(dāng)不錯(cuò)的結(jié)果,能到83.1
- 當(dāng)然 Swin Transformer 能更高一些,Swin Base 最高能到84.5,稍微比之前最好的卷積神經(jīng)網(wǎng)絡(luò)高那么一點(diǎn)點(diǎn),就比84.3高了0.2
- 雖然之前表現(xiàn)最好的 EfficientNet 的模型是在 600*600 的圖片上做的,而 Swin Base 是在 384*384 的圖片上做的,所以說(shuō) EfficientNet 有一些優(yōu)勢(shì),但是從模型的參數(shù)和計(jì)算的 FLOPs 上來(lái)說(shuō) EfficientNet 只有66M,而且只用了 37G 的 FLOPs,但是 Swin Transformer 用了 88M 的模型參數(shù),而且用了 47G 的 FLOPs,所以總體而言是伯仲之間
- 表格的下半部分是用 ImageNet-22k 去做預(yù)訓(xùn)練,然后再在ImageNet-1k上微調(diào)最后得到的結(jié)果
- 這里可以看到,一旦使用了更大規(guī)模的數(shù)據(jù)集,原始標(biāo)準(zhǔn)的 ViT 的性能也就已經(jīng)上來(lái)了,對(duì)于 ViT large 來(lái)說(shuō)它已經(jīng)能得到 85.2 的準(zhǔn)確度了,已經(jīng)相當(dāng)高了
- 但是 Swin Large 更高,Swin Large 最后能到87.3,這個(gè)是在不使用JFT-300M,就是特別大規(guī)模數(shù)據(jù)集上得到的結(jié)果,所以還是相當(dāng)高的
?
接下來(lái)是目標(biāo)檢測(cè)的結(jié)果,作者是在 COCO 數(shù)據(jù)集上訓(xùn)練并且進(jìn)行測(cè)試的,結(jié)果如下圖所示

- 表2(a)中測(cè)試了在不同的算法框架下,Swin Transformer 到底比卷積神經(jīng)網(wǎng)絡(luò)要好多少,主要是想證明 Swin Transformer 是可以當(dāng)做一個(gè)通用的骨干網(wǎng)絡(luò)來(lái)使用的,所以用了 Mask R-CNN、ATSS、RepPointsV2 和SparseR-CNN,這些都是表現(xiàn)非常好的一些算法,在這些算法里,過(guò)去的骨干網(wǎng)絡(luò)選用的都是 ResNet-50,現(xiàn)在替換成了 Swin Tiny
- Swin Tiny 的參數(shù)量和 FLOPs 跟 ResNet-50 是比較一致的,從后面的對(duì)比里也可以看出來(lái),所以他們之間的比較是相對(duì)比較公平的
- 可以看到,Swin Tiny 對(duì) ResNet-50 是全方位的碾壓,在四個(gè)算法上都超過(guò)了它,而且超過(guò)的幅度也是比較大的
- 接下來(lái)作者又換了一個(gè)方式做測(cè)試,現(xiàn)在是選定一個(gè)算法,選定了Cascade Mask R-CNN 這個(gè)算法,然后換更多的不同的骨干網(wǎng)絡(luò),比如 DeiT-S、ResNet-50 和 ResNet-101,也分了幾組,結(jié)果如上圖中表2(b)所示
- 可以看出,在相似的模型參數(shù)和相似的 Flops 之下,Swin Transformer 都是比之前的骨干網(wǎng)絡(luò)要表現(xiàn)好的
- 接下來(lái)作者又做了第三種測(cè)試的方式,如上圖中的表2(c)所示,就是系統(tǒng)層面的比較,這個(gè)層面的比較就比較狂野了,就是現(xiàn)在追求的不是公平比較,什么方法都可以上,可以使用更多的數(shù)據(jù),可以使用更多的數(shù)據(jù)增強(qiáng),甚至可以在測(cè)試的使用 test time augmentation(TTA)的方式
- 可以看到,之前最好的方法 Copy-paste 在 COCO Validation Set上的結(jié)果是55.9,在 Test Set 上的結(jié)果是56,而這里如果跟最大的 Swin Transformer--Swin Large 比,它的結(jié)果分別能達(dá)到58和58.7,這都比之前高了兩到三個(gè)點(diǎn)
第三個(gè)實(shí)驗(yàn)作者選擇了語(yǔ)義分割里的ADE20K數(shù)據(jù)集,結(jié)果如下圖所示

- 上圖表3里可以看到之前的方法,一直到 DeepLab V3、ResNet 其實(shí)都用的是卷積神經(jīng)網(wǎng)絡(luò),之前的這些方法其實(shí)都在44、45左右徘徊
- 但是緊接著 Vision Transformer 就來(lái)了,那首先就是 SETR 這篇論文,他們用了 ViT Large,所以就取得了50.3的這個(gè)結(jié)果
- Swin Transformer Large也取得了53.5的結(jié)果,就刷的更高了
- 其實(shí)作者這里也有標(biāo)注,就是有兩個(gè)“+”號(hào)的,意思是說(shuō)這些模型是在ImageNet-22K 數(shù)據(jù)集上做預(yù)訓(xùn)練,所以結(jié)果才這么好
消融實(shí)驗(yàn)
實(shí)驗(yàn)結(jié)果如下圖所示

- 上圖中表4主要就是想說(shuō)一下移動(dòng)窗口以及相對(duì)位置編碼到底對(duì) Swin Transformer 有多有用
- 可以看到,如果光分類任務(wù)的話,其實(shí)不論是移動(dòng)窗口,還是相對(duì)位置編碼,它的提升相對(duì)于基線來(lái)說(shuō),也沒(méi)有特別明顯,當(dāng)然在ImageNet的這個(gè)數(shù)據(jù)集上提升一個(gè)點(diǎn)也算是很顯著了
- 但是他們更大的幫助,主要是出現(xiàn)在下游任務(wù)里,就是 COCO 和 ADE20K 這兩個(gè)數(shù)據(jù)集上,也就是目標(biāo)檢測(cè)和語(yǔ)義分割這兩個(gè)任務(wù)上
- 可以看到,用了移動(dòng)窗口和相對(duì)位置編碼以后,都會(huì)比之前大概高了3個(gè)點(diǎn)左右,提升是非常顯著的,這也是合理的,因?yàn)槿绻F(xiàn)在去做這種密集型預(yù)測(cè)任務(wù)的話,就需要特征對(duì)位置信息更敏感,而且更需要周圍的上下文關(guān)系,所以說(shuō)通過(guò)移動(dòng)窗口提供的窗口和窗口之間的互相通信,以及在每個(gè) Transformer block都做更準(zhǔn)確的相對(duì)位置編碼,肯定是會(huì)對(duì)這類型的下游任務(wù)大有幫助的
點(diǎn)評(píng)
除了作者團(tuán)隊(duì)自己在過(guò)去半年中刷了那么多的任務(wù),比如說(shuō)最開(kāi)始講的自監(jiān)督的Swin Transformer,還有 Video Swin Transformer 以及Swin MLP,同時(shí) Swin Transformer 還被別的研究者用到了不同的領(lǐng)域

所以說(shuō),Swin Transformer 真的是太火,真的是在視覺(jué)領(lǐng)域大殺四方,感覺(jué)以后每個(gè)任務(wù)都逃不了跟 Swin 比一比,而且因?yàn)?Swin 這么火,所以說(shuō)其實(shí)很多開(kāi)源包里都有 Swin 的實(shí)現(xiàn)
- 百度的 PaddlePaddle
- 視覺(jué)里現(xiàn)在比較火的 pytorch-image-models,就是 Timm 這個(gè)代碼庫(kù)里面也是有 Swin 的實(shí)現(xiàn)的
- 同時(shí) Hugging Face 估計(jì)也是有的
雖然前面已經(jīng)說(shuō)了很多 Swin Transformer 的影響力啊已經(jīng)這么巨大了,但其實(shí)他的影響力遠(yuǎn)遠(yuǎn)不止于此,論文里這種對(duì)卷積神經(jīng)網(wǎng)絡(luò),對(duì) Transformer,還有對(duì) MLP 這幾種架構(gòu)深入的理解和分析是可以給更多的研究者帶來(lái)思考的,從而不僅可以在視覺(jué)領(lǐng)域里激發(fā)出更好的工作,而且在多模態(tài)領(lǐng)域里,相信它也能激發(fā)出更多更好的工作
?
----end----