[Daily morning study] Contrastive Learning과 CLIP 모델 — 시각-언어 표현 학습

#daily morning study

Image


Contrastive Learning이란

Contrastive Learning(대조 학습)은 레이블 없이 의미 있는 표현(representation)을 학습하는 자기지도 학습(self-supervised learning) 방식이다. 핵심 아이디어는 간단하다.

  • 유사한 샘플(positive pair)은 임베딩 공간에서 가깝게
  • 다른 샘플(negative pair)은 멀게

당기고 밀어내는 과정을 반복하면서 모델이 데이터의 본질적인 특징을 스스로 학습한다.

학습 방법: Positive/Negative Pair 구성

이미지 하나를 두 가지 방식으로 augmentation하면 자연스럽게 positive pair가 만들어진다. 두 이미지는 같은 원본에서 나왔으니 의미적으로 같다고 볼 수 있다.

원본 이미지 x
  ├── augmentation 1 → x_i  (positive)
  └── augmentation 2 → x_j  (positive)

배치 내 나머지 이미지들 → negative pairs

대표적인 augmentation:

  • 무작위 크롭 (Random Crop)
  • 색상 왜곡 (Color Jitter)
  • 가우시안 블러 (Gaussian Blur)
  • 수평 뒤집기 (Horizontal Flip)

NT-Xent 손실 함수

SimCLR(Simple Framework for Contrastive Learning)에서 쓰이는 NT-Xent(Normalized Temperature-scaled Cross Entropy) 손실이 대표적이다.

배치 N개의 샘플에서 2N개의 augmented 샘플이 생기고, 각 샘플에 대해 자신의 positive pair는 1개, 나머지 2N-2개는 모두 negative다. \[\mathcal{L}_{i,j} = -\log \frac{\exp(\text{sim}(z_i, z_j) / \tau)}{\sum_{k=1}^{2N} \mathbf{1}_{[k \ne i]} \exp(\text{sim}(z_i, z_k) / \tau)}\]

  • sim(u, v): 코사인 유사도
  • τ (tau): temperature 파라미터. 작을수록 hard negative를 더 강하게 구분

SimCLR 구조

이미지 x
  ↓ Encoder (ResNet, ViT 등)
  h (representation)
  ↓ Projection Head (MLP, 2-layer)
  z (contrastive 학습에 쓰이는 벡터)

Projection Head는 학습에만 사용하고, 실제 downstream task에서는 h를 쓴다. projection이 h보다 성능이 떨어지는 이유는 projection이 너무 augmentation-invariant한 방향으로만 최적화되기 때문이다.

MoCo: Momentum Contrast

SimCLR의 약점은 큰 배치가 필요하다는 것이다(보통 4096 이상). MoCo는 이 문제를 메모리 큐(queue)로 해결했다.

방식negative 출처필요 배치 크기
SimCLR같은 배치매우 큰 배치 (4096+)
MoCo메모리 큐 (최근 K개)일반 크기 가능

MoCo는 두 개의 인코더를 사용한다.

  • Query encoder: 일반 gradient 업데이트
  • Key encoder (momentum encoder): Query 인코더의 EMA(Exponential Moving Average)로 천천히 업데이트
\[\theta_k \leftarrow m \theta_k + (1 - m) \theta_q\]

m은 보통 0.999로 설정. 키 인코더가 급격히 변하지 않아서 큐에 쌓인 negative들이 일관성을 유지한다.


CLIP: Contrastive Language-Image Pretraining

OpenAI가 2021년에 발표한 CLIP은 Contrastive Learning을 이미지와 텍스트 쌍으로 확장한 모델이다. 인터넷에서 수집한 (이미지, 텍스트) 쌍 4억 개로 학습했다.

구조

이미지 → Image Encoder (ViT 또는 ResNet) → 이미지 임베딩
텍스트 → Text Encoder (Transformer) → 텍스트 임베딩

두 임베딩을 같은 차원으로 맞추고, 같은 쌍끼리는 유사하게, 다른 쌍끼리는 멀게 학습한다.

학습 과정

배치 N개의 (이미지, 텍스트) 쌍이 있을 때, N×N 행렬을 만들어 대각선 원소(실제 pair)가 높은 유사도를 갖도록 학습한다.

         텍스트1  텍스트2  텍스트3
이미지1  [높음]   낮음    낮음
이미지2  낮음    [높음]   낮음
이미지3  낮음    낮음    [높음]

손실은 행 방향(이미지→텍스트)과 열 방향(텍스트→이미지) 모두의 cross entropy를 평균낸다.

Zero-shot 분류

CLIP의 가장 큰 강점은 추가 학습 없이 새로운 분류 태스크를 처리한다는 점이다.

import torch
import clip
from PIL import Image

model, preprocess = clip.load("ViT-B/32", device="cpu")

image = preprocess(Image.open("dog.jpg")).unsqueeze(0)
text = clip.tokenize(["a photo of a dog", "a photo of a cat", "a photo of a car"])

with torch.no_grad():
    image_features = model.encode_image(image)
    text_features = model.encode_text(text)

    # 코사인 유사도 계산
    image_features /= image_features.norm(dim=-1, keepdim=True)
    text_features /= text_features.norm(dim=-1, keepdim=True)
    similarity = (100.0 * image_features @ text_features.T).softmax(dim=-1)

print(similarity)  # [0.92, 0.07, 0.01] → "a photo of a dog"

분류할 클래스를 “a photo of a {label}” 형태의 텍스트로 변환하면 별도 fine-tuning 없이 분류가 된다.

Prompt Engineering for CLIP

텍스트 프롬프트 설계가 성능에 큰 영향을 준다.

방식프롬프트 예시효과
단순 레이블"dog"기본
문장 형식"a photo of a dog"성능 향상
컨텍스트 추가"a photo of a dog, a type of pet"추가 향상
앙상블여러 프롬프트 임베딩 평균더 안정적

CLIP 논문에서는 단순 클래스명 대신 “a photo of a {class}” 형식만으로도 ImageNet에서 약 3.5% 성능이 오른다고 보고했다.

CLIP의 한계

분포 외 일반화 한계 훈련 데이터에 없는 세밀한 개념(예: 정확한 개수 세기, 공간적 관계)에서 약하다.

텍스트 길이 제한 CLIP의 텍스트 인코더는 보통 77 토큰으로 제한된다.

Fine-grained 분류 약점 “옷의 소재가 면인지 폴리에스터인지” 같은 세밀한 구분은 어렵다.

공정성 문제 학습 데이터인 인터넷 텍스트-이미지 쌍에 내재된 편향이 그대로 학습될 수 있다.

CLIP 이후 발전

모델특징
ALIGN (Google, 2021)18억 쌍의 더 큰 데이터, 노이즈 허용 학습
BLIP (Salesforce, 2022)캡션 생성도 가능한 멀티태스크
BLIP-2 (Salesforce, 2023)LLM과 연결, Flamingo 계열
SigLIP (Google, 2023)Sigmoid 손실 사용, 소배치에서도 안정적
OpenCLIPCLIP을 오픈소스로 재현한 프로젝트

활용 사례

이미지 검색 텍스트 쿼리로 이미지를 검색한다. 쿼리와 이미지 임베딩의 코사인 유사도를 기준으로 순위를 매긴다.

이미지 캡셔닝 CLIP 이미지 인코더를 LLM과 연결해 이미지를 설명하는 텍스트를 생성한다.

이미지 생성 조건 제어 Stable Diffusion과 같은 Diffusion 모델의 텍스트 조건으로 CLIP 텍스트 임베딩을 사용한다.

콘텐츠 필터링 특정 텍스트 카테고리(“폭력적인 이미지”, “성인 콘텐츠”)와 이미지 유사도를 계산해 자동 필터링한다.


정리

개념핵심
Contrastive Learning유사 쌍은 가깝게, 다른 쌍은 멀게 학습
SimCLRaugmentation으로 positive pair 구성, 큰 배치 필요
MoCo메모리 큐 + momentum encoder로 소배치 가능
CLIP이미지-텍스트 pair로 cross-modal 대조 학습
Zero-shot새 클래스도 텍스트 프롬프트만으로 분류

Contrastive Learning은 레이블 없이도 강력한 표현을 학습할 수 있다는 걸 보여준 패러다임 전환이었다. CLIP은 이를 멀티모달로 확장해, 텍스트와 이미지를 같은 임베딩 공간에서 다루는 방식의 기반이 됐다. 이후 등장한 DALL-E, Stable Diffusion, GPT-4V 같은 멀티모달 모델들은 모두 CLIP이 닦은 길 위에 있다.