profile image

JONG HYUN LEE

Developer

Contact Info

Seoul, Korea

devjh@yonei.ac.kr

01066001566

MoCo: Momentum Contrast for Unsupervised Visual Representation Learning

저자: Kaiming He, Haoqi Fan, Yuxin Wu, Saining Xie, Ross Girshick
발행일: 2020
학회: CVPR
키워드: Contrastive Learning, Self-supervised, Dictionary, Momentum Encoder, InfoNCE

1. 🔍 개요

MoCo는 대조 학습(contrastive learning)을 위한 프레임워크로, 기존 방법들이 가진 두 가지 핵심 한계를 해결합니다:

  • 한계 1: 대조 학습에 필요한 수많은 negative sample 확보를 위해 매우 큰 batch size 필요 (e.g. SimCLR)
  • 한계 2: memory bank 기반 접근은 stale features 문제로 consistency가 떨어짐

MoCo는 이를 해결하기 위해 다음 두 가지 핵심 아이디어를 제안합니다:

  • Momentum Encoder: key encoder를 query encoder의 모멘텀 버전으로 유지하여 feature 일관성 확보
  • Queue-based Dictionary: 고정 크기의 FIFO queue를 통해 대규모 negative sample pool 유지

2. 🎯 주요 개념

✅ Contrastive Learning as Dictionary Lookup

MoCo는 contrastive learning을 사전 검색(dictionary look-up) 문제로 정의합니다. 즉, query vector qq가 주어졌을 때, **대규모 사전(dictionary)**에서 올바른 positive key k+k^+를 찾아내는 문제입니다. 나머지 key들은 모두 negative로 간주됩니다.


3. 🧠 핵심 수식과 상세 설명

📌 InfoNCE Loss

Lq=logexp(qk+/τ)exp(qk+/τ)+i=1Kexp(qki/τ)\mathcal{L}_q = -\log \frac{\exp(q \cdot k^+ / \tau)}{\exp(q \cdot k^+ / \tau) + \sum_{i=1}^{K} \exp(q \cdot k_i / \tau)}

🎓 왜 이런 구조인가?

  • 이 수식은 (1+K)개의 클래스 중에서 positive를 맞히는 softmax 분류 문제로 볼 수 있습니다.
  • numerator는 query qq와 positive key k+k^+ 사이의 유사도
  • denominator는 query qq와 모든 key들(positive + negative) 사이의 유사도 총합
  • τ\tau는 temperature로, softmax 분포의 sharpness를 조절해 학습 안정성과 분별력을 조절합니다.

🧩 수식 구성 요소 설명

| 구성 | 수학적 의미 | 직관적 의미 | | -------------- | ---------------------------- | ---------------------------------------------------- | | qk+q \cdot k^+ | 내적(similarity) | 같은 이미지끼리는 비슷해야 하므로 값이 크도록 학습됨 | | qkiq \cdot k_i | negative pair similarity | 다른 이미지들과는 내적값이 작도록 유도 | | softmax + log | log-softmax (CE loss와 동일) | 분류 문제로 전환하여 안정적 역전파 가능 | | log()-\log(\cdot) | log-likelihood 최대화 | 올바른 positive key를 맞힐 확률을 최대화 |

✅ 이 수식의 역할

  • representation space를 정렬시킵니다.

    • qqk+k^+는 가까워지고
    • qqkk^-는 멀어지도록
  • 이는 클러스터링이 아닌 instance-level 구분을 기반으로 한 학습 방식입니다 (Instance Discrimination).


📌 Momentum Encoder 업데이트

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

🎓 왜 이런 구조인가?

  • 기존 memory bank 방식에서는 key encoder가 매 iteration마다 빠르게 바뀌어 feature drift가 발생
  • 반면, momentum update는 slow moving average 방식으로 encoder를 천천히 업데이트함

