Skip to main content

SimCLR

SimCLR (Simple Framework for Contrastive Learning of Visual Representations) は、2020 年に Google が提案した contrastive self-supervised learning の代表的手法です。「特別な architecture を持ち込まず、適切な augmentation と large batch があれば十分」というメッセージで、self-supervised learning ブームの起点になりました。

核となる三つの要素

  1. Strong augmentation: Random crop + color jitter が特に重要
  2. Projection head gg: Encoder の特徴を projection した後で contrastive loss を取る
  3. Large batch: 多くの negative を一度に使う

重要な観察

  • Augmentation の選択が精度に最も大きく影響する
  • Encoder の出力をそのまま contrastive せず、projection head 経由で loss を取ると downstream が良くなる
  • Batch size を大きくするほど性能が伸びる (ただし計算量も増える)

なぜ projection head なのか

Contrastive loss は augmentation 不変性を強制しますが、それを encoder 出力に直接押し付けると、downstream で有用な情報まで潰してしまいます。Projection head を挟むことで、

  • Loss は projection 後の空間で計算
  • Encoder の特徴自体は augmentation 不変ほど強くは縛られない

という分離が起きます。

弱点

  • 大きな batch (1024〜8192) が必要 → メモリ重い
  • 計算コストが大きい
  • Negative sample が batch に閉じる

これらを解決する方向として、MoCo (queue で negative を増やす) や BYOL (negative 不要) が出てきました。

数式で見る NT-Xent loss

SimCLR では、一つの画像から二つの augmentation view を作り、それらを positive pair とします。Batch 内に 2N2N 個の view があるとき、view ii と positive view jj に対する NT-Xent loss は次のように書けます。

i,j=logexp(sim(zi,zj)/τ)k=12N1kiexp(sim(zi,zk)/τ)\ell_{i,j}= -\log \frac{\exp(\mathrm{sim}(z_i,z_j)/\tau)} {\sum_{k=1}^{2N}\mathbf{1}_{k\ne i}\exp(\mathrm{sim}(z_i,z_k)/\tau)}

ここで、ziz_i は projection head の出力、sim\mathrm{sim} は cosine similarity、τ\tau は temperature、1ki\mathbf{1}_{k\ne i} は自分自身を denominator から除く indicator です。

この式の気持ちは、「positive pair の similarity を大きくしながら、同じ batch 内の他の view との similarity は相対的に小さくする」というものです。Large batch が重要になるのは、denominator に入る negative の数が増え、表現空間をより細かく押し広げられるからです。

関連ページ

主なソース