참조
들어가며
최근 Vision Transformer(ViT)의 구조가 컴퓨터 비전에서 많은 발전을 이루고 있습니다. 특히, 파라미터의 수와 데이터 양이 증가함에 따라 그 성능이 정체되지 않고, 계속해서 증가하는데 있어서 크게 각광받았습니다.
하지만, 적은 양의 데이터에 대해 학습했을때는 CNN보다 성능이 저조합니다. 그 이유로는 구조 자체가 원래 NLP에서 사용되는 구조이다 보니 컴퓨터 비전에는 적합하지 않다고 합니다. 이미지는 2D 구조이기 때문에 인접한 픽셀에 대한 영향을 많아 이 CNN의 커널이 더 적합하다는 것이죠.
그렇기 때문에, CNN은 이미지내 객체가 어느정도 이동하거나, 크기가 더 커진다 하더라도 더 견고한 모델링이 가능하고, 아울러 계층적인 구조를 가지니까 low-level 부터 high-level 까지 다양한 context를 배울 수 있는 장점이 있습니다. 하지만 파라미터 수와 데이터 양이 증가함에 따라 어느정도에서 성능이 정체되는 단점이 있습니다.
이러한 이유로 본 논문은 ViT에 CNN 구조를 도입하면, 두 가지 장점이 결합되고 성능이 더 향상되지 않을 거라는 가설을 세웁니다. CNN의 구조를 도입하는 핵심적인 부분은 2가지 입니다.
- Convolutional Token Embedding
본 논문은 CNN의 계층적인 구조를 Transformer에 도입하였습니다. 각 스테이지의 시작에 Convolution 연산으로 Token Embedding(각 스테이지 초반 시퀀스를 2D 형태로 reshape 한 후 진행)을 합니다. 이렇게 함으로써 CNN의 특성인 지역적 정보를 캡처할 수 있고, 매 스테이지 시작에 해상도를 줄여 High, Low-level의 다양한 context 학습 가능하게 되었습니다. - Convolutional Transformer Block
기존 Transformer Block에서 Query, Key, Value에 각각 Linear Projection을 하는 것을 Convolutional Projection으로 변경하였습니다. 이 변경으로 추가적인 지역적 정보를 삽입할 수 있게 되며, Attention 메커니즘에서 이 정보를 적절하게 활용하였습니다.
또한 이러한 구조를 설계함에 따라 Position Encoding을 제외하였습니다. 애초에 CNN은 고정된 크기(e.g. 3*3, 5*5, 7*7)의 커널이 인접하게 붙어있어 Position 정보를 입력해줄 필요가 없었는데, 이 정보를 ViT에 삽입해주니 자연스레 필요가 없어진 것입니다.
이로 인해, 고정된 크기의 Position Encoding에 따른 고정된 이미지 해상도가 쉽게 확장이 가능하게 되었습니다.
대략적인 설명은 이렇고, 자세한 구조는 아래에서 살펴보도록 하겠습니다.
Convolutional Vision Transformer(CvT)
전체적인 구조는 아래와 같습니다.
위 그림에서 (a)를 보면 계층적인 구조로 나뉘어진 3개의 Stage가 있고, 앞서 말한 Convolutional Token Embedding과 Convolutional Transformer Block 이 구성되어 있습니다.
Convolutional Token Embedding
먼저, 2D 이미지나 2D로 Reshape된 Token map \( x_{i-1} \in \mathbb {R}^{H_{i-1} * W_{i-1} * C_{i-1}} \)이 \( i \ ) Stage에서 Convolutional Token Embedding에 입력되어 새로운 Token map을 생성합니다.
Convolutional Token Embedding은 \(f() \)로 표기하고, s x s의 커널 크기, s - o의 stride, p의 패딩, \(C_i \)의 출력 채널을 가진 단순한 Convolutional Layer입니다. 기존 ViT는 이 과정에서 non-overlapping하게 패치 임베딩을 진행하는데, 이 \( f() \) 연산은 이 패치들을 Overlapping하게 진행하였습니다(이런 방법으로 지역의 연속성을 가져가며 Position Encoding을 뗄 수 있지 않았나 하는 개인적인 견해가 있습니다).
\( x_{i-1} \)이 \( f() \)를 통과하여 새로운 Token map \(f(x_{i-1}) \in \mathbb {R}^{H_i * W_i * C_i} \)를 생성합니다. 여기서 Height와 Width의 크기는 아래와 같은 식으로 나타냅니다.
이제 Attention 연산으로 입력되어야 하기 때문에, \( f (x_{i-1}) \)를 다시 \(H_iW_i * C_i \) 크기로 Flatten하고, Layer Normalization으로 정규화해줍니다.
이러한 과정으로 매 스테이지에서 점진적으로 시퀀스의 수는 줄이며 채널수는 증가시키는 계층적인 구조로 풍부한 표현들에 대한 학습이 가능해지게 되었습니다.
Convolutional Transformer Block
본 논문은 추가적인 지역적 모델링을 위해, 기존 ViT가 Query, Key, Value에 Linear Projection 적용하는 방식을 Convolutional Projection을 적용하였습니다. 아래 그림은 기존 방식과 현재 방식을 비교한 입니다.
(a)가 기존 ViT 방식이고, (b)가 Convolutional Projection 방식으로 변형한 것입니다. 수식으로 표현하면 아래와 같습니다.
아까 위 Convolutional Token Embedding에서 1차원의 시퀀스로 출력이 나왔는데, Convolution을 적용해주기 위해 다시 Reshape 해줍니다. 그 후, 각각의 Q, K, V에 대해 Conv2d 연산을 적용하고, Self-Attention 연산을 하기위해 다시 Flatten 해줍니다.
위 과정에서 Conv2d는 depth-wise separable convolution(Depth-wise Conv2d -> BatchNorm2d -> Point-wise Conv2d)를 적용하여 연산 속도에 이점을 가져갔습니다.
본 논문은 여기서 나아가, (c)와 같이 K와 V에는 Conv2d의 Stride를 1보다 높게 설정하여, 차원을 축소하는 방법도 제안하였습니다. 이렇게 함으로써, Attention 연산 수행시 복잡도가 많이 줄어드는 장점이 있습니다. 원래 같으면 이렇게 차원을 줄이면 연산에 대해서는 이점이 있지만, 필연적으로 정보 손실이 발생하는 단점이 있었습니다.
하지만, 이미지는 객체에 따라 픽셀 주변이 중복성이 있을 확률이 높기 때문에, 발생하는 정보 손실이 크게 없을 것이라고 주장합니다. 그 근거는 아래와 같이 성능에 대한 저하가 거의 없기 때문이죠.
마치며
본 논문은 제안한 Convolutional Token Embedding과 Convolutional Transformer Block 둘 다, 지역적 공간 관계를 충분히 모델링 했기 때문에 기존과 달리 위치 정보가 필요 없습니다. 이러한 결과로 다양한 해상도의 입력으로도 확장이 쉽게 가능한 장점이 있습니다.
위치 정보를 넣어도 성능 차이는 미미하네요. 나머지 실험 결과는 원문을 참고하시길 바랍니다.
긴 글 읽어주셔서 감사합니다.
이상 포스팅을 마치도록 하겠습니다.
댓글