앞서 작성한 Constrative Learning를 기반으로 CLIP 논문 리뷰를 진행하겠습니다.
2024.11.12 - [DL] - Contrastive Learning
CLIP을 설명하기에 앞서 이전의 모델들은 어떤 단점이 있는지 알아보겠습니다.
기존 DL의 단점
- 데이터 세트를 구축하기 위해 각 이미지마다 라벨링하는데 많은 시간과 비용을 사용
- 학습된 데이터 구성이 아닐 경우 새로운 데이터 세트를 빌드하고 output head를 추가하고 모델을 fine tuning하는 과정을거쳐야 함
- 실제 배포하면 벤치마크보다 성능이 훨씬 낮은 경우가 많음(일반화 문제)
-> 벤치마크에서의 높은성능을 위한 최적화 때문
CLIP
- 새로운 데이터가 들어왔을 떄 추가적인 모델 학습이 필요 없음
- Text encoder에 이미지에 대한 설명만 해주면 됨 (Image Encoder는 Pre-trained Image Encoder 그대로 사용)
- 데이터 학습 없이 평가할 수 있으므로 벤치마크 성능과 실제 성능의 차이가 적음(일반화된 모델) - zeroshot
- 이미지와 자연어를 결합하는 새로운학습 방법
- 자연어로 supervision하는 방식(Image & label이 아닌 Image & Description about Image)으로 데이터셋을 구축
- 인터넷으로부터 4억장의 이미지&자연어 매칭 데이터셋을 구축
모델 학습 및 예측
크게 아래와 같은 3 단계를 거쳐 모델을 학습하고 예측합니다.

1. Contrastive pre-training
Pre-training이라고 표현하는 이유는 광범위한 데이터에 대해 미리 학습을 하고 하위 task에 적용을 하겠다는 차원에서 해당 논문에서 표현하였습니다.
계산 과정을 이해하기 쉽게 논문에 제시된 psedo code와 함께 순서대로 정리해보겠습니다.
# Numpy-like pseudo code for the core of an implementation of CLIP
# image_encoder - ResNet or Vision Transformer
# tenxt_encoder - CBOW or Text Transformer
# I[n, h, w, c] - minibach of aligned images
# I[n, l] - minibach of aligned text
# 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
- Image는 Image Encoder로 Text는 Text Encoder로 각각 N개의 feature(Vector 값) 추출 후 가중치 곱하고 L2 Norm 수행하여 각 벡터 embedding 한다.
# extract feature representations of each modeality 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), W_t), axis=1) - Image와 Text vector간의 내적을 통해 Cosine Similarity를 구한다.
(각 text embedding vector가 다른 text embedding 과 얼마나 유사한지 / 각 image embedding vector가 다른 imageembedding 과 얼마나 유사한지를 구한다.)
# scaled pairwise cosine similarity [n, n] logits = np.dot(I_e, T_e.T) * np.exp(t) # symmetric loss function labels = np.arrange(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
- Image vector에 대한 Text vector N 개의 Cosine Similarity를 계산한다.
- Text vector 또한 마찬가지로 Image vector N개의 Cosine Similarity를 계산한다.
- 위 과정을 거치면 label을 생성한 것처럼 Image 관점에서의 CrossEntroy Loss와 Text 관점에서의 CrossEntroy Loss 를 계산할 수 있다.
- i 번째 이미지에 대한 loss는 다음과 같이 구할 수 있다.

- 마찬가지로 Text에 대해서도 위의 식으로 하나하나에 대해 loss를 구해줍니다.
- 위 과정을 거치면 각각의 loss 값들은 Image에 대해 N개, Text에 대해 N개의 vector가 되는데 각 vector를 평균 내어 loss를 계산하여 Cosine Similarity가 커지는 방향으로 학습합니다.
- 해당 논문에서는 fine-tuning하지 않고 학습 종료
cf.) Image Encoder는 다양한 Vision model 활용 가능 ex) ResNet, Vit 등
cf.) Text Encoder는 Transformer를 사용 / 마지막 token에서 추출한 feature를 linear projection 해주어 image feature와 차원을 맞춤
2. Create dataset classifier from label text
fine-tuning 하지 않고 하위 task에 데이터 학습 없이 모델을 그대로 Zero-shot Prediction을 통해 예측값을 계산합니다.

위 그림과 같이 진행할 하위 task의 label을 Text로 생성하고 Text Encoder를 거쳐 각 Text vector 값을 구한다.
cf.) 단어가 아닌 문장으로, 예를 들어 a photo of (object)로 라벨링을 할 경우 성능이 향상된다고 한다.
3. Use for zero-shot prediction
앞에서 생성한 Text vector 값과 예측할 Image의 vector간의 유사도를 구하여 가장 높은 값의 Text를 선택한다.


- Pre-train된 Image Encoder를 통해 Image feature 추출(초록색 부분)
- Image가 어떤 Class에 해당하는지 알기 위해 Text Encoder를 통해 Text feature 추출(보라색 부분)
- Image feature와 Text feature 사이의 Cosine Similarity를 측정하여 가장 높은 값으로 Prediction
결과적으로 이렇게 Image와 Text의 Align을 통해 학습하여 고정되지 않은 개수의 새로운 Class에 대해 Prediction이 가능하다.
'DL' 카테고리의 다른 글
| Contrastive Learning (2) | 2024.11.12 |
|---|---|
| GAN(Generative Adversarial Networks) 리뷰 (1) | 2024.03.16 |
| VGG-16 리뷰 (0) | 2024.03.14 |
| ResNet(Residual Neural Network) 리뷰 (0) | 2024.03.12 |
| YOLO 리뷰 (2) | 2024.03.12 |