///
Search
Duplicate
🖼️

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

Created
2021/07/04 07:14
발표일자
2020/10/12
발표자
김승일
Tags
Transformer
✅main
포스팅 종류
논문리뷰
작성자 : 김승일(모두의연구소 연구소장)
발표일 : 20201012 at DeepLAB 논문반

학습자료

논문 링크
함께 보면 좋을 참고자료
Attention is All You Need (Transformer를 처음 제안한 논문)
Illustrated Transformer (Transformer를 알기 쉽게 표현해 주는 블로그)
BERT (Transformer를 이용한 Pre-trained Language Model)
Illustrated BERT (BERT를 알기 쉽게 표현해 주는 블로그)

논문 요약

목표

Transformer 기반의 architecture가 자연어처리 쪽 task는 짱먹고 있는데, 왜 영상쪽은 아직도 CNN 기반이 우세할까? 정말 transformer로 image classification task에서 SOTA를 찍는 것은 불가능한가? 우리가 해보겠음.

아이디어

Sequential Data는 RNN 계열에서 Transformer 계열로 완전히 대세가 기울었음
그러나, Image Data는 Convolution Layer를 통한 Inductive Bias(Transition Equivariance, Locality 등) 가 너무 강력했었음.
근데 Transformer가 누구냐... 엄청 많은 training data로부터 token들의 관계를 통으로 외워버리는 녀석. 진짜 많은 데이터를 넣어주면 Inductive Bias가 없어도 있는 것처럼 잘 되지 않겠느냐?
그래서 BERT가 엄청 잘되듯.. image recognition에서도 BERT 같은 걸 만들어보겠음.

Method : Vision Transformer(ViT)

Overview

image를 patch로 나누어 transformer의 입력에 넣어준다. 이 때 BERT와 마찬가지로 CLS token 을 앞에 넣어주고, 그 CLS token의 마지막 레이어 출력값에 MLP 를 붙여서 classification 하는 형태로 구현된다. BERT의 Classification과 같은 구조이지만, Mask를 사용하지는 않는다 (Mask를 사용하는 Self-Supervised 방식을 사용해보기도 했는데, 그냥 Supervised로 하는게 성능이 조금 더 좋았다.)

Details

(1) image patch xpn(n=1..N)\bold{x}_p^n (n=1..N) 만들기
WxH 의 image(NLP의 문장에 해당)를 PxP짜리 patch(NLP의 단어에 해당)로 나누어준다.
총 N개의 patch가 나오게 됨. Ex] 224x224 image를 16x16 patch로 쪼개면 총 N=196개의 패치로 표현할 수 있다.
(2) embedding
patch에 linear projection matrix EE 를 곱하여, Dx1짜리 vector로 만들어준다.
xpnE\bold{x}_p^n \bold{E}
extra learnable embedding xclass\bold{x}_{class} 를 넣어준다. BERT의 [CLS] token과 같은 역할.
Q1 ([CLS] token을 넣고, E\bold{E} 를 곱하는 형태로 안하고, 그냥 learnable embedding으로 한 이유가 있을까?
positional embedding도 추가한다.
2D positioning 도 해봤는데 1D positioning과 큰 차이는 없음.
2D positioning 시에는 positional embedding을 learning parameter로 했음 Q2 why?
(3) Transformer Encoder
patch embedding z\bold{z} 를 transformer 입력으로 넣어준다.
Transformer Encoder는 LayerNorm → Self-Attention 과정과 이 후 LayerNorm → MLP 과정 둘로 나누어 볼 수 있다.
MLP 에서는 GELU activation을 사용.
(4) xclass\bold {x}_{class} 에 해당하는 마지막 레이어 출력 값을 MLP 입력 (self-attention이 고려된 image representation, y\bold{y} )으로 넣기 전에 Layer Norm을 해준다.

Hybrid Architecture

patch로 나누고 embedding하지말고, ResNet 중간 레이어의 feature map을 활용하게끔도 구현해봤음.
작은 데이터셋에서는 이 hybrid architecture가 더 좋은 성능을 냈으나, 데이터셋이 늘어나면서 이 gap이 줄어들었음. → Large dataset에서는 convolutional layer를 충분히 대체할 수 있다고 주장하고 있음.
Q2 왜 Hybrid Architecture는 L/16, H/14 for 14 epochs 에 대해서 계속 실험하지 않았나?

Fine-Tuning

Fine-Tuning 하는 방법 : pre-trained prediction head를 제거하고 zero-initiated DxK feedforward layer를 붙인다.
만약 image size가 high-resolution 인 경우, patch의 position이 달라진다. 이 경우 pretrained position embedding을 2D interpolation 해서 사용한다. 즉, high resolution image는 단순히 긴 문장처럼 생각되어 positional embedding하는 것이 아닌, 기존 문장(image)의 사이사이에 token이 들어가는 형태가 되어야 한다.

Experiment

Dataset

Training Dataset
ILSVRC-2012 : 1k classes + 1.3M images
ImageNet-21k : 21k classes + 14M images
→ 여기까지 몇개 안되는 영상으로 학습하면 ResNet 50이 더 좋음
JFT : 18k classes + 303M images
→ 이 때부터는 ViT가 좋아짐
Comparison to SOTA
기존 SOTA 방법들보다 성능이 우수한 반면, pre-training 속도는 훨씬 빠르다.
Attention Distance
Attention Distance는 query pixel과 all other pixels 간의 average에 의해 계산된다. (첫 query patch의 pixel과 각 layer에서의 patch pixel 간 거리???)
CNN의 receptive field와 비슷한 의미로 볼 수 있다. why? distance가 가깝다면 attention 한 결과가 query pixel과 비슷한 곳의 attention weight가 높았다고 볼 수 있음. 즉, receptive field가 작은 의미..