300x250

 

목차

     

    Multi-modal이란 여러 도메인을 사용하는 것을 말한다. 특히 NLP(language, text)분야와 CV(vision, image)분야를 넘나들며 딥러닝을 적용하는 것이 요즘 트렌드인데, image captioning, text-to-image generation, 심지어 3D Vision까지 확장하여 Scene captioning, text-to-shape generation 등 다양한 task가 등장하고 있다.

    최근 chat-GPT를 발표한 OpenAI 회사에서 2021년 ICLR 학회에 이 분야의 base로 많이 활용되는 CLIP이라는 모델을 발표한 논문(Radford et al., Learning Transferable Visual Models From Natural Language Supervision)을 냈다. (2년도 지나지 않아 인용 횟수가 3500회가 넘었다!) 이에 대해 자세히 알아보자.

     

     

     

     

    Pre-knowledges

     

    먼저, self-supervised learning에 대해 알고있어야 한다.

    자세한 내용은 링크를 참조하고, 핵심만 간단히 짚어보고 넘어가자.

     

     

     

    Self-supervised Learning

     

    Transformer 기반의 대형 언어 모델들의 성공 요인은 scalability이다. 즉, 파라미터 개수가 아주 많은 복잡한 모델을 통해 다양한 task에서 높은 성능을 보이고 있다. (다른 말로 expressive power가 강하다고도 한다.) 이러한 복잡한 모델을 학습시킬 때 self-supervised learning(training)을 활용한다.

     

    익숙한 supervised learning과 비교해보자.

    Supervised learning은 특정 task에 대한 성능을 높이는 데 최적화되어있다. 따라서 training data에 대한 labeling에 드는 비용이 아주 크다. 그리고 이를 통해 학습한 모델은 특정(구체적인) task에만 최적화, 즉 task-specific하다는 한계가 있다.

    이에 비해 self-supervised learninglabeling되지 않은 방대한 데이터의 representation을 학습하도록 pre-training을 진행하는 방법이다. 이후에 특정 task에 따라 fine-tuning 혹은 linear-probing을 거쳐 활용한다. 주요 과정은 다음과 같다.

    1. Pre-training for pretext task : Representation 학습 과정
    2. Transfer learning for downstream(specific) task : Fine-tuning 혹은 linear probing을 통해 특정 task에 적용하는 과정

     

    Pre-training

    Pretext task란 pre-training 과정에서 사용하는 task를 말하며, 크게 다음과 같이 나뉜다.

    • Self-prediction : 데이터의 샘플 일부를 마스킹하고(가리고), 그것을 예측하는 task
      • Autoregressive generation : Sequential data를 다루는 task (GPT에서 사용)
      • Masked generation : Masking을 통해 일반화 성능을 높이는 방법 (BERT에서 사용)
      • Hybrid self-prediction : 여러 방식의 pretext task를 혼합한 방식 (DALL-E에서 사용)
    • Contrastive Learning : Embedding space 상에서 비슷한 feature 쌍(positive pair)은 가깝게, 다른 feature 쌍(negative pair)은 멀게 embedding하도록 학습하는 task (CLIP에서 사용)

     

    Fig 1. Contrastive Learning Example

     

    Fig 1에서 강아지와 고양이 사진으로 contrastive learning의 간단한 예시를 볼 수 있다. 강아지의 오른쪽 위만 남겨둔(나머지는 마스킹한) 사진의 feature \(\theta(x^a)\)와 왼쪽 위를 남겨둔 사진의 feature \(\theta(x^+)\)는 positive pair(둘 다 강아지 사진의 일부)이므로 가깝게, \(\theta(x^a)\)와 고양이의 일부의 feature \(\theta(x^-)\)는 negative pair(서로 다른 사진의 일부)이므로 멀게 embedding하도록 학습하는 것이다.

    이러한 방법으로 모델은 representation을 학습, 즉 학습된 feature space를 얻게 된다.

     

    Transfer Learning

    학습한 모델을 특정 task에 활용하려면 linear probing 혹은 fine-tuning 과정을 거쳐야 한다.

    Linear probing이란, pre-training 과정에서 학습된 weight을 모두 freeze한 뒤에 모델이 적절한 feature를 만들어내는지(representation을 잘 학습했는지)를 입증하는 방법이다. 즉, pre-training을 잘 했는지 평가하는 방법이라고 생각할 수 있다.

    Fine-tuning은 학습한 representation(weight)을 활용하여 downstream task에 맞게 좀 더 학습을 진행(weight을 업데이트)하는 방법이다. 간단한 예시로, BERT는 pre-training 과정에서 text를 이해하고, fine-tuning 과정에서 sentence classification, question & answering 등 좀 더 구체적인 downstream task에 대해 학습을 조금 더 진행한다.

     

     

     

     

    Introduction

     

     

     

    Motivation

     

    이러한 self-supervised learning 방법을 통해 NLP 도메인에서는 방대한 raw text를 사용하여 BERT, GPT 등의 복잡한 모델(task-agnostic architecture)을 pre-training한 후 다양한 task에 활용하는 것이 최근의 트렌드이다. (이미 2017, 2018년에 이루어진 거라 최근이라고 하기에도 조금 지났기는 하다.)

    하지만, CV 도메인에서는 2021년 당시 아직도 labeling된 (상대적으로 적은 양의)dataset을 활용했다.

    'NLP에서처럼 방대한 web상의 data들을 labeling 없이 활용하여 범용적인(general) 모델을 학습할 수는 없을까?'라는 의문이 CLIP 연구의 시발점이었다.

     

     

     

    Related Works

     

    기존에도 text로부터 image representation을 학습하려는 시도는 많았다. 대표적으로 pre-training 방식에 따라 transformer 기반의 VirTex(Visual representations from Textual annotations), masked language modeling 기반의 ICMLM (Image-Conditioned Masked Language Modeling), contrastive learning 기반의 ConVIRT(Contrastive VIsual Representation learning from Text) 등이 있다.

     

     

     

    ConVIRT

     

    특히 ConVIRT의 경우, 이름에서도 알 수 있듯이 CLIP의 base로 볼 수 있는 모델이다. (실제로 논문에서 CLIP은 ConVIRT의 간소화 버전이라고 언급했다.) ConVIRT 모델의 pre-training 과정을 살펴보자.

     

    Fig 2. ConVIRT Pipeline

    1. Image encoding process
    2. Text encoding process

     

    Terminologies

    변수들부터 살펴보면, \(\mathbf{x}_v, \mathbf{x}_u\)는 각각 image input, text input이며, \(\mathbf{v}, \mathbf{u}\)는 각각 image feature embedding, text feature embedding이다.

    \(t\)는 Stochastic (image or text) transformation function \(\mathcal{T}\)에서 샘플링한 transformation function이다. CLIP에서는 text encoding 시에는 text prompt의 문장이 하나여서 샘플링할 필요는 없으므로 사용하지 않고, image encoding 시에는 random square cropping만 사용한다.

    \(f_v\)는 image encoder로 ResNet 50을, \(f_u\)는 text encoder로 BERT encoder를 사용했다.

    \(g\)는 Non-linear projection로, ReLU를 사용했다. CLIP에서는 non-linear projection 대신 더 간단히 linear projection을 활용한다. (Non-linear projection 사용 시 현재 이미지의 detail에만 집중하게 된다고 한다.)

     

    Bidirectional loss

    ConVIRT에서 사용하는 loss는 bidirectional loss이다. CLIP에서 거의 그대로 사용하기 때문에 아주 중요하다.

    Bidirectional loss란 contrastive loss인데, image를 기준으로 한 image-to-text contrastive loss 혹은 text를 기준으로 한 text-to-image contrastive loss를 말한다.

    수식을 통해 각각을 이해해보자. 먼저 image-to-text contrastive loss는 다음과 같다.

    \( l_i^{(v \rightarrow u)} = - \log \cfrac{\text{exp}\left( \left\langle \mathbf{v}_i, \mathbf{u}_i \right\rangle / \tau \right)}{\sum\limits_{k=1}^N \text{exp} \left( \left\langle \mathbf{v}_i, \mathbf{u}_k \right\rangle / \tau \right)} \)

     

    \(i\)번째 image embedding과 positive pair인 text embedding 간의 거리를 가깝도록 해주기 위한 loss라고 생각하면 쉽다.

     

    \(\left\langle \mathbf{v}, \mathbf{u} \right\rangle = \mathbf{v}^\top \mathbf{u} / \lVert \mathbf{v} \rVert \lVert \mathbf{u} \rVert\)는 cosine similarity로, Fig 3과 같이 두 벡터가 이루는 각도에 따라 값이 정해진다.

     

    Fig 3. Cosine Similarity

     

    \(\tau\)는 temperature parameter라는 hyperparameter로, softmax 내에서의 logit의 범위를 조정해준다. 즉, 값이 커질수록 분포가 뾰족해지고, 작아질수록 분포가 완만해진다.

    Loss에 -를 붙여줌으로써(negative loss) loss 값을 최소화함에 따라 \(i\)번째 image embedding과 \(i\)번째 text embedding간의 유사도는 커지고(positive pair), \(i\)번째 image embedding과 \(i\)번째를 포함한 모든 text embedding간의 유사도 합은 작아지는(negative pairs) 효과를 갖는다.

    이는 \((\mathbf{v}_i, \mathbf{u}_i)\)를 true pair로 예측하도록 하는 classifier의 개념으로 볼 수 있다. 이럴 때 loss는 아래 식과 같은 개념으로도 볼 수 있다.

    \( - \log (\operatorname{softmax}(\left\langle \mathbf{v}_i, \mathbf{u}_i \right\rangle / \tau )) \text{ for } \mathbf{u}_k \)

     

    Text-to-image contrastive loss는 반대로 고정된 \(i\)번째 text embedding에 대해 positive pair인 image embedding을 embedding space에서 가깝도록 조정해주는 loss이다.

    \( l_i^{(u \rightarrow v)} = - \log \cfrac{\text{exp}\left( \left\langle \mathbf{u}_i, \mathbf{v}_i \right\rangle / \tau \right)}{\sum\limits_{k=1}^N \text{exp} \left( \left\langle \mathbf{u}_i, \mathbf{v}_k \right\rangle / \tau \right)} \)

     

    따라서 최종 bidirectional loss는 각 loss에 weight \(\lambda\), \(1 - \lambda\)를 적용하여 다음과 같이 나타낸다.

    \( \mathcal{L} = \cfrac{1}{N} \sum\limits_{i=1}^N \left( \lambda l_i^{(v \rightarrow u)} + (1 - \lambda) l_i^{(u \rightarrow v)} \right) \)

     

    학습은 다음과 같은 과정으로 진행된다.

    1. \(N\)개 input pair \((\mathbf{x}_v, \mathbf{x}_u)\)의 representation pair \((\mathbf{v}, \mathbf{u})\)를 구함
    2. Bidirectional loss를 사용하여 image-text pair로 두 modality의 joint representation(embedding) space 학습

     

     

     

    Natural Language Supervision

     

    그런데 왜 하필 text, 즉 natural language를 활용하여 학습을 할까?

    Motivation으로 돌아가보자. 범용적인 모델을 학습시킬 때 web 상의 방대한 (이미지) 데이터를 사용한다고 하였는데, 이 데이터는 natural language와 vision 정보가 함께 존재하는 경우가 대부분이기 때문이다. 즉, natural language를 활용하는 경우 훨씬 다양한 representation과 supervision이 가능해진다.

    Natural language supervision이란, pre-training에서 contrastive learning을 통해 text와 image 쌍을 사용하여 image representation을 학습하는 것을 말한다. Unsupervised, self-supervised, weakly sueprvised 등 다양한 단어로 비슷한 개념을 표현하는데, 논문에서 natural language sueprvision이라는 표현을 사용했다.

    특히 CLIP의 경우 데이터의 개수가 압도적으로 많다(Scalability). VirTex, ICMLM, ConVIRT 이전에는 수많은 image를 학습하긴 했으나 word representation(N-gram 등) 방식의 한계로 학습에 수 년이 걸렸고, VirTex, ICMLM, ConVIRT의 경우 며칠 만에 학습하긴 했으나 수십만개 image밖에 학습하지 못했다. 하지만 CLIP은 ConVIRT의 간소화 버전 모델을 4억개의 (image, text) pair data로 학습시켜 scale이 GPT와 유사할만큼 아주 크고, 다양한 downstream task에 적용이 가능해졌다. Word representation의 측면에서 n-gram등 단순한 방법에 비해 deep contextual representation을 사용하면서 natural language를 supervision으로 더 쉽게 사용할 수 있었다.

    이렇게 web에서 얻은, (image, text) 쌍을 약간의 정제과정을 거쳐 학습에 사용한 4억개의 데이터셋의 이름은 WIT (WebImageText)이다. (GPT-2 학습에 서용했던 WebText와 비슷한 scale이다.) 하지만 애석하게도 openAI에서 이 데이터셋을 공개하지는 않았다.

     

     

     

     

     

     

    Method

     

    다음으로 CLIP의 pre-training 및 zero-shot transfer 과정과, encoder로 어떤 모델을 사용했는지를 좀 더 자세히 알아보자. 

     

     

     

    Overview

     

    Fig 4. CLIP Overview

     

    학습 과정(pre-training)에서, 일반적인 image model들은 image feature extractor와 linear classifier를 jointly training하여 정답 label을 예측하지만, CLIP은 image encoder와 text encoder를 jointly training하여 알맞은 (image, text) pair를 예측한다.

    Test 과정(linear probing)에서, CLIP은 학습된 text encoder로 target dataset의 class에 대한 description의 embedding을 얻고, 이를 통해 zero-shot prediction을 진행한다. 즉, zero-shot linear classifier 역할로 활용한다.

     

     

     

    Pre-Training Method

     

    Scaling을 위한 핵심은 training efficiency이다!

     

    Fig 5. Training efficiency of CLIP in zero-shot ImageNet classification

     

    위 그림에서 zero-shot ImageNet classification에서 text encoder로 transformer보다 bag of words prediction이 3배, bag of wrods prediction 모델보다 bag of words contrastive 모델이 4배 더 효율적임을 알 수 있다.

     

    Comparison of various models for pre-training

    ResNeXt, Student EfficientNet 등은 1000개의 ImageNet class에 최적화되어 있으므로 pre-training에 사용하기 적절하지 않다.

    그리고 VirTex의 경우, CNN과 text transformer를 jointly learning하지만, transformer는 복잡해서 효율적으로 scaling하지 못한다.

    또한 Bag of words prediction과 bag of words contrastive를 비교해 봤을 때, predictive objective를 사용할 경우에는 image에 해당하는 정확한 word를 예측하려 하므로 일반화 성능이 떨어지고, contrastive objective를 사용하는 것이 image의 전반적인 내용을 담는 text를 예측하려 하므로 더 적합하다.

    Generative model의 경우에는 high quality의 image representation을 얻을 수는 있으나, 같은 성능 구현을 위해서 contrastive model보다 computational cost가 한 차원 높다.

     

    Pre-training process

    CLIP의 pre-training 과정은 ConVIRT의 간소화 버전으로 생각해볼 수 있다.

    Pseudo code와 그림으로 이해해보자.

     

    # 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 projection of image to embedding
    # W_t[d_t, d_e] - learned projection of text to embedding
    # t - learned temperature parameter (tau)
    
    # Extract feature representations of each modality
    I_f = image_encoder(I) # [n, d_i]
    T_f = text_encoder(T) # [n, d_t]
    
    # Joint multimodal embeddings
    I_e = l2_normalize(np.dot(I_f, W_i), axis=1) # [n, d_e]
    T_e = l2_normalize(np.dot(T_f, W_t), axis=1) # [n, d_e]
    
    # Scaled pairwise cosine similiarities
    logits = np.dot(I_e, T_e.T) * np.exp(t) # [n, n]
    
    # Symmetric loss function
    labels = np.arange(n) # [n,]
    loss_i = cross_entropy_loss(logits_per_image, labels, axis=0) # image-to-text contrastive loss
    loss_t = cross_entropy_loss(logits_per_text, labels, axis=1) # text-to-image contrastive loss
    loss = (loss_i + loss_t) / 2

     

    Fig 6. Contrastive pre-training

     

    Input은 \(N\)개의 (image, text) pair이고, \(N \times N\)개의 가능한 (image, text) pair를 예측한다. 즉, positive 쌍이면 cosine similarity가 가깝도록, negative 쌍이면 멀도록 한다.

    Contrastive learning을 통해 multi-modal embedding space를 학습하는데, image encoder와 text encoder가 \(N\)개 positive pair(파란색)의 feature의 cosine similarity는 최소화하고, 나머지 \(N^2 - N\)개 negative pair(흰색)의 feature의 cosine similarity는 최대화한다.

     

    Contrastive loss는 ConVIRT와 같다. 먼저 image-to-text contrastive loss는 아래와 같이 정의한다.

    \( l_i^{(v \rightarrow u)} = - \log \cfrac{\operatorname{exp}\left(\left\langle \mathbf{v}_i, \mathbf{u}_i \right\rangle \right)}{\sum\limits_{k=1}^N \operatorname{exp} \left( \left\langle \mathbf{v}_i, \mathbf{u}_k \right\rangle \right)} \)
    • \(\left\langle \mathbf{v}, \mathbf{u} \right\rangle = \mathbf{v}^\top \mathbf{u} / \lVert \mathbf{v} \rVert \lVert \mathbf{u} \rVert \) : Image feature \(\mathbf{v}\)와 text feature \(\mathbf{u}\)의 cosine similarity
    • Temperature parameter \(\tau\)는 불필요하게 hyperparameter로 두지 않고, contrastive learning을 진행하면서 학습한다.

     

    이러한 loss를 최소화한다는 것의 의미는 true pair(positive pair)의 정보를 최대한 보존한다는 것과 같다. 즉, 모든 text embedding과 i번째 image embedding간의 유사도 합은 작게, i번째 text embeddig과 i번째 image embedding간의 유사도는 크게 하는 것이다. ( \(\mathbf{v}_i, \mathbf{u}_i)\)를 true pair로 예측하도록 하는 classifier 개념으로 볼 수 있다.)

    그림으로 이해해보자.

     

    Fig 7. Image-to-text contrastive loss

     

    Image-to-text contrastive loss를 최소화하는 것은 query image(강아지)에 대한 feature에 대해, embedding space에서 여러 text들 중 positive(true)인 pair에 해당하는 'dog'의 feature는 가깝게, 다른 text feature들은 멀게 위치시키는 과정이다.

     

    Text-to-image contrastive loss는 다음과 같다.

    \( l_i^{(u \rightarrow v)} = - \log \cfrac{\operatorname{exp}\left(\left\langle \mathbf{u}_i, \mathbf{v}_i \right\rangle  \right)}{\sum\limits_{k=1}^N \operatorname{exp} \left( \left\langle \mathbf{u}_i, \mathbf{v}_k \right\rangle \right)} \)

     

    Image-to-text contrastive loss가 i번째 image embedding에 관한 loss(Fig 6에서의 행)였다면, text-to-image contrastive loss는 i번째 text embedding에 관한 loss(Fig 6에서의 열)를 의미한다.

    최종 loss는 다음과 같다.

    \( \mathcal{L} = \cfrac{1}{N} \sum\limits_{i=1}^N \left( \lambda l_i^{v \rightarrow u} + (1 - \lambda) l_i^{(u \rightarrow v)} \right) \)

     

     

     

    Choosing Models and Scaling

     

    Image encoder와 text encoder에 어떤 모델을 적용할 수 있는지 알아보자.

     

    Models for image encoder

    Image encoder로는 ResNet이나 Vision Transformer(ViT)를 활용한다.

    _MODELS = {
        "RN50": "https://openaipublic.azureedge.net/clip/models/afeb0e10f9e5a86da6080e35cf09123aca3b358a0c3e3b6c78a7b63bc04b6762/RN50.pt",
        "RN101": "https://openaipublic.azureedge.net/clip/models/8fa8567bab74a42d41c5915025a8e4538c3bdbe8804a470a72f30b0d94fab599/RN101.pt",
        "RN50x4": "https://openaipublic.azureedge.net/clip/models/7e526bd135e493cef0776de27d5f42653e6b4c8bf9e0f653bb11773263205fdd/RN50x4.pt",
        "RN50x16": "https://openaipublic.azureedge.net/clip/models/52378b407f34354e150460fe41077663dd5b39c54cd0bfd2b27167a4a06ec9aa/RN50x16.pt",
        "RN50x64": "https://openaipublic.azureedge.net/clip/models/be1cfb55d75a9666199fb2206c106743da0f6468c9d327f3e0d0a543a9919d9c/RN50x64.pt",
        "ViT-B/32": "https://openaipublic.azureedge.net/clip/models/40d365715913c9da98579312b702a82c18be219cc2a73407c4526f58eba950af/ViT-B-32.pt",
        "ViT-B/16": "https://openaipublic.azureedge.net/clip/models/5806e77cd80f8b59890b7e101eabd078d9fb84e6937f9e85e4ecb61988df416f/ViT-B-16.pt",
        "ViT-L/14": "https://openaipublic.azureedge.net/clip/models/b8cca3fd41ae0c99ba7e8951adf17d267cdb84cd88be6f7c2e0eca1737a03836/ViT-L-14.pt",
        "ViT-L/14@336px": "https://openaipublic.azureedge.net/clip/models/3035c92b350959924f9f00213499208652fc7ea050643e8b385c2dac08641f02/ViT-L-14-336px.pt",
    }

     

    ResNet-50은 global average pooling 대신 attention pooling(multi-head QKV attention)을 적용하고, ViT는 거의 그대로 사용하는데, 기존에 patch와 positional encoding을 concat하는 과정에서 layer normalization을 추가한다.

     

    Models for text encoder

    Text encoder에는 Natural Language Supervision을 위해 조금 변형된 transformer를 활용한다.

    Text representation으로는 lower-cased BPE(Byte Pair Encoding)를 활용하고, vocab size는 49,152, max sequence length는 76이다.

     

    Scaling of image encoder and text encoder

    성능 향상을 위해 image encoder는 ResNet의 width, depth, resolution을 늘리고, text encoder는 ResNet의 width 증가량에 비례하여 width만 늘린다.(Text encoder의 capacity는 CLIP의 성능에 큰 영향이 없다고 한다.)

     

     

    728x90
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기