天天看點

【Transformer 論文精讀】……Swin Transformer……(Hierarchical Vision Transformer using Shifted Windows)

文章目錄

  • ​​一、Abstract(摘要)​​
  • ​​二、Introduction(引言)​​
  • ​​三、Related Work(相關工作)​​
  • ​​四、Method(方法)​​
  • ​​1.Patch Merging子產品​​
  • ​​2.W-MSA子產品​​
  • ​​3.SW-MSA、masked MSA子產品​​
  • ​​五、Conclusion(結論)​​
  • ​​六、小總結​​

論文題目:

Swin Transformer: Hierarchical Vision Transformer using Shifted Windows

論文下載下傳位址:

​​https://arxiv.org/pdf/2103.14030.pdf​​

論文用的是2021 8月17日的版本。

Swin Transformer是ICCV 2021的最佳論文,這一篇論文是繼Vit之後的Transformer在CV領域的巅峰之作。

在paperwithcode上可以看到,SwinV2版本已經将coco資料集的精确度刷到了63.1%,而卷積系列還在50%+。Swin很可能引領之後的CV領域。

這是基于Vit的一篇論文,可以看一下我之前的Vit閱讀筆記:

  • Vit閱讀筆記

一、Abstract(摘要)

作者在摘要中說他提出了一個Swin Transformer的模型,可以當backbone。

之前在Vit的結尾,Vit的作者說他的Vit模型并不能用于全部的CV領域工作,留了一些分割啊等等任務給後人,是以Swin作者摘要中就直接說他的Swin墨西哥可以當backbone,算是填補了Vit留下的坑吧。

緊接着作者提出了将Transformer從NLP搬到CV面臨的關鍵問題:

  • 一個是尺度問題,圖檔裡包含的資訊很多,可能有螞蟻大小,也可能有高樓大小的不同尺度。
  • 另一個就是圖檔分辨率(resolution )太大了,如果以像素點為機關,則計算量爆炸,序列長度爆炸,是以之前Vit提出了patch方案,或小視窗+自注意力等,都是為了解決序列長度問題。

為了解決這兩個問題,作者提出了一個叫 Hierarchical Transformer的模型,使用shifted windows(移動視窗)的方法。

随後作者說到移動視窗的好處,這好處當然就是解決了上面的兩個問題,因為是變成了更小的視窗,是以序列長度問題得到解決,因為自注意力在一個小視窗内計算,是以計算複雜度直線下降,且通過移動使得相鄰的視窗之間有了聯系,整合了各個尺度的資訊。

感覺這滑動視窗式的操作有點CNN感受野那味了,如果不是看到了Swin的實驗結果,我還以為是那個學術機構在水論文,這是直接給CNN感受野套殼啊,哈哈,不過Swin的這個實驗結果,基本霸榜了很多資料集,是以這裡隻能說是抽取了CNN的部分優點拿過來用了。

二、Introduction(引言)

引言的前兩段又是湊字數湊格式的話,就将了一下Alex引領的CNN主導CV領域的事,一直以來都是擠牙膏式的發展,沒什麼大突破,作者意在完全抛棄CNN,建立一個新的模型方法,但是Vit已經把這個事幹了,但是Vit并不是所有的CV領域都可以做,是以這篇論文的作者要填Vit的坑,讓Transformer在所有的CV領域 比如分割等都可以做。

第三段作者開始介紹她的模型,給了一張圖:

這裡的模型和過程在後續的method裡會詳細說。

【Transformer 論文精讀】……Swin Transformer……(Hierarchical Vision Transformer using Shifted Windows)

右邊就是Vit的圖,分成16 * 16的小patch,圖裡寫的16x就是16倍下采樣率,Vit始終在整個圖上進行自注意力,并且沒有多尺度特征。

左邊就是本篇論文圖了,我們知道,對于CV的下遊任務,比如密集的檢測和分割,融合底層和高層的特征資訊對結果有較顯著提升,大多數使用了FPN技術,FPN就是多層聯級金字塔,使用了bottom-up與top-down方法,融合了底層和高層的特征,解決了語義鴻溝問題,詳細:​FPN論文筆記。

