논문 리뷰

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

y_unique 2025. 1. 24. 16:41
728x90

진짜진짜 오랜만에 돌아온 논문리뷰 

ViT를 가지고 왔습니당 

정확하지 않으며 제 생각이 많이 들어간 글이라는 점.. 

인지하시고~

설 연휴 직전이걸랑요

새복많입니다. 


Abstract

  • nlp에서 transformer가 자리를 잡는 동안 cv에선 한계가 있었음
    • cnn 구조를 가져가면서 attention을 적용하거나 전체 구조는 유지해야만 했음
  • 저자는 pure transformer에 직접적으로 Image patch를 붙여 image classification을 수행하도록 함
  • 많은 양의 데이터로 pre-trained 되었거나 imageNet 등의 인식 벤치마크로 trnasfered 한 경우 sota 달성
    • 대체로 fewer computational resources

Introduction

  • CNN architecture with self-attention의 경우 이론적으론 효율적이지만 하드웨어적으로 아직 가속화되지 못했다
  • so transformer directly to image
    • image into patches
    • provide the sequence of linaer embeddings of patches ← input?
    • supervised
  • 하지만 mid-sized datasets such as ImageNet without strong regularization
    • ResNet보다 낮은 성능
    • → trnasformer는 CNN이 가지는 inductive bias가 부족해!!!
      • trnaslation equivariance or locality
    • 그래서 충분한 데이터가 있어도 잘 일반화되지 않음
  • 근데 lager dataset으로 하니까 성능이 높아짐
    • inductive bias가 좀 부족한 점을 이겨버린거지

 

Method

Vision Transformer

  • input : 2D image를 다루기위해 flatten
    • standard transformer input : 1D
    • (C, H, W) → (P, P) 패치로 N개로 자름
    • P는 hyperparmeter (ex 14, 16, 32 등)
    • linear projection 수행하여 D인 벡터의 시퀀스로 차원 변경
  • CLS token 
    • BERT’s class token과 유사
      • 이때 CLS 토큰은 문장의 전체 표현을 나타내는데 사용
    • leanable embedding sequence 를 앞에 붙임
      • 얘도 이미지 전체의 representation을 학습하는데 사용
    • 이는 pretraining, finetuning 단계에서 classification 하는데 사용
      • pretrain → 하나의 hidden layer를 포함한 MLP로 구성
      • finetuning → single linear layer (특정 작업에 fit 되도록)
  • position embedding
    • to position information
      • transformer는 입력 시퀀스의 위치 정보는 담을 수 없었기에
    • image patch를 입력으로 사용하니까 각 패치에 위치임베딩을 더함
    • 2D-aware position embedding 을 하면 성능 향상이 크지않았음 ⇒ 왤까?
      • → 1D 를사용
    • 이는 encoder input으로 사용
  • transformer encoder
    • multihead-self-attention and MLP의 attention layer
    • 모든 블록 앞에 LN
    • 모든 블록 후에 residual connection
    • MLP는 GELU (none-linearity)
  • inductive bias
    • ViT는 CNN에 비해 inductive bias가 적음
    • CNN
      • locality
      • two-dimensional neighborhood structure
      • translation equivariance
        • 이미지가 다른 위치로 이동해도 동일한 특징을 감지할 수 있음
    • ViT
      • MLP layer만 locality + translation equivariant
        • 왜?
          • 패치가 독립적으로 계산되니까?
          • 여기서 MLP는 position-wise FFN 이기때문에 각 토큰에 동일한 weigt 적용 → 1x1 conv를 적용하는 것과 동일
      • 초기화에서 position embedding은 2차원에 대한 정보가 포함되지 않음
        • 패치간 모든 공간적 관계는 scrach부터 학습해야함
  • Hybrid Architecture
    • CNN feature map을 input으로?
    • 패치 크기가 1x1인 경우
      • feature map을 flatten 후, transformer 차원으로 투영 시킨 것과 같다?
      • 그냥 이미지의 feature map을 일반적으로 flatten 하는 것과 같은거임
      • 패치 크기가 1x1 이면 feature map 전체를 보는 것과 같으니까

Fine-tuning and higher resolution

  • pretrain large datatsets and fintuned downstream task
  • pretiain 보다 높은 해상도를 사용하는 것이 유리.
    • 패치 크기는 동일하게 유지 → 더 긴 시퀀스 길이가 생성됨…
      • 아하.. 피자 10개를 셋이먹냐 20개를 셋이먹냐 이런건가
      • 근데 입력 시퀀스가 길어지면 좋아요?.. 성능 향상이랑 무슨 관계지
        • 일단 패치 크기가 동일한데 입력 size가 커지면 패치가 늘어날 것 -> 입력 시퀀스가 길어짐
        • 해상도가 높아진다는 관점에서 성능에 영향을 미칠 것이라고 생각 
  • fintuning 시에 position embedding이 의미가 없다?
    • pretrain 과 비교했을 때 해상도가 바껴서 의미없다고 생각함 
    • 2D 보간으로 새로 맞춤
      • 근데 위에서 무슨 2D로 하면 성능 향상이 적어서 1D로 한다하지않았나

⇒ 위 두 과정이 (패치추출, 해상도 조절) 2D 구조에 대한 inductive bias를 주입하는 효과 

 

 

Experiment는 리뷰에서 잠시 생략하도록 할게요. 


논문을 읽고! 

온전히 나의 생각 .... 

그래서 ViT가 CNN보다 좋은 게 뭘까? 

  • Self-attention 메커니즘 
    • CNN은 Local filter를 사용하여 이미지를 처리해 작은 receptive field에서 feature를 추출 
    • 하지만 ViT는 attention 연산을 통해 이미지 전체의 global한 feature를 한 번에 학습할 수 있다
  • dataset
    • ViT는 짱짱 대규모 dataset을 사용하여 뛰어난 성능을 발휘함
    • 높은 model capacity를 활용할 수 있다! 
  • 유연한 architecture 
    • 뭔가 CNN은 filter, stride 등 어떤 도메인에 특화된 hyperparmeter들이 있다면 비교적
    • ViT는 아키텍처 관점에서 그 제약이 적다고 생각 
    • 그래서 다른 데이터 type에 유연하게 적용될 수 있다?
  • hadware efficiency 
    • transfomer 기반 아키텍처는 병렬처리니까 하드웨어에서 효율적일것 

 

ViT의 contribution이 뭘까?

  • transformer를 vision task에 도입했다는 점 
    • 이전까지 transformer는 nlp task에서 사용됨 
  • patch embedding 
    • 이미지를 패치단위로 나누고 각 패치를 linear projection에 태운 후 transformer input으로 변환함 
    • 이미지를 transformer로 처리할 수 있었던 가장 큰 부분이라고 생각