MoCo
MoCo (Momentum Contrast) は、SimCLR と並ぶ contrastive learning の代表的手法です。Momentum encoder と memory 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 との比較
| 観点 | SimCLR | MoCo |
|---|---|---|
| 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 を 、key encoder の parameter を とすると、更新は次のように書けます。
ここで、 は momentum coefficient で、通常は 1 に近い値を使います。この式の気持ちは、「key encoder を急に変えず、query encoder の変化をゆっくり反映する」ということです。
MoCo の contrastive loss は、positive key と queue 内の negative keys を使って次のように書けます。
Queue を使うことで、現在の batch size よりもはるかに多い negative を denominator に入れられます。Momentum encoder は、その queue 内の古い key と現在の query の表現空間が急にずれないようにする役割を持ちます。
関連ページ
主なソース
- MoCo: https://arxiv.org/abs/1911.05722
- MoCo v2: https://arxiv.org/abs/2003.04297
- MoCo v3: https://arxiv.org/abs/2104.02057