주제: 7-1 ViT (Vision Transformer와 Patch Embedding)
분류: vision
타입: concept
난이도: 중급
선수지식: 있음 — Self-Attention, Transformer, Linear Layer
처음 보면 이 발상이 낯설지만, 핵심은 이미지를 완전히 다른 대상이 아니라 "시각 토큰들의 집합"으로 다시 해석하는 데 있다. NLP에서 단어를 token으로 다뤘듯이, ViT는 이미지 patch를 token처럼 다룬다.
문제 설정
기존 컴퓨터 비전 모델은 CNN을 사용했습니다.
Image → Conv → Conv → Conv → Classifier
하지만 Transformer가 NLP에서 성공하면서 다음 질문이 생겼습니다.
"이미지를 Transformer로 처리할 수 있을까?"
이 질문에 대한 답이 Vision Transformer (ViT)입니다.
즉 ViT는 convolution 중심의 inductive bias를 줄이고, 대신 충분한 데이터와 self-attention의 전역 문맥 처리 능력을 활용하려는 시도라고 볼 수 있다. 그래서 ViT를 이해하면 vision과 NLP 구조가 하나의 공통 프레임으로 이어진다는 감각도 잡힌다.
시각 자료로 먼저 보기
1. 핵심 아이디어
ViT는 이미지를 작은 패치로 나누어 토큰처럼 처리합니다.
Image
↓
Patch Split
↓
Patch Embedding
↓
Transformer Encoder
↓
Classification
NLP와 동일한 구조를 사용합니다.
2. Patch Split
이미지를 일정 크기의 patch로 나눕니다.
예:
Image: 224 × 224
Patch size: 16 × 16
patch 개수:
기호 의미
- H : 이미지 높이
- W : 이미지 너비
- P : patch 크기
- N : patch 개수
왜 필요한가
이미지를 Transformer가 처리할 수 있는 token sequence로 변환합니다.
주의점
patch 크기가 너무 크면 세부 정보가 손실됩니다.
3. Patch Embedding
각 patch를 벡터로 변환합니다.
flatten:
embedding:
기호 의미
- x_p : patch vector
- W_e : embedding matrix
- z_0 : patch embedding
왜 필요한가
Transformer 입력 차원으로 변환합니다.
주의점
patch embedding은 사실상 linear projection입니다.
4. Positional Encoding
Transformer는 순서를 인식하지 못하기 때문에 위치 정보를 추가합니다.
기호 의미
- E_pos : positional embedding
왜 필요한가
patch 위치 정보를 모델에 전달합니다.
5. Self-Attention
ViT는 일반 Transformer encoder를 사용합니다.
기호 의미
- Q : query
- K : key
- V : value
- d_k : key dimension
왜 필요한가
이미지의 모든 patch 간 관계를 학습합니다.
주의점
attention 계산량은 O(N²)입니다.
6. Classification Token
ViT는 BERT처럼 CLS token을 사용합니다.
[CLS] + patch tokens
출력:
기호 의미
- h_cls : CLS token representation
왜 필요한가
전체 이미지 정보를 하나의 벡터로 요약합니다.
7. 전체 ViT 구조
Image
↓
Patch Split
↓
Patch Embedding
↓
+ Positional Encoding
↓
Transformer Encoder
↓
CLS Token
↓
MLP Head
8. CNN vs ViT
| 특징 | CNN | ViT |
|---|---|---|
| 연산 | convolution | self-attention |
| local bias | 강함 | 약함 |
| global context | 제한적 | 직접 모델링 |
9. 계산 복잡도
attention 복잡도:
기호 의미
- N : patch 수
주의점
고해상도 이미지에서는 계산 비용이 증가합니다.
코드-수식 연결
| 개념 | 코드 | 설명 |
|---|---|---|
| patch split | torch.nn.Unfold() |
이미지 패치 분할 |
| patch embedding | nn.Linear() |
patch → embedding |
| attention | nn.MultiheadAttention() |
self-attention |
자주 하는 오해 5개
- ViT는 CNN을 완전히 대체한다고 생각한다
- patch embedding은 convolution과 동일하다고 생각한다
- ViT는 항상 CNN보다 성능이 좋다고 생각한다
- positional encoding이 필요 없다고 생각한다
- attention은 local 정보만 학습한다고 생각한다
체크리스트 (스스로 설명 가능해야 하는 질문)
- Vision Transformer는 이미지를 어떻게 token으로 변환하는가?
- patch embedding은 어떤 역할을 하는가?
- positional encoding은 왜 필요한가?
- ViT에서 CLS token의 역할은 무엇인가?
- CNN과 ViT의 구조적 차이는 무엇인가?