TT Lab
요금제

한국어

시작하기
블로그

블로그

Vision Transformer: 그림을 16×16 조각의 문장으로 읽기, 그리고 데이터가 많이 필요한 이유

상태: 초안 (2026-10-13), 일부 실측. 예제는 노트북 CPU 에서 직접 돌린 값입니다(code/07_vit.py, 1초 안). 논문 수치는 원문을 열어 조건과 함께 옮겼고, 하드웨어는 등급으로 적었습니다. 작성 규칙: 실측 데이터가 기본이고, 못 잰 것은 「미실측」으로 표시합니다.

목차

1. 어텐션: 모든 쌍의 관계를 본다

트랜스포머(2017)는 번역을 위해 만든 모델입니다. 핵심 연산은 셀프 어텐션입니다. 문장의 단어마다 세 가지 벡터를 만듭니다.

단어 i 의 질의와 단어 j 의 키를 내적해 「i 가 j 를 얼마나 볼지」를 정하고, 그 비율로 값들을 섞습니다.

Attention(Q, K, V) = softmax( Q·Kᵀ / √d_k ) · V

√d_k 로 나누는 이유를 논문은 이렇게 설명합니다. 차원 d_k 가 크면 내적값이 커지고(성분이 평균 0, 분산 1 이면 내적의 분산이 d_k), softmax 가 한쪽으로 몰려 기울기가 아주 작아집니다. 나눠서 분산을 1 근처로 되돌립니다.

합성곱과 비교하면 차이가 분명합니다. 합성곱의 출력 한 칸은 이웃 3×3 만 보고, 멀리 보려면 층을 쌓아야 했습니다(1편의 수용 영역). 어텐션은 첫 층부터 모든 위치를 봅니다. 누구를 볼지는 고정된 창이 아니라 데이터(Q·K)가 정합니다.

2. ViT: 그림을 조각의 문장으로

ViT: 그림을 16×16 조각으로 자르면 「단어」가 된다 224×224 → 196조각(14×14) (4×4 로 줄여 그림) 선형 투영 = 16×16 합성곱 CLS 토큰 + 위치 임베딩(+) 트랜스포머 인코더 × L 셀프 어텐션: 모든 토큰 쌍을 본다 CLS 출력 → 분류 합성곱은 「가까운 것끼리」가 구조에 박혀 있다. ViT 는 첫 층부터 그림 전체를 볼 수 있는 대신, 그 규칙을 데이터에서 스스로 배워야 한다 → 데이터가 많이 든다
그림: 그림을 16×16 조각으로 잘라 선형 투영하고, CLS 토큰과 위치 임베딩을 붙여 트랜스포머 인코더에 넣는 ViT 의 구조

Dosovitskiy 등의 ViT 는 그림을 문장처럼 만듭니다.

  1. 224×224 그림을 16×16 조각으로 자릅니다. 14×14 = 196조각.
  2. 조각 하나(16×16×3 = 768개 숫자)를 펴서 선형 투영으로 D 차원 벡터(토큰)로 바꿉니다.
  3. 맨 앞에 학습하는 CLS 토큰을 하나 붙입니다. 마지막 층에서 이 토큰의 출력을 그림 전체의 표현으로 써서 분류합니다.
  4. 각 토큰에 위치 임베딩(학습하는 벡터)을 더합니다.
  5. 표준 트랜스포머 인코더(셀프 어텐션 + MLP, 각각 잔차 연결과 층 정규화)를 L 층 쌓습니다.
모델 층 숨은 차원 D MLP 헤드 파라미터
ViT-Base 12 768 3072 12 8,600만
ViT-Large 24 1024 4096 16 3억 700만
ViT-Huge 32 1280 5120 16 6억 3,200만

이름의 「/16」, 「/14」는 조각 크기입니다. 9편의 SAM 이 쓰는 이미지 인코더가 이 ViT-Huge(조각 16)입니다.

직접 해 보기 1: 조각 + 선형 투영 = 보폭 16 합성곱

조각으로 잘라 행렬을 곱하는 것과, 16×16 필터를 보폭 16 으로 미는 합성곱은 같은 계산입니다. 같은 가중치로 두 방법을 계산해 비교했습니다(실측).

224×224 → 패치 196개(14×14), 패치 하나 768개 숫자 → 64차원 토큰
「잘라서 선형 변환」과 「보폭 16 합성곱」의 최대 차 2.7e-15

차이는 부동소수 반올림뿐입니다. 실제 구현도 대부분 이 부분을 합성곱 한 층으로 짭니다. ViT 의 첫 층은 「창이 겹치지 않는 아주 큰 합성곱」이고, 합성곱다운 부분은 거기까지입니다.

직접 해 보기 2: 위치 임베딩이 없으면 순서를 모른다

셀프 어텐션은 토큰의 순서를 보지 않습니다. 입력 토큰을 섞으면 출력도 똑같이 섞일 뿐입니다(순열 등변성). 그러면 그림의 왼쪽 위 조각과 오른쪽 아래 조각을 바꿔도 모델은 모릅니다(실측).

토큰 순서를 섞어 넣은 출력 == 원래 출력을 같은 순서로 섞은 것: 최대 차 1.3e-15
위치 임베딩을 더하면 같은 패치를 섞었을 때 출력이 달라진다: 상대 차 0.28

그래서 위치 임베딩이 필요합니다. ViT 논문의 실험(ViT-B/16, ImageNet 5장씩 선형 평가)에서 위치 임베딩이 없으면 0.614, 1D 학습 임베딩 0.642, 2D 임베딩 0.640, 상대 위치 0.640 이었습니다. 있느냐 없느냐는 크게 다르고, 어떤 종류냐는 거의 차이가 없었습니다. 조각 수준(14×14)에서는 1D 번호만 줘도 모델이 2D 배치를 스스로 배운다는 뜻입니다.

3. 해상도의 비용

어텐션은 모든 토큰 쌍을 보므로 비용이 토큰 수 N 의 제곱입니다(실측 계산).

입력 한 변 토큰 수 N 어텐션 행렬 N² 224px 대비
224 196 38,416 1.0배
384 576 331,776 8.6배
512 1,024 1,048,576 27.3배
1024 4,096 16,777,216 436.7배

SAM 은 1024×1024 를 넣습니다. 그래서 SAM 의 ViT-H 는 대부분의 층에서 14×14 창 안에서만 어텐션하고, 전역 어텐션은 4개 층에만 둡니다(9편). 해상도가 중요한 일에 ViT 를 쓰려면 이런 절충이 필요합니다.

4. 왜 데이터가 많이 필요한가

ViT 논문의 가장 중요한 결과는 정확도 숫자보다 데이터 크기에 따른 역전입니다.

모델(사전학습 데이터) ImageNet top-1 사전학습 비용(TPUv3 코어·일)
ViT-H/14(JFT-300M) 88.55% 2,500
ViT-L/16(JFT-300M) 87.76% 680
ViT-L/16(ImageNet-21k) 85.30% 230
BiT-L(ResNet152×4, JFT-300M) 87.54% 9,900
Noisy Student(EfficientNet-L2) 88.4–88.5% 12,300

(논문 표 2. ViT-H/14 는 518px, ViT-L/16 은 512px 로 미세조정.)

이유를 논문은 귀납 편향으로 설명합니다. 합성곱은 「가까운 화소끼리 관계가 깊다(국소성)」와 「같은 무늬는 어디서나 같다(이동 등변성)」를 구조로 갖고 태어납니다(1편). ViT 에서 그런 성질을 가진 것은 조각 안의 MLP 뿐이고, 셀프 어텐션은 전역입니다. 그러니 「가까운 조각을 더 봐라」는 규칙을 데이터에서 스스로 배워야 하고, 데이터가 적으면 그 규칙을 배우기 전에 학습 데이터를 외워 버립니다. 데이터가 충분하면 반대로 그 자유가 이점이 됩니다. 구조가 강요하지 않으니 데이터에 맞는 더 나은 규칙을 찾을 수 있습니다.

실제로 학습된 ViT 를 들여다보면, 가장 아래층에서도 일부 헤드는 그림 대부분을 보고 다른 헤드는 가까운 곳만 보며, 층이 깊어질수록 보는 거리가 늘었습니다(논문 4.5절). 합성곱처럼 국소적으로 보는 헤드를 스스로 만들어 낸 셈입니다.

비용 쪽도 흥미롭습니다. 위 표에서 ViT-H/14 는 BiT-L 보다 정확하면서 사전학습 비용은 약 1/4 이었습니다. 데이터가 충분하면 트랜스포머가 계산 효율에서도 유리했습니다.

5. DeiT: ImageNet 만으로 학습하기

대부분은 3억 장의 비공개 데이터를 쓸 수 없습니다. Touvron 등의 DeiT(2021)는 ImageNet-1k 만으로 ViT 를 잘 학습하는 방법을 보였습니다. 열쇠는 둘입니다.

  1. 강한 증강과 정규화. RandAugment, mixup, CutMix, 무작위 지우기, 확률적 깊이, 반복 증강을 다 씁니다. 하나씩 빼 본 실험(DeiT-B, 224px)에서 mixup 과 CutMix 를 함께 빼면 81.8% → 75.8%, 반복 증강을 빼면 76.5% 로 떨어졌고, 무작위 지우기나 확률적 깊이를 빼면 학습 자체가 실패했습니다. 데이터에서 배워야 할 귀납 편향을, 데이터를 부풀려 가르치는 셈입니다.
  2. 증류 토큰. CLS 토큰 옆에 「선생 모델의 답을 따라 하는」 토큰을 하나 더 둡니다. 선생은 합성곱 망(RegNetY-16GF, 82.9%)입니다. 합성곱의 귀납 편향을 선생의 답을 통해 물려받는 것으로 볼 수 있습니다.
모델(ImageNet-1k 만) 224px 384px
DeiT-B 81.8% 83.1%
DeiT-B + 증류 83.4% 84.5%

학습은 GPU 8장짜리 서버 한 대로 2–3일이었습니다(300에폭에 53시간). 논문의 다른 곳에는 「GPU 4장으로 3일」이라는 표현도 있어 원문 안에서 조건이 엇갈립니다.

6. 계층 구조로 돌아가기: Swin, Hiera

ViT 는 처음부터 끝까지 14×14 한 해상도입니다. 검출·분할처럼 여러 크기의 물체를 다루는 일에는 합성곱의 피라미드(고해상도 → 저해상도)가 그리웠습니다.

MAE 같은 자기지도 사전학습의 원리는 자매 시리즈(자기지도·영상·자세·스포츠)에서 다룹니다.

7. 한계와 우리 프로젝트

그래서 TT Score 에서는 역할이 갈립니다. 공 찾기는 합성곱(HRNet 계열), 탁구대 분할은 트랜스포머(SAM 2.1 의 Hiera) 입니다. 탁구대는 크고 단순하며 경기 시작 때 한 번만 찾으면 되니 무거운 트랜스포머를 써도 되고, 공은 작고 프레임마다 찾아야 하니 가볍고 국소적인 합성곱이 맞습니다(TT Score 모델 해부 1편).

다음 글은 트랜스포머로 검출을 다시 쓴 DETR 입니다. 앵커도 NMS 도 없습니다.

티티 한마디. 조각 순서를 섞어도 위치 임베딩이 없으면 모델은 눈치를 못 채요. 그림을 퍼즐 조각 더미로 보는 거죠. 번호표를 달아 줘야 퍼즐이 맞춰져요.

참고 문헌

로그인하면 좋아요를 누를 수 있습니다

댓글

아직 댓글이 없습니다.

로그인하면 댓글을 쓸 수 있습니다