対照学習とは
Contrastive Learning / コントラスティブ学習
似たデータの表現を近づけ、異なるデータの表現を遠ざけるように埋め込みを学習する方式
ひとことで言うと
「似ているもの同士は近く、違うもの同士は遠く」に配置されるよう、データの特徴の座標を学習する方法。
概要
対照学習とは、似たデータの組の表現を近づけ、異なるデータの組の表現を遠ざけるように埋め込みを学習する方式を指す。 同じ画像への異なるデータ拡張を正例ペア、他の画像を負例として学習する画像表現学習や、画像とその説明文を対応づけるCLIPの学習が代表例になる。 ラベルを使わずに質の高い表現を得られる自己教師あり学習の主要な方法であり、検索や類似度計算に使う埋め込みモデルの学習にも広く使われている。
歴史
画像分野では2020年に発表されたSimCLRやMoCoが代表的な研究として知られる。
アーキテクチャ
同じデータに異なるデータ拡張(切り抜き・色調変化等)を適用したペアを正例、バッチ内の他のデータを負例として扱う。エンコーダがそれぞれを埋め込みベクトルへ変換し、正例ペアの類似度を高く、負例ペアの類似度を低くするようInfoNCE等の対照損失で学習する。
ワークフロー
入力データに2種類の拡張を適用し正例ペアを作る → エンコーダで埋め込みベクトルを計算する → バッチ内の他サンプルを負例として類似度を計算する → 正例の類似度を最大化し負例の類似度を最小化する対照損失で学習する。
コード例
対照損失(InfoNCE)の簡易実装
import torch
import torch.nn.functional as F
def info_nce_loss(z1, z2, temperature=0.5):
z1, z2 = F.normalize(z1, dim=1), F.normalize(z2, dim=1)
logits = z1 @ z2.T / temperature
labels = torch.arange(z1.size(0), device=z1.device)
return F.cross_entropy(logits, labels)利点
欠点
- 十分な数の負例を確保するため大きなバッチサイズやメモリバンクが必要になり、計算資源を要する
- データ拡張の設計がタスクに合っていないと、学習される表現の質が低下する
- 正例・負例の定義が曖昧なドメイン(意味的に類似するが別データとして扱われる場合等)では性能が不安定になりやすい
関連用語
よくある質問
参考文献
- Research PaperSimCLR (arXiv)