Contrastive Learning - MoCo 논문 리뷰
Momentum Contrast for Unsupervised Visual Representation Learning (CVPR 2020)
MoCo(Momentum Contrast)는 대조 학습(contrastive learning)을 마치 dictionary에서 query에 해당하는 key를 찾는 작업처럼 해석한 method다.
Momentum Contrast (MoCo)는 encoded query와 encoded key들로 구성된 dictionary간의 contrastive loss를 사용하여 학습한다. Key들은 data sample로부터 실시간(on-the-fly)으로 정의된다. Dictionary는 queue 구조로 built되며, 현재 mini-batch가 queue에 추가되고 가장 오래된 mini-batch는 제거되어, dictionary size와 mini-batch size가 독립적으로 유지된다. Key encoder는 query encoder의 parameter를 기반으로 한 momentum update를 통해 천천히 학습된다. 이러한 방법은 visual representation을 위한 크고 일관된 dictionary를 가능하게 한다.
자연어 처리(NLP)에서의 비지도 표현 학습(unsupervised representation learning) 큰 성공(e.g. GPT, BERT) ➡ 컴퓨터 비전 불가능?
비지도 표현 학습에서 두 분야의 차이는 신호 공간(signal space)의 차이에서 비롯될 수 있다.
언어: 이산적인(discrete) 구조를 가진다. (e.g. word, sub-word units, etc.)
➡ 쉽게 tokenized dictionary 만들어서 비지도 학습 가능
비전: 연속적이고 고차원적인 구조를 다룬다
➡ Tokenized dictionary 만들기 어렵고, 사람의 언어처럼 정형화된 구조가 없음.
Contrastive loss를 사용하여 비전에서도 동적인 사전(dynamic dictionary)을 구축해보자!
Query: 같은 이미지를 변형한 키와는 유사하게, 다른 것들과는 비유사하게 표현되도록 함.
Key: 데이터(이미지 또는 이미지 패치 등)로부터 샘플링되며 인코더로 표현
Loss function: InfoNCE (Information Noise-Constrastive Estimation)
$\mathcal{L}_q = -\textrm{log}\frac{\textrm{exp}(q\cdot k_+/\tau ) }{\sum_{i=0}^{K}\textrm{exp}(q\cdot k_i/\tau )}$
$\tau$: Temperature hyperparameter로 분포의 sharpness 조절
$K$: negative 샘플 개수
$q\cdot k$: dot product로 유사도 계산
이 수식은 (K+1)개의 class 중 하나를 맞추는 softmax classifier와 동일한 구조다. 즉, $q$가 $k^+$를 "정답"으로 맞추도록 유도한다.
좋은 사전의 조건!
1. 충분히 커야 한다! ➡ 고차원 연속 공간을 더 잘 샘플링가능
2. 일관되어야 한다! ➡ 같은 기준(Encoder)으로 표현되어야 비교가 의미 있으므로.
MoCo의 효율적인 사전 구성 방식
사전을 queue로 구성하고, current mini-batch에서 나온 인코딩을 queue에 추가하고 오래된 것을 제거 ➡
mini-batch size와 무관하게 큰 사전 만들 수 있음.
사전의 key들을 만드는 인코더를 momentum 방식으로 moving average하여, query encoder와 일관성을 유지한다.
Momentum Update
Key encoder는 천천히 업데이트된다.
문제: Queue에 있는 key들은 backprop으로 학습 불가 (큐에 있는 수천 개 샘플에 대해 역전파할 수 없음.)
단순하게 $f_k = f_q$로 복사하면, encoder가 너무 빨리 변해서 성능이 나빠짐.
$\theta _k \leftarrow m\theta _k + (1-m)\theta _q$
$\theta _q$: query encoder의 parameter (역전파로 학습됨)
$\theta _k$: key encoder의 parameter (천천히 추적)
$m$: momentum 계수, 보통 0.999처럼 매우 크게 설정
Method | End-to-End (ex. SimCLR) |
Memory bank (ex. InstDisc) |
MoCo |
Dictionary size | 작음 (mini-batch 크기만큼) |
큼 (전체 데이터셋 수준) |
큼 (queue를 사용) |
일관성 | 매우 높음 (같은 encoder 사용) |
낮음 (오래된 representation 많음) |
높음 (momentum 통해 encoder 일관성 유지) |
설명 | 메모리 한계 batch 크기에 제한됨. |
Encoder는 고정되지만 outdated representation 사용 |
메모리 효율적 scale-up 가능 |
MoCo 과정 요약
1. Positive/Negative Pair 정의
- 같은 이미지 $\rightarrow$ 두 개의 augment된 view 생성 $\rightarrow$ positive pair
- 다른 이미지 $\rightarrow$ negative pairs (dictionary queue에서 가져옴)
2. Encoder 네트워크
- $f_q$ (query encoder), $f_k$ (key encoder)
- 둘 다 ResNet 사용, 마지막 FC layer는 128차원 벡터 출력 후 L2 정규화
3. Data Augmentation (Pytorch torchvision 기반)
- Resize $\rightarrow$ Random crop (224x224)
- Random color jitter
- Random horizontal flip
- Random grayscale