상태: 초안 (2026-10-13). 논문 수치는 원문(arXiv)을 열어 조건과 함께 확인한 값입니다. 직접 해 본 것은 노트북 CPU 에서 돌린 장난감 예제뿐이고(코드
code/01_infonce.py), 탁구 영상에 CLIP 을 적용한 실측은 없습니다(미실측). 시리즈: 「비전 모델 읽기 2: 스스로 배우기·움직임·사람·스포츠」 1편. 합성곱·ViT·검출·SAM 같은 기초는 자매 시리즈 비전 모델 읽기 1이 다룹니다.
목차
- 1. 직관: 정답표 대신 짝 맞히기
- 2. 그림: 배치 하나가 문제집 하나
- 3. 어떻게 학습시키나: InfoNCE
- 4. 직접 해 보기
- 5. 논문 수치
- 6. 한계
- 7. 우리 프로젝트와의 연결
- 참고 문헌
1. 직관: 정답표 대신 짝 맞히기
보통의 이미지 분류기는 「이 사진은 고양이」처럼 사람이 정한 라벨 목록으로 배웁니다. 목록에 없는 것은 영원히 답할 수 없습니다. 출력 칸이 1,000개면 1,001번째 개념은 모델 안에 자리가 없습니다.
CLIP(Contrastive Language–Image Pre-training)은 질문을 바꿉니다. 「이 그림의 라벨은?」이 아니라 **「이 그림과 짝인 글은 이 중 어느 것?」**입니다. 인터넷에는 그림과 그 그림을 설명하는 글(캡션, 대체 텍스트)이 함께 올라온 경우가 많습니다. 짝은 공짜로 생기고, 개념의 가짓수에 상한이 없습니다.
짝 맞히기를 잘하게 되면 분류는 덤으로 따라옵니다. 「탁구 라켓 사진」, 「탁구공 사진」, 「탁구대 사진」 세 문장을 만들어 두고, 새 그림이 셋 중 어느 문장과 가장 가까운지 보면 됩니다. 학습 때 「탁구 라켓」이라는 라벨을 한 번도 정해 주지 않았는데도요. 이것을 제로샷(zero-shot) 분류라고 부릅니다. 예시를 0개 보고 푼다는 뜻입니다.
2. 그림: 배치 하나가 문제집 하나
학습은 이렇게 돌아갑니다.
- 그림-글 짝 N개를 한 배치로 뽑습니다.
- 그림 인코더(ResNet 이나 ViT)가 그림 N장을, 글 인코더(트랜스포머)가 글 N개를 각각 같은 차원의 벡터로 바꾸고 길이를 1로 맞춥니다(단위 벡터).
- 모든 그림과 모든 글의 내적, 곧 코사인 유사도를 N×N 행렬로 만듭니다. 대각선이 진짜 짝, 나머지 N²−N 칸은 가짜 짝입니다.
- 각 행에서 「대각선 칸을 고르는」 분류 문제를, 각 열에서도 같은 문제를 풉니다. 두 손실의 평균이 최종 손실입니다.
오답(negative)을 따로 모을 필요가 없다는 점이 핵심입니다. 같은 배치의 다른 짝이 곧 오답입니다. 배치가 클수록 한 번에 비교하는 오답이 많아집니다. CLIP 은 배치를 32,768로 잡았습니다(논문).
3. 어떻게 학습시키나: InfoNCE
손실 식
그림 i 의 벡터를 uᵢ, 글 j 의 벡터를 vⱼ, 온도를 τ 라고 하면 그림 쪽 손실은 다음과 같습니다.
L_그림 = −(1/N) Σᵢ log [ exp(uᵢ·vᵢ / τ) / Σⱼ exp(uᵢ·vⱼ / τ) ]
L_글 = 같은 식을 열 방향으로
L = (L_그림 + L_글) / 2
괄호 안은 소프트맥스 확률입니다. 정답 칸의 확률이 1에 가까워지도록, 즉 진짜 짝의 유사도는 올리고 가짜 짝의 유사도는 내리도록 학습합니다. 이 꼴의 손실을 InfoNCE 라고 부릅니다. 이름은 2018년의 CPC(Contrastive Predictive Coding) 논문에서 왔습니다. 그 논문은 이 손실을 줄이면 두 쪽 사이의 상호정보량(mutual information)의 하한이 올라간다는 것을 보였습니다. 하한은 log N − L 꼴이라, 오답 수 N 이 클수록 하한이 단단해집니다(논문). 큰 배치를 선호하는 이론적 이유입니다.
온도 τ
τ 는 유사도를 소프트맥스에 넣기 전에 나누는 수입니다. τ 가 작으면 작은 유사도 차이도 확률에서 크게 벌어지고(날카로움), 크면 뭉개집니다. CLIP 은 τ 도 학습하는 값으로 두고 0.07 에 해당하는 값에서 출발했습니다. 그리고 로짓 배율(1/τ)이 100을 넘지 않게 잘랐습니다. 학습이 불안정해지는 것을 막기 위해서라고 적었습니다(논문).
분류기를 글로 만든다
학습이 끝나면 분류는 이렇게 합니다.
- 클래스 이름마다 문장을 만듭니다. 이름 하나만 넣기보다 「A photo of a {label}.」 같은 틀(프롬프트)에 넣으면 ImageNet 정확도가 1.3%p 올랐습니다. 틀 80개를 만들어 벡터를 평균하면(프롬프트 앙상블) 3.5%p 가 더 올랐습니다(논문).
- 문장 벡터들이 곧 분류기의 가중치입니다. 새 그림의 벡터와 가장 가까운 문장이 답입니다.
4. 직접 해 보기
code/01_infonce.py 를 노트북 CPU 에서 돌렸습니다(numpy + PyTorch, 20초 안팎). 숫자는 그 출력 그대로입니다(code/01_infonce.out.txt).
손으로 계산한 InfoNCE
짝 4개의 코사인 유사도 행렬을 만들고 온도만 바꿔 손실을 쟀습니다.
logits = img @ txt.T / tau # (N, N), 대각선이 정답 짝
loss = (ce(logits) + ce(logits.T)) / 2 # ce = 행마다 소프트맥스 교차 엔트로피(정답 = 대각선)
[[ 0.647 0.225 0.487 0.103]
[ 0.333 0.459 0.425 0.286]
[-0.255 0.302 0.445 0.267]
[-0.383 -0.043 -0.318 0.351]]
τ=1.0 InfoNCE=1.1515 (무작위로 고르면 log N = 1.386)
τ=0.1 InfoNCE=0.4468
τ=0.07 InfoNCE=0.3604
τ=0.01 InfoNCE=0.5304
τ=1 이면 0.65 와 0.49 의 차이가 확률에서 거의 드러나지 않아, 손실이 아무렇게나 고른 값(log 4 = 1.386)과 별로 다르지 않습니다. τ 를 낮추면 손실이 줄다가, 0.01 에서는 다시 올라갑니다. 셋째 열을 보면 정답(0.445)보다 첫째 그림과의 유사도(0.487)가 더 큽니다. 온도가 아주 낮으면 이런 「틀린 칸」 하나를 아주 세게 벌합니다. τ 를 고정값으로 두지 않고 학습하게 한 이유를 감각으로 보여 주는 예입니다.
장난감 CLIP: 본 적 없는 개념 맞히기
개념 20개로 된 가짜 세계를 만들었습니다. 개념마다 숨은 벡터가 있고, 「그림」은 그 벡터를 한 비선형 변환으로, 「글」은 다른 비선형 변환으로 만든 64차원·40차원 벡터입니다(잡음 포함). 두 인코더(작은 MLP)를 개념 0–14 의 짝으로만 대조 학습하고, 개념 15–19 는 학습에서 아예 뺐습니다. 시험 때는 개념마다 「글」 10개를 인코딩해 평균한 것을 프롬프트로 씁니다.
장난감 CLIP(배치 64, 600걸음) — 학습한 τ = 0.0756
본 개념 15개 안에서 제로샷 정확도 : 0.973 (무작위 0.067)
처음 보는 개념 5개 제로샷 정확도 : 0.855 (무작위 0.200)
지도 분류기(라벨 15개): 본 개념 정확도 0.973, 처음 보는 개념은 출력 칸이 없어 답할 수 없음
같은 데이터로 라벨 15개짜리 분류기를 학습하면 본 개념에서는 똑같이 0.973 이지만, 새 개념에는 출력 칸이 없습니다. 대조 학습한 쪽은 처음 보는 개념도 85.5% 맞혔습니다. 그림과 글을 같은 공간에 놓는 법을 배웠기 때문에, 새 개념의 글만 있으면 그 자리를 찾아갈 수 있습니다.
무엇이 이 능력을 만드는지 손잡이를 돌려 보았습니다(시드 3개 평균).
| 조건 | 처음 보는 개념 5개 정확도 |
|---|---|
| 학습에 쓴 개념 3개 | 0.485 |
| 학습에 쓴 개념 7개 | 0.767 |
| 학습에 쓴 개념 15개 | 0.875 |
| 개념 15개, τ=1 고정 | 0.799 |
| 개념 15개, 배치 4 | 0.839 |
| 개념 15개, 배치 256 | 0.818 |
가장 큰 손잡이는 학습에 쓴 개념의 다양성이었습니다. 개념 3개로 배우면 새 개념 정확도가 절반 아래로 떨어집니다. 온도를 1로 묶으면 7%p 남짓 손해였습니다. 반면 배치 크기는 이 장난감에서 효과가 보이지 않았습니다. 개념이 15개뿐이라 배치가 크면 같은 개념이 여러 번 들어가고, 그 칸들이 「사실은 정답인데 오답으로 취급되는」 가짜 오답이 되기 때문으로 봅니다(추정). 4억 개의 서로 다른 짝을 쓰는 실제 CLIP 에서는 사정이 다릅니다. 이 결과를 실제 규모에 그대로 옮기면 안 됩니다.
5. 논문 수치
모두 CLIP 논문(Radford 외 2021)의 값입니다.
| 항목 | 값 | 조건 |
|---|---|---|
| 학습 데이터 | 그림-글 짝 4억 개(WIT) | 인터넷에서 검색어 50만 개로 모음 |
| 배치·학습 길이 | 32,768 · 32에폭 | 모든 모델 처음부터 학습 |
| 계산량 | 데이터센터급 GPU 592장 × 18일(RN50x64), 256장 × 12일(ViT-L/14) | 논문의 보고 |
| ImageNet 제로샷 top-1 | 76.2% | ViT-L/14@336px. 라벨 128만 장을 하나도 쓰지 않고 원조 ResNet-50 지도 학습과 같은 수준 |
| 분포가 바뀐 시험 | ImageNet-V2 70.1, -R 88.9, ObjectNet 72.3, -Sketch 60.2, -A 77.2 | 같은 제로샷 모델 |
| 학습 목표 비교 | 캡션을 생성하는 트랜스포머는 단어 주머니 예측보다 3배 느리게 배우고, 단어 주머니를 「예측」 대신 「대조」로 바꾸면 4배 더 효율적 | ImageNet 제로샷 정확도가 오르는 속도 기준 |
마지막 줄이 이 글의 요점입니다. 문장을 그대로 만들어 내게 하는 것보다, 맞는 짝을 고르게 하는 쪽이 훨씬 싸게 배웁니다. 글을 단어 하나하나 맞히는 일은 어렵고(같은 그림을 설명하는 문장은 수없이 많습니다), 짝을 고르는 일은 그보다 쉬우면서도 그림의 뜻을 배우게 만듭니다.
시그모이드로 바꾼 SigLIP
SigLIP(Zhai 외 2023)은 행·열 소프트맥스를 버리고, 행렬의 칸마다 독립된 이진 분류(짝이면 1, 아니면 0)를 시그모이드로 겁니다. 배치 전체로 정규화하지 않으니 장치끼리 유사도 행렬 전체를 모을 필요가 없습니다. 오답 칸이 압도적으로 많아서 처음에 「모두 0」으로 쏠리는 것을 막으려고 치우침(bias)을 −10, 배율을 10에서 출발시켰습니다(논문).
| 항목 | 값(논문) |
|---|---|
| 공개된 그림 인코더를 얼리고 글 쪽만 학습(SigLiT g/14) | ImageNet 제로샷 84.5%, TPU 칩 4개로 2일, 배치 20k |
| 배치 크기 | 시그모이드·소프트맥스 모두 약 32k 에서 포화. 작은 배치에서는 시그모이드가 확실히 낫다 |
「배치는 클수록 좋다」는 통념이 32k 근처에서 멈춘다는 관찰은, 위 장난감 실험에서 배치 효과가 보이지 않은 것과도 결이 같습니다.
6. 한계
- 세기와 세밀한 구분에 약하다. CLIP 논문은 물체 개수 세기, 차종·꽃 종·항공기 기종 같은 세밀한 분류, 그리고 손글씨 숫자(MNIST, 제로샷 88%)에서 약하다고 스스로 적었습니다. MNIST 는 화소에 로지스틱 회귀만 돌린 기준선보다도 낮았습니다(논문).
- 글이 다루지 않는 것은 배우지 못한다. 인터넷 캡션은 「탁구 치는 사람」이라고는 써도 「공이 리시버 쪽 테이블에 두 번째로 닿기 2프레임 전」이라고는 쓰지 않습니다. 시간과 순서처럼 글로 잘 적히지 않는 정보는 이 방식의 사각지대입니다(12편에서 다시 다룹니다).
- 데이터의 편향을 그대로 물려받는다. 웹에서 모은 짝이라 웹의 치우침이 들어갑니다.
7. 우리 프로젝트와의 연결
- 글로 부르는 분할·검출의 뿌리. 「탁구대」라는 글자로 탁구대를 찾게 하는 열린 어휘 검출·분할(SAM 3 등)은 그림과 글을 같은 공간에 놓는 이 생각 위에 서 있습니다. 구조는 자매 시리즈 비전 모델 읽기 1의 SAM·열린 어휘 검출 편이, 우리가 탁구대에 쓴 방식은 TT Score 모델 해부 3편이 다룹니다.
- 영상-언어 모델의 눈. 12편에서 다룰 LLaVA 계열은 CLIP 그림 인코더를 얼린 채로 언어 모델에 붙입니다. 그 눈이 「세기」와 「세밀한 시간」에 약하다는 점이 스포츠 판정에 약한 이유의 일부입니다.
- 바로 쓰지 않는 이유. TT Score 의 판정은 「몇 번, 어느 쪽, 언제」가 전부라 CLIP 이 약한 쪽에 정확히 걸립니다. 그래서 점수 엔진에는 넣지 않았고, 탁구 장면에 CLIP 제로샷을 재 본 적도 없습니다(미실측).
티티 한마디. 정답표 없이 「짝 맞히기」만 했는데 처음 보는 것도 맞힌다니, 신기하죠? 대신 「몇 개야?」나 「언제야?」는 짝 맞히기로 잘 안 배워져요. 그건 공을 직접 세는 우리 엔진 몫이에요.
참고 문헌
- Radford et al., Learning Transferable Visual Models From Natural Language Supervision, ICML 2021. https://arxiv.org/abs/2103.00020
- van den Oord et al., Representation Learning with Contrastive Predictive Coding, arXiv 2018. https://arxiv.org/abs/1807.03748
- Zhai et al., Sigmoid Loss for Language Image Pre-Training(SigLIP), ICCV 2023. https://arxiv.org/abs/2303.15343
- 예제 코드와 출력: 이 시리즈 폴더의
code/01_infonce.py,code/01_infonce.out.txt