차근차근 이해하는 Transformer에 이어 Transformer를 Vision 분야에 적용한 Vision Transformer(ViT)을 이해하고 코드로 구현해보겠습니다.
Introduction
자연어 처리 분야에서 Transformer는 표준 모델이 된지 오래이지만, Vision 분야에서는 Attention이 Convolotional Network와 함께 사용되거나, Convolutional Network의 일부가 Attention으로 대체되는 정도에 그쳤습니다. 이런 가운데 Dosovitskiy, Alexey, et al. (2020)은 Vision 문제를 Convolutional Network 대신 Transformer만을 이용하여 해결하는 방법을 제시하였습니다. 그럼 3차원 데이터인 이미지 데이터를 어떤 식으로 변환하여 Transformer를 이용하였는지 차근차근 알아보겠습니다.
Image to Sequence of Embeddings
기본적으로 Transformer는 1차원 데이터를 순서대로 입력 받는 것을 가정합니다. 따라서 2D 이미지를 입력 받는다고 가정했을 때 다음 과정을 거쳐 이미지를 1차원 데이터로 변환하여 줍니다.
그럼 과정을 상세히 확인해보겠습니다.
Split into Smaller Patches
(H x W)의 해상도를 가지고 있는 이미지를 (P x P) 해상도를 가지는 N개의 이미지로 나눈 후 각 Patch를 Flatten 해줍니다.
Linear Projection onto D dimensions
Embedding Matrix(E)를 이용하여 각각의 Patch를 D차원으로 Embedding 해줍니다.
Attach Class Token and Add Positional Encoding
패치의 가장 앞에 학습이 이루어지는 Class Token을 삽입한 후 Positional Encoding을 더해줍니다. 단, ViT에서는 위치마다 고정된 Positional Encoding을 사용하였던 Transformer와 다르게 학습을 통해 얻은 Positional Encoding을 이용하였습니다.
Vision Transformer (ViT)
이미지를 1차원 데이터로 변환하였으니 남은 일은 변환된 데이터를 Transformer에 넣어주는 것 뿐입니다.
위 그림을 보면 기존의 Transformer와 ViT 사이에 차이점이 존재하는 것 같습니다. 구체적으로
1. ViT는 Transformer의 Encoding 부분만을 이용합니다.
2. 원논문에서는 Multihead Self-Attention(이하 MSA)과 MLP 이후에 Layer Normalization(이하 LN)이 이루어졌다면, ViT에서는 LN 이후에 MSA, MLP가 위치합니다.
3. Classification을 위해 Encoder의 모든 출력을 활용하는 대신 Class Token이 위치한 가장 앞 부분의 출력만을 이용합니다.
여기까지 ViT의 대략적인 구조를 살펴봤습니다. 그럼 주어진 학습 데이터를 이용해서 학습을 진행하면 좋은 결과를 얻을 수 있을까요? 현실은 그리 녹록치 않습니다 :(
Inductive Bias and Pre-Training
Vision 분야에서 CNN이 독보적인 위치에 있었던 이유는 뭘까요? CNN은 국소적인 부분을 모으고 모아서 겹치면 전체적인 모습을 대강 파악할 수 있다는 이미지의 특성을 이용하는 방식이라는 것이 좋은 성과를 내는 이유 중 하나일 것입니다. 이를 보다 학술적인 용어로 표현하자면 CNN은 Translation Equivalence와 Locality라는 Inductive Bias를 가지고 있기에 이미지 분류를 포함한 다양한 Vision 분야에서 좋은 성과를 보여준다고 할 수 있습니다.
그럼 Transformer를 생각해봅시다. Transformer가 가지고 있는 Inductive Bias는 입력값들 사이의 관계 혹은 유사성이 존재한다는 정도 뿐입니다. 즉, 이미지와 관련된 Inductive Bias가 CNN에 비해 약하기 때문에 CNN을 사용할 때 비해 많은 양의 학습 데이터가 있어야 유의미한 성과를 보여줄 수 있을 것입니다. 하지만 많은 학습 데이터가 필요하다는 것은 오랜 학습 시간으로 인한 효율 저하는 물론, 데이터 하나 하나가 돈 혹은 시간이라는 점을 염두했을 때 모델을 실제로 사용하기에 부담스러운 부분입니다. ViT는 이러한 한계점을 다음과 같이 Pre-Training을 활용하여 해결하였습니다.
1. 많은 데이터를 확보할 수 있는 이미지 데이터 셋으로 MLP Head를 이용하여 Pre-Training
2. 1에서 사용한 MLP Head를 대신 Feed-Forward Layer(Linear Layer)를 이용하여 실제 학습 데이터로 Fine-Tuning
그럼 Pre-Training까지 고려한 1-Layer ViT의 내부 계산 과정은 다음과 같이 표현할 수 있습니다.
마치며
지금까지 ViT의 전체적인 구조를 파악하기 위해 데이터 전처리 - 모델 - Pre-Traing 등 3개 요소를 하나씩 살펴보았습니다. 다음으로 코드를 구현하며 조금 더 디테일한 부분들을 이해해보도록 하겠습니다. 🙂
잘못된 내용, 오타, 부정확한 문장 등 어떤 피드백이든 환영합니다. 감사합니다.
References
- Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., ... & Polosukhin, I. (2017). Attention is all you need. Advances in neural information processing systems, 30. [Link]
- Dosovitskiy, A., Beyer, L., Kolesnikov, A., Weissenborn, D., Zhai, X., Unterthiner, T., ... & Houlsby, N. (2020). An image is worth 16x16 words: Transformers for image recognition at scale. arXiv preprint arXiv:2010.11929. [Link]
'Data Science > Maching Learning' 카테고리의 다른 글
ML. Pinball Loss (0) | 2023.09.28 |
---|---|
차근차근 이해하는 Transformer(5): Positional Encoding (0) | 2022.05.18 |
차근차근 이해하는 Transformer(4): Masked Multi-Head Attention과 Decoder (2) | 2022.05.09 |
차근차근 이해하는 Transformer(3): Multi-Head Attention과 Encoder (0) | 2022.05.06 |
차근차근 이해하는 Transformer(2): Single-Head Attention으로 이해하는 Encoder (2) | 2022.05.05 |