Ch.05
비전 트랜스포머: 이미지를 패치로 잘라 넣기
이미지를 작은 네모(패치)로 나눕니다. 각 네모는 픽셀을 한 줄로 펼친 뒤 숫자 벡터로 바꾸고 (), 맨 앞 요약 칸(CLS) 과 칸마다의 위치 정보를 붙여 한 줄로 세운 다음 인코더와 분류로 보냅니다.
패치 분할선형 임베딩토큰 한 줄인코더분류
학습 흐름 한눈에
- ① 패치 분할: 이미지를 격자로 자릅니다.
- ② 토큰화: 각 패치를 벡터로 임베딩하고 위치 정보를 더합니다.
- ③ 인코더: 멀티헤드 셀프 어텐션+FFN을 반복합니다.
- ④ 분류: CLS(또는 풀링) 표현에 헤드를 붙입니다.
Chapter 01~03에서 다룬 트랜스포머(Transformer)는 원래 텍스트 문장처럼 '순서가 있는 단어(토큰)들'을 다루기 위해 태어났습니다. 그렇다면 이 똑똑한 모델에게 이미지를 보여주려면 어떻게 해야 할까요? 비전 트랜스포머(Vision Transformer, ViT)는 아주 단순하고 직관적인 아이디어에서 출발합니다. 바로 '한 장의 사진을 여러 개의 작은 직소 퍼즐 조각(패치)으로 잘라서, 각각의 조각을 하나의 단어처럼 취급하자!'는 것입니다.
기존의 CNN(합성곱 신경망)이 돋보기로 이미지를 조금씩 훑으며 특징을 찾아냈다면, ViT는 이미지를 조각내어 한 번에 쫙 펼쳐놓고, 조각들이 서로 대화(셀프 어텐션)하며 전체 그림의 맥락을 파악합니다. 의료 영상, 위성 사진 등 넓은 문맥을 파악해야 하는 최신 비전 AI 트렌드의 핵심이 바로 이 모델입니다.
이어지는 이야기: 패치 를 벡터 로 펼치고 , 로 만든 뒤 인코더에 넣는 흐름은 아래 절과 수식 박스에서 이어집니다. 해상도를 올리면 패치 수가 늘어 Chapter 04의 어텐션 비용·메모리 이슈와 바로 맞닿습니다.
수식 쉽게 이해하기 (ViT 흐름)
패치 벡터와 선형 임베딩
이미지를 패치로 나눈 뒤 한 패치를 길이 벡터 로 펼칩니다. 선형층 로 모델 차원 로 올립니다.
는 “이 패치가 가진 시각 정보를 차원에서 표현한 토큰”입니다.
토큰에 위치 더하기
패치 의 임베딩에 위치 정보를 더합니다(학습형 또는 고정형).
덕분에 모델은 “어느 위치의 패치인지”를 알고, 셀프 어텐션으로 공간적 거리를 간접적으로 반영합니다.
셀프 어텐션 한 블록
패치 토큰 행렬 에 대해 를 만들고
Chapter 01과 같은 식입니다. 차이는 입력이 단어가 아니라 패치라는 점뿐입니다.
CLS와 분류 헤드
맨 앞 토큰 을 뽑아 선형층으로 클래스 로짓을 냅니다.
가 전체 이미지를 요약한 벡터 역할을 하도록 학습됩니다.
비전 트랜스포머: 이미지를 패치로 잘라 넣기
1. 왜 패치(Patch)인가? 이미지를 단어처럼 읽기
개념: 트랜스포머는 입력된 토큰들의 관계를 학습합니다. 이미지를 트랜스포머에 넣기 위해, ViT는 이미지를 바둑판 모양의 격자로 자릅니다. 이 작은 네모 조각들을 패치(Patch)라고 부릅니다.
직관: 풍경 사진을 16등분으로 자른 직소 퍼즐을 상상해 보세요. 각각의 퍼즐 조각이 문장에서의 '단어' 역할을 합니다. 조각 안에 있는 픽셀 정보들을 길게 한 줄로 쭉 편 다음, 트랜스포머가 이해할 수 있는 크기(차원)의 벡터로 변환하여 모델에 입력합니다.
실전 주의점: 퍼즐 조각을 너무 크게 자르면 전체 덩어리는 줄어들지만 세밀한 부분을 놓치게 됩니다. 반대로 너무 잘게 자르면 디테일은 살지만 조각 수가 너무 많아져 컴퓨터가 계산하다가 지쳐버립니다(메모리 폭발). Chapter 04에서 본 토큰 수· 비용과 직결됩니다.
2. 패치에 이름표 붙이기: 임베딩과 위치 정보
개념: 트랜스포머는 한 번에 모든 조각을 보기 때문에, 조각이 원래 어디에 있던 것인지 위치를 모릅니다. 그래서 각 조각의 벡터에 '나는 왼쪽 위 첫 번째 조각이야'라는 위치 정보(Positional Embedding)를 더해줍니다. 또한, 맨 앞에는 전체 이미지가 무엇인지 결론을 내릴 반장 역할의 [CLS] 토큰을 추가합니다.
핵심 수식: 특정 패치 의 픽셀 데이터를 라고 할 때, 이를 선형 변환 행렬 를 곱해 다루기 쉬운 벡터로 만듭니다 (). 여기에 위치 정보 를 더해 최종 입력 벡터 를 완성합니다. 즉, 가 됩니다. 이것이 트랜스포머로 들어가는 최종 티켓입니다.
실전: 세그멘테이션·검출 등은 패치 대신 다른 토큰화(픽셀·쿼리 등)를 쓰는 변형이 많습니다.
3. CNN과의 결정적 차이: 돋보기 vs 원탁회의
개념: 전통적인 비전 모델인 CNN은 주변 픽셀들만 확인하는 '합성곱' 연산을 층층이 쌓아갑니다. 반면 ViT는 전역 셀프 어텐션(Global Self-Attention)을 사용하여 멀리 떨어진 패치들 간의 관계를 한 번에 계산합니다. 초기에 작은 conv stem을 붙이는 하이브리드 모델도 흔합니다.
비유: CNN이 '작은 돋보기를 들고 사진을 이리저리 옮겨가며' 탐색한다면, ViT는 '모든 퍼즐 조각을 원탁회의에 앉혀놓고 동시에 서로 의견을 주고받게 하는' 방식입니다. 강아지 사진이라면, '꼬리' 조각과 '귀' 조각이 서로 멀리 떨어져 있어도 ViT는 한 번의 층에서 둘의 관계를 바로 알아챌 수 있습니다.
실전: 데이터가 충분하거나 사전학습이 강하면 ViT가 강하고, 소규모 데이터에서는 증강·사전학습·CNN 특징이 도움이 되기도 합니다.
4. 학습과 추론 시 겪게 되는 현실적인 벽
개념: 모델을 학습시킬 때 정답을 맞히기 위한 손실 함수는 일반적인 분류 문제(교차 엔트로피)와 같습니다. 하지만 문제는 해상도입니다. 추론 시에도 패치 시퀀스 길이에 비례해 연산·메모리가 늘어납니다.
실전: 고화질 이미지를 입력하면 퍼즐 조각(패치)의 수가 기하급수적으로 늘어납니다. 이전 챕터에서 배웠듯 트랜스포머의 계산량은 토큰 수의 제곱()에 비례하므로, 해상도가 조금만 커져도 그래픽 카드(GPU)의 메모리가 터져버리는 현상(OOM)이 발생합니다. 이를 해결하기 위해 윈도우 단위로 연산을 끊어가는 Swin Transformer 같은 변형 모델들이 실무에서 자주 쓰입니다. Chapter 04와 연결되는 효율 어텐션·패치 병합 설계도 함께 봅니다.
왜 중요한지
텍스트와 이미지를 하나로 연결하는 만능 열쇠
자연어 처리(NLP)에서 대성공을 거둔 트랜스포머 구조를 이미지에도 똑같이 쓸 수 있게 만들었습니다. 덕분에 '이미지를 보고 텍스트로 답하는' 멀티모달 AI(예: 최신 거대 언어 모델들)를 만들 때, 시각 정보를 처리하는 뇌의 역할로 ViT가 아주 찰떡궁합으로 쓰입니다.
숲을 먼저 보는 능력 (전역 문맥 파악)
CNN은 좁은 영역에서 시작해 점차 넓은 영역을 봅니다. 반면 ViT는 첫 번째 층부터 이미지의 전체적인 맥락을 동시에 파악합니다. 특히 암세포를 찾는 의료 영상이나 넓은 지형을 분석하는 위성 사진처럼 '전체적인 숲'을 보는 것이 중요한 분야에서 강력한 힘을 발휘합니다.
비용과 성능의 저울질
'해상도 증가 = 패치 수 증가 = 연산량 폭발'이라는 공식이 성립합니다. 패치 수 이 늘면 어텐션은 대략 에 연동됩니다. 따라서 실제 서비스를 기획할 때, 사용자의 입력 해상도를 어느 정도로 제한할지, 패치 크기를 어떻게 설정할지가 서비스 운영 예산(서버 비용)을 결정하는 핵심 요소가 됩니다.
앞선 챕터들의 지식 재활용
놀랍게도 모델의 내부 작동 방식(셀프 어텐션, 피드포워드 신경망 등)은 Chapter 01~04에서 배운 텍스트 트랜스포머와 99% 동일합니다. '입력 데이터를 단어에서 이미지 조각으로 바꿨을 뿐'이라는 점을 깨닫는 순간, 딥러닝의 거대한 퍼즐이 맞춰질 것입니다. Chapter 04의 메모리·길이 이슈는 고해상도 ViT에서 그대로 재등장합니다.
어떻게 쓰이는지
학습 전략: 거인의 어깨 위에 올라타기
ViT는 데이터 먹보입니다. 데이터가 적으면 오히려 CNN보다 성능이 떨어집니다. 그래서 구글이나 메타 같은 빅테크가 엄청난 데이터(ImageNet 등)로 미리 똑똑하게 학습시켜 놓은 사전학습(Pre-trained) 모델을 가져옵니다. 그리고 우리의 작은 데이터셋에 맞게 머리(분류 헤드)만 살짝 바꿔 미세조정(파인튜닝) 하는 방식으로 사용합니다. 필요하면 강한 증강·정규화·작은 모델을 함께 씁니다.
서비스 적용 (추론): 크기 조절의 미학
실제 스마트폰 앱이나 웹 서비스에 모델을 올릴 때는 이미지 크기가 제각각입니다. 모델이 소화할 수 있도록 입력 이미지의 크기를 고정하거나, 큰 이미지를 여러 구역으로 나누어 슬라이딩 윈도로 순차적으로 처리하는 엔지니어링 기술이 필요합니다. GPU 메모리 한계를 넘기면 배치·해상도·AMP를 조절합니다.
상황에 맞는 무기 선택하기
무조건 최신 ViT가 정답은 아닙니다. 데이터가 넉넉하고 넓은 문맥이 필요하다면 ViT를, 연산 효율이 중요하고 이미지의 국소적 디테일도 중요하다면 Swin Transformer나 ConvNeXt(CNN의 장점을 흡수한 최신 모델), 혹은 CNN과 ViT를 섞은 하이브리드 모델을 과제의 성격에 맞게 골라 써야 합니다.
실무자를 위한 디버깅 체크리스트
* 성능이 안 나올 때: 패치 크기가 너무 크지 않은지, [CLS] 토큰이 잘 세팅되었는지, 사전학습 가중치를 제대로 불러왔는지 확인하세요.
* 메모리가 터질 때 (Out Of Memory): 입력 이미지의 해상도를 줄이거나 패치 크기를 키워서 전체 토큰 수를 줄여보세요. 혹은 메모리를 아끼는 효율적인 어텐션 기법(Chapter 04)이나 체크포인팅을 검토합니다.
요약
한 줄 요약 — 한 장의 이미지를 패치로 자르고, 각 조각을 토큰()으로 만든 뒤 CLS·위치(PE)와 함께 인코더에서 패치 간 관계를 학습합니다.
BERT·GPT와의 연결: 구조는 NLP의 인코더 스택과 같고, “문장 토큰” 대신 패치 토큰을 다룹니다.
CNN vs ViT: CNN은 국소 돋보기를 반복해 특징을 쌓는 느낌에 가깝고, ViT는 전역 셀프 어텐션으로 멀리 떨어진 패치도 한 번에 맞춥니다(변형·하이브리드 제외).
실무: 사전학습·파인튜닝, 해상도·패치 크기·OOM, Chapter 04의 비용과 Swin 등 효율 설계를 함께 기억하세요.
문제 풀이를 위한 설명
ViT 문제는 “이미지→패치 토큰→CLS·PE→인코더” 흐름과 “패치 수 이면 어텐션 부담 ~”를 같이 떠올리면 풀기 쉽습니다. 패치 개수는 이고, OOM이면 해상도·패치 크기·효율 어텐션(앞 장)을 함께 봅니다.
예시 (개념)
"ViT가 이미지를 토큰열로 바꾸는 핵심에 가장 가까운 것은?
① 합성곱만 반복
② 패치로 나누어 임베딩 후 인코더
③ 픽셀을 RNN으로 순차"
→
② → 2
예시 (계산)
"입력 , 정사각 패치 일 때 패치 토큰 수(CLS 제외)는?"
→ 가로·세로 패치 , → 196
예시 (O/X)
"ViT는 보통 패치 임베딩 뒤 위치 임베딩을 더한다."
→ 일반적 사실 → 1
예시 (응용)
"고해상도로 OOM이 난다. 우선 시도하기 좋은 것은?
① 라벨만 늘리기
② 패치 크기를 키워 토큰 수 줄이기
③ 옵티마이저 이름만 바꾸기"
→ 2
예시 (패치 수·격자)
, 패치 , CLS 없음 → 4 / 한 변 패치 8개인 정사각 격자의 총 칸 → 64
정의 예시 — "ViT에서 이미지의 국소 패턴을 CNN처럼 반복 합성곱으로만 쌓는 것이 핵심이다. 맞으면 1, 틀리면 0." → 패치+트랜스포머가 핵심. 정답 0
참/거짓 예시 — "CLS 토큰은 분류 헤드와 자주 짝을 이룬다." → 맞음. 정답 1
선택 예시 — "패치 수를 줄여 메모리를 아끼려면?
① 패치 한 변을 키운다
② 라벨만 늘린다" →
①. 정답 1
계산 예시 — " 이미지, 패치 일 때 패치 수(가정: 정사각 타일링)?" → . 정답 16