TT Lab
요금제

한국어

시작하기
블로그

블로그

대조 학습과 CLIP: 그림과 글을 짝지어 배우면 처음 보는 것도 맞힌다

상태: 초안 (2026-10-13). 논문 수치는 원문(arXiv)을 열어 조건과 함께 확인한 값입니다. 직접 해 본 것은 노트북 CPU 에서 돌린 장난감 예제뿐이고(코드 code/01_infonce.py), 탁구 영상에 CLIP 을 적용한 실측은 없습니다(미실측). 시리즈: 「비전 모델 읽기 2: 스스로 배우기·움직임·사람·스포츠」 1편. 합성곱·ViT·검출·SAM 같은 기초는 자매 시리즈 비전 모델 읽기 1이 다룹니다.

목차

1. 직관: 정답표 대신 짝 맞히기

보통의 이미지 분류기는 「이 사진은 고양이」처럼 사람이 정한 라벨 목록으로 배웁니다. 목록에 없는 것은 영원히 답할 수 없습니다. 출력 칸이 1,000개면 1,001번째 개념은 모델 안에 자리가 없습니다.

CLIP(Contrastive Language–Image Pre-training)은 질문을 바꿉니다. 「이 그림의 라벨은?」이 아니라 **「이 그림과 짝인 글은 이 중 어느 것?」**입니다. 인터넷에는 그림과 그 그림을 설명하는 글(캡션, 대체 텍스트)이 함께 올라온 경우가 많습니다. 짝은 공짜로 생기고, 개념의 가짓수에 상한이 없습니다.

짝 맞히기를 잘하게 되면 분류는 덤으로 따라옵니다. 「탁구 라켓 사진」, 「탁구공 사진」, 「탁구대 사진」 세 문장을 만들어 두고, 새 그림이 셋 중 어느 문장과 가장 가까운지 보면 됩니다. 학습 때 「탁구 라켓」이라는 라벨을 한 번도 정해 주지 않았는데도요. 이것을 제로샷(zero-shot) 분류라고 부릅니다. 예시를 0개 보고 푼다는 뜻입니다.

2. 그림: 배치 하나가 문제집 하나

짝 N개 → N×N 유사도 → 양방향 교차 엔트로피 그림 N장 그림 인코더 벡터 u₁ … u_N 글 N개 글 인코더 벡터 v₁ … v_N 행 = 그림 u₁·v₁ u₂·v₂ u₃·v₃ u₄·v₄ u₁·v₂ u₁·v₃ 열 = 글 v₁ … v₄ 모든 칸 ÷ 온도 τ 작을수록 차이가 날카로워진다 행마다·열마다 소프트맥스, 정답 = 대각선 대각선 N칸은 올리고 나머지 N²−N칸은 내린다 오답 = 같은 배치의 다른 짝
그림: 배치 N 쌍으로 만든 N×N 유사도 행렬과 양방향 교차 엔트로피

학습은 이렇게 돌아갑니다.

  1. 그림-글 짝 N개를 한 배치로 뽑습니다.
  2. 그림 인코더(ResNet 이나 ViT)가 그림 N장을, 글 인코더(트랜스포머)가 글 N개를 각각 같은 차원의 벡터로 바꾸고 길이를 1로 맞춥니다(단위 벡터).
  3. 모든 그림과 모든 글의 내적, 곧 코사인 유사도를 N×N 행렬로 만듭니다. 대각선이 진짜 짝, 나머지 N²−N 칸은 가짜 짝입니다.
  4. 각 행에서 「대각선 칸을 고르는」 분류 문제를, 각 열에서도 같은 문제를 풉니다. 두 손실의 평균이 최종 손실입니다.

오답(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을 넘지 않게 잘랐습니다. 학습이 불안정해지는 것을 막기 위해서라고 적었습니다(논문).

분류기를 글로 만든다

학습이 끝나면 분류는 이렇게 합니다.

  1. 클래스 이름마다 문장을 만듭니다. 이름 하나만 넣기보다 「A photo of a {label}.」 같은 틀(프롬프트)에 넣으면 ImageNet 정확도가 1.3%p 올랐습니다. 틀 80개를 만들어 벡터를 평균하면(프롬프트 앙상블) 3.5%p 가 더 올랐습니다(논문).
  2. 문장 벡터들이 곧 분류기의 가중치입니다. 새 그림의 벡터와 가장 가까운 문장이 답입니다.

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. 한계

7. 우리 프로젝트와의 연결

티티 한마디. 정답표 없이 「짝 맞히기」만 했는데 처음 보는 것도 맞힌다니, 신기하죠? 대신 「몇 개야?」나 「언제야?」는 짝 맞히기로 잘 안 배워져요. 그건 공을 직접 세는 우리 엔진 몫이에요.

참고 문헌

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

댓글

아직 댓글이 없습니다.

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