Skip to main content

CLIP

CLIP (Contrastive Language-Image Pre-training) は、image と text を共通の embedding 空間で対応づける foundation model です。OpenAI が 2021 年に提案し、Vision-Language Models の標準的な出発点になりました。

何を学ぶのか

CLIP は、

  • Image encoder fIf_I (ViT / ResNet)
  • Text encoder fTf_T (Transformer)

の 2 つを持ち、(image, caption) pair を対応づけるように対比的に学習します。

L=1Nilogexp(fI(xi),fT(ti)/τ)jexp(fI(xi),fT(tj)/τ)\mathcal{L} = -\frac{1}{N}\sum_i \log \frac{\exp(\langle f_I(x_i), f_T(t_i)\rangle / \tau)}{\sum_j \exp(\langle f_I(x_i), f_T(t_j)\rangle / \tau)}

(image-to-text と text-to-image の対称な softmax 損失の和)

なぜ zero-shot ができるのか

CLIP の image / text encoder は、共通の embedding 空間を共有します。したがって、未知の class でも、

  1. Class name を「a photo of a {class}」のような text prompt にして encode
  2. Image を image encoder で embedding
  3. Cosine similarity が最大の class を選ぶ

という手順で zero-shot classification ができます。

何がインパクトだったのか

  • ImageNet などの固定 class set に縛られない
  • Caption データだけで強い visual representation が得られる
  • 多様な downstream に prompt 一つで適用できる
  • 後続の DALL·E / Stable Diffusion など、generative model の text encoder としても使われる
  • Open-vocabulary detection / segmentation / 3D perception の出発点になる

弱点

  • 細かい属性 (counting、relation、negation) は弱い
  • Compositional understanding が限定的
  • Caption noise に依存
  • 単純 cosine similarity では fine-grained matching が不安定

これらに対する改良が、SigLIP、EVA-CLIP、SigLIP 2 などにつながります。

数式で見る CLIP の対称 contrastive loss

CLIP は、image encoder fIf_I と text encoder fTf_T が出力した embedding を normalize して同じ空間に置き、batch 内の (image, text) pair を対応付けます。Batch 内の embedding を vi=fI(xi)/fI(xi)\mathbf{v}_i=f_I(x_i)/\|f_I(x_i)\|tj=fT(tj)/fT(tj)\mathbf{t}_j=f_T(t_j)/\|f_T(t_j)\| とすると、similarity matrix は次のように書けます。

Sij=vitjτS_{ij}=\frac{\mathbf{v}_i^\top \mathbf{t}_j}{\tau}

ここで、τ\tau は学習可能な temperature です。Image を query にしたときと、text を query にしたときの cross-entropy をそれぞれ書くと、次のようになります。

LIT=1Nilogexp(Sii)jexp(Sij)\mathcal{L}_{I\to T} =-\frac{1}{N}\sum_i\log\frac{\exp(S_{ii})}{\sum_j\exp(S_{ij})} LTI=1Njlogexp(Sjj)iexp(Sij)\mathcal{L}_{T\to I} =-\frac{1}{N}\sum_j\log\frac{\exp(S_{jj})}{\sum_i\exp(S_{ij})}

最終的な loss は対称な和です。

L=12(LIT+LTI)\mathcal{L}=\frac{1}{2}\left(\mathcal{L}_{I\to T}+\mathcal{L}_{T\to I}\right)

各項の意味は次の通りです。

  • vi,tj\mathbf{v}_i,\mathbf{t}_j は、画像と text を同じ空間に置いた embedding です。
  • τ\tau は softmax の鋭さを決め、似ている度合いをどれくらい厳しく比べるかを決めます。
  • 分母には batch 内の全 text または全 image が入るため、batch 内の他 sample が negative の役割を担います。
  • LIT\mathcal{L}_{I\to T} は「画像が正しい text を選べるか」、LTI\mathcal{L}_{T\to I} は「text が正しい画像を選べるか」を学習します。

この式の気持ちは、「同じ意味の image-text pair の類似度を上げ、無関係な pair の類似度を相対的に下げる」というものです。Batch を大きくするほど negative が増え、表現空間がより細かく押し広げられます。

数式で見る zero-shot classification

CLIP の zero-shot 分類は、各 class cc について prompt TcT_c(例: "a photo of a {class}")を作り、text embedding tc=fT(Tc)/fT(Tc)\mathbf{t}_c=f_T(T_c)/\|f_T(T_c)\| を計算します。Query 画像 xx に対しては、image embedding v=fI(x)/fI(x)\mathbf{v}=f_I(x)/\|f_I(x)\| を作り、次の分布から class を選びます。

p(cx)=exp(vtc/τ)cexp(vtc/τ)p(c\mid x)=\frac{\exp(\mathbf{v}^\top\mathbf{t}_c/\tau)}{\sum_{c'}\exp(\mathbf{v}^\top\mathbf{t}_{c'}/\tau)}

この式の気持ちは、「画像 embedding に最も近い class prompt embedding を選ぶ」ということです。Class set を入れ替えるだけで分類対象を変えられるため、fine-tuning なしで新しい task に転用できます。

関連ページ

主なソース