CLIP (Contrastive Language-Image Pre-training)
CLIP은 이미지와 텍스트를 하나의 공유 공간에 임베딩하여 일반 텍스트 레이블로 이미지를 분류하는 OpenAI 모델입니다. 학습 방식과 제로샷 작동 원리를 알아봅니다.
CLIP(대조적 언어-이미지 사전 학습)은 OpenAI가 만든 모델로, 이미지와 이미지의 텍스트 설명을 연결하는 방법을 학습합니다. 이미지 인코더와 텍스트 인코더를 짝지어 학습하며, 이미지와 해당 이미지를 설명하는 캡션이 하나의 공유 임베딩 공간에서 서로 가까운 벡터로 매핑되도록 합니다. 인터넷에서 수집한 이미지-캡션 쌍 4억 개로 학습된 CLIP은 해당 카테고리의 레이블이 지정된 예시 없이 텍스트로만 제시된 카테고리로 이미지를 분류할 수 있습니다. 이를 제로샷 학습이라고 합니다. 2021년 논문에서 최고 성능 모델은 ImageNet 제로샷 top-1 정확도 76.2%를 기록해, ResNet-50이 학습에 사용한 레이블 이미지 128만 장을 전혀 사용하지 않고도 원래 완전 지도 학습 방식으로 학습한 ResNet-50과 대등한 성능을 보였습니다.
CLIP 학습 방법#
CLIP에는 인코더가 두 개 있습니다. 이미지 인코더는 ResNet 또는 비전 트랜스포머(ViT)이고, 텍스트 인코더는 기본 크기에서 파라미터 6,300만 개를 가진 12층 트랜스포머입니다. 선형 프로젝션을 통해 각 인코더의 출력을 공유 공간으로 매핑하며, 이 공간에서 모든 벡터는 단위 길이로 정규화됩니다.
학습에는 이미지-캡션 쌍 32,768개로 구성된 배치를 사용하는 대조 학습을 적용합니다. 쌍 N개가 있는 배치에서 CLIP은 모든 이미지와 모든 캡션의 코사인 유사도를 계산해 N×N 행렬을 만들며, 대각선에는 실제 쌍이 놓입니다. 각 행에 소프트맥스 교차 엔트로피 손실을 적용해 각 이미지가 N개 중 자신의 캡션을 선택하도록 하고, 각 열에 두 번째 손실을 적용해 각 캡션이 해당 이미지를 선택하도록 합니다. 학습 가능한 온도 매개변수는 소프트맥스를 적용하기 전에 유사도 값을 조정합니다.
캡션이 자유 형식 텍스트이므로 CLIP은 웹에서 설명하는 모든 것, 즉 객체, 장면, 미술 양식, 이미지 속 텍스트, 동작을 대상으로 학습하며 고정된 클래스 목록에 제한되지 않습니다.
제로샷 분류#
이미지를 분류할 때 CLIP은 "a photo of a dog"와 같은 짧은 문장으로 각 후보 레이블을 임베딩하고, 이미지도 임베딩한 다음 코사인 유사도가 가장 높은 레이블을 선택합니다. 프롬프트 문구가 중요합니다. 논문에 따르면 "A photo of a {label}." 템플릿만으로도 ImageNet 정확도가 1.3% 향상되었으며, 템플릿 80개의 텍스트 임베딩을 평균하면 3.5%가 더 향상되었습니다. 아래의 Hugging Face Transformers 파이프라인은 각 레이블을 "This is a photo of {}." 템플릿에 넣고 원본 ViT-B/32 모델을 실행합니다.
from transformers import pipeline
# Load OpenAI's CLIP ViT-B/32 for zero-shot image classification
classifier = pipeline("zero-shot-image-classification", model="openai/clip-vit-base-patch32")
# The classes are free-form text, chosen at inference time
labels = ["a city bus", "a tram", "a delivery truck", "a bicycle"]
predictions = classifier("https://ultralytics.com/images/bus.jpg", candidate_labels=labels)
# Scores are a softmax over the image's similarity to each caption
for prediction in predictions:
print(f"{prediction['label']}: {prediction['score']:.3f}")a city bus: 0.657, a tram: 0.341, a delivery truck: 0.001, a bicycle: 0.000을 출력합니다. 전차는 남은 확률의 거의 전부를 차지하는 또 다른 대형 여객 운송 수단이며, 새로운 레이블 세트를 사용하려면 문자열 목록만 새로 지정하면 됩니다.
실제 적용 사례#
- 시맨틱 검색: 이미지 컬렉션을 한 번 임베딩해 벡터 데이터베이스에 저장합니다. "나무 바닥 위의 빨간 운동화"와 같은 텍스트 쿼리는 검색 시점에 임베딩해 저장된 벡터와 비교하므로, 수동 태그 없이 콘텐츠를 기준으로 이미지를 찾을 수 있습니다.
- 텍스트-이미지 생성: Stable Diffusion 1.x는 CLIP ViT-L/14의 텍스트 임베딩을 이미지 생성기의 조건으로 사용하며, 생성된 이미지가 프롬프트를 얼마나 충실히 따르는지 평가하는 데 CLIP 유사도가 널리 사용됩니다.
- 오픈 어휘 탐지: Ultralytics 패키지에서 실행되는 Tencent AI Lab의 YOLO-World 모델은 CLIP의 ViT-B/32 텍스트 인코더를 사용해
set_classes에 전달된 클래스 이름을 인코딩합니다. 따라서 한 번 학습된 탐지기가 이름을 바탕으로 "빨간 배낭"이나 "지게차"를 찾을 수 있습니다. Google의 OWLv2는 CLIP의 사전 학습된 이미지 및 텍스트 인코더를 기반으로 하며, VLM 리더보드는 실제 탐지 데이터셋에서 이 모델을 다른 오픈 어휘 탐지기 및 VLM과 비교합니다. - VLM용 비전 인코더: 많은 비전 언어 모델은 사전 학습된 CLIP 이미지 인코더를 기반으로 시작합니다. 예를 들어 LLaVA는 CLIP ViT-L/14 특징을 언어 모델에 입력합니다.
- 데이터셋 필터링: LAION-5B 같은 대규모 오픈 이미지-텍스트 데이터셋은 CLIP 이미지-텍스트 유사도가 임계값을 통과한 웹 쌍만 유지해 이미지 내용을 설명하지 않는 캡션을 제거합니다.
CLIP과 관련 접근 방식 비교#
- 지도 학습 분류기: 일반적인 분류기는 학습 클래스마다 출력 하나를 가지므로 한 번도 보지 못한 클래스의 점수를 계산할 수 없습니다. CLIP의 "분류기"는 텍스트 임베딩 집합이므로 레이블이 바뀔 때마다 함께 바뀝니다.
- SigLIP: Google의 변형 모델은 CLIP의 배치 전체 소프트맥스를 시그모이드 손실로 대체해 이미지-텍스트 쌍을 각각 독립적으로 평가하므로 메모리를 덜 사용하며 작은 배치 크기에서 더 잘 작동합니다.
- 자기 지도 대조 학습: SimCLR 같은 방법은 동일한 이미지의 두 증강 뷰를 대조하고 이미지 자체만으로 학습합니다. CLIP은 두 가지 모달리티를 대조해 이미지 특징을 단어와 연결합니다.
- 생성형 VLM: CLIP은 이미지-텍스트 유사도를 평가하지만 캡션을 작성하거나 질문에 답할 수 없습니다. 생성형 모델은 이미지 인코더에 언어 모델을 연결하며, 이미지 인코더로 CLIP 자체를 사용하는 경우가 많습니다.
한계#
CLIP의 제로샷 정확도는 항공기나 자동차 모델과 같은 세부 카테고리, 객체 수 세기, 거리 추정과 같은 추상적 작업에서 떨어집니다. 또한 웹 캡션의 편향도 학습합니다. CLIP은 이미지 속 텍스트를 읽도록 학습되었기 때문에 텍스트에 속을 수 있습니다. OpenAI의 멀티모달 뉴런 연구에서는 손으로 "iPod"라고 쓴 라벨을 붙인 사과를 iPod으로 분류했습니다.










