
ViT 구현 해보느라 논문리뷰가 늦어졌네용
microsoft 논문
18000회 인용
본 논문은 semantic segmentation, image classification, object detection 등 여러 비전 task에서 우수한 성능을 보이는 Swin Transformer를 컴퓨터 비전 분야의 back-bone으로 제시함
Swint Transformer는 shifed windows를 이용한 계층적 설계를 기반으로 하는 트랜스포머 모델이다.
그동안은 CNN을 백본으로 해서 많은 아키텍쳐들이 발달해왔다. 더 크고, 더 정교한 형태의 CNN이 발전됨에 따라 performance 역시 계속 증가했음
반면 NLP는 살짝 다른 길을 걷고있다!
NLP 분야에서의 최고는 트랜스포머임.
트랜스포머가 워낙 잘나가다 보니까 vision 분야에서도 적용해보려고 여러 연구들이 진행되었고 , 아주 훌륭한 결과를 도출해냈다. ( ViT , CLIP )
저자는 CV에서 백본으로 쓰이는 genearl pupose Transformer의 적용에 대해서 연구를 했다.
language domain과 다른점은 기본처리 요소로 사용되는 것이 없다는 건데 (NLP는 단어 토큰이 있음) 시각적 요소들은 규모가 크게 다를 수 있다는 점을 지적하였다.
그리고 단어, 문장들과 다르게 하나의 고해상도 사진은 훨씬 더 많은 계산을 필요로 한다. => 비효율적임
이러한 문제들을 해결하기위해서 논문에선 Swin Transformer라는 백본 모델을 제시한다.
이는 계층적인 featur map과 qudratic이 아닌 linear computational complexity를 가진다!

이러한 계층적 구조를 지닌 덕분에 FPN ,U-Net 같은 기술들도 효과적으로 활용할 수 있다고한다 .( 뭔소리지? 일단 넘어가자 )
locally computed self attention인 non-overlapping window를 통해 linear한 computational complexity도 얻었다고 함
해상도가 224x224에서 448 x 448 이 되니까 그러면 32x32 => 64x64개의 패치니까 linear form이 나온다. 윈도우 사이즈는 7x7 고정
이러한 특징들 때문에 백본으로 쓰기 아주 좋다.
Swin Transformer는 "shifted windows"라는 기법을 사용한다. 이는 각 레이어마다 윈도우의 위치를 약간씩 이동시켜서 겹치게 한다.

자세한건 아래에서 다루겠습니다.
본 논문의 저자들은 하나의 아키텍쳐가 Vision 과 NLP task의 경계를 허물어주고 둘 다 훌륭하게 처리할 수 있다는 믿음이 있다고 합니다. Swin Transformer의 뛰어난 성능이 이 믿음에 힘을 보태주었으면 한다고 하네요 🥹
늘 그렇듯 오버뷰를 보고 옵시다.

먼저 4x4 patch size를 사용한뒤 48 ( 4 x 4 x 3 ) feature dimension을 C로 바꿔주는 linear embedding 을 통과합니다.
=>nn.Conv2d(3,C,4,strid=4) 와 같다
그러면 C x 56 x 56 이 ouput으로 나오겠죠? 여기서 윈도우 크기 내에서 (예를들면 7x7) self- attention을 수행합니다. attention weight가 빠져 나오면서 크기는 유지되겠죠.
여전히 Cx56x56 입니다.

2x2 기준으로 Merge합니다. Merge한 4C가 Linear layer 를 거쳐서 4C=>2C가 되게 해줍니다. 28x28x2C가 되겠죠?
28x28에 대해서 또 윈도우 크기 내에서 self-attention 수행합니다.
2x2 기준으로 Merge합니다. 근데 Linear layer 를 거쳐서 8C=>4C가 되게 해줍니다. 14x14x4C가 되겠죠?
14x14에 대해서 또 윈도우 크기 내에서 self-attention 수행합니다.
2x2 기준으로 Merge합니다. 근데 Linear layer 를 거쳐서 16C=>8C가 되게 해줍니다. 7x7x8C가 되겠죠?
7x7에 대해서 또 윈도우 크기 내에서 self-attention 수행합니다
왜 back bone으로 사용가능하지?
이것은 마치 전통적인 CNN layer처럼 계층적으로 feature map을 뽑아 낸 것이라고 할 수 있습니다.
( self-attention으로 학습하고 줄이고 self-attention 학습하고의 반복이니 receptive field를 늘려가는 과정이라 할 수 있겠네요 )
그래서 기존 CNN 기반 아키텍쳐들을 대체할 수 있다고 말하죠
우리가 그동안 언급했던 self-attention은 그냥 이루어지지 않는다. 엄격하게 구분된 상태에서 self-attention을 수행하는 방식은 gloabl한 정보교환이 이루어지지 않기 때문에 우리는 shifted window partitioning을 도입할 것이다.
위와 같이 window를 움직인다. 윈도우 사이즈가 M이라면 (⌊ M/2 ⌋, ⌊ M/2 ⌋) 만큼 이동시킴! (위에선 (2,2) )
이렇게 밀리고밀리다 보면 각 픽셀이 전체에 대한 정보를 갖고있게 된다.

정리하면 block 하나가 위와같은 식을 거친다.

저렇게 왼쪽처럼 따로따로 attention 하면 GPU의 오버헤드가 커지게 된다.
(4번에 끝날거 9번이나 함수 호출하게 됨 => 메모리에 가서 가져왔다가 다른거 가져왔다가 )
패딩을 0 으로해서 계산할수도 있지만 이러면 불필요한 computation량이 많아짐 ( 위에만해도 7x7x8)
그래서 그림처럼 cyclic shift를 한뒤에 경계로 구분되어 있는 네모에 대해서는 masking을 하는 전략을 취한다. GPU효율도 최대한으로 낼 수 있고 (적은 오버헤드로 병렬처리 가능) , (7x7x4)로 줄일 수 있음
지역성 정보를 추가하기위한 단계입니다.

이건 예시로 설명하는게 쉬울 것 같네요

self attention을 적용하는 패치수가 9개라 할때
초록색이 B입니다 M4 에 해당하는 파라미터를 각각 따로 설정하지 않고 [2M-1] x [2M-1] 의 작은 행렬 B^ 로 부터 가져옵니다.
그리고 학습을 진행시킵니다!
이렇게 B를 추가해주면 locality 정보를 추가해줄 수 있겠죠

모델별 block , 차원의 수, head의 수는 위와 같다네요.
Window size=7로 고정입니다.
각 헤드의 dimension =>32가 되도록 했다네요
(초반 부분의 차원이 생각보다 적네..)

(a) 부터 보자면 (1k pre-train)
ViT는 압도했지만 Efficent Net과는 비슷한성능을 보인다. 하지만 throughput을 보면 Swin이 훨씬 빠른걸 확인 할 수 있다.
(b)를 봐도 ViT를 압도한걸 볼 수 있다.

shifted window , relative positional bias의 성능도 보여주었다.
간만에 CV논문들을 읽어서 그런지 읽고 정리하는데 되게 오래걸렸네요 😅.
window를 shift해서 global한 정보교환을 하는 것 , Relative position bias의 도입, patch merging 등등 처음보는 다양한 기법들이 나와서 꽤 난이도가 있었던 논문입니다.
시간 나는대로 experiments 부분 추가로 정리하도록 하겠습니다.
감사합니다