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

swin transformer代碼庫(kù)
一系列更新,swin transformer 3月份上傳論文,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ò)
接下來(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 的論文
效果炸裂
Swin Transformer 的提出主要是用來(lái)做視覺(jué)的下游任務(wù),所以主要看一下 COCO 和 ADE20K這兩個(gè)數(shù)據(jù)集上的表現(xiàn)
下圖 COCO 數(shù)據(jù)集上的表現(xiàn)

ADE20K數(shù)據(jù)集

研究動(dòng)機(jī):證明transformer是一個(gè)通用骨干網(wǎng)絡(luò),可以用于所有視覺(jué)任務(wù)

vit缺陷:雖然可以通過(guò)全局自注意力操作達(dá)到全局建模能力,但是對(duì)多尺寸特征的把握會(huì)弱一些,不適合處理密集預(yù)測(cè)任務(wù),全局自注意力對(duì)于視覺(jué)任務(wù)有點(diǎn)浪費(fèi)資源
檢測(cè)和分割任務(wù)處理多尺寸特征的方法

降低復(fù)雜度:小窗口之內(nèi)算自注意力
如何生成多尺寸特征?
CNN有pooling操作,可以增大卷積核的感受野,從而使得每次池化的特征抓住不同物體的特征
swin transformer提出類(lèi)似于池化的patch merging,這樣合并的大patch內(nèi)容可以看到之前4個(gè)小patch看到的內(nèi)容
swin的一個(gè)關(guān)鍵因素:滑動(dòng)窗口

模型前向過(guò)程

linear embedding:把向量維度變成一個(gè)預(yù)先設(shè)置好的值(Transformer能夠接收),論文里把超參數(shù)設(shè)置為C(網(wǎng)絡(luò)總覽圖C=96)
56 x 56=3136 拉直成序列長(zhǎng)度,96是每一個(gè)token的向量維度
vit的patch size=16 x 16,序列長(zhǎng)度=196,3136太長(zhǎng)了,不是TRM可以接受的
所以swin transformer引入基于窗口的自注意力,每個(gè)窗口按照默認(rèn)來(lái)說(shuō)有7 x 7=49個(gè)patch,序列長(zhǎng)度=49非常小,解決了計(jì)算復(fù)雜度的問(wèn)題,暫時(shí)把transformer block當(dāng)做一個(gè)黑盒,我們只關(guān)注輸入和輸出的維度
想要構(gòu)建多尺寸信息,需要層級(jí)式的transformer block,也就是CNN中的池化操作
patch merging操作

顧名思義,把鄰近的小patch合并成一個(gè)大patch,就可以起到下采樣特征圖的效果
這里我們要下采樣2倍,所以我們選點(diǎn)時(shí)每隔一個(gè)點(diǎn)選一個(gè)
假如說(shuō)原來(lái)的張量是HxWxC,那么經(jīng)過(guò)這次采樣之后得到4個(gè)張量,每個(gè)張量大小(H/2)x(W/2),尺寸縮小1倍,將張量在C的維度上拼接起來(lái),相當(dāng)于用空間上的維度換了更多通道數(shù)
為了和CNN保持一致(resnet和vggnet一般在池化操作之后,通道數(shù)翻2倍),用1 x 1卷積把通道數(shù)4C變成2C,空間大小減半,通道數(shù)x2,就和CNN完全對(duì)等起來(lái)
基于窗口(移動(dòng)窗口)的自注意力
全局自注意力:會(huì)導(dǎo)致平方倍的復(fù)雜度,(對(duì)于視覺(jué)的下游任務(wù),尤其是密集型的任務(wù),或者遇到非常大尺寸的圖片,全局計(jì)算自注意力的復(fù)雜度就非常貴)
窗口自注意力:

每一個(gè)橘黃色的方格是一個(gè)窗口(不是最小計(jì)算單元),最小計(jì)算單元是patch,每一個(gè)窗口里有M x M個(gè)patch(論文里M=7),所有的自注意力計(jì)算都是在小窗口里完成的(序列長(zhǎng)度永遠(yuǎn)=7x7=49),原來(lái)大的整體特征圖會(huì)有多少窗口?8 x 8=64
我們會(huì)在64個(gè)窗口里分別計(jì)算自注意力
基于窗口自注意力的計(jì)算復(fù)雜度如何?

(1)標(biāo)準(zhǔn)的多頭自注意力的計(jì)算復(fù)雜度,h=w=56
(2)基于窗口的自注意力,M=7(一個(gè)窗口某條邊上有多少patch)
公式推算(1)

公式推算(2)(直接套用公式1)
現(xiàn)在高度和寬度不再是hxw了,而是MxM,將M值帶入公式1

兩公式差別,56 x 56 和7 x 7相差巨大,窗口自注意力很好的解決了計(jì)算量問(wèn)題
新問(wèn)題:窗口和窗口之間沒(méi)有通信了,這樣達(dá)不到全局建模了,會(huì)限制模型的能力,我們希望窗口和窗口之間通信起來(lái)
作者提出移動(dòng)窗口的方式

transformer block的安排是有講究的,每一次先做一個(gè)基于窗口的自注意力,然后再做一個(gè)基于移動(dòng)窗口的自注意力,這樣就打到窗口和窗口之間的通信

如圖3b

兩個(gè)swin transformer blocks加起來(lái)才是ST的一個(gè)基本單元,這就是為什么2、2、6、2都是偶數(shù)
目前的移動(dòng)窗口有哪些問(wèn)題?為甚作者要提高計(jì)算性能?

原來(lái)算的時(shí)候特征圖上只有4個(gè)窗口,做完移動(dòng)窗口后得到9個(gè)窗口,窗口數(shù)量增加,且大小不一
怎么讓移位完的窗口數(shù)量還保持4個(gè),每個(gè)窗口中patch數(shù)量保持一致?

作者提出掩碼方式,當(dāng)我們得到移位后的9個(gè)窗口之后,我們不在9個(gè)窗口上算自注意力,我們?cè)僮鲆淮窝h(huán)移位,得到的窗口數(shù)還是4個(gè),計(jì)算復(fù)雜度固定了
新問(wèn)題
掩碼操作怎么做?

左邊:經(jīng)過(guò)循環(huán)位移后的操作

swin transformer的幾個(gè)變體
實(shí)驗(yàn):目標(biāo)檢測(cè)結(jié)果