Transformer가 등장하기 이전 NLP에서 언급된 문제점이 동일하게 CV에서도 고민됨
+) CNN의 filter size를 키워도 receptive field를 늘리는 것엔 한계가 있었다.
Transformer를 도입하려는 시도
Image → patch → Embedding → Transformer Encoder → Task Head
(H,W,C)
크기의 이미지를 크기가 (P,P)
인 패치 N
개로 자른다.
e.g.) (H, W, C) 이미지를 16개의 패치로 나눌 경우 → (16, H/4, W/4, C)
(패치의 개수인 N을 미리 정하는 경우 계산 방식)
e.g.2) (H, W, C) 이미지를 (2, 2) 패치로 나눌 경우 → (HW/4, 2, 2, C)
(패치의 크기인 P를 미리 정하는 경우 계산 방식)
각각의 패치를 Flatten
한다.
$(N, P^2\\times C)$
크기의 flattend feature를 Linear Projection으로 d_model
크기로 변환한다.
example
1. (224, 224 , 3) -> 16개의 패치로 나눈다.
각각의 패치는 (56, 56, 3) 크기를 갖고 총 16개의 패치가 생성된다. (16, 56, 56, 3)
2. (56, 56, 3) 패치들을 flatten한다. -> (9408,)
flatten한 패치들을 concat한다. -> (16, 9408)
3. Linear Projection -> nn.Linear(P**2 * C, d_model)
(16, 9408) -> nn.Linear(9408, 1024) -> (16, 1024)
Linear Projection이 완료된 임베딩 벡터에 이미지를 대표하는 cls token
을 추가한다.
→ (N+1, d_model)
CNN처럼 spatial locality (=inductive bias) 를 파악하지 못한다.
+) CV에서의 inductive bias : ML에서 일반화 성능을 향상시키기 위해 추가적인 가정인 inductive bias를 갖는 것이 좋다. CNN에서는 정보의 Locality를 가정하고 filter를 sliding window 방식으로 Convolution 연산을 수행해 얻은 정보를 종합한다. 이 과정에서 각각의 정보들은 Fully-connected layer보단 약한 관계를 맺고, 이는 Locality & translation invariance의 inductive bias를 갖는다고 표현한다. 즉, 모델이 처음 보는 이미지를 입력받아도 특정 부분에서 학습한 locality 특징을 발견한다면 이것을 통해 올바른 결과를 출력할 수 있다.
Patch를 flatten하는 과정에서 이미지의 Spatial 정보가 파괴된다.
⇒ Patch를 더 효율적으로 설계하는 구조를 제안
⇒ Inductive bias를 고려한 transformer 구조를 제안
계층적 구조 : 작은 단위의 patch ~ 큰 단위의 patch 를 각각 연산해 merge하는 구조
파이프라인
(4,4)
patch로 이미지를 분할
e.g. (224, 224, 3)
→ patching → (3136, 4, 4, 3)
Concatenate : Channel 을 Concat함
e.g. (3136, 4, 4, 3)
→ (3136, 16 x 3)
Linear Projection : (H/4 x W/4, 48)
→ (H/4 x W/4, d_model)
Learned Positional Embedding.
절대적인 값을 더하는 것이 아니라 attention 연산을 수행할 때 Position Bias를 더해 bias를 학습시킨다. → 상대적인 positional bias를 학습하게 된다. → patch들 간에 상대적인 위치에 따른 bias를 학습하게 된다.
$$ \operatorname{Attention}(Q,K,V)=\operatorname{SoftMax}(\frac{Q\cdot K^T}{\sqrt{d}}+B)\cdot V $$
기존 Patch-wise Attention은 patch들 간의 attention을 연산하는 것에 초점을 둠. Swin Transformer Block은 Window를 추가해 window 내에서 patch들 간의 attention을 연산함.
하나의 Swin Transform Block 는 W-MSA layer, SW-MSA layer로 구성되어 있다.
W-MSA : Window Multi-head self attention
(H/P x W/P, C)
를 (M, M)
window로 분할한다.
(M x M, C)
크기를 갖는다.(M x M, C)
가 되도록 Q,W,V linear projection dimension = C 로 조정한다.
(M x M, C)
(H/P x W/P, C)
출력을 만듦.SW-MSA : Shifted Window Multi-head self attention
W-MSA에서 계산 복잡도를 줄이고, patch 간 유의미한 표현력을 더 높이기 위해 도입되었다. W-MSA에서는 이웃하는 patch임에도 attention 연산이 수행되지 않는 경우가 존재한다.
Cyclic Shift : 기존 W-MSA의 모듈을 그대로 활용 가능하도록 이미지를 crop & cyclic shift 하여 SW-MSA를 연산하는 방법이다.
(H/P, W/P, C)
에서 인접한 2x2 patch들을 channel 레벨에서 merge하여 resolution을 2배 줄인다.