---
# System prepended metadata

title: Swin-Transformer
tags: ["Deep Learning\_"]

---

# 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)）







