대조 학습 (Contrastive Learning): 두 개의 증강 (Augmentation)은 양성 쌍 (Positive Pair)이며
요약
레이블 없이 데이터의 표현을 학습하는 대조 학습(Contrastive Learning)의 원리와 SimCLR의 핵심 메커니즘을 설명합니다. 이미지 증강을 통해 양성 쌍을 생성하고 InfoNCE 손실 함수를 사용하여 정렬(Alignment)과 균일성(Uniformity)을 동시에 최적화하는 과정을 다룹니다.
핵심 포인트
- 레이블 없이 이미지 증강을 통해 양성 쌍을 생성하여 학습 신호 확보
- InfoNCE 손실 함수를 통한 정렬(Alignment)과 균일성(Uniformity)의 최적화
- 임베딩을 하이퍼스피어 상에 매핑하여 코사인 유사도 기반 학습 수행
- 온도 파라미터(τ)를 통한 소프트맥스 분포의 날카로움 조절
지도 학습 (Supervised learning)은 놀랍지만, 레이블 (Labels)을 기반으로 작동하며, 레이블은 느리고 비용이 많이 들며 희소합니다. 반면 인터넷은 레이블이 없는 이미지들의 끝없는 우물입니다. SimCLR의 핵심인 대조 학습 (Contrastive learning)은 매우 단순한 아이디어 하나로부터 레이블이 전혀 없이도 진정으로 유용한 표현 (Representation)을 학습합니다. 저는 실제 InfoNCE 손실 함수 (Loss)를 사용하여 브라우저에서 실시간으로 실제 인코더 (Encoder)를 훈련하는 데모를 제작했습니다. 여기서 레이블은 오직 점들의 색상을 지정하는 데만 사용되며 손실 함수에는 전혀 관여하지 않으므로, 여러분은 원형의 데이터가 아무것도 없는 상태에서 클래스 호 (Class arcs) 형태로 스스로 조직화되는 과정을 문자 그대로 지켜볼 수 있습니다. 작동 원리는 다음과 같습니다.
증강 (Augmentations)이 레이블을 발명한다
무료로 훈련 신호를 얻는 비결은 다음과 같습니다: 이미지 하나를 가져와서 강력한 무작위 증강 (Random augmentation)을 두 번 적용합니다 — 자르기 (Crop), 뒤집기 (Flip), 색상 변조 (Colour-jitter), 흐림 처리 (Blur) — 이를 통해 두 개의 뷰 (Views)를 생성합니다. 우리는 이 두 뷰를 **양성 쌍 (Positive pair)**이라고 선언합니다: 이들이 공통으로 가진 것이 콘텐츠이며, 인코더는 이들을 가깝게 매핑해야 합니다. 증강이 변경한 모든 것은 인코더가 버려야 할 노이즈 (Nuisance)입니다. 증강의 선택은
인코더는 각 뷰 (view)를 임베딩 (embedding)으로 매핑합니다. 이를 단위 길이 (unit length)로 정규화 (normalise)하면 하이퍼스피어 (hypersphere) 상에 존재하게 되며, 내적 (dot product)이 곧 코사인 유사도 (cosine similarity)가 됩니다. 이제 모든 뷰를 쌓고(stack), 단 한 번의 행렬 곱셈 (matmul)으로 쌍별 유사도 행렬 (pairwise similarity matrix)을 계산합니다. 대각 성분 (diagonal)을 마스킹 (mask)하여 자기 자신이 자신의 음성 (negative)이 되지 않도록 하고, 온도 파라미터 τ (temperature)로 나눈 뒤, 각 행에 대해 소프트맥스 (softmax)를 취합니다. 손실 (loss)은 실제 양성 (true positive)에 할당된 음의 로그 확률 (negative log-probability)입니다. 이는 문자 그대로 "어느 샘플이 나의 양성인가"를 "클래스 (class)"로 하는 분류 문제 (classification problem)에 대한 크로스 엔트로피 (cross-entropy)와 같습니다.
def info_nce(sim, N, tau=0.5):
logits = sim / tau # temperature-scaled
targets = torch.arange(2*N, device=sim.device)
...
이 단일 손실 함수는 두 가지를 동시에 조용히 최적화합니다. 분자 (numerator)는 각 앵커 (anchor)를 자신의 양성 (positive) 쪽으로 끌어당기며, 이는 **정렬 (alignment)**입니다. 분모 (denominator)는 앵커를 모든 음성 (negative)으로부터 밀어내며, 이는 임베딩을 구형 (sphere) 전체에 퍼뜨리는 **균일성 (uniformity)**입니다. 정렬만 있다면 모든 것이 하나로 뭉쳐버리는 붕괴 (collapse)가 일어나고, 균일성만 있다면 구조 없이 흩어지게 됩니다. 이 둘 사이의 긴장감이 조밀하면서도 잘 분리된 클러스터 (cluster)를 만들어냅니다.
데모에서 망가뜨려 볼 수 있는 두 가지 노브 (knobs)
**온도 τ (Temperature)**는 소프트맥스의 날카로움 (sharpness)을 조절합니다. 작은 τ (≈0.05)는 분포를 뾰족하게 만들어 가장 가까운 — 즉, 가장 어려운 (hardest) — 음성이 그래디언트 (gradient)를 지배하게 합니다. 이는 날카로운 분리를 만들어내지만 민감합니다. 큰 τ는 분포를 부드럽게 만들어 모든 음성에 대해 페널티 (penalty)를 완만하게 분산시킵니다. SimCLR은 일반적으로 τ ≈ 0.1–0.5를 사용합니다. 데모에는 "가장 어려운 음성의 점유율 (hardest-negative share)" 읽기 기능이 있습니다. τ를 낮추면 하나의 음성이 소프트맥스 가중치를 집어삼키는 것을 관찰할 수 있습니다.
음성 (Negatives)은 선택 사항이 아닙니다. 음성을 꺼버리면 목적 함수는 단순히 "두 뷰가 일치하게 만들기"가 되며, 이의 사소한 전역 최적해 (global optimum)는 모든 입력을 동일한 상수 벡터로 매핑하는 것입니다. 이는 표현의 **붕괴 (collapse)**이며, 정보가 제로 (zero)가 됩니다. 데모에서 "양성만 사용 (positives only)"로 전환하면 데이터 클라우드 (cloud)가 하나의 점을 향해 찌그러지는 것(동일 클래스 유사도 → 1.00)을 볼 수 있습니다. 분모에 있는 음성들은 이를 금지하는 척력 (repulsion) 역할을 합니다.
음성 (negatives) 없음 -> L = -sim(z1, z2)/tau (정렬 (alignment)만 수행)
최적해는 모든 x에 대해 f(x) = 상수 -> 표현 (representations)이 붕괴 (COLLAPSE).
분모의 음성들은 척력 (repulsion, uniformity)을 더함 -> 붕괴 방지.
레이블 없이 클래스가 나타나는 이유
여기에 미묘하지만 중요한 결과가 있습니다. 손실 함수 (loss)는 오직 단일 이미지의 두 가지 증강 (augmentation)만을 결합할 뿐, 서로 다른 이미지를 "같은 클래스"로 비교하지는 않습니다. 그럼에도 불구하고 클래스 클러스터 (clusters)가 나타납니다. 왜 그럴까요? 인코더 (encoder)는 매끄러운 함수 (smooth function)이며, 이미지의 증강들은 입력 공간 (input space)의 일정한 영역을 차지합니다. 모든 이미지에 대해 해당 영역 전체를 하나의 임베딩 (embedding)으로 강제하면, 인접한 입력들도 인접한 임베딩으로 매핑되도록 강제됩니다. 동일한 클래스의 서로 다른 이미지들 또한 서로 닮았기 때문에, 입력 공간에서 중첩되며 인접한 임베딩을 상속받게 됩니다. 클래스 구조는 증강 불변성 (augmentation-invariance)을 요구하는 과정에서 발생하는 "부산물 (by-product)"로 나타납니다. 이는 데모 원 (demo circle)에서 자기 조직화 (self-organise)되는 과정을 통해 정확히 확인할 수 있는 현상입니다.
이 데모는 실제 역전파 (backprop), 소프트맥스 (softmax), 그리고 그래디언트 클리핑 (grad-clipped)이 적용된 SGD를 사용하는 실제 2→16→2 tanh 인코더를 실행합니다. 따라서 'Train'을 누르고, 음성 (negatives)을 끄고, τ를 드래그하는 모든 동작은 정해진 애니메이션이 아니라 실제 그래디언트 (gradients)를 움직입니다.
실제로 사용하는 방법
사전 학습 (pretraining) 후에는 인코더를 동결 (freeze)하고, 가지고 있는 소수의 레이블을 사용하여 그 위에 단일 선형 레이어 (linear layer)를 학습시킵니다. 이것이 바로 **선형 프로브 (linear probe)**입니다. SimCLR의 동결된 특징 (frozen features)은 완전 지도 학습 (fully-supervised) 방식의 ImageNet 성능에 근접합니다. 이 아이디어는 여러 계보를 탄생시켰습니다: MoCo (모멘텀 인코더 (momentum encoder) + 음성 큐 (queue of negatives)), BYOL/SimSiam (음성을 전혀 사용하지 않음 — 예측기 (predictor) + stop-gradient를 통해 붕괴를 회피), 그리고 CLIP — 동일한 InfoNCE 손실을 사용하지만, 양성 쌍 (positive pair)이 이미지와 그 캡션 (caption)이 되어 현대적인 멀티모달 (multimodal) 모델의 기반이 되는 공유된 이미지-텍스트 공간을 제공합니다.
음성을 켠 상태로 Train을 누른 다음, 이를 끄고 붕괴되는 과정을 지켜보세요:
https://dev48v.infy.uk/dl/day43-contrastive-learning.html
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기