TT Lab
ブログ

한국어 English 日本語 中文

はじめる
ブログ

ブログ

対照学習とCLIP:画像とテキストをペアで学習すれば、見たことのないものも当てられる

ステータス:ドラフト(2026-10-13)。 論文の数値は原典(arXiv)を開いて条件と一緒に確認した値です。実際に動かしてみたのはノートPCのCPUで動かしたおもちゃの例だけで(コード code/01_infonce.py)、卓球映像にCLIPを適用した実測はありません(未実測)。 シリーズ:「ビジョンモデルを読む 2:自己学習・動き・人・スポーツ」第1編。畳み込み・ViT・検出・SAMなどの基礎は姉妹シリーズ ビジョンモデルを読む 1で扱っています。

目次

1. 直観:正解表の代わりにペア合わせ

通常の画像分類器は「この写真は猫」のように、人が決めたラベルのリストで学習します。リストにないものは永遠に答えることができません。出力枠が1,000個であれば、1,001番目の概念をモデルの中に収める場所はありません。

CLIP(Contrastive Language–Image Pre-training)は問いを変えます。「この写真のラベルは?」ではなく、**「この画像とペアのテキストはこの中のどれか?」**です。インターネットには、画像とそれを説明するテキスト(キャプション、代替テキスト)が一緒に掲載されているケースがよくあります。ペアはタダで手に入り、概念の種類に上限はありません。

ペア合わせが上手になると、分類はおまけとしてついてきます。「卓球のラケットの写真」、「卓球のボールの写真」、「卓球台の写真」の3つの文を作っておき、新しい画像が3つのうちどの文に最も近いかを確認すればよいのです。学習時に「卓球のラケット」というラベルを一度も指定していなかったとしてもです。これを ゼロショット(zero-shot)分類と呼びます。例を0個見て解くという意味です。

2. 図解:バッチ1つが問題集1つ

짝 N개 → N×N 유사도 → 양방향 교차 엔트로피 그림 N장 그림 인코더 벡터 u₁ … u_N 글 N개 글 인코더 벡터 v₁ … v_N 행 = 그림 u₁·v₁ u₂·v₂ u₃·v₃ u₄·v₄ u₁·v₂ u₁·v₃ 열 = 글 v₁ … v₄ 모든 칸 ÷ 온도 τ 작을수록 차이가 날카로워진다 행마다·열마다 소프트맥스, 정답 = 대각선 대각선 N칸은 올리고 나머지 N²−N칸은 내린다 오답 = 같은 배치의 다른 짝
図解:バッチN個のペアで作ったN×N類似度行列と双方向クロスエントロピー

学習は次のように進みます。

  1. 画像とテキストのペアN個を1つのバッチとして抽出します。
  2. 画像エンコーダー(ResNetやViT)が画像N枚を、テキストエンコーダー(トランスフォーマー)がテキストN個をそれぞれ同じ次元のベクトルに変換し、長さを1に合わせます(単位ベクトル)。
  3. すべての画像とすべてのテキストの内積、すなわち コサイン類似度をN×N行列にします。対角線が本当のペアで、残りのN²−N個のマスが偽のペアです。
  4. 各行において「対角線のマスを選ぶ」分類問題を解き、各列でも同じ問題を解きます。2つの損失の平均が最終的な損失となります。

不正解(ネガティブ)を個別に集める必要がない点がポイントです。 同じバッチ内の他のペアがそのまま不正解になります。バッチが大きいほど、一度に比較する不正解が増えます。CLIPはバッチサイズを32,768に設定しました(論文)。

3. どのように学習させるのか:InfoNCE

損失の数式

画像iのベクトルをuᵢ、テキストjのベクトルをvⱼ、温度をτとすると、画像側の損失は次のようになります。

L_그림 = −(1/N) Σᵢ log [ exp(uᵢ·vᵢ / τ) / Σⱼ exp(uᵢ·vⱼ / τ) ]
L_글   = 같은 식을 열 방향으로
L      = (L_그림 + L_글) / 2

