요약


Swin TransformerViT(Vision Transformer)와 유사하게 이미지를 패치로 나누어, 각 패치를 토큰처럼 취급하여Transfomer에 전달하는 모델이다. ViT와의 차이점은 ViT은 패치를 레이어를 통과시키면서, 고정크기로만 연산하는 것에 반해, Swin Transformer레이어를 지나면서 각 패치들을 합쳐서, 패치의 크기를 크게 만들고, Self-attention의 범위를 확장시키는데 그 차이가 있다(Figure 1).  추가적인 주요 특징으로는 윈도우 내 영역내 여러 패치가 존재할 때, Attention을 줄 영역을 윈도우 내로만 주는 것이 아니라, 이전 레이어의 Window영역을 가로지를 수 있게 다음 레이어에서 Attention할 영역의 Window을 매번 달리하는 것이 있다.

Figure 1. Swin Transformer에서의 패치 영역을 합치는 단계의 예시 (a)

 

모델 설명: 1) 패치의 분리, 2) 패치의 임베딩, 3) 트렌스포머(어텐션 + Shifted window 파티셔닝), 4) 패치 병합과정의 연속


1. 이미지를 작은 단위의 이미지인 패치(Patch)형태로 분리한다: 각각의 패치는 겹치지않도록 분리하며 ViT(Vision Transformer)의 방식과 동일하게 이미지를 분리한다. 즉, 각 패치는 정사각형의 p x p의 형태를 갖는다. 예를들어, MNIST의 28 x 28의 이미지 크기라면, 4x4패치를 만든다고 가정하면, 49개의 패치가 생긴다(49=28/4 * 28/ 4) (Figure 2. 패치 파티셔닝의 예시).  

Figure 2. 패치 파티셔닝의 예시

  

 

2. 각 패치의 벡터 형태로 변환한다. 1. 단계에서의 패치의 크기는 $P \times P $이다. 이 이미지가 3차원이었다면, 이를 모두 concat함과 동시에 Flatten하여 $ P \cdot P \cdot 3 $의 형태로 변경한다. 즉, 채널에 해당하는 벡터까지 옆으로 펼쳐서(Flatten) 벡터화 한다. 

 

3. 선형결합을 하여 C차원을 가진 벡터로 만든다. 패치의 가로X세로가 PXP인 것을 3채널을 펼쳐(Flatten)하여 PxPx3의 벡터를 만들었다. 이 벡터를 압축하여, 임의의 크기가 C인 벡터로 만들어준다(=쉽게 말해 Dense(C)을 한번 거쳐준다). 이 연산의 결과의 벡터는 $\mathbb{R}^{C}$이다. 

 

 

4. Stage 1에서는 Swin transformer block을 통과시킨다: 이 때의 각 패치의 차원은 동일하게 유지한다. 즉 C에서 C로 나온다. 다만 벡터내 원소의 숫자는 다르다.

 

5. Stage 2. 인접패치를 합쳐준다: 첫 번째로 임베딩된 패치들은 근처의 2x2패치들을 합친다(Concat). 3의 단계에서 각 패치들을 C차원의 벡터로 만들었기 때문에, 4C 차원의 벡터가 만들어진다. 이 합치는 연산은 토큰의 숫자를 많이 줄여든다. 일종의 Pooling과 비슷하다(=본문에 ”down sampling of resolution”라고 기술됨.).   

6. Stage 2단계를 2번, 위와 비슷한 Stage 3단계를 6번, Stage 4단계를 2번진행한다.  

 

 

Window 영역 내에서만 attention을 적용하는 이유? 계산 복잡도 때문에...


Transformer에서는 토큰과 토큰사이의 관계를 모두 Attention을 적용하며 학습한다. 토큰의 수가 N이라면, NxN의 Attention weight matrix가 나오게 되는 것이다. Vision문제에서 이를 쉽게 적용할 수 있을까? 그렇지 않다. 이미지 자체가 128 x 128이면 엄청난 크기의 attention weight matrix가 생성되어야하기 때문이다. 저자들은 이를 해결하기 위한 방법을 고안했다.

1) Self-attention in non overlapped window: Window 영역을 정하고, 이 내에서만 self attention을 적용하는 것. 아래와 같이 작은 사각형은 각 패치를 의미하고, 두꺼운 줄을 가진 큰 사각형은 Window으로 정의해보자. 윈도우 영역내에는 4x4 (본문내 M x M)개의 패치가 있다. 이를 global self attention을 한다고생각하면, ....다음과 같은 계산이 나온다.

