본문 바로가기
AIML 분야/Vision Transformer

[ViT 논문] Image Recognition without CNNs? - Transformer!

by 포숑은 맛있어 2020. 10. 30.
반응형

이 논문 막 읽기 시작했다.

원래 논문을 구글독스에 주절거리며 읽는 편이라 그냥 여기다 썼다.

의식의 흐름대로 논문 읽어보기.

 

Title : AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE

https://openreview.net/pdf?id=YicbFdNTTy

 

ICLR 2021 리뷰중이라는 논문.

Transformer만 사용해서 이미지처리를 한다?!

 

1. 원래 이럴땐 성능부터 보는거다.

Accuracy를 보자.

보고왔는데 그냥 그렇다. ResNet, EfficientNet이랑 비교한 것 처럼 나와있는데 EfficientNet은 비어있는 것도 많다.

그리고 ResNet152도 아니고 ResNet152x4는 뭐지? 설명 써있을 수도 있다는 희망을 가지고 일단 넘어간다.

 

성능이 비슷한 수준이라면, 파라미터수는?

논문에서 명시하긴 했지만, 여기서 주로 쓰는 L, H가 각각 300M, 600M 넘는다.

 

논문에서는 대놓고 비교하지 않았기 때문에 EfficientNet 논문으로 가자.

dd

파라미터도 이 논문이 더 많은 것 같다.

단순히 모델 사이즈가 증가했기 때문에 좋은건가? 이런 의문이 들기는 하는데, 

towardsdatascience.com/the-w3h-of-alexnet-vggnet-resnet-and-inception-7baaaecccc96#:~:text=AlexNet%20and%20ResNet%2D152%2C%20both,training%20time%20and%20energy%20required.

이 글을 보면 꼭 그렇지만도 않은 것 같다.

 

그래서 Transformer를 사용할 수 있다는걸 보여줬음에 의의를 두는 논문이구나, 정도로 생각하고 넘어감.

효율적일수 있는 구조 중 하나에 트랜스포머가 포함될 수 있구나.

 

추가로 TPUv3 day라고 표기된건 이 논문이 가장 좋았다. GPU hours/days 이런거랑 비슷한 개념이겠지?

 

 

2. 이 논문의 주요 특징과 다른 논문 살펴보기

Intro/Related Works 읽기.

 

* 이 모델의 특징

  • NLP를 위한 transformer 첫 논문의 셋팅을 최대한 그대로 따르려고 했다. 
  • input image : 각 patch들을 하나의 token처럼 본다.
    그러면 positional embedding이 2D로 되어야 하는거야.
  • 앗 그러면 Mid-scale 이미지에서는 어렵겠네? 패치가 크거나 or 많아야하잖아. NLP에서 문장이 길어지거나, 단어단위가 아니라 뭉텅이 단위로 자르는 것과 같은거지.
    ⇒ 그래서 이미지넷에서 잘 안된대.
  • full-size 이미지에 대해 global attention을 한게 처음이래.

여담

self attention 쓰는 가장 naive approach는 역시 픽셀단위로 이걸 수행하는 것이다.
하지만 attention 연산이 quadratic이라는 것! ⇐그래서인지 이번에 구글에서 Linear Attention을 만들었다. 30쪽이 넘는 어마어마한 논문 분량을 보고 읽진 않았다. 이름이 Performer였나?

 

* 다른 논문들

  • transformer를 image recognition에 도입한건 최초는 아니었나봐.
    CNN feature들에 attention을 쓴 것도 있고, 뭐 다양한 시도가 있었다.
  • 가장 비슷한 논문이 iGPT. (imageNet에서 72% 찍음)
    이건 이미지의 컬러와 해상도를 downsize한다음에, generative model처럼 unsupervised learning을 했다.

3. Method 자세히 읽기

input

원래 NLP에서는 token으로 임베딩해서 읽어옴.

문장 => 각각의 단어를 벡터형태로 변환 => Positional Embedding을 통해 위치정보 같이 넣어줌.

 

여기서도 이런 과정이 필요하다.

만약 64*64*3 image라면 => 16*(16*16*3)으로 변형된다.

길이가 16인 시퀀스인데, 16*16 사이즈의 패치로 이루어져 있으며 똑같이 3채널 이미지로 이루어져 있다는 것.

(위에서 예상했던 것 처럼, 패치 사이즈가 고정이라면 문장이 길어지게 된다. 그러면 처리하기 더 까다롭겠지.)

 

 

+ classification 문제를 풀기 위해 learnable한 임베딩 [CLS] token을 추가한다는데, BERT를 잘 몰라서 일단 생략.

이걸 문장 맨 앞에 넣어서 학습하는건 알겠는데 그럼 inference시에 어떻게 되는지 상상이 잘 안감.

* Multihead Self-Attention (MSA)

* MLP Blocks : 2 layer짜리. + GELU.

* 각 block 시작 전에 LayerNorm (LN), 후에 residual connection.

 

하나하나 읽어보자.

z0 : input. 위에 쓴 그대로.

z'l = 이전 레이어의 것에 LN, MSA 적용한 후, residual connection.

zl = 방금 계산한 z'l에다가 LN, MLP 적용한 후, residual connection.

y = 트랜스포머 인코더 아웃풋에 LN 씌운 것. 여기에 classification head가 붙는다고 함.

 

+ 하이브리드하게 ResNet에서도 사용할 수 있다고 한다. 초반 레이어 거쳐서 나온 것 가지고 flatten해서 transformer에 넣는 것.

 

이제 이걸 여러 task에서 어떻게 사용하는가.

1. large scaled dataset에서 pretrain.

2. prediction head를 뗀 다음, 다른 task의 헤드를 붙임. 이때 zero-initialization.

만약에 더 큰 이미지를 받게되면, patch size 그대로 두고 문장 길이를 늘리는 형태로 한다.

그래서 임의의 문장길이를 처리해야하니 positional embedding이 의미 없어져서, pretrained positional embedding에다가 2D interpolation해서 사용했다.

 

 

4. 다시 Experiment 보기

 

 

 

반응형

댓글