Contrastive Learning
対照学習では、一致するペアを近づけ、それ以外のサンプルを遠ざけるように埋め込みを学習します。InfoNCE、SimCLR、MoCo、CLIP、コードを解説します。
対照学習では、対応するサンプルのペア(正例)が近く、対応しないサンプルのペア(負例)が遠くなるような埋め込みをモデルに生成させます。ペアは、同じ写真の異なる拡張クロップなどのデータ自体から作ることも、画像とそのキャプションなど、自然にペアになっているデータから作ることもできます。そのため、対照学習にはクラスラベルは必要ありません。マスク再構成や自己蒸留と並ぶ、画像向け自己教師あり学習手法の主な系統の1つです。この方法で学習されたエンコーダーは、検出、分類、検索に転用できる特徴を生成します。また、CLIPなどのビジョン・言語モデルも同じ目的関数で学習され、ゼロショット学習によってテキストだけで画像を分類できます。
対照学習の仕組み#
対照学習の手法は、正例ペアの作成方法、各サンプルを正規化された埋め込みに変換するエンコーダー、類似度を比較する損失関数の3つで構成されます。SimCLRでは、GoogleのTing Chenらがランダムなクロッピング、色の歪み、ぼかしを使って各画像から2つのビューを作成し、共有のResNetと小さな射影ヘッドで両方をエンコードしました。また、バッチ内の他の画像を負例として扱いました。
データ拡張によって、モデルが何を無視するよう学習するかが決まります。同じ画像の2つの切り抜きが近い位置にマッピングされる必要があるため、エンコーダーは位置、スケール、色の変化が画像の内容を変えないことを学び、他の画像と区別する特徴を保持します。標準的なResNet-50の4倍の幅を持つモデルでは、SimCLRの固定特徴を使って学習した線形分類器が、ImageNetで76.5%のtop-1正解率を達成し、教師あり学習のResNet-50に匹敵しました。
対照学習の損失関数#
- ペアワイズ対照損失: Raia Hadsell、Sumit Chopra、Yann LeCunが2006年に提案した損失関数です。各正例ペアを近づけ、各負例ペアを、少なくともマージンmだけ離れるまで遠ざけます。
- トリプレット損失: アンカー、正例、負例を比較し、正例がマージン分だけ近くなるよう求めます。GoogleのFaceNetは2015年にこの方法で顔の埋め込みを学習しました。
- InfoNCE: 1つの正例を複数の負例と一度に比較します。類似度sを温度τで割った場合、アンカーに対する損失は−log[exp(s₊/τ) / Σⱼ exp(sⱼ/τ)]です。これは、すべての候補の中で正例を正解クラスとするsoftmax交差エントロピーです。Aaron van den Oordらは2018年に対照予測符号化でこの名称を付けました。SimCLRのNT-Xent損失とCLIPの損失も、その一種です。
- シグモイド損失: SigLIPでは、シグモイドを使ってすべてのペアを独立した一致・不一致として評価するため、バッチ全体で正規化する必要がありません。
PyTorchでは、InfoNCEは対角線上に正例を持つ類似度行列に対する交差エントロピーとして表せます。
import torch
import torch.nn.functional as F
torch.manual_seed(0)
# Stand-in embeddings for 8 images, a second view of each (row i of both is a positive pair),
# and 8 unrelated images
view1 = F.normalize(torch.randn(8, 128), dim=1)
view2 = F.normalize(view1 + 0.1 * torch.randn(8, 128), dim=1)
unrelated = F.normalize(torch.randn(8, 128), dim=1)
# InfoNCE: cosine similarities divided by a temperature, then cross-entropy where
# each row's positive (the diagonal) is the correct class among all 8 candidates
temperature = 0.1
targets = torch.arange(8)
for name, keys in [("Augmented views", view2), ("Unrelated images", unrelated)]:
logits = view1 @ keys.T / temperature
print(f"{name}: loss {F.cross_entropy(logits, targets):.3f}")出力はAugmented views: loss 0.016とUnrelated images: loss 2.505です。各行で正例が最も類似したキーであれば、損失は0に近づきます。無関係なキーの場合、損失はln 8 ≈ 2.08を上回ります。これは、温度0.1で割ると、偶然の類似度が確信度の高い誤答に変わるためです。ln 8は、8つの候補から一様に推測した場合の損失です。温度を下げるとsoftmaxが鋭くなり、損失は最も難しい負例に集中します。MoCoではτ = 0.07を使用し、CLIPでも学習可能な温度の初期値に同じ値を設定します。
負例、バッチサイズ、各種手法#
InfoNCEは負例が増えるほど性能が向上するため、負例の数が重要なコスト要因になります。SimCLRでは非常に大きなバッチから負例を取得しました。Facebook AI ResearchのKaiming Heらが開発したMoCoでは、最近のバッチから得た65,536個の埋め込みを負例としてキューに保持し、エンコーダーのモメンタム更新版でそれらをエンコードします。これにより、負例の数をバッチサイズから切り離せます。ランダムな負例には、同じ犬種の別の写真など、誤った負例が含まれることがあります。また、簡単すぎる負例からはあまり学習できないため、ハードネガティブマイニングでは混同しやすいサンプルを探します。教師あり対照学習(SupCon)では、ラベルを使い、同じクラスのすべてのサンプルを正例として扱います。BYOL、SimSiam、DINOなどの非対照学習手法では負例を完全に除き、非対称ネットワーク、勾配停止、または中心化によって、すべての入力が同じ埋め込みに崩壊するのを防ぎます。
対照学習と関連概念の違い#
- メトリック学習: 距離関数を学習する、より広いタスクです。対照損失やトリプレット損失はこの分野から派生しました。現在、「対照学習」は通常、SimCLRやMoCoで広く知られるようになった、自己教師ありで複数の負例を使う形式を指します。
- オートエンコーダー: 入力を再構成して学習するため、特徴にはピクセル単位の詳細が保たれる必要があります。対照学習の特徴は、あるサンプルを他のサンプルと区別する情報だけを保持します。
- JEPA: 画像の可視領域から隠れた領域の埋め込みを予測し、負例ペアを使わずに埋め込み空間で学習します。
- 教師あり学習: 人間が割り当てた固定のクラス集合に向けて学習します。一方、対照事前学習で必要なのは、どのサンプル同士が一致するかを決めるルールだけです。
用途#
- ビジョン・言語モデル: CLIPは、バッチサイズ32,768で4億組の画像とキャプションを使い、画像エンコーダーとテキストエンコーダーを学習しました。そのため、テキストプロンプトを使って画像を分類・検索できます。UltralyticsのYOLOE-26モデルは、CLIP形式の対照目的関数で学習したAppleのMobileCLIP2テキストエンコーダーを使ってクラス名をエンコードし、対照ヘッドで各候補領域をそのテキスト埋め込みと照合します。そのため、
set_classes(["forklift", "pallet"])を使うと、同じ重みを新しいカテゴリに対応する検出器にできます。 - セマンティック検索: 画像とテキストの対照学習済み埋め込みをベクトルデータベースに保存し、類似度に基づいて検索します。
- ラベルが少ない場合の事前学習: 医用画像解析のように専門家によるラベルが限られる分野では、ラベルのないスキャン画像で対照事前学習を行うことで、少数のラベル付きデータを使ったファインチューニングで適応できるバックボーンを得られます。
- 顔認識と再識別: 対照損失やトリプレット損失を使って、同じ人物や物体の写真が近くに配置される埋め込みを学習します。FaceNetの128次元埋め込みは、Labeled Faces in the Wildベンチマークで99.63%の正解率を達成しました。










