본문 바로가기
DL

[논문리뷰]CLIP (Learning Transferable Visual Models From Natural Language Supervision)

by Kwonys 2024. 11. 13.
728x90
반응형

앞서 작성한 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
  1. 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)
  2. 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 LossText 관점에서의 CrossEntroy Loss 를 계산할 수 있다.
    •    i 번째 이미지에 대한 loss는 다음과 같이 구할 수 있다. 
    •    마찬가지로 Text에 대해서도 위의 식으로 하나하나에 대해 loss를 구해줍니다.

  3. 위 과정을 거치면 각각의 loss 값들은 Image에 대해 N개, Text에 대해 N개의 vector가 되는데 각 vector를 평균 내어 loss를 계산하여 Cosine Similarity가 커지는 방향으로 학습합니다.

  4. 해당 논문에서는 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를 선택한다. 

feature  연산부분

  1. Pre-train된 Image Encoder를 통해 Image feature 추출(초록색 부분)
  2. Image가 어떤 Class에 해당하는지 알기 위해 Text Encoder를 통해 Text feature 추출(보라색 부분)
  3. Image feature와 Text feature 사이의 Cosine Similarity를 측정하여 가장 높은 값으로 Prediction

 

결과적으로 이렇게 Image와 Text의 Align을 통해 학습하여 고정되지 않은 개수의 새로운 Class에 대해 Prediction이 가능하다.

728x90
반응형

'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