Developer
devjh@yonei.ac.kr
01066001566
MoCo는 대조 학습(contrastive learning)을 위한 프레임워크로, 기존 방법들이 가진 두 가지 핵심 한계를 해결합니다:
MoCo는 이를 해결하기 위해 다음 두 가지 핵심 아이디어를 제안합니다:
MoCo는 contrastive learning을 사전 검색(dictionary look-up) 문제로 정의합니다. 즉, query vector 가 주어졌을 때, **대규모 사전(dictionary)**에서 올바른 positive key 를 찾아내는 문제입니다. 나머지 key들은 모두 negative로 간주됩니다.
| 구성 | 수학적 의미 | 직관적 의미 | | -------------- | ---------------------------- | ---------------------------------------------------- | | | 내적(similarity) | 같은 이미지끼리는 비슷해야 하므로 값이 크도록 학습됨 | | | negative pair similarity | 다른 이미지들과는 내적값이 작도록 유도 | | softmax + log | log-softmax (CE loss와 동일) | 분류 문제로 전환하여 안정적 역전파 가능 | | | log-likelihood 최대화 | 올바른 positive key를 맞힐 확률을 최대화 |
representation space를 정렬시킵니다.
이는 클러스터링이 아닌 instance-level 구분을 기반으로 한 학습 방식입니다 (Instance Discrimination).
# 초기화
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())
| 방법 | Top-1 Accuracy | 비고 | | --------------- | -------------- | --------------------------------- | | MoCo (200ep) | 60.6% | SimCLR보다 작은 batch로 유사 성능 | | SimCLR (1000ep) | 66.6% | 매우 큰 batch size 필요 |
| 방법 | mAP | AP50 | AP75 | | ---------- | -------- | -------- | -------- | | Supervised | 53.5 | 81.3 | 58.8 | | MoCo | 55.9 | 81.5 | 62.6 |
지도 학습보다 downstream task에서 전이 성능이 뛰어남
| 방법 | Negative Pool | Consistency | Memory 효율성 | | ----------- | ------------------ | ----------------- | -------------------- | | SimCLR | 배치 내 샘플 | ✅ 높음 | ❌ 매우 큰 batch 필요 | | Memory Bank | 전체 데이터 | ❌ 낮음 | ✅ 효율적 | | MoCo | FIFO queue (65536) | ✅ 높음 (momentum) | ✅ 효율적 |
MoCo는 contrastive learning을 실용적이고 안정적으로 수행할 수 있도록 설계된 구조이며, 특히 큐 기반 메커니즘과 모멘텀 업데이트를 통해 representation consistency와 scalability를 동시에 달성합니다. 이후 self-supervised learning의 대부분 프레임워크가 MoCo의 영향을 받았으며, MoCo는 학문적으로도, 실무적으로도 매우 큰 영향을 미친 연구입니다.