括弧内はソフトマックス確率です。正解マスの確率が1に近づくように、つまり本物のペアの類似度を上げ、偽のペアの類似度を下げるように学習します。この形の損失を InfoNCE と呼びます。名称は2018年のCPC(Contrastive Predictive Coding)の論文に由来しています。同論文では、この損失を小さくすると両者間の相互情報量(mutual information)の下限が大きくなることが示されました。下限はlog N − Lの形をしており、 不正解の数Nが大きいほど下限が堅固になります(論文)。大きなバッチが好まれる理論的な理由です。

温度τ

τは類似度をソフトマックスに入力する前に割る数値です。τが小さいと、わずかな類似度の違いも確率上で大きく開き(鋭くなり)、大きいとぼやけます。CLIPはτも学習するパラメーターとし、0.07に相当する値からスタートしました。そして、ロジットスケーリング(1/τ)が100を超えないようにクリッピングしました。学習が不安定になるのを防ぐためと記載されています(論文)。

テキストで分類器を作る

学習が終わると、分類は次のように行います。

  1. クラス名ごとに文を作ります。名前をそのまま入れるだけでなく、「A photo of a {label}.」のようなテンプレート(プロンプト)に入れると、ImageNetの精度が1.3%p向上しました。80個のテンプレートを作ってベクトルを平均化する(プロンプトアンサンブル)と、さらに3.5%p向上しました(論文)。
  2. テキストベクトルがそのまま分類器の重みになります。新しい画像のベクトルと最も近いテキストが答えとなります。

4. 実際にやってみる

code/01_infonce.py をノートPCのCPUで実行しました(numpy + PyTorch、20秒前後)。数値はその出力のままです(code/01_infonce.out.txt).

手動で計算したInfoNCE

ペア4つのコサイン類似度行列を作成し、温度だけを変更して損失を測定しました。

logits = img @ txt.T / tau          # (N, N), 대각선이 정답 짝
loss = (ce(logits) + ce(logits.T)) / 2    # ce = 행마다 소프트맥스 교차 엔트로피(정답 = 대각선)
[[ 0.647  0.225  0.487  0.103]
 [ 0.333  0.459  0.425  0.286]
 [-0.255  0.302  0.445  0.267]
 [-0.383 -0.043 -0.318  0.351]]
τ=1.0   InfoNCE=1.1515   (무작위로 고르면 log N = 1.386)
τ=0.1   InfoNCE=0.4468
τ=0.07  InfoNCE=0.3604
τ=0.01  InfoNCE=0.5304

τ=1の場合、0.65と0.49の違いが確率にほとんど表れず、損失に適当な値を選んだ場合(log 4 = 1.386)とあまり変わりません。τを下げると損失が減少しますが、0.01では再び増加します。3列目を見ると、正解(0.445)よりも1番目の画像との類似度(0.487)の方が高くなっています。温度が非常に低いと、こうした「間違ったマス」の1つを非常に厳しく罰することになります。τを固定値にせず、学習させるようにした理由を感覚的に示す例です。

トイCLIP:見たことのない概念を当てる

20個の概念からなる偽の世界を作成しました。概念ごとに隠れベクトルがあり、「画像」はそのベクトルを1つの非線形変換で、「テキスト」は別の非線形変換で作成した64次元・40次元のベクトルです(ノイズを含む)。2つのエンコーダー(小さなMLP)を 概念0〜14のペアだけで 対照学習し、概念15〜19は学習から完全に除外しました。テスト時は概念ごとに「テキスト」10個をエンコードして平均したものをプロンプトとして使用します。

장난감 CLIP(배치 64, 600걸음) — 학습한 τ = 0.0756
  본 개념 15개 안에서 제로샷 정확도     : 0.973  (무작위 0.067)
  처음 보는 개념 5개 제로샷 정확도      : 0.855  (무작위 0.200)
지도 분류기(라벨 15개): 본 개념 정확도 0.973, 처음 보는 개념은 출력 칸이 없어 답할 수 없음