✅ 이 수식의 역할

  • negative sample dictionary에 있는 key feature들이 너무 자주 바뀌는 것을 막아 representation의 안정성과 일관성 유지
  • 모멘텀 계수 mm은 일반적으로 0.999로 설정되며, 이는 key encoder가 천천히 변화하게 함

4. 🔄 전체 알고리즘 구조 (MoCo v1)

# 초기화
f_q = QueryEncoder()
f_k = KeyEncoder()  # f_q와 동일하게 초기화
queue = FixedQueue(size=65536)
momentum = 0.999

for images in dataloader:

    # (1) 두 개의 augmentation
    x_q, x_k = aug(images), aug(images)

    # (2) 인코딩
    q = f_q(x_q)  # query encoder (학습 대상)
    with torch.no_grad():
        k = f_k(x_k)  # key encoder (momentum 기반)

    # (3) 정규화
    q = normalize(q)
    k = normalize(k)

    # (4) InfoNCE Loss
    logits = torch.cat([q @ k.T, q @ queue.T], dim=1) / tau
    labels = torch.zeros(q.shape[0], dtype=torch.long)  # positive는 항상 첫 번째
    loss = cross_entropy(logits, labels)

    # (5) query encoder 업데이트
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    # (6) momentum update
    for θ_k, θ_q in zip(f_k.parameters(), f_q.parameters()):
        θ_k.data = momentum * θ_k.data + (1 - momentum) * θ_q.data

    # (7) 큐에 key 저장
    queue.dequeue_oldest()
    queue.enqueue(k.detach())

5. 🧪 실험 설정 및 주요 결과

ImageNet Linear Evaluation (ResNet-50 기준)

| 방법 | Top-1 Accuracy | 비고 | | --------------- | -------------- | --------------------------------- | | MoCo (200ep) | 60.6% | SimCLR보다 작은 batch로 유사 성능 | | SimCLR (1000ep) | 66.6% | 매우 큰 batch size 필요 |

Transfer Learning (VOC Detection)

| 방법 | mAP | AP50 | AP75 | | ---------- | -------- | -------- | -------- | | Supervised | 53.5 | 81.3 | 58.8 | | MoCo | 55.9 | 81.5 | 62.6 |

지도 학습보다 downstream task에서 전이 성능이 뛰어남


6. 🔬 기존 방식과의 비교

| 방법 | Negative Pool | Consistency | Memory 효율성 | | ----------- | ------------------ | ----------------- | -------------------- | | SimCLR | 배치 내 샘플 | ✅ 높음 | ❌ 매우 큰 batch 필요 | | Memory Bank | 전체 데이터 | ❌ 낮음 | ✅ 효율적 | | MoCo | FIFO queue (65536) | ✅ 높음 (momentum) | ✅ 효율적 |


7. ✅ MoCo의 핵심 강점

  • Negative Sample Diversity: queue를 통해 매우 많은 negative 사용 가능
  • Encoder Consistency: momentum encoder로 feature drift 방지
  • Scalability: 작은 batch로도 학습 가능 → GPU 자원이 제한된 환경에서도 효과적
  • Downstream 전이 성능 우수: classification뿐 아니라 detection, segmentation에 강함

8. 🔮 후속 및 파생 연구

  • MoCo v2: projection head 추가, strong augmentation, cosine LR schedule
  • MoCo v3: Vision Transformer 적용, BYOL-style 방식 흡수
  • DenseCL: dense prediction용 MoCo 확장
  • DetCo: detection 최적화를 위한 contrastive pretraining

📌 결론

MoCo는 contrastive learning을 실용적이고 안정적으로 수행할 수 있도록 설계된 구조이며, 특히 큐 기반 메커니즘과 모멘텀 업데이트를 통해 representation consistency와 scalability를 동시에 달성합니다. 이후 self-supervised learning의 대부분 프레임워크가 MoCo의 영향을 받았으며, MoCo는 학문적으로도, 실무적으로도 매우 큰 영향을 미친 연구입니다.