논문을 읽게 된 계기
최근 vision과 NLP를 모두 활용한 논문들을 읽어보면서, vision 말고도 multimodal learning 에 관심이 생기게 되었다. 사실 multimodal 에 관심은 엔비디아에서 출시한 자비스(Jarvis) 프레임워크를 접하게 되면서 시작되었다. 자비스는 영화 아이언맨에 나오는 것처럼 대화형 AI 에이전트로, 텍스트나 음성으로 대화가 가능하다. 더 나아가, 사용자의 얼굴을 보면서 기분이 안좋아보이면 말을 걸어주거나 유머를 던지는 멀티모달 기술도 개발중이라고 한다. vision과 NLP를 모두 활용해 사람과 소통할 수 있는 인공지능 모델이 있다면 정말 좋을 것 같다는 생각을 하면서 vision과 NLP를 모두 공부해보고 싶다는 생각이 들었다..!!
이후 가장 처음 읽은 논문이 바로 CLIP이다. CLIP은 2021년에 OpenAI 에서 발표한 논문이다. CLIP은 그동안 vision task 논문들만 읽었던 나에겐 꽤나 재미있는 논문이었고, 성능이 매우 좋아 충격을 받았다. 그동안 vision 분야는 기존에 라벨링된 데이터셋(ImageNet, MS COCO 등등..)으로 사전학습한 모델을 사용하는 것이 표준 방식이었다. 라벨링은 시간이 오래 걸리는 작업이기에 데이터 규모의 한계가 있었다. 반면 NLP 분야에선 웹에서 엄청난 규모의 텍스트 데이터를 사전학습한 언어모델 (GPT-3, BERT)이 등장하였고, 이렇게 사전학습(pre-training)된 모델을 fine-tuning하는 방식으로 뛰어난 성과를 얻었다. 물론 GPT-3의 경우 대부분 task에 대해 추가적인 학습없이 적용 가능하다..! 논문에서는 이러한 NLP 모델들이 task-agnostic 하다고 표현한다. (어떤 task 이던지 추가적인 학습이 필요 없이 바로 사용할 수 있다는 표현) 그럼 자연어의 이러한 퍼포먼스를 vision task에 사용할 수는 없을까? 다시 말해 자연어를 vision에 represent-ation learning을 할 수는 없을까? 이러한 고민에서 이 논문이 시작되었다.
결론부터, CLIP이란 "사물 인식의 새로운 모델"
먼저 결론부터 말하면 CLIP이란 zero-shot으로 물체를 classification 하는 모델이다. 먼저 zero-shot이란 학습데이터에는 없는 데이터를 맞추는 것이다. 학습데이터에 없는 데이터라니... 한번도 보지 못한 데이터를 맞출 수 있을까? 기존 image classification model에서는 절대로 맞출 수 없는 일이다. 여기서 zero-shot learning이라는 개념은 Palatucci의 "Zero-Shot Learning with Semantic Output codes"라는 논문으로 2009년 NIPS에 발표되면서 처음 다뤄지게 되었다.
그럼 한번도 보지 못했던 데이터를 딥러닝 모델이 맞추려면 어떻게 해야할까? 바로 입력 이미지에서 semantic information을 추출해내야 할 것이다. 예를 들어, 어떤 사람이 처음으로 날개 없는 선풍기를 봤다고 하자. 이 사람은 이전에 한 번도 날개없는 선풍기를 본적 없지만 바람이 나오는 구멍과 여러가지를 고려했을 때 날개가 없는 선풍기라는 사실을 추론해낼 수 있다. 하지만 기존 classification 모델은 이게 선풍기라는 사실을 알기 어렵다. 학습 데이터에서 본 적이 없는 데이터이기 때문이다. 따라서 딥러닝 모델이 이전에 한번도 본 적이 없는 이미지를 인식하는 zero-shot inference가 가능하려면 물체에 대한 semantic information을 얻어내야 한다. 바로 CLIP에선 text embedding을 통해 한 이미지에 대해 단순히 class 정보만 주는 것이 아니라 semantic한 정보를 주었다. 이미지와 그에 대한 labeling text를 학습에 사용한 것이 zero-shot learning을 가능하도록 만들었다.
CLIP과 기존 분류 모델의 차이점
기존 이미지 분류 모델은 학습 시 object에 대한 class 정보만 주었다. 이때 class는 숫자로 부여되며, 비슷한 class에 대해 유사성이 전혀 고려되지 않았다. 가령 3번 class가 car, 4번 class가 dog이라고 하자. 21번 class는 sedan일 때, 3번과 21번 class는 매우 유사하지만 class 번호는 차이가 많이 난다. Classification은 이런 식으로 정답 label에 대한 의미론적인 정보를 추출해내지 못했다. 하지만 CLIP은 이미지와 그에 대한 caption을 학습에 사용함으로써 정답 label의 의미론적인 정보를 이미지에 적용해냈다. 본 논문에서는 CLIP 모델을 4억개의 이미지와 텍스트(caption) 쌍으로 대규모 학습하였다. 즉, 자연어 supervision을 사용하여 학습한 셈이다. 그 결과 매우 많은 vision task에서 좋은 결과를 얻을 수 있었다!
위 그림은 CLIP 구조를 대표하는 구조이다. 왼쪽 그림은 CLIP이 학습 시 어떤 과정을 거치는지 한눈에 파악하도록 해준다. N개의 이미지가 한 batch라고 했을 때, 입력 이미지 N개 - text N개가 모델에 들어온다고 하자. 여기서 text는 각 이미지를 묘사하는 caption이다. 각 이미지는 Image Encoder를 거쳐 (1,768)로 tokenize 되고, text도 Text Encoder를 거쳐 (1,768)로 tokenize 된다. 여기서 tokenize된 벡터의 차원은 CLIP에서 제공하는 Encoder의 종류에 따라 바뀌는데, 내 기억으론 Image Encoder로 "ViT-B/32"를 쓴 경우 (1,768)로 tokenized되고 "ViT-B/16"을 쓴 경우 (1,512)가 되었다.
아무튼, N개의 이미지-text 쌍이 들어오면 총 N^2개의 pair가 생기는데, 이 중 정답은 N개이다! 즉, positive 쌍은 N개이고 negative 쌍은 N^2 - N개가 되는 것이다!!
- N개의 이미지-text pair가 주어졌을 때 (N개의 batch)
- N개의 positive pair는 image embedding된 결과와 text embedding된 결과의 cosine similarity를 최대화하고,
- N^2 - N개의 negative pair는 image embedding된 결과와 text embedding된 결과의 cosine similarity를 최소화 하도록
- CE loss를 사용하여 학습한다!
위에서 설명한 과정을 수도코드로 나타내면 위 Figure 3과 같다. batch를 사용해 N^2의 matrix를 한번에 계산 처리를 함으로써 많은 학습데이터를 매우 빠르게 학습할 수 있었다고 한다. 무려 4억개나 되는 데이터를 학습하는데 최적의 방법이었던 것이다.
Image/Text Encoder의 종류
실제로 CLIP 코드를 보거나, 돌려보면 다양한 encoder의 옵션이 있다는 사실을 알 수 있다. 참고로 CLIP 코드는 정말로 쉽게 알아볼 수 있도록 구현되어 있고, 손쉽게 수정도 가능하다 ㅎㅎ.. 아무튼 CLIP의 저자들은 Image Encoder와 Text Encoder로 어떤 것을 사용했는지 알아보자.
Image Encoder
Image Encoder의 경우 ResNet-50과 Vision Transformer(ViT)를 사용했다. 이때 ResNet-50의 경우 original ResNet을 사용하진 않았고, 수정된 버전의 ResNet-D를 사용했다. 논문에는 ResNet의 경우 5개의 모델을 사용했다. 먼저 2개는 ResNet-50, ResNet-101이고, 추가로 EfficientNet-style model을 통해 모델의 width, depth, resolution을 증가시킨 3개를 더 사용했다. 계산량을 4, 16, 64배씩 증가시켜 RN50x4, RN50x16, RN50x64라고 논문에서 표기했다.
Vision Transformer의 경우 2020년에 google에서 발표한 Vision Transformer에서 추가적인 layer normalization을 추가하는 것 외에는 기존의 모델을 수정하지 않고 사용했다. (CVPR에서 발표되었던 "An image is worth 16x16 words: Transformers for image recognition at scale" 논문에 나온 ViT 구조이다.)
논문 : Dosovitskiy, A., Beyer, L., Kolesnikov, A., Weissenborn, D., Zhai, X., Unterthiner, T., ... & Houlsby, N. (2020). An image is worth 16x16 words: Transformers for image recognition at scale. arXiv preprint arXiv:2010.11929.
Text Encoder
Text Encoder로는 2019년에 openai에서 공개한 text Transformer를 사용했다. 이때 텍스트의 BPE representation을 이용했다. BPE(Byte pair encoding) 알고리즘이란 1994년에 제안된 데이터 압축 알고리즘이다. 자연어에서의 BPE 알고리즘은 기존에 있는 단어를 분리하는 방법 중 하나인데, 자세히 다루지는 않겠다.
논문 : Radford, A., Wu, J., Child, R., Luan, D., Amodei, D., & Sutskever, I. (2019). Language models are unsupervised multitask learners. OpenAI blog, 1(8), 9.
학습은 얼마나 시켰을까?
위에서 언급했듯, 5개의 ResNet과 3개의 Vision Transformer로 학습을 진행했다.
ResNet : ResNet-50, ResNet-101, RN50x4, RN50x16, RN50x64
ViT : ViT-B/32, ViT-B/16, ViT-L/14
모두 32 epoch만큼 학습했고, Optimizer로는 Adam을 사용했다. 4억개의 데이터를 32 epoch이라..! 가장 큰 ResNet 모델인 RN50x64의 경우 NVIDIA Tesla V100에서 18일이 걸렸다고 한다. 그런데 논문에서 "592 V100 GPUs"라고 표현되어 있는데 그럼 Tesla V100이 592대라는 뜻인가...? (충격) 가장 큰 ViT의 경우 256대의 V100 GPU에서 12일을 꼬박 학습시켰다고 한다.
Experiments
주저리 주저리 적어보고 있는데, 실제로 이 흐름이 논문의 순서와 동일하다! 맨 처음에 CLIP은 "사물 인식의 새로운 모델"이라고 소개했었다. 즉, CLIP은 classification 모델인 것이다. 그럼 어떻게 분류를 할 수 있을까? 분명히 학습시킬 때 image-text 쌍으로 학습시켰으니 class라는 정확한 id를 구하는 방식은 아닐거 같은데... 라는 의문을 가질 수 있다. 학습된 CLIP은 아래와 같은 방식으로 classification을 할 수 있다.
바로 "A photo of a {object}" 이런 식으로 문장을 입력으로 주고 빈칸을 맞추는 식이다!! 바로 이런 과정을 논문에선 "Zero-shot transfer"라는 소제목에서 소개한다. 여기서 놀라운 점은 기존 classification 모델보다 훨씬 강력하다는 점이다. 만약 "The color of this photo is {color}"라는 입력을 주면 놀랍게도 사진의 color를 classfication할 수 있다..! 기존 분류 모델은 ImageNet이나 MS COCO 데이터셋에서 정해놓은 object class만 맞출 수 있지만 CLIP은 zero-shot classifier로써 color 정보나 모든 정보들을 맞출 수 있다. 현재 CLIP의 이런 zero-shot 기능을 활용해 프로젝트를 진행해보고 있기도 하다 ㅎㅎ..
이미지 분류에 대해 Visual N-grams 방식보다 "a Yahoo", "ImageNet", "SUM" 데이터셋 모두에서 zero-shot 성능이 훨씬 뛰어남을 볼 수 있다.
Promp Emgineering and Ensembling
CLIP이 다른 분류 모델과 다른 점은 바로 class id 하나만 출력하는게 아니라 prompt를 출력하는 것이다. 여기서 prompt란 "A photo of a {class}" 와 같은 형식의 문장을 의미한다. (GPT-3에서도 prompt를 조금씩 바꿔가면서 원하는 답을 얻을 때까지 고생했는데..)
즉, prompt를 조금식 바꾸면 성능도 올라갈 수 있다는 것을 의미한다. 본 논문에선 "A photo of a {class}" 와 같은 문장을 상황에 따라 구체적으로 바꿈으로써 성능을 훨씬 올릴 수 있었다고 한다.
"A photo of a {class}"를 다음과 같이 바꿔보자!
- "A photo of a {label}, a type of pet."
- "a satellite photo of a {label}."
- "A photo of big {label}."
- "A photo of small {label}."
그럼 다음과 같이 성능이 향상되었다고 한다. 무려 5%가 넘는 정확도 향상을 보여주었다.
결과
다양한 Image 데이터셋에 대해 CLIP의 결과는 놀랍도록 훌륭하다.
총 27개의 이미지 데이터셋 중 ImageNet을 포함한 16개의 데이터셋에서 ResNet-50에 비해 좋은 성능을 보였다고 한다. 데이터셋마다 성능이 조금씩 다른게 매우 흥미로웠다. MNIST에서는 CLIP이 안좋은걸 보니, 매우 단순해서 언어적으로 묘사가 한정적인 데이터에 대해선 성능이 안좋다고 생각되었다. 또한 STLI0 데이터셋에 대해선 99.3%의 정확도로 SOTA를 달성했다.
CLIP과 사람을 비교해본다면..?
논문 16 page에서 CLIP과 사람을 비교해보는 매우 흥미로운 실험을 소개한다. Oxford IIT Pets dataset (Parkhi et al.,2012)을 사용하였고, 이 중 3669개의 이미지를 5명의 다른 사람에게 주고 37종류의 개/고양이 사진 중 어느 것인지를 고를 수 있게 했다. 여기서 I don't know를 고를 수도 있게 했다. 5명의 사람은 인터넷 검색을 하지 못하고, 아무런 예시를 보지도 못한 채 이미지를 labeling 했다고 한다. 실제로 나도 처음보는 강아지 사진을 보고 이게 37개 종류 중 어떤 것인지를 알아맞춰보라면 못할거같다..
논문에는 나오지 않았지만, CLIP은 "A dog with 어떤 특징 ~ is {breed}" 이런 식으로 입력을 받았을 것 같다. prompt에서 기본적인 설명은 주어졌을 것이라 생각한다.
결과는 매우 흥미로웠다. Zero-shot human의 정확도는 53.7%에 그친 반면, Zero-shot CLIP은 무려 93.5%라는 놀라운 정확도를 기록했다.
Limitations
그럼 CLIP의 한계점은 무엇일까? 정리해보면 다음과 같다.
- CLIP은 ResNet-50, 101과 비교했을 때 특정 데이터셋에 대해 낮은 성능을 가졌다. 논문에서는 CLIP이 SOTA에 도달하려면 계산량이 1000배 이상 증가해야 할 것이라고 말한다.
- MNIST에서 낮은 성능을 보인 것처럼, CLIP은 낮은 성능을 보이는 경우가 있다. 특히, 좁은 범위의 분류 문제에 약하다고 한다. 또한 CLIP이 사전학습 단계에서 배울 수 없는 새로운 종류의 문제에서 정확도가 매우 낮다고 한다.
- CLIP이 MNIST에서 낮은 성능을 보인 것은, CLIP이 온라인에서 4억개의 이미지-text 쌍을 학습할 때 MNIST의 손글씨 이미지와 유사한 사진이 거의 없기 때문이라고 한다.
- 4억개의 이미지를 1초에 하나씩 32 epoch로 학습하면 405년이 걸릴 수 있다..? -> 추가 학습할 생각 하지 말자 ㅠ
- If every image seen during training ofa CLIP model was presented at a rate of one per second,it would take 405 years to iterate through the 12.8 billionimages seen over 32 training epoch
- 인터넷에서 수집한 데이터로 CLIP을 학습하게 되면 기존 온라인에 여러 사람들이 가지고 있는 사회적 편견들을 똑같이 학습하게 된다.
요약
- CLIP은 zero-shot으로 classification을 할 수 있는 새로운 분류 모델이다.
- 기존 분류 모델과는 다르게, 이미지-text pair를 입력으로 받아 학습한다.
- 학습이 완료된 CLIP 모델에는 "A photo of a {class}"와 같은 prompt를 통해 { }안에 있는 class를 얻어낼 수 있다.
- prompting을 통해 성능을 5%정도 향상시킬 수 있으니, prompting을 잘하자!
- 단순히 class 정보만 classification 하는게 아니라, 이미지의 color나 다른 정보들도 알아낼 수 있다.
- 하지만 의료, 위성, MNIST와 같이 웹에서 거의 존재하지 않는 이미지에는 기존 ResNet-50, 101에 비해 -10% 정도의 약한 성능을 보인다.
회고
CLIP 논문은 총 48쪽으로 정말 많은 실험 결과를 잘 정리해놓았다. 읽기 쉬운 논문에 속하는 것 같지만, 양이 너무 많아서 논문을 대략적으로 파악하고 싶다면 온라인에서 요약본을 보는게 훨씬 시간 절약이 될 것 같다.
점점 데이터의 양으로 승부를 보는 모델들이 등장하면서 개인 서버도 없는 나같은 학생은 초라해져만 간다.. 최근 GPT-3를 사용해보면서 아무리 좋은 모델 구조를 고안한다 해도 컴퓨팅 파워가 없으면 기존 거대 모델들을 따라잡을수 없다는 생각이 든다. 몇달 전에 나온 GATO 역시 무자비한 컴퓨팅 파워를 이용한 모델에 불과했다. 결국 기업에서 이러한 딥러닝 모델들을 독점하는게 아닌가 싶다.
현재 CLIP을 기반으로 하는 여러 모델들이 등장하고 있는데, CLIP이 너무 강력해서 그런지 CLIP에 변화를 거의 주지 않고 그대로 사용한다. CLIP이 나온지 1년이 지났는데, CLIP을 그대로 활용해 다양한 task를 수행하는 논문들이 아직 나오는 추세이다. Multimodal learning은 계속 트렌드가 될 수 있을까? 이제 새로운 트렌드는 어떤 것인지 최신 논문들을 유심히 읽어봐야 겠다.
참고한 블로그 : https://greeksharifa.github.io/computer%20vision/2021/12/19/CLIP/
Python, Machine & Deep Learning
Python, Machine Learning & Deep Learning
greeksharifa.github.io
'Paper > Multimodal Learning' 카테고리의 다른 글
VQA: Visual Question Answering - Computer Vision & NLP 분야에 대해 (1) | 2022.09.09 |
---|