# Swin-Transformer 先閱讀:https://hackmd.io/@wilson920430/SJeCY1Iq1R ## Introduction 將 Transformer 應用在圖像上,跟應用在文字有以下幾個挑戰: * 視覺實體(看到的物體)在視覺範圍中會有很大的尺寸差異 * 圖像跟文字比起來,圖像的 resolution 非常高 於是提出 Shifted Window 的方法,將 self-attention 範圍限制在不重疊的 window 中,同時也允許 cross window connection,帶來更高的效率,同時也可以處理 high resolution 的圖片: ![image](https://hackmd.io/_uploads/HknLajbQC.png) 原本的 ViT 採 Global Attention,且 Feature map 都是相同尺度的。Swin Transformer 採用階層式的 feature maps(灰線),且 Attention 只在不重疊的 Window 中操作(紅線) Shift Window: ![image](https://hackmd.io/_uploads/rkDYTaW7C.png) 在連續的 Self-attention layers 之間,Window partition 改變了,跨越上一層 Window 的邊界,提供 Window 與 Window 之間的連結,大大提高模型能力。 另外,跟先前的 Sliding window based 比起來,可以有更小的 latency,因為一個 Window 中所有 Query patch 共享 key。 ## Method ### Architecture ![圖片1](https://hackmd.io/_uploads/ry_WJkGm0.png) 與 ViT 相同,第一步先把 input image 分割成不重疊的 patches,patch size 為 $4*4$, 並將每個 Patch 展平成 $4*4*3=48$ 維的向量,總共會產生 $\frac{H}{4}*\frac{W}{4}$ 個 patches 接下來進入 Stage 1,通過 Linear Embedding 將每個 patch 映射成 dimension C,並經過多個 Swin Transformer Blocks,Token 數量不變。 Stage 2 包含 Patch Merging 將鄰近的 $2*2$ patches 合併,Token 數量除以 4(變為$\frac{H}{8}*\frac{W}{8}$),Dimension 變為原本 4 倍,再經過線性映射將 Dimension 縮至 2C。Patch Merging 後是多個 Swin Transformer Block。Stage 3 和 Stage 4 結構都與 Stage 2 相似。 | ![圖片2](https://hackmd.io/_uploads/ryVD4kMmR.png) | Swin Transformer Block 堆疊與 ViT 相同<br />除了用 W-MSA (regular window)<br />SW-MSA (shifted window) 取代原本的 <br /> Multi-head Self Attention | | -------- | -------- | ### Shifted Window based Self-Attention Time Complexity:![image](https://hackmd.io/_uploads/HJVjKxzQC.png) 原本的 MSA 會是圖片解析度的二次,W-MSA 假設每個 Window 有 $M*M$ 個 Patches,只要 M 固定,時間複雜度與圖片解析度的關係呈線性。 ![image](https://hackmd.io/_uploads/rkDYTaW7C.png) $M = 4$(每個 Window $4*4$ 個 patches),將 $8*8$ Feature map 分割成 $2*2$ 個 Windows 並在下一層將 Window 移動 $(\lfloor\frac{M}{2}\rfloor,\lfloor\frac{M}{2}\rfloor)$,達成 Window 與 Window 之間的連接 ![image](https://hackmd.io/_uploads/BJHahefQR.png) 但是這樣的 Shifting 方法會造成 Window 數量不一致(原本 $2*2$ 變 $3*3$ 個) 在這裡提出一個有效率的解決方案:將超出範圍的 Window 往圖片的 top-left 方向去補,達成 cyclic shift 但是這樣一個 Window 中就可能含有不相鄰的兩部分,所以還加入 Masking 機制以確保 self-attention 的運算 ![image](https://hackmd.io/_uploads/rk02n9NmR.png) 以 $4*4$ 為例,每個 Window 展平後做 Q 與 K 矩陣相乘 我們只要保留跟自己同區域的點相乘的結果就好,其他全部 Mask 掉 當 Window 更大時的 Visualization(概念一樣): ![image](https://hackmd.io/_uploads/SJY9ycEmA.png) (以上兩張圖擷取自 [Github issue](https://github.com/microsoft/Swin-Transformer/issues/38))