🤖 AI/ML

Vision Transformer

ViT

Transformer를 이미지에 적용한 비전 모델. 이미지를 패치로 분할하여 CNN의 대안으로 사용.

이 용어는 ViT와 동일한 개념입니다. 상세 내용은 ViT 페이지를 참고하세요.

📖 상세 설명

Vision Transformer(ViT)는 2020년 Google Research가 발표한 이미지 분류 모델로, 자연어 처리에서 성공한 Transformer 아키텍처를 컴퓨터 비전에 최초로 성공적으로 적용했습니다. "An Image is Worth 16x16 Words" 논문에서 이미지를 16x16 픽셀 패치로 분할하여 마치 단어처럼 처리하는 혁신적인 접근법을 제시했습니다.

ViT 이전의 컴퓨터 비전은 CNN(Convolutional Neural Network)이 지배했습니다. CNN은 지역적 특징을 추출하는 데 효과적이지만, 이미지 전체의 전역적 관계를 파악하는 데는 한계가 있었습니다. ViT는 Self-Attention 메커니즘을 통해 이미지의 모든 패치 간 관계를 동시에 학습하여 이 문제를 해결했습니다.

ViT의 작동 원리는 다음과 같습니다. 입력 이미지를 고정 크기 패치(보통 16x16)로 분할하고, 각 패치를 선형 임베딩으로 변환합니다. 위치 정보를 추가한 후 Transformer 인코더에 입력하면, Multi-Head Self-Attention을 통해 패치 간 관계를 학습합니다. CLS 토큰의 출력을 사용하여 최종 분류를 수행합니다.

실무에서 ViT는 ImageNet 같은 대규모 데이터셋에서 CNN을 능가하는 성능을 보여줍니다. 특히 사전 학습(Pre-training) 후 파인튜닝 패러다임에서 강점을 발휘하며, CLIP, DALL-E, Stable Diffusion 등 멀티모달 모델의 비전 인코더로 널리 사용됩니다.

💻 코드 예제

import torch
from transformers import ViTImageProcessor, ViTForImageClassification
from PIL import Image
import requests

# 모델과 프로세서 로드
model_name = "google/vit-base-patch16-224"
processor = ViTImageProcessor.from_pretrained(model_name)
model = ViTForImageClassification.from_pretrained(model_name)

# 이미지 로드
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)

# 추론
inputs = processor(images=image, return_tensors="pt")
with torch.no_grad():
    outputs = model(**inputs)

# 예측 결과
predicted_class_idx = outputs.logits.argmax(-1).item()
print(f"예측: {model.config.id2label[predicted_class_idx]}")

🗣️ 실무에서 이렇게 말하세요

💬 회의에서

"Vision Transformer로 이미지 분류 모델을 구축하려고 하는데요, 데이터가 적으면 사전학습 모델 파인튜닝이 더 효과적입니다."

💬 면접에서

"ViT는 Vision Transformer의 약자로, 이미지를 패치로 나눠 NLP의 Transformer처럼 처리합니다. CNN과 달리 전역 관계를 학습할 수 있어요."

💬 기술 토론에서

"CLIP이나 DINO 같은 self-supervised 방식으로 학습된 Vision Transformer는 다운스트림 태스크에서 범용성이 뛰어납니다."

⚠️ 흔한 실수 & 주의사항

소규모 데이터로 처음부터 학습

ViT는 대규모 데이터가 필요합니다. 소규모 데이터에서는 사전학습 모델을 파인튜닝하세요.

해상도 불일치 무시

학습 시 사용한 해상도와 다른 이미지를 입력하면 성능이 저하됩니다. 프로세서의 자동 리사이즈를 활용하세요.

태스크에 적합한 변형 선택

객체 탐지에는 Swin Transformer, 세그멘테이션에는 SegFormer 등 태스크별 최적화 모델을 고려하세요.

🔗 관련 용어

📚 더 배우기