Skip to main content

MoCo

MoCo (Momentum Contrast) は、SimCLR と並ぶ contrastive learning の代表的手法です。Momentum encodermemory queue によって、batch サイズを大きくせずに大量の negative sample を確保できる点が核心です。

構造

  • Query encoder は通常通り backprop で更新
  • Key encoder は query encoder の EMA (momentum 更新)
  • 過去 batch の key を queue に貯めて negative として使う

なぜ EMA なのか

Key encoder を query encoder と完全に共有すると、毎 step ごとに key の意味が変わり、queue 内の past key と整合しなくなります。EMA で slow に key encoder を動かすことで、queue 内の key の表現が時間的に一貫します。

SimCLR との比較

観点SimCLRMoCo
Negative 数Batch サイズに依存Queue で巨大に
Batch サイズ大きくないと性能出ない中規模 OK
メモリ
ViT 対応後発で対応MoCo v3 で本格対応

MoCo v3

MoCo v3 は ViT backbone での self-supervised learning に focus した version です。BYOL / SimSiam に近い formulation を採り入れつつ、ViT 特有の不安定性 (early layers の崩壊) を緩和しました。

数式で見る momentum encoder

MoCo の key encoder は、query encoder の parameter を exponential moving average で追いかけます。Query encoder の parameter を θq\theta_q、key encoder の parameter を θk\theta_k とすると、更新は次のように書けます。

θkmθk+(1m)θq\theta_k \leftarrow m\theta_k + (1-m)\theta_q

ここで、mm は momentum coefficient で、通常は 1 に近い値を使います。この式の気持ちは、「key encoder を急に変えず、query encoder の変化をゆっくり反映する」ということです。

MoCo の contrastive loss は、positive key k+k^+ と queue 内の negative keys {kr}\{k^-_r\} を使って次のように書けます。

Lq=logexp(qk+/τ)exp(qk+/τ)+rexp(qkr/τ)\mathcal{L}_q=-\log \frac{\exp(q^\top k^+/\tau)} {\exp(q^\top k^+/\tau)+\sum_r\exp(q^\top k^-_r/\tau)}

Queue を使うことで、現在の batch size よりもはるかに多い negative を denominator に入れられます。Momentum encoder は、その queue 内の古い key と現在の query の表現空間が急にずれないようにする役割を持ちます。

関連ページ

主なソース