同じデータでラベル15個分の分類器を学習させると、既存の概念では同じく0.973となりますが、新しい概念に対しては出力枠がありません。対照学習を行った方は、初めて見る概念も85.5%正解しました。画像とテキストを 同じ空間に配置する方法を学習しているため、新しい概念のテキストさえあればその場所を見つけることができます。

何がこの能力を生み出しているのか、パラメータを調整してみました(3つのシードの平均)。

条件 初めて見る概念5個の精度
学習に使用した概念3個 0.485
学習に使用した概念7個 0.767
学習に使用した概念15個 0.875
概念15個、τ=1固定 0.799
概念15個、バッチサイズ4 0.839
概念15個、バッチサイズ256 0.818

最も大きな要因は 学習に使用した概念の多様性でした。3個の概念で学習すると、新しい概念の精度が半分以下に低下します。温度を1に固定すると約7%pのマイナスとなりました。一方、バッチサイズはこのおもちゃの実験では効果が見られませんでした。概念が15個しかなく、バッチが大きいと同一の概念が何度も含まれ、それらのマスが「実際には正解なのに不正解として扱われる」偽の不正解になってしまうためだと推測されます。4億個の異なるペアを使用する実際のCLIPでは状況が異なります。この結果を実際の規模にそのまま当てはめることはできません。

5. 論文の数値

すべてCLIPの論文(Radfordほか、2021)の値です。

項目 値 条件
学習データ 画像-テキストペア4億個(WIT) インターネット上の検索ワード50万個で収集
バッチサイズ・学習長 32,768 ・ 32エポック すべてのモデルをゼロから学習
計算量 データセンター級GPU 592基×18日(RN50x64)、256基×12日(ViT-L/14) 論文の報告
ImageNetゼロショットtop-1 76.2% ViT-L/14@336px。128万枚のラベルを一切使用せず、元のResNet-50の教師あり学習と同等の水準
分布が変化したテスト ImageNet-V2 70.1、-R 88.9、ObjectNet 72.3、-Sketch 60.2、-A 77.2 同一のゼロショットモデル
学習目標の比較 キャプションを生成するトランスフォーマーは、Bag-of-Words予測よりも3倍遅く学習し、Bag-of-Wordsを「予測」ではなく「対照」に変更すると4倍効率的 ImageNetゼロショット精度の向上速度に基づく基準

最後の行がこの記事の要点です。 文章をそのまま生成させるよりも、正しいペアを選択させる方がはるかに低コストで学習できます。 テキストの単語を1つずつ当てる作業は難しく(同じ画像を説明する文章は無数に存在します)、ペアを選ぶ作業はそれよりも簡単でありながら、画像の意味を学ぶことができます。

シグモイドに変更したSigLIP

SigLIP(Zhaiほか、2023)は行と列のソフトマックスを廃止し、行列の マスごとに独立した二値分類(ペアであれば1、そうでなければ0)をシグモイドで行います。バッチ全体で正規化しないため、デバイス間で類似度行列全体を集める必要がありません。不正解のマスが圧倒的に多く、最初に「すべて0」に偏るのを防ぐためにバイアスを−10、スケールを10からスタートさせました(論文)。

項目 値(論文)
公開された画像エンコーダーを凍結し、テキスト側のみ学習(SigLiT g/14) ImageNetゼロショット84.5%、TPUチップ4基で2日、バッチサイズ20k
バッチサイズ シグモイド・ソフトマックスともに約32kで飽和。小さなバッチではシグモイドの方が確実に優れている

「バッチは大きいほど良い」という通念が32k付近で頭打ちになるという観察は、前述のおもちゃの実験でバッチの効果が見られなかったこととも傾向が一致しています。

6. 限界

7. 我々のプロジェクトとのつながり

TT の一言。 正解ラベルなしで「ペア合わせ」だけをしたのに、初めて見るものも当てられるなんて不思議ですよね?代わりに「いくつ?」や「いつ?」はペア合わせではなかなか学べません。それはボールを直接数える私たちのエンジンの役割です。

参考文献

ログインするといいねできます

コメント

まだコメントはありません。

ログインするとコメントできます