Vision Transformer (ViT)
Vision Transformer (ViT)는 이미지를 패치로 나누고 셀프 어텐션으로 패치 간 관계를 파악합니다. 아키텍처, 변형 모델 및 CNN과의 장단점을 다룹니다.
비전 Transformer(ViT)는 언어 모델링에 사용되는 Transformer 아키텍처를 이미지에 적용한 신경망입니다. 이미지를 고정 크기 패치로 나누고 각 패치를 토큰 임베딩으로 변환한 다음 셀프 어텐션으로 시퀀스를 처리하므로 첫 번째 레이어부터 모든 패치가 다른 모든 패치의 정보를 활용할 수 있습니다. Google 연구진은 "An Image is Worth 16x16 Words"에서 이 아키텍처를 소개하고, 합성곱 레이어가 전혀 없는 순수 Transformer도 충분한 데이터로 사전 학습하면 이미지 분류에서 최신 합성곱 신경망(CNN)과 대등한 성능을 보인다는 점을 입증했습니다. 오늘날 ViT는 비전 언어 모델, 세그멘테이션 파운데이션 모델, 자기 지도 학습 백본의 이미지 인코더로 사용됩니다.
비전 트랜스포머 작동 방식#
ViT는 이미지를 시퀀스로 변환한 뒤 텍스트처럼 처리합니다. 아래 단계에서는 224×224 이미지에 ViT-Base/16을 사용합니다.
- 패치 임베딩: 이미지를 16×16픽셀 패치로 나누면 14×14 격자에 패치 196개가 생성됩니다. 각 패치를 펼친 뒤 학습 가능한 행렬을 곱해 768차원 임베딩으로 변환합니다. 일반적으로 이 과정은 스트라이드 16의 16×16 합성곱으로 구현됩니다.
- 클래스 토큰과 위치 임베딩: 학습 가능한 클래스 토큰을 시퀀스 맨 앞에 추가하고 모든 토큰에 학습 가능한 위치 임베딩을 더합니다. 어텐션만으로는 순서를 파악할 수 없으므로 이 임베딩만이 각 패치의 원래 위치를 알려 줍니다.
- Transformer 인코더: ViT-Base에서는 12개인 동일한 블록을 쌓아 구성합니다. 각 블록은 모든 토큰에 걸쳐 정보를 결합하는 멀티헤드 셀프 어텐션과 토큰을 개별적으로 변환하는 GELU 활성화 기반 2계층 MLP를 번갈아 적용합니다. 각 하위 레이어 앞에는 레이어 정규화를 적용하고, 하위 레이어를 잔차 연결로 감쌉니다.
- 헤드: 클래스 토큰의 최종 출력을 선형 분류기에 입력합니다. 세그멘테이션과 같은 고밀도 작업에서는 패치 토큰을 사용해 14×14 격자로 다시 구성합니다.
아래 PyTorch 코드는 이미지 하나의 토큰 시퀀스를 구성한 뒤 단일 인코더 블록에 전달합니다.
import torch
from torch import nn
# ViT-Base/16 설정: 16x16 패치, 768차원 토큰, 어텐션 헤드 12개
image = torch.randn(1, 3, 224, 224)
patch_embed = nn.Conv2d(3, 768, kernel_size=16, stride=16) # 패치마다 선형 투영 하나 적용
# 이미지를 14x14 패치 격자로 나누고 펼쳐 토큰 196개로 변환
tokens = patch_embed(image).flatten(2).transpose(1, 2)
# 학습 가능한 클래스 토큰을 앞에 추가하고 학습 가능한 위치 임베딩을 더함
cls_token = nn.Parameter(torch.zeros(1, 1, 768))
pos_embed = nn.Parameter(torch.zeros(1, 197, 768))
tokens = torch.cat([cls_token, tokens], dim=1) + pos_embed
# 모든 토큰이 서로에게 주의를 기울이는 사전 정규화 인코더 블록 하나
block = nn.TransformerEncoderLayer(
d_model=768, nhead=12, dim_feedforward=3072, activation="gelu", batch_first=True, norm_first=True
)
print(block(tokens).shape)코드는 torch.Size([1, 197, 768])을 출력합니다. 패치 토큰 196개와 클래스 토큰 하나가 모두 768차원을 유지한 채 ViT-Base의 12개 블록 중 다음 블록에 입력될 준비를 마칩니다.
모델 크기와 변형#
ViT 이름에는 모델 크기와 패치 크기가 표시됩니다. ViT-B/16은 16×16 패치를 사용하는 파라미터 8,600만 개의 Base 모델이며, Large와 Huge 모델의 파라미터 수는 각각 3억 700만 개와 6억 3,200만 개입니다. 패치가 작을수록 토큰 수가 늘어나 세부 정보가 향상되지만 연산 비용이 증가합니다. ViT의 학습 방식이나 구조를 변경한 여러 변형 모델은 다음과 같습니다.
- DeiT: 강력한 증강과 증류 토큰을 사용하는 학습 레시피로, 추가 사전 학습 데이터 없이 ImageNet-1k만으로도 경쟁력 있는 ViT를 학습합니다.
- Swin Transformer: 이동하는 로컬 윈도우 내에서 어텐션을 계산하고 단계 사이에서 패치를 병합해, 탐지와 세그멘테이션에 적합한 CNN 형태의 계층 구조를 생성합니다.
- 마스크드 오토인코더(MAE)와 DINOv2: 레이블 없는 이미지로 ViT를 사전 학습하는 자기 지도 학습 방법입니다. MAE는 마스킹된 패치를 재구성하고, DINOv2는 교사 네트워크의 출력을 일치시킵니다.
- CLIP과 SigLIP: 이미지와 해당 캡션을 연결하도록 학습된 ViT 이미지 인코더로, 멀티모달 모델의 비전 타워로 널리 재사용됩니다.
응용 분야#
- 비전 언어 모델: ViT 인코더가 이미지를 토큰 시퀀스로 변환하면 대규모 언어 모델이 텍스트와 함께 이를 읽어 캡션 생성과 시각적 질의응답을 수행합니다.
- 고밀도 예측: ViT 백본의 패치 토큰은 이미지 전반의 먼 영역에서 문맥 정보를 얻어야 하는 이미지 세그멘테이션과 깊이 추정에 사용됩니다.
- 비디오 이해: 비디오 ViT는 클립을 시공간 패치로 나눕니다. V-JEPA와 같은 자기 지도 비디오 모델은 레이블 없는 영상에서 동작 및 외관 특징을 학습해 동작 인식과 같은 작업을 수행합니다.
비전 트랜스포머와 CNN 비교#
CNN은 모든 레이어에 각 필터가 작은 주변 영역을 본다는 점에 기반한 지역성과 동일한 필터를 모든 위치에 적용한다는 점에 기반한 평행 이동 등변성이라는 두 가지 가정을 내재합니다. 패치 그리드 외의 공간 구조는 ViT가 데이터로부터 학습해야 합니다. 원 논문에서 이미지 130만 장으로 구성된 ImageNet만으로 학습한 ViT는 비슷한 규모의 ResNets보다 몇 퍼센트포인트 낮은 점수를 기록했으며, 이미지 3억 장 규모의 JFT-300M 데이터셋으로 사전 학습한 결과 ViT-H/14의 ImageNet top-1 정확도는 88.55%에 도달했습니다. 비용도 또 다른 차이점입니다. 셀프 어텐션은 각 토큰을 나머지 모든 토큰과 비교하므로, 이미지의 한 변 길이를 두 배로 늘리면 토큰 수는 네 배가 되고 어텐션 비용은 16배로 증가합니다. 플래시 어텐션은 해당 연산의 메모리 트래픽을 줄이고, 윈도우 어텐션은 비교 연산 자체를 제한합니다. Ultralytics는 Meta의 Segment Anything Model을 실행하며, 해당 모델의 sam_b.pt 체크포인트는 ViT-B 백본을 사용해 각 1024×1024 이미지를 인코딩합니다: 16×16 패치는 4,096개 토큰으로 이루어진 64×64 그리드를 형성하므로, 12개 블록 중 8개는 14×14 윈도우 안에서만 어텐션을 수행하고 나머지 4개는 전역 어텐션을 사용합니다.










