본문 바로가기
인공지능 개발하기/기술 & 논문 리뷰

[논문 리뷰] ViT(An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale)

by 선의공 2024. 6. 16.

논문 : https://arxiv.org/pdf/2010.11929

 

이번 포스팅에서는 2021년 Google Brain Team에서 발표한 Transformer를 이용한 이미지 분류 모델

ViT(An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale)에 대한 논문 리뷰를 진행하겠습니다.

 

 

해당 포스팅을 참고했습니다.

https://hipgyung.tistory.com/entry/%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-ViTVision-Transformer-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-An-Image-is-Worth-16x16-Words-Transformers-for-Image-Recognition-at-Scale

 

쉽게 이해하는 ViT(Vision Transformer) 논문 리뷰 | An Image is Worth 16x16 Words: Transformers for Image Recognition at

ViT(Vision Transformer) 논문 리뷰를 해보겠습니다. Transformer는 NLP 테스크에서 Bert, GPT-3 등 기반 알고리즘으로 유명하죠. 이런 Transformer 알고리즘을 Vision 분야에서 사용합니다. 시작하기 앞서서 Transform

hipgyung.tistory.com

https://kikaben.com/vit-vision-transformer-image-classifier-2020/

 

KiKaBeN - ViT: Vision Transformer (2020)

An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale

kikaben.com

 


 

1. Vision Transformer Architecture

 

1-1. Vision Transformer Overview

 

 

 ViT의 전체적인 구조에 대해서 설명하겠습니다.

먼저 입력 이미지를 고정된 크기의 patch로 나눠줍니다.

해당 patch는 Linearly embedding 되어 Vector값으로 변경되며

Positional Embedding을 더해 Transformer Encoder의 Input값으로 들어갑니다.

 

 

 

1-2. Linear Projection of Flattened Patches

 

이번에는 patch를 vector값으로 변경시키는 해당 부분을 더 살펴보겠습니다.

Transformer 의 Input값은 1차원 시퀀스이므로, 해당 구조에 Input값으로 넣어주기 위해서는

 H x W x C 형태의 이미지 데이터를 N x (P^2 * C) 형태로 변환해야합니다.

여기서 H는 이미지의 높이, W는 이미지의 폭, C는 이미지의 채널 수입니다. 

N은 시퀀스 수, P^2는 patch의 크기입니다.

N은 해당 수식으로도 표현할 수 있습니다.

(이미지 자체의 크기를 patch 크기로 나눈 수입니다.)

 

해당 변환한 이미지 데이터를 patch embedding을 통해 D차원의 벡터로 변경합니다. 

해당 데이터 맨 앞에 class token(BERT의 [CLS]와 유사한)을 추가하고,  

이 class token의 맨 마지막 hidden state는 이미지 전체를 대표하는 특징 벡터가 되어 분류에 사용되게 됩니다.

 

추가적으로 patch embedding을 더 설명하자면,

논문에서는 이미지 크기는 224, 패치크기를 16로 정해주었으며,

패치크기인 16x16를 kernel size로 갖고, 동일한 크기인 16을 stride로 가지는 convolution layer를 사용해서 임베딩을 진행합니다.  

해당 임베딩 값을 flatten으로 평탄화해서 Transformer Encoder로 들어갑니다.

 

공식 구현 코드에서는 Convolution layer를 아래와 같이 구현합니다. 

# We can merge s2d+emb into a single conv; it's the same.
x = nn.Conv(
        features=self.hidden_size,
        kernel_size=self.patches.size,
        strides=self.patches.size,
        padding='VALID',
        name='embedding')(x)

 

 

1-3. Transformer Encoder as a Freature Extractor

 

ViT의 Encoder는 CNN 구조의 다른 이미지 분류 모델의 feature extractor(특징추출기)에 해당되는 역할을 합니다.

CNN 구조의 모델에서 Backbone이라고 표현하는 부분입니다.

이미지의 지역적 패턴이 중요하다고 판단한 CNN과는 다르게

ViT에서는 1D Positional Embedding을 사용해서 이미지 전체의 global한 관계를 학습하게 됩니다. 

 

이런 구조의 ViT는 대규모 데이터셋에서 pre-training될 때 더 좋은 성능을 발휘합니다.

충분한 데이터가 주어지지 않으면 overfitting의 위험이 높아지고 패턴의 관계를 학습하는데 어려움이 있다고 하네요.

(해당 내용은 데이터셋의 크기에 따라 모델 선정을 결정하는 기준이 될수도 있겠네요..!)


 

2. Vision Transformer Experiments

 

2-1. 기존 모델과 성능 비교 

 

ViT의 다양한 모델입니다.

 

ViT-H/14는 Huge모델이고 patch크기가 14,

ViT-L/16은 Large모델이고 patch크기가 16을 의미합니다.

ViT 모델의 성능은 몇 데이터셋에서 ResNet152x4, EfficientNet-L2 보다 성능이 뛰어나다고 설명합니다.

(21년에 발표된 ViT-H/14 모델은 2024년 현재 CIFAR-10에서 아직도 SOTA를 달성하고 있습니다.)

 

 

 

2-2. 대규모 데이터셋에 대한 pre-training 효과

 

ImageNet, ImageNet-21K, JET-300M 데이터셋에서 pre-training 후 

DownStream Task에 fine tuning시켰다고 합니다.

ViT는 더 큰 데이터셋에서 pre-training 될 때 더 나은 성능을 발휘한다는 것을 설명합니다.

 

 

2-3. Attention 시각화

 

ViT가 Transformer의 Attention을 통한 이미지의 주요 객체를 효과적으로 포착한다는 것을

시각적으로 표현하고 있습니다.

실제로 배경보다 객체에 주목되는 모습입니다. 

 

2-4. Self-supervised Masked Patch Prediction

 

ViT를 BERT와 같이 자가 지도 학습(Self-supervised learning)에 사용을 했다고합니다.

BERT모델은 token의 일부를 마스킹 하고 

해당 마스킹 token을 예측하도록 Self-supervied leaning을 진행하는데

이 부분을 이미지 모델로서 따라서 실험한 것 같네요.

ViT-B/16 모델을 사용해서 실험했고, ImageNet 데이터셋에서 79.9의 accuracy를 달성했다고 합니다.

이는 pre-training 모델을 사용하지 않고 처음부터 학습한 모델에 비해 2%의 높은 accuracy이며,

pre-trainig 된 모델을 사용해 fine-tuning한 모델보다는 4% 낮은 accuracy라고 합니다.