Window 영역내 self attention 예시 그림

한 윈도우에, 패치가 M x M이 있다고 가정하고, 일반적인 global self-attention을 하는 경우(1)와 widnow내 h x w개의 패치가 있는 경우를 계산복잡도를 구하면 아래와 같다. 중요한건 총 패치수인 h x w 수가 증가할 때, (1)의 식은 제곱으로 복잡도가 증가하지만, (2)의 식은 선형적으로 증하한다는 것이다. 윈도우 내에만 self attention하는 것이 컴퓨터비전에서 계산 복잡도를 낮출 수 있기 때문에, 이 방법을 저자들은 생각했다.

 

 

Shift window 을 구현하는 방법과 그 이유: 윈도우 내에서만 attention을 계산하면, 윈도우 넘어 연결성이 부족하기에... 윈도우 영역을 돌려가며(cyclic) 윈도우를 정의


Shift attention을 적용하기위해서 각 attention을 적용하는 단계를 본 논문에서는 module이라고 부른다. 논문에서는 2개의 모듈을 사용하는데, 첫번째는 왼쪽 상단에서 규칙적인 모양을 가진 window로 attention을 하고, 두 번째 모듈에서는 규칙적으로 분할된 윈도우에서 $(\lfloor\frac{M}{2}\rfloor,\lfloor\frac{M}{2}\rfloor)$ 만큼 떼어냏어 옮긴 후에 attention을 적용하는 것이다.

W-MSA(Window-Multihead Self-Attention) 방법과 이를 Shift(Cyclic shfit)하여 옮긴후에 attention하는방법

 

 

반응형

 

요약

 


ViT(Vision Transofmer)은 자연어처리(NLP)분야에서는 성공적인 성능을 보이는 트랜스포머(Transfomer)을 컴퓨터 비전까지 적용하기에는 제한이 있어왔는데, 이를 시도한 사례이다. 트랜스포머에서 각 토큰을 임베딩하여 샐프 어텐션(Self-attention)하는 것과 같이, 각 토큰을 이미지로 생각하여 트랜스포머의 인코딩에 전달하는 것이 이 모델의 골자이다.

 

Vision Transformer의 시각화. 각 이미지를 1부터 9까지 패치를 만든다음에, 각 패치를 단어처럼 취급해서 임베딩한다. 임베딩할때는 0, 1, 2와 같이 이미지 패치가 어디서부터 기원했는지에 위치정보를 더해주는 포지셔널 인코딩(positional encoding)과 유사하게 패치 위치를 가리키는 벡터도 포함한다. 이를 트랜스포머의 인코딩에만 전달하면 ViT의 완성이다. GIF 출처: https://en.wikipedia.org/wiki/Vision_transformer#/media/File:Vision_Transformer.gif

 

 

모델 아키텍처 설명


본문에서는 별 다른 수정없이(with the fewest posiible modification) NLP에 쓰이던 트랜스포머를 영상처리에도 쓸 수 있다고 소개한다. 그림은 아래와 같다. 큰 순서는 다음과 같다. 1) 이미지를 잘게 자른 패치(Patch)로 N개의 패치를 만든다. 2) 패치를 Flatten하게 벡터화한다. 3) 벡터화한 이미지를 선형으로 결합하여 임베딩한다. 4) 임베딩된 결과에 클레스를 예측하는 클래스 토큰을 더해준다. 그리고, 포지셔널인 임베딩을 더해주어 패치의 위치를 더해 연산한다. 

 

 

자세히는 아래와 같다.

1) 이미지를 잘게 자른 패치(Patch)로 N개의 패치를 만든다. 원래 이미지가 H, W에 C채널 이미지인 것으로 고려한다. 컬러가 R, G, B였다면 C는 3이고, (1024, 1024)의 HD 이미지면 H는 1024, W은 1024값을 갖는다. 이런 이미지를 겹치지 않게(Not overlapping) N개의 정사각형 패치로 나눈다. 패치의 크기는 P이고, 개수는 N개이다. 이 때, 당연히, N개의 개수가 정수형이어야하고, 이미지와 맞아떨어져야하므로, $N=HW/P^{2}$으로 계산해야한다. C개의 채널을 가진 가로,세로가 각각 P인 패치를 그러면 N개를 생성하게 된다. 이렇게 만든 패치를 Flatten하여 원소의 길이가 $P*P*C$인 벡터를 얻는다. 이 벡터가 그리고 N개가 있다.

 