Swin不同于Vit,Vit是在整個圖上自注意力,而Swin是在每一個小格子裡自自注意力。

Swin解決多尺度的方法也很簡單,一開始是4倍下采樣率,然後是8倍.16倍。也就是說,每次會融合相鄰的4個patch變成一個大的patch,這個大patch感受野可以感受到之前四個小patch的特征,進而抓住了多尺寸的特征。

有了多尺寸的特征圖,給FPN就可以做檢測了,給U-NET就可以做分割了,是以作者說他的模型可以做骨幹網絡back-bone。

第四段作者開始講他Swin的移動視窗操作,看一下作者給的圖:

【Transformer 論文精讀】……Swin Transformer……(Hierarchical Vision Transformer using Shifted Windows)

圖裡每一個小方塊就是一個patch(4 * 4),每一個紅框就是一個視窗,本論文中一個紅色視窗裡有49個小patch。

原本每一個紅色視窗裡的小patch和其他紅色視窗裡的patch是沒有互動的,而當紅色視窗移動後,原本不屬于一個紅色視窗裡的patch可以互動了,也就是因為移動,使得不同patch移動到一個紅色視窗裡了,這樣再自注意力,看似是視窗内的局部注意力,實際上通過移動後就近似于全局注意力了。

引言的最後作者展望了一下Transformer的大一統結局。

三、Related Work(相關工作)

又是車轱辘話來回說,先介紹了傳統的CNN和變體,然後又介紹了一下之前Transformer中自注意力的工作,沒什麼可看的,下一章!

四、Method(方法)

這一章就是模型的詳細介紹了。

作者給出了模型總覽圖:

【Transformer 論文精讀】……Swin Transformer……(Hierarchical Vision Transformer using Shifted Windows)

在Swim這篇論文中的patch是4 * 4 不是Vit裡的16 * 16了。

這裡很多的參數次元變換就不說了,主要是搞懂裡面的各個子產品。

幾個子產品:

  • Swim Transformer Block
  • Patch Merging

其中 Transformer Block的圖論文中也給出來了:

【Transformer 論文精讀】……Swin Transformer……(Hierarchical Vision Transformer using Shifted Windows)

其中LN和MLP之前都學過了,就一個W-MSA和SW-MSA需要看一下。

是以實際上Swim模型就三個子產品要學習:

  • Patch Merging
  • W-MAS
  • SW-MSA

下面逐一來看。

1.Patch Merging子產品

相當于CNN裡的池化操作。

在網上找了張圖便于了解, 圖源:bilibili:霹靂吧拉Wz

【Transformer 論文精讀】……Swin Transformer……(Hierarchical Vision Transformer using Shifted Windows)

這個圖畫的很清晰,

  • 第一步先提取每個2 * 2 相同位置的patch放到一起,這裡就是隔點采樣,或者了解成空洞卷積?
  • 然後在深度方向進行拼接。
  • 最後經過LN層,然後再線性層(1*1卷積)。
  • 最終得到的長寬縮減一半,深度擴大一倍。

2.W-MSA子產品

Windows Multi-head Self-Attention(W-MSA)子產品是為了減少計算量。

在用一次這個圖:

【Transformer 論文精讀】……Swin Transformer……(Hierarchical Vision Transformer using Shifted Windows)

在計算自注意力的時候,Vit是在全局上做自注意力,也就是每個patch兩兩之間都要做計算,比如有1234一共四個Patch,則12,13,14,23,24,34這樣兩兩之間做計算。

這樣就帶來一個問題,随着圖檔的增大,這個計算量是爆炸的。

是以Swin就分成好幾個大的塊(左邊紅色的視窗),自注意力在每個大的塊之内進行,塊之間的patch是沒有互動的,這樣就大大降低了計算複雜度。這就是W-MSA。

在論文中作者有給出公式對比兩種自注意力的複雜度,就不看公式了,兩者相差幾十甚至上百倍,記個結論算了哈哈。

3.SW-MSA、masked MSA子產品

Shifted Windows Multi-Head Self-Attention (SW-MSA)。

上面的W-MSA雖然解決了計算量的問題,但是也引入了一個新的問題,就是各個紅框的大patch(視窗)之間的小patch沒辦法互動了,損失了一定的全局模組化能力。是以為了彌補這個缺陷,提出了SW-MSA子產品。

再看一下論文中給的那個移動的圖:

【Transformer 論文精讀】……Swin Transformer……(Hierarchical Vision Transformer using Shifted Windows)

乍一看不是很好了解,看一下下面的過程。

移動過程看圖:

圖源還是bilibili霹靂巴拉

原始:

【Transformer 論文精讀】……Swin Transformer……(Hierarchical Vision Transformer using Shifted Windows)

向右,向下移動兩個機關:

【Transformer 論文精讀】……Swin Transformer……(Hierarchical Vision Transformer using Shifted Windows)

這樣進行移動,就彌補了W-MSA裡的缺陷,可以融合不同Windows裡的patch資訊了。

這樣又出現了一個新的問題:

【Transformer 論文精讀】……Swin Transformer……(Hierarchical Vision Transformer using Shifted Windows)

原來是四個Windows,移動之後變成9個Windows,那就要在這新的9個Windows上做自注意力,這無疑是拆東牆補西牆的操作,計算量又增加了。

作者提出了彌補方法:

【Transformer 論文精讀】……Swin Transformer……(Hierarchical Vision Transformer using Shifted Windows)

在網上找了個比較好了解的過程圖,繼續偷圖哈哈。

我嚴重懷疑作者的思路是玩七巧闆的來的~~~~

【Transformer 論文精讀】……Swin Transformer……(Hierarchical Vision Transformer using Shifted Windows)

将移動後的區域标号,A對應0,C對應1+2,B對應3+6.

開始變換,将區域A,C移動到最下方:

【Transformer 論文精讀】……Swin Transformer……(Hierarchical Vision Transformer using Shifted Windows)

再将BA區域移動到最右邊:

【Transformer 論文精讀】……Swin Transformer……(Hierarchical Vision Transformer using Shifted Windows)

可以看到當現在移動完成之後,左上角的紅色框window就是4 * 4的,右邊B和中間的一個小長條組合變成 4 * 4(5和3區域),左下角兩個躺着的長方形組成4 * 4 (1和7區域).右小角四個小2 * 2 組成4 * 4 (8.2.6.0區域)。這樣一來就又是4個4 * 4 的window,跟移動之前的window是一樣的。

但是這樣又引來一個問題就是 原本的3和5區域不是挨着的,不在一塊。但是現在3和5強行組成一個windos,在這個windos裡做自注意力會出問題。

作者又提出一個子產品來解決這個問題就是 ​

​masked MSA​

​即帶蒙闆mask的MSA。 關于masked MSA計算過程,我看了一邊不是特别了解,就是上述的兩個區域3和5分别計算,在計算的過程将其中一個區域的權重值-100,然後softmax之後就變成0了,這樣就分割開兩個區域了。(這裡其實沒太搞懂,這樣的話計算量應該是線性增加了一些,并不是和移動之前的一樣吧?我沒太想深究,感覺可以直接記結論。)

全部計算完成後要将資料挪回原來的位置上。

五、Conclusion(結論)

結論按照慣例繼續車轱辘話來回說,作者提出了一種層級式的Transformer模型,叫做Swim Transformer,計算複雜度很低,與輸入模型呈線性增長,已經是SOTA了,作者希望Swim在多模态方面出現更多更好的工作。

六、小總結

  • 将層次性、局部性和平移不變性等先驗引入Transformer網絡結構設計。
  • Swim并沒有像Vit那樣使用cls token。
  • 加入了類似于CNN池化層的操作 Patch Merging。
  • 主要貢獻是提出了 Shifted Windows 移動視窗的自注意力模型。
  • 因為提出的移動視窗,進而使Swim可以徹底的應用在CV的各個領域中了,Swim可以作為back bone主幹網絡。
  • 移動視窗和相對位置編碼對分類任務提升效果不顯著,對下遊任務,分割檢測等提升效果顯著。

繼續閱讀