[논문 설명] CLIP: ConnectingText and Images
공부하는 피카츄
CLIP(Contrastive Language-Image Pre-Training)
Learning Transferable Visual Models From Natural Language Supervision
요약
1. Contrastive learning을 사용하여 Image와 Text Encoder로 생성된 embedding이 비슷하게 만든다
2. 다양한 downstream task에 대한 성능이 좋다
Why?
항상 무언가를 할때 왜하는거지? 라는 질문을 하면 좋다. 나는 왜 CLIP논문을 리뷰할까?
리뷰 이유
1. 훌륭한 lagnuage representation을 통해 visual representation을 guide 할 수 있다는 것을 보여준 논문이다
2. CLIP을 사용하면 unseen dataset에 대한 성능이 좋다 (generability가 높다)
3. CLIP을 사용하는 논문이 2022 CVPR 및 모든 학회에서 쏟아지고 있다 (유행)
4. Practical usage가 높다 (실제 서비스에 이용)
자 그러면 이제 본격적인 내용으로 넘어가자.
Method
위 Figure는 CLIP algorithm의 pseudocode다. 결국 CLIP의 핵심은 image encoder와 text encoder의 embedding을 비슷하게 만드는 것이다. 이를 위하여 두 embedding 사이의 cosine-similarity를 계산하고 이를 cross entropy loss로 minimize한다.
Dataset
Method는 간단하다. 그런데 문득 생각이 든다. CLIP 을 훈련하기 위해서는 image와 text가 일대일 matching이 돼야 하는데 dataset을 어떻게 구축한거지? 기존 dataset로는 안되는걸까?
먼저 기존 dataset으로는 MS-COCO, Visual Genome, YFCC100M등이 있다. MS-COCO 와 Visual Genome은 좋은 quality의 image, text pair를 갖고있다. 하지만 image가 10만장 정도이기 때문에 Large-scale model을 training하기에는 너무 적다 (overfitting 문제 발생 가능). YFCC100M은 1억장의 image를 가지고 있다. 하지만 대다수의 image에 대한 text pair가 2017_023045.jpg 와 같이 유용하지 않은 정보를 담고있다. 이를 다 가려내면 1700만장의 image가 된다. 이또한 너무 적다.
사실 몇장의 이미지가 CLIP 모델에 적당한지 모르겠다. 모델의 parameter가 증가할수록 데이터셋의 크기가 늘어나야 할 것 같은 느낌은 있지만 최적의 데이터셋 크기는 무엇이다라고 말하기 힘들다. 시간이 된다면 관련 연구를 찾아보는것이 좋을 듯 하다.
아무튼 저자들은 엄청 큰 image, text pair dataset을 만들기로 한다. 방법은 다음과 같다.
1. Wikipedia 영어 버전에 100번이상 등장하는 단어 5만개를 query로 정한다.
2. Query에 등장하는 단어를 포함한 text와 이에 해당하는 image pair를 인터넷에서 찾는다.
흠.... 1번은 알겠는데 2번은 굉장히 모호한 말이다. 실제로 논문에도 굉장히 추상적으로 묘사돼 있다. 관련 github issue를 찾았다. https://github.com/openai/CLIP/issues/118
what text you use in (image, text) pairs · Issue #118 · openai/CLIP
Thanks for this amazing work. This is a question related to the paper, In paper section 8, "CLIP only uses full text sequences co-occuring with images as supervision rather than just the queri...
github.com
저자의 설명으로는 text는 title + description의 형태로 해당 이미지와 관련있는 한두 문장을 webpage에서 가져온다고 한다. 이 설명 또한 모호하다. 영업비밀인듯 하다.
Training
Model backbone은 다음과 같다.
Image encoder: ResNet, EfficientNet, ViT
Text ecoder: Transformer
특이한 점은 ResNet을 그냥 쓴것이 아니고 global average pooling을 attention pooling이라는 것으로 교체하였다. 궁금하신 분들은 해당 링크의 코드를 보시면 좋을 듯 하다. https://github.com/openai/CLIP/blob/d50d76daa670286dd6cacf3bcd80b5e4823fc8e1/clip/model.py#L58
GitHub - openai/CLIP: Contrastive Language-Image Pretraining
Contrastive Language-Image Pretraining. Contribute to openai/CLIP development by creating an account on GitHub.
github.com
또다른 특이사항으로는 minibatch size가 32,768이라는 것이다. 음.... 이정도면 학교에서는 절대 못하는 연구라고 할 수 있다.
Zero-shot Transfer
실험은 zero-shot transfer로 진행된다.
보통의 zero-shot learning은 unseen object에 대한 실험을 뜻하는데 CLIP은 unseen dataset에 대한 실험을 다룬다.
위 Figure는 Zero-shot CLIP과 Resnet Linear Probe의 성능을 비교한 것이다. 여기서 말하는 Linear Probe는 마지막 layer 이전은 freeze 시키고 마지막 linear layer만 해당 dataset으로 훈련한 것을 뜻한다. 실험결과를 보면 초록색으로 표시된 dataset에 대해 CLIP 이 더 좋은 성능을 보인다. 전반적으로 좋은 성능을 보이는데 위성사진 dataset과 같은 특별한 domain의 dataset에 대해서는 CLIP의 성능이 나쁘다. 당연한 것이다. CLIP의 dataset에 위성사진이 많지 않을 것이기 때문이다.
위 figure는 Linear Probe CLIP이 얼마나 좋은 성능을 보이는지 보여준다. 여기서 말하는 y축 average score는 여러개의 데이터셋의 accuracy를 평균낸 값이다.
결론
1. Text supervision을 통해 좋은 visual representation을 만들 수 있다.
2. CLIP pretrained model은 다양한 task에서 좋은 성능을 보인다 (활용도가 높다).
Future Works
CLIP이 좋은 성능을 보이는것은 인정한다. 그런데 이걸 어떻게 활용할 수 있을까? 놀랍게도 이를 활용한 논문이 정말 많이 쏟아져나오고 있다. 모든 학회에서 CLIP을 사용한 논문이 나온다. High-level에서 설명하자면 대다수의 논문은 CLIP pretrained image encoder를 사용하거나 CLIP 모델을 teacher로 사용한다. 기회가 된다면 CLIP을 사용한 논문중 재밌는 논문도 리뷰를 해야겠다.