가로(W), 세로(H), 채널 수(C)개의 이미지를 가로(P), 세로(P)인 N개의 패치(작은 이미지)로 나눈다. 그리고 이 이미지를 Flatten한다. $\times$은 메트릭스와 같이 차원이 있다는 얘기기고, "."은 그냥 차원이 없다는 의미이다.

 

2) 각각의 패치를 각각 선형결합하여 임베딩시킨다: 각 패치를 선형결합시켜서(Dense layer을 통과시켜) 원소의 길이가 D인 벡터를 만든다. 이 단계가 $\mathbb{R}^{P^{2}C} \cdot \mathbb{R}^{P^{2} C \times D}->\mathbb{R}^{D}$에 해당한다. Linear projection을 해서 원소의 개수가 D개인 벡터를 만드는 단계이다.

 

3) 각 임베딩한 원소를 concat하고 포지션임베딩을 더해준다.: 각 원소의 길이가 D개인 벡터를 모두 concat해서 길게 만든다. 가령 N개의 패치에 D개의 원소의개수를 가진 벡터로 패치를 선형결합시킨 결과를 얻었다고하면 $N \times D$의 차원의 메트릭스를 얻게된다. 거기에 하나를 더해서 클레스임베딩($x_{class}$)을 정의하여(\mathbb{R}^{D}) 더 concat해준다. 결과적으로 $\mathbb{R}^{(N+1)\timesD}$의 메트릭스를 얻게된다. 거기에 포지셔넝임베딩을 하나 정의하여 함께 더해준다. 이 포지셔널 임베딩의 크기는 $\mathbb{R}^{(N+1)\timesD}$ 와 같다.

 

 

4) Self-attention 및 정규화 단계(NL): Transformer와 같이 진행한다. 이미 위의 단계에서 충분히 이미지를 임베딩하였으니 Transformer의 일반적인 연산과정을 거친다.

 

 

 

CNN과의 비교?

위의 연산과정을보면, ViT도 CNN과 유사한 방식을 사용한다. 패치사이즈인 16x16, stride 16의 convolution을 하는것과 같이 진행한다.

  1. 가장 큰 차이는 CNN은 국소성(locality)가 있어서 각 특징값들을 픽셀 단위에서 특징값으로 잘 표현되는데, ViT은 Transformer이다보니, 이미지의 패치의 시리즈간의 연결성도 강조할 수 있다. 즉 좌측상단의 패치와 우측상단의 패치가 연관성을 이어줄 수 있다는 것이다. 이러한 분석방법이 더욱 픽셀단위의 중요성을 강조할 수 있다고 소개되어있다[1]. 
  2. 하지만 CNN별로 데이터가 엄청나게 많지 않아도 잘 학습되는 반면, Vision Transformer은 꽤 많은 양의 데이터를 필요로한다. 
  3. Inductive bias을 줄일 수 있다. CNN은 이미지를 다루기 위한 Inductive bias을 갖고있다. 가령 CNN은 학습해야하는 커널이 각 이미지영역을 훑고 지나가면서, 근소한 이미지 연관성이 크게 학습되도록 꾸며져있고(=이를  Locality(근접 픽셀끼리의 종속성)라 함). 또한, 패치가 여러 영역을 훑기 때문에, Translation Invariance(사물의 위치가 바뀌어도 사물을 인식)의 이 된다. 하지만, 이러한 CNN의 가정들(메커니즘 방식)보다 각 패치의 연관성을 글로벌하게 연관지어 학습하기 때문에 Inductive bias을 줄일 수 있다고 한다[2][3].

 

[1] https://en.wikipedia.org/wiki/Vision_transformer

[2] Raghu, Maithra; Unterthiner, Thomas; Kornblith, Simon; Zhang, Chiyuan; Dosovitskiy, Alexey (2021-08-19). "Do Vision Transformers See Like Convolutional Neural Networks?". arXiv:2108.08810.

[3] Coccomini, Davide (2021-07-24). "Vision Transformers or Convolutional Neural Networks? Both!"Towards Data Science.

[4] https://arxiv.org/pdf/2010.11929.pdf

 

Vision transformer - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search A Vision Transformer (ViT) is a transformer that is targeted at vision processing tasks such as image recognition.[1] Vision Transformers[edit] Vision Transformer Architecture for Imag

en.wikipedia.org


 

반응형

+ Recent posts