자기 지도 학습(Self-Supervised Learning, SSL)은 레이블 없는 데이터에서 pretext task를 정의하여 유용한 표현을 학습하는 기법이다. 대규모 비지도 데이터를 활용해 강력한 사전 학습 모델을 만든다.
자기 지도 학습 방법 분류
| 분류 | 방법 | 대표 모델 |
|---|
| 생성적 | 마스킹된 부분 예측 | BERT, MAE, GPT |
| 대조적 | 유사/비유사 쌍 구별 | SimCLR, MoCo, CLIP |
| 비대조적 | 붕괴 없이 불변 표현 | BYOL, SimSiam, DINO |
| 멀티모달 | 모달 간 정렬 | CLIP, ALIGN, ImageBind |
SimCLR (대조적 학습)
python
import torch
import torch.nn as nn
import torch.nn.functional as F
class SimCLRLoss(nn.Module):
def __init__(self, temperature=0.07):
super().__init__()
self.T = temperature
def forward(self, z_i, z_j):
"""
z_i, z_j: 두 뷰의 임베딩 (B, D)
같은 이미지의 두 증강 → 유사하게, 다른 이미지 → 다르게
"""
B = z_i.shape[0]
z = F.normalize(torch.cat([z_i, z_j], dim=0), dim=1) # (2B, D)
sim = torch.mm(z, z.T) / self.T # (2B, 2B)
# 자기 자신 제외 마스크
mask = ~torch.eye(2*B, dtype=bool, device=z.device)
# 양성 쌍: (i, i+B) 및 (i+B, i)
pos_sim = torch.cat([torch.diag(sim, B), torch.diag(sim, -B)])
neg_sim = sim[mask].view(2*B, -1)
logits = torch.cat([pos_sim.unsqueeze(1), neg_sim], dim=1)
labels = torch.zeros(2*B, dtype=torch.long, device=z.device)
return F.cross_entropy(logits, labels)
MAE (Masked Autoencoder)
python
from transformers import ViTMAEForPreTraining, ViTMAEConfig
config = ViTMAEConfig(
image_size=224,
patch_size=16,
num_channels=3,
mask_ratio=0.75, # 75% 패치 마스킹
hidden_size=768,
num_hidden_layers=12,
)
model = ViTMAEForPreTraining(config)
# 이미지에서 75% 패치를 마스킹하고 복원
pixel_values = torch.randn(2, 3, 224, 224)
outputs = model(pixel_values)
loss = outputs.loss # 마스킹된 패치 복원 MSE 손실
DINO (자기 증류)
DINO는 교사-학생 구조에서 EMA(지수 이동 평균)로 교사를 업데이트하며, 글로벌 뷰와 로컬 뷰의 분포를 맞추도록 학습한다. ViT 기반으로 강력한 로컬 특성을 학습하며 세그멘테이션에서 우수한 성능을 보인다.