본문 바로가기
딥러닝 with Python

[딥러닝 with Python] 비전 트랜스포머(Vision Transformer / ViT) (1/2)

by CodeCrafter 2024. 11. 7.
반응형

이번에는 지난 시간에 알아본 트랜스포머를 Vision Task에 적용한 Vision Transformer에 대해서 알아보겠습니다.

 

해당 포스팅은 " AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE(ICLR 2021 / Dosovitskiy et al)"  논문을 참조했습니다.

 

1. 비전 트랜스포머 (Vision Transformer)

( 들어가기 전 : Attention과 Self-Attention을 비교해보자면, Attention의 경우 Query는 디코더로부터, Key와 Value는 인코더로부터 나와서 Attention 연산을 진행했다면, Self Attention은 Query, Key, Value 모두 인코더로부터 나온 값을 활용한다는 차이점 이있습니다.)

 

 

- 해당 논문은 자연어 처리(NLP / Natural Language Process)에서 Transformer 구조의 대 성공으로 인해, 해당 아키텍처를 비전 분야에 적용하고자 했던 여러 노력 중 성공적인 사례라고 할 수 있습니다.

 

- 기존의 Transformer는 높은 연산 효율성과 확장성(Scalability)라는 장점이 있었고, 특히나 데이터셋과 모델의 크기가 계속 커져도 모델의 성능이 포화되지 않고 지속적으로 개선이 되는 부분이 있었습니다.

 

- 그래서 비전 태스크에서도 CNN 계열 모델 구조에 Self Attention을 추가한 구조들이 제안되었으나, 이론적이 효율성이 보장되었을 뿐 실제 하드웨어 가속기와의 호환성이 떨어지는 부분이 있었습니다.

 

- 이때 등장한 개념이 모델이 바로 Vision Transformer 입니다.

 * 이는 이미지 자체를 Tansformer 구조에 넣어주기 위해 이미지를 픽셀 단위가 아닌 패치 단위로 나누어 Tokenization을 시켜주었습니다. (Transformer에서는 글자 단위가 토큰이 되었습니다)

 * 아래와 같이 기존 비전 태스크에서는 픽셀 단위를 토큰으로 보았기에 연산량이 너무 많아서, 이를 고려하여 Attnetion에 참여하는 픽셀을 제한하기 위해 Sparse한 Transformer를 제안하기도 했지만 연산 효율 및 Manual한 하이퍼 파라미터 튜닝은 모델의 확장성을 제한했습니다.

 

- 이러한 시도는 중간 사이즈의 데이터셋에서 학습 시킬 경우, 강력한 Regularization이 없이 기존 ResNets 대비 좋은 성능을 보여주지는 못했고, 이에 대한 이유로 Transformer 구조가 CNN 구조에 비해 Inductive Bias가 부족하다고 판단하였습니다.

 

* Inductive Bias란, 모델이 새로운 데이터에 대해 일반화 하는데 도움이 되는 내재된 가정을 의미하며, 예시로 알아보면 선형 회귀 모델의 경우 "데이터가 선형적으로 분포하고 있다"는 가정을 / CNN의 경우 이미지는 "Spatial Locality(공간적 국소성)와 Translation invariance(평행 이동 불변성)"가 있다는 가정을 / RNN 계열의 경우 "이전 타임스텝이 현재 타입스텝에 영향을 준다"는 예시가 있겠습니다.

 

 

- 그렇지만, 정말 큰 사이즈의 데이터 셋(1400만 ~ 3억장 의 이미지)에서 학습을 시킬 경우, 위와 같은 한계를 뛰어넘고 좋은 성능을 보여주었습니다. 

 

 

- 비전 트랜스포머의 구조는 아래와 같습니다.

 

* 해당 논문에서는 이미지를 16 x 16 크기의 패치로 나누어 각각을 한 개의 토큰으로 취급합니다.

* 이후 패치를 Flatten 시킨 후 Linear Projection을 하며 이때 분류 작업을 위해 cls token(분류 토큰)을 추가해줍니다.

* 이후 Position Embedding을 하고, 기존에 알아봤었던 전형적인 Transformer Encoder에 넣은 뒤

* cls token 만을 가지고 MLP head에 넣어 분류를 진행하는 작업이 되겠습니다. 

 

- 아래 예시를 바탕으로 설명을 드리면

 

 

* 그림을 16x16의 9개의 패치로 나눈 뒤 패치를 Flatten 하고 Linear projection을 해줍니다.

 

* 그리고 Position Embedding을 추가해서 더해준 뒤 Cls token(Classification Toekn)을 추가해줍니다. 아래 그림처럼 14x14의 이미지 패치는 총 196개의 패치가 입니다. 이는 224 x 224 크기의 이미지를 16x16의 패치 사이즈로 나누면 나오는 전체 패치의 개수입니다. 즉 아래 그림에서 한개의 행은 하나의 이미지 패치를 의미한다고 보시면 되겠습니다.

* 이때 각 패치는 총 16x16x3개의 픽셀을 가진다고 할 수 있는데, 이는 가로 16 / 세로 16 / 채널 3 의 곱이기 때문입니다. 이를 고려해서 1개의 패치를 Flatten하게 되면 총 768개의 픽셀이 나오게 되며 이를 embedding dimesion으로 활용합니다. 

* 이후, Learnable한 파라미터인 CLS Token이 추가되고, 여기에 동일한 차원의 Learnable parameter인 Position embedding은 Element wise addtion이 되는 것입니다. 

 

 

* 이후 위 총 197 x 768 차원의 벡터가 트랜스포머 인코더에 들어가게 됩니다.

 

* 이 벡터는 Q,K,V로 활용하기 위해 임베딩 차원이 3배인 2304로 증가하게되고, Q,K,V로 동일한 크기로 활용하게 위해 Reshape 후 각각 12 x 197 x 64의 텐서가 되고 이를 활용해 Self Attention을 진행합니다. 이때 Multi Head Self Attention을 적용해서 임베딩 차원을 헤드 수만큼 나누어 Self Attention 후 다시 concat해서 최종 결과를 만들어냅니다.

 

 

* 이렇게 나온 아웃풋 중 CLS Token은 MLP Head에 들어가 분류에 활용되는데, Fully Connected Layer와 GeLU로 이루어진 MLP가 되겠습니다.

[딥러닝 with Python] GELU란?(Gaussian Error Linear Unit)

 

[딥러닝 with Python] GELU란?(Gaussian Error Linear Unit)

이번에 알아볼 것은 활성화 함수로 활용되는 GELU에 대해서 알아보겠습니다. 1. GELU란?- GELU는 Gaussian Error Linear Unit의 줄임말로, 딥러닝에서 활용되는 비선형 활성화 함수 중의 하나입니다. - 기존

jaylala.tistory.com

 

 

반응형

댓글