[논문 리뷰] CLIP: Learning Transferable Visual Models From Natural Language Supervision
교수님께서 추천하신 vision-language multi modal 의 Baseline model인 CLIP 논문을 읽고 정리해보았다.
Abstract
기존의 컴퓨터 비전 모델들은 주어진 고정된 레이블 집합을 예측하도록 훈련되는 경우가 많다. 따라서 새로운 범주의 이미지를 분류하려면 추가 라벨링 작업(“나비” 대신 “잠자리”와 같은 새로운 카테고리)에 의존해야 한다.
NLP 분야는 방대한 웹 텍스트를 활용하여 자연어 자체로 풍부한 감독(supervision)을 얻어내고 있으며, GPT-3 같은 사례를 통해 대규모 프리트레이닝 + 제로샷(Zero-shot)으로도 많은 태스크를 수행 가능해졌다.
After pre-training, natural language is used to reference learned visual concepts (or describe new ones) enabling zero-shot transfer of the model to downstream tasks.
시각 분야(Computer Vision) 또한, 굳이 일일이 라벨링된 이미지 데이터셋만 쓰기보다 웹에서 수집한 이미지-텍스트 쌍을 이용한다면, 훨씬 다양한 시각적 개념을 학습할 수 있지 않을까?
Back ground & Related Research
Mori et al. (1999) 이후, 이미지와 연결된 단어·태그·캡션 등을 예측하는 방식으로 자연어 기반 학습 시도가 이루어짐.
Li et al. (2017) 등은 이미지와 연관된 단어·구 등을 예측하게 하는 과제(멀티라벨 분류)를 통해 이미지 표현을 학습하고, 이를 다른 데이터셋으로 제로샷 전이(Zero-shot Transfer) 하는 실험을 보여줌.
다만, 그 성능이 아직 일반적인 대규모 레이블링 수준을 뛰어넘지 못해, 실제 활용은 제한적이었다.
Creating Potential Large Web Dataset
한편, SNS 나 구글의 대규모 이미지 데이터같은 약한(super) 라벨을 활용한 대규모 학습이 큰 성능 향상을 가져오긴 했으나, 여전히 학습 가능한 범주가 제한되어 있음.
자연어는 훨씬 더 방대한 시각 개념을 포함 가능하므로, 만약 이를 충분히 큰 규모로 학습한다면 기존 모델을 능가할 잠재력이 존재한다.
CLIP의 Suggestion (Contrastive Language-Image Pre-training)
Figure 1. Summary of our approach. While standard image models jointly train an image feature extractor and a linear classifier to predict some label, CLIP jointly trains an image encoder and a text encoder to predict the correct pairings of a batch of (image, text) training examples. At test time the learned text encoder synthesizes a zero-shot linear classifier by embedding the names or descriptions of the target dataset’s classes.
Main IDEA
논문에서는 (이미지, 텍스트) 쌍을 대상으로 한 대규모 Contrastive Learning을 제안함.
간단히 말해, “이 이미지에 해당하는 설명은 무엇인가?”를 맞추는 식으로 이미지 인코더와 텍스트 인코더를 함께 학습한다.
학습이 끝난 후에는 텍스트를 통해 임의의 분류 라벨을 표현할 수 있으므로, 새로운 레이블에 대해서도 별도 학습 없이 제로샷 추론을 수행할 수 있다.
학습 데이터 & 방법
웹에서 약 4억 쌍의 (이미지, 텍스트) 데이터를 수집하여 사용.
이미지 인코더는 CNN 또는 비전 트랜스포머, 텍스트 인코더는 Transformers 기반.
미니배치 내에서 이미지-텍스트 실제 매칭은 긍정 예시(Positive), 나머지는 부정 예시(Negative)로 간주하여, 대조 학습으로 학습한다.
Zero-shot 전이(Zero-shot Transfer)
학습이 끝난 모델은, 새로운 데이터셋의 클래스 레이블을 “A photo of a {label}.”처럼 문장으로 변환 후 텍스트 인코더에 넣는다.
테스트 이미지를 이미지 인코더로 임베딩한 뒤, 각 클래스 문장 임베딩과 코사인 유사도 등을 계산 → 가장 유사도가 높은 레이블을 예측값으로 삼는다.
이렇게 하면 ImageNet처럼 미리 본 적 없는 레이블 집합도 추가 파인튜닝 없이 분류가 가능하다.
준수한 Zero-shot 성능
ImageNet 같은 대중적인 벤치마크에서 학습 데이터를 전혀 사용하지 않고도, 기존 ResNet-50 ImageNet 모델 수준에 가까운 정확도를 얻음.
OCR, 행동인식, geo-localization 등 다양한 테스크에서 기존 지표를 상당 부분 따라잡거나 능가함을 보임.
학습 효율 & 확장성
이전 자연어 pre-training(NLP)과 유사하게, 데이터·모델 크기(scale)를 키우는 데 따라 성능이 매끄럽게 개선된다는 점을 확인.
웹에서 손쉽게 확보 가능한 (이미지, 텍스트) 쌍이 모델 학습에 강력한 감독 신호를 제공한다는 사실을 재확인.
Numpy-like pseudocode for the core of an implementation of CLIP
# image_encoder - ResNet or Vision Transformer
# text_encoder - CBOW or Text Transformer
# I[n, h, w, c] - minibatch of aligned images
# T[n, l] - minibatch of aligned texts
# W_i[d_i, d_e] - learned proj of image to embed
# W_t[d_t, d_e] - learned proj of text to embed
# t - learned temperature parameter
# extract feature representations of each modality
I_f = image_encoder(I) #[n, d_i]
T_f = text_encoder(T) #[n, d_t]
# joint multimodal embedding [n, d_e]
I_e = l2_normalize(np.dot(I_f, W_i), axis=1)
T_e = l2_normalize(np.dot(T_f, W_t), axis=1)
# scaled pairwise cosine similarities [n, n]
logits = np.dot(I_e, T_e.T) * np.exp(t)
# symmetric loss function
labels = np.arange(n)
loss_i = cross_entropy_loss(logits, labels, axis=0)
loss_t = cross_entropy_loss(logits, labels, axis=1)
loss = (loss_i + loss_t)/2
주석 되어있는 파라미터 설명:
• I: 배치 크기 n의 이미지를 나타냅니다. 각 이미지는 (h, w, c) 해상도와 채널을 가짐.
• T: 배치 크기 n의 텍스트(문장)를 나타냅니다. 각 문장은 길이 l(토큰 수).
• image_encoder: (ResNet, Vision Transformer 등) 이미지를 입력받아 d_i 차원의 벡터로 추출.
• text_encoder: (CBOW, Transformer 등) 텍스트를 입력받아 d_t 차원의 벡터로 추출.
• W_i, W_t: 각각 d_i × d_e, d_t × d_e 형태의 학습 파라미터(투영행렬).
• 이미지/텍스트의 표현을 공동 임베딩 공간(크기 d_e)으로 투영할 때 사용.
• t: ‘temperature(온도)’라는 스칼라 파라미터로, 로짓(logits)을 스케일링할 때 사용.
이미지·텍스트 특징 추출
I_f = image_encoder(I) #[n, d_i]
T_f = text_encoder(T) #[n, d_t]
• image_encoder(I): 이미지를 받아서 n × d_i 형태로 변환 (배치 내 각 이미지는 d_i차원의 특징 벡터).
• text_encoder(T): 텍스트를 받아서 n × d_t 형태로 변환 (배치 내 각 문장은 d_t차원의 특징 벡터).
joint multimodal embedding 계산
I_e = l2_normalize(np.dot(I_f, W_i), axis=1)
T_e = l2_normalize(np.dot(T_f, W_t), axis=1)
• I_f와 T_f를 각각 투영행렬 W_i, W_t와 곱해 d_e 차원으로 맵핑.
• 그 뒤 **L2 정규화(l2_normalize)**를 수행하여, 최종적으로 I_e와 T_e가 같은 공간(d_e)에서 단위 벡터가 되도록 함.
• I_e : [n, d_e] (이미지 임베딩 벡터들)
• T_e : [n, d_e] (텍스트 임베딩 벡터들)
이미지-텍스트 쌍의 유사도 계산
logits = np.dot(I_e, T_e.T) * np.exp(t)
• I_e와 T_e를 dot product하여, n × n 크기의 pairwise cosine similarity 행렬을 얻는다.
• 행(n)은 이미지 인덱스, 열(n)은 텍스트 인덱스에 해당.
• 각 위치 (i, j)는 i번째 이미지 벡터와 j번째 텍스트 벡터의 코사인 유사도.
• np.exp(t): 학습되는 파라미터 t를 exp(t)로 변환, 로짓(logit)에 곱해줌으로써 스케일을 조정(InfoNCE 스타일).
대칭적(symmetric) 크로스 엔트로피 손실
labels = np.arange(n)
loss_i = cross_entropy_loss(logits, labels, axis=0)
loss_t = cross_entropy_loss(logits, labels, axis=1)
loss = (loss_i + loss_t)/2
• labels = np.arange(n)은 0부터 n-1까지의 라벨 벡터(배치 인덱스).
• logits: n × n 행렬이므로,
• loss_i는 “각 이미지(i번째 행)가 올바른 텍스트(i번째 열)를 골라야 한다”고 보는 크로스 엔트로피 손실. (axis=0)
• loss_t는 “각 텍스트(j번째 열)가 올바른 이미지(j번째 행)를 골라야 한다”고 보는 크로스 엔트로피 손실. (axis=1)
• 결국 이미지→텍스트, 텍스트→이미지 양방향으로 정답 인덱스가 일치하도록 학습하는 대칭 구조.
• 최종 loss는 두 방향의 손실을 평균해준 값.
즉, 배치 내 i번째 (이미지, 텍스트)가 실제로 짝이 되도록(= i번째 이미지에 해당하는 정답 텍스트도 i번째 위치) 확률을 높이고, 나머지는 낮추는 방식이다.
간단한 리뷰와 전망
Zero-shot 가능: 학습 후 임의의 텍스트 프롬프트(“A photo of a cat”)로도 새로운 분류를 수행할 수 있어 유연함.
대규모 웹 데이터 활용: 추가 라벨링 없이, 인터넷에 존재하는 방대한 이미지-텍스트 쌍을 학습에 활용 가능.
확장성: 이미지 인코더·텍스트 인코더 아키텍처를 교체하거나 대규모로 키워도 확장성 높음.
한계 및 과제
논문 전체 기준으로 보면, 세부 구현(데이터 수집 방식, 품질 관리 등)에 따라 편향(bias) 문제가 생길 수 있음.
Zero-shot 정확도가 특정 태스크에서는 훌륭하지만, 여전히 도메인 특화 Fine-tuning 모델보다 낮은 경우도 있음.
자연어를 분류 쿨래스 라벨로 변환하는 기법이 단순(“a photo of a {label}”)하기 때문에, 맥락이나 문장 구조가 복잡해지면 여전히 제한적.
...오늘은 CLIP main idea 위주로 리뷰를 해보았다. 다음에는 현재 진행중인 medical AI 관련 논문 발제를 위한 논문 리뷰를 해보겠다.