이미지 인식에서 자주 보이는 말이 있다. "학습 없이 분류했다(zero-shot)." 모델을 새 데이터로 다시 훈련시키지 않고, 클래스 이름만 바꿔서 분류한다는 뜻이다. 어떻게 학습 없이 분류가 되는지 이해하려면 두 개념을 알아야 한다. 임베딩, 그리고 대조학습이다.
임베딩 — 의미를 좌표로
임베딩(embedding)은 이미지나 텍스트 같은 입력을 고정 길이의 숫자 벡터로 바꾼 것이다. 핵심은 단순히 숫자로 바꾸는 게 아니라, 의미가 가까운 것끼리 벡터도 가깝게 배치된다는 점이다.
비유하면 지도 위의 좌표다. 서울과 인천은 가깝고, 서울과 부산은 멀다. 임베딩은 "의미의 지도"에서 각 입력에 좌표를 찍는다. "강아지" 사진과 "개" 텍스트는 가까운 좌표에, "강아지"와 "자동차"는 먼 좌표에 놓인다.
가까움은 보통 코사인 유사도(cosine similarity)로 잰다. 두 벡터가 이루는 각도의 코사인 값으로, 1에 가까우면 같은 방향(유사), 0이면 무관, -1이면 반대다. 길이가 아니라 방향만 보기 때문에 "얼마나 비슷한 의미인가"를 재기에 적합하다.
벡터의 길이(차원)는 모델에 따라 다르다. 예를 들어 ViT-B/32라는 이미지 인코더는 이미지 하나를 512차원 벡터로 바꾼다. 512개의 실수로 이루어진 한 점이 사진 한 장의 "의미 좌표"가 된다.
대조학습 — 좋은 좌표를 만드는 법
문제는 "의미가 가까운 것끼리 가깝게"라는 좌표를 어떻게 만드느냐다. 이걸 만드는 학습 방법이 대조학습(contrastive learning)이다.
CLIP, SigLIP 같은 모델은 이미지 인코더 f와 텍스트 인코더 g, 두 개를 동시에 학습한다. 학습 데이터는 이미지와 그 설명이 짝지어진 쌍이다(인터넷에서 모은 수억 쌍). 학습 목표는 두 줄로 요약된다.
- 올바른 쌍의 유사도를 높인다:
sim(f(이미지), g(맞는 설명))↑ - 틀린 쌍의 유사도를 낮춘다:
sim(f(이미지), g(다른 설명))↓
비유하면 사진과 캡션 카드를 잔뜩 섞어놓고, 맞는 짝끼리는 끌어당기고 틀린 짝끼리는 밀어내는 일을 수억 번 반복하는 것이다. 이 과정을 거치면 이미지 인코더와 텍스트 인코더가 만들어내는 두 벡터 공간이 하나로 정렬된다. "비빔밥" 사진의 벡터와 "비빔밥"이라는 텍스트의 벡터가 같은 자리에 모인다.
이렇게 두 종류(이미지·텍스트)를 하나의 공간에 정렬했다는 점이 대조학습의 핵심이다.
제로샷 — 학습 없이 분류가 되는 이유
이제 제로샷이 왜 가능한지 설명된다. 분류란 "이 사진이 어느 클래스냐"를 정하는 일이다. 대조학습으로 정렬된 공간에서는 이렇게 한다.
- 분류 후보를 텍스트로 적는다. 예: "비빔밥", "피자", "샐러드".
- 각 후보 텍스트를 텍스트 인코더에 넣어 벡터로 바꾼다.
- 분류할 이미지도 이미지 인코더에 넣어 벡터로 바꾼다.
- 이미지 벡터와 가장 가까운(코사인 유사도가 가장 높은) 후보 텍스트를 고른다.
수식으로는 argmax_c sim(f(이미지), g(클래스명_c)) 한 줄이다. 모델을 다시 학습시키는 단계가 없다. 후보 목록을 텍스트로 바꿔 끼우기만 하면 된다. "비빔밥"이라는 단어 자체가 분류기의 검색키가 되는 셈이다.
이게 강력한 이유는, 학습 때 정확히 그 조합을 본 적이 없어도 의미적으로 가장 가까운 답을 고를 수 있기 때문이다. 새 카테고리를 추가하고 싶으면 텍스트 한 줄을 후보에 넣으면 끝이다.
CLIP과 SigLIP의 차이
CLIP과 SigLIP은 둘 다 위 방식을 쓰지만, 학습할 때 쓰는 손실 함수(loss, 모델이 얼마나 틀렸는지 재는 척도)가 다르다.
- CLIP: 소프트맥스 기반 InfoNCE loss. 한 배치(한 번에 처리하는 묶음) 안의 모든 이미지-텍스트 조합을 동시에 비교한다. 정답 쌍 하나를 나머지 모든 오답 쌍과 견주어 상대적으로 높이는 방식이라, 배치가 클수록(오답 비교 대상이 많을수록) 학습이 잘 된다.
- SigLIP: 시그모이드 기반 binary loss. 각 쌍을 "맞는 쌍이냐 아니냐"로 독립적으로 평가한다. 다른 쌍과의 상대 비교에 덜 의존하므로 배치 크기 의존성이 낮다.
| 기준 | CLIP | SigLIP |
|---|---|---|
| 손실 함수 | 소프트맥스(InfoNCE) | 시그모이드(binary) |
| 배치 내 비교 | 모든 쌍을 한꺼번에 | 쌍마다 독립 |
| 배치 크기 의존 | 큼(예: 32768) | 작아도 안정(예: 4096) |
| 분산 학습 통신 | 배치 전체 공유 필요 | 오버헤드 적음 |
실무적 함의는 SigLIP이 더 작은 배치에서도 안정적으로 학습되고, 대규모 분산 학습에서 장비 간 통신 부담이 적다는 것이다. 정확도 자체는 데이터와 규모에 따라 갈리며 한쪽이 항상 우월한 건 아니다.
이점과 트레이드오프
제로샷 분류의 이점은 분명하다. 새 클래스를 추가할 때 데이터 수집과 재학습이 필요 없다. 텍스트 후보만 바꾸면 된다.
감수하는 것도 있다.
- 후보 목록을 누군가 관리해야 한다. 분류는 후보 텍스트 중에서 고르는 일이라, 후보가 빈약하면 답도 빈약하다. 예를 들어 한식을 분류하려는데 후보 목록이 서양 음식 위주면(공개 데이터셋 다수가 그렇다) 한식은 분류 대상에조차 들어가지 못한다.
- 정확도가 텍스트 표현에 민감하다. "비빔밥"과 "Korean mixed rice" 중 어느 표현이 더 잘 맞는지가 결과를 바꾼다.
- 세밀한 구분은 약하다. 비슷하게 생긴 두 음식의 미묘한 차이는 일반 목적 임베딩이 잘 못 잡는다. 이럴 땐 도메인 데이터로 모델을 보강해야 한다.
제로샷은 "데이터 없이 일단 분류를 시작"하는 데 가장 강하고, 정밀도를 끝까지 끌어올리는 단계에서는 다른 방법(가중치에 지식을 담은 분류기, 도메인 파인튜닝)으로 옮겨가는 경우가 많다. 그 분류기를 작게 만들고 폰에 올리는 방법은 다른 글에서 다룬다.
'TIL' 카테고리의 다른 글
| MediaPipe Tasks Vision — 브라우저에서 손과 얼굴을 추적하는 법 (0) | 2026.06.08 |
|---|---|
| WASM 온디바이스 추론 — 서버 없이 폰 안에서 모델 돌리기 (0) | 2026.06.07 |
| LoRA — 모델 전체를 재학습하지 않고 일부만 바꾸는 법 (0) | 2026.06.07 |
| ONNX와 INT8 양자화 — 학습한 모델을 폰에 올리는 법 (0) | 2026.06.07 |
| KNN과 근사 최근접 이웃 — 벡터 검색은 어떻게 빨라지나 (0) | 2026.06.07 |