Self-Supervised Learning의 핵심 목표
- 레이블 없이 데이터를 통해 좋은 Feature Representation을 얻는 것.
- 다운스트림 태스크(예: 이미지 분류, 객체 탐지 등)에 활용 가능한 좋은 Feature(표현)를 추출하는 Encoder를 만드는 것
- SSL 모델의 output = 의미 있는 feature vector
- 그 feature는 나중에 classification, detection 등에 사용됨
- “학습을 위한 중간 표현을 잘 만드는 방법”을 고민하는 것
| 입력 (Input) | 원본 이미지, 텍스트, 오디오 등 |
| 출력 (Output) | 고차원 Feature Vector (예: 512차원, 1024차원 등) |
| 목표 (Task) | 이 Feature Vector가 의미 있게 정렬되도록 학습하는 것 |
| 사용 방법 | 학습된 Encoder를 다른 태스크에 transfer (예: 분류기 위에 붙이기) |
1. SimCLR
(Contrastive Learning 기반)
- Input: 같은 이미지를 두 번 augmentation
- Output: 두 버전의 이미지에 대한 512차원 벡터
- Task: 같은 이미지의 두 벡터는 가깝게, 다른 이미지의 벡터는 멀게 만들기 (Contrastive Loss 사용)
- Output은 학습된 Encoder가 생성한 의미 있는 Feature Vector
2. Autoencoder
(Generative 방식의 SSL)
- Input: 원본 이미지
- Output: 이미지 재구성 (복원)
- Task: Decoder가 입력 이미지를 잘 복원하도록 Encoder를 학습
- Output은 재구성된 이미지, 하지만 실제로 중요한 건 Encoder에서 나오는 Feature Vector
- Encoder: 이미지를 입력받아 정보를 압축한 벡터(Feature Representation) 생성
- Decoder: 이 벡터를 입력받아 원래 이미지를 복원
압축된 벡터가 원본 정보를 잘 보존하도록 학습하는 것이 디코더 목표 - # 이미지 크기: (3, 64, 64) → 압축된 벡터: (1, 512)
# Encoder: 이미지를 512차원의 벡터로 변환
# Decoder: 이 벡터를 다시 이미지 형태로 복원
3. Jigsaw Puzzle (Proxy Task)
- Input: 섞인 이미지 조각들
- Output: 조각들의 원래 위치 순서 예측
- Task: 순서 맞추기
- 이 과정에서 학습된 Encoder가 중요한 구조적 Feature를 내포하게 됨
결국 SSL은 어떤 Output을 만드는가?
종류 Output 목적
| Contrastive Learning | 고차원 Feature Vector (예: 512D) | 의미 기반 정렬 (유사한 것끼리 가까이) |
| Generative (Autoencoder 등) | 재구성된 입력 | 원본 복원 → Encoder가 정보 보존하도록 학습 |
| Proxy Task (Exemplar, Jigsaw 등) | 예측 결과 (위치, 순서 등) | Pretext task 수행 → 구조적 특징을 학습 |
왜 SSL(Self-Supervised Learning) 모델에서 Decoder가 Image Classification에서 의미가 없을까?
Generative Learning과 SSL(Self-Supervised Learning)의 차이
- Generative Learning (생성 모델)
- Encoder-Decoder 구조를 사용하여 입력 데이터를 다시 복원하는 방식.
- 예: Autoencoder, GAN, VAE(Variational Autoencoder) 등
- SSL에서도 Encoder-Decoder 방식이 사용될 수 있지만, 일반적으로 Contrastive Learning 기반의 모델들이 더 많이 사용됨.
- SSL (Self-Supervised Learning, 자기지도 학습)
- 대부분의 최신 SSL 모델 (예: SimCLR, MoCo, BYOL)은 Encoder만 사용하여 Feature Representation을 학습.
- Decoder는 필요하지 않음 → 이유는 Image Classification과 같은 다운스트림 태스크에서 필요하지 않기 때문.
Decoder가 Image Classification에서 의미가 없는 이유
1. Image Classification은 High-level Feature가 중요
- Image Classification의 목표는 이미지가 어떤 카테고리에 속하는지 예측하는 것.
- 즉, 이미지의 의미를 잘 표현하는 Feature(특징 벡터)를 뽑는 것이 중요함.
- Encoder만 학습하면 충분하며, Decoder는 복원이 목적이므로 필요하지 않음.
ex)
- Encoder가 고양이 이미지를 입력받아 [0.8, -0.3, 0.2, ...] 와 같은 Feature Vector를 추출한다면,
- Classifier는 이 Feature를 사용하여 고양이 클래스로 분류 가능.
- Decoder는 불필요한 역할을 수행(이미지를 복원하려고 함 → Classification에는 필요 없음).
2. Decoder는 학습 비용이 큼 (Computational Cost)
- Decoder는 원본 이미지와 유사한 이미지를 복원하려고 하기 때문에, 연산량이 많음.
- 즉, 생성 모델(Generative Learning)은 계산 비용이 크고 비효율적.
- 하지만 Image Classification에서는 원본 이미지를 복원할 필요가 없으므로, Encoder만 학습하면 됨
- ex)
- Autoencoder는 Encoder + Decoder를 학습해야 해서 메모리 사용량이 큼.
- 반면, MoCo나 SimCLR 같은 SSL 모델은 Encoder만 사용해서 학습 비용이 적음.
3. Decoder가 다운스트림 태스크(Downstream Task)에서 필요 없음
- SSL을 통해 학습된 모델은 Image Classification, Object Detection, Segmentation 등의 다운스트림 태스크에 사용됨.
- 그러나 다운스트림 태스크는 대부분 Decoder를 필요로 하지 않음.
- Image Classification: Feature Vector만 있으면 충분 → Decoder 불필요
- Object Detection: 위치 정보가 필요하지만, Decoder 없이도 Feature Extraction으로 가능
- Segmentation: 경우에 따라 Decoder를 사용할 수도 있지만, 보통 별도 설계 가능
➡️ Decoder는 “이미지를 복원하는 것”에 초점이 맞춰져 있으므로, Classification에서는 불필요함.
1. Decoder의 역할 — 이미지 복원
디코더는 주로 입력 데이터를 복원하거나 생성하는 데 사용
목표: 압축된 벡터가 원본 정보를 잘 보존 하도록 학습하는 것!
2. 왜 Decoder가 이미지 분류에서 필요 없을까?
Image Classification은 복원이 목표가 아님
- 목표: 이 이미지가 어떤 클래스(고양이/강아지/비행기 등)에 속하는가?
- 즉, 이미지를 보고 “레이블을 뽑는 게 목적”이지, 이미지를 재구성하는 게 아니다
필요한 것: 이미지 → Feature Vector → Class Score
[이미지]
↓ Encoder (CNN)
[Feature Vector]
↓ Classifier (Linear Layer, Softmax 등)
[클래스 확률값]
여기서 Decoder는 전혀 필요 없음!
Feature만 잘 뽑으면 바로 분류 가능하니까요.
3. Object Detection도 마찬가지
- 목표: 이미지 속 객체가 어디에 있고, 무엇인지 찾는 것
- 예: “왼쪽 위에 고양이 있음”, “오른쪽 아래에 자동차 있음”
- 어떻게 가능?
- CNN Encoder로 이미지 Feature를 뽑고
- Feature Map 상에서 특정 위치마다 Bounding Box + 클래스를 예측
이미지 → CNN Encoder → Feature Map → 각 위치에서 박스 + 클래스 예측
입력 이미지를 다시 복원할 필요는 없음. --> Decoder는 불필요!
4. Segmentation은 경우에 따라 다름
- 목표: 이미지의 각 픽셀마다 어떤 클래스에 속하는지 예측
- 예: 고양이 영역, 배경 영역, 사람 영역 등
두 가지 방법
- Feature를 그대로 Upsample하여 Segmentation → Decoder 역할이 약함 (예: FCN, DeepLab)
- Unet, SegNet 같은 구조는 진짜로 Decoder를 사용함 (축소된 feature를 점점 키워서 복원)
Segmentation은 경우에 따라 Decoder가 필요하기도, 필요 없기도 하다
하지만 대부분의 SSL pretraining 단계에서는 Decoder까지 굳이 쓰지 않음.
요약 비교표
Task 목표 Decoder 필요성이유
| Image Classification | 클래스 예측 | ❌ 없음 | Feature만 있으면 분류 가능 |
| Object Detection | 박스 + 클래스 예측 | ❌ 없음 | Feature에서 위치 + 클래스 추출 |
| Segmentation | 픽셀 단위 분류 | 상황에 따라 다름 | 일부 모델은 Decoder로 복원, 일부는 단순 Upsampling |
- Decoder = “복원”이 필요한 경우만 중요 (예: 이미지 생성, 복원 등)
- Image Classification, Detection은 복원이 아니라 “이해/예측”이 목적이라서 Decoder가 필요 없음
- SSL에서는 복원이 목적이 아니라 representation(표현 학습)이 목적이기 때문에, Decoder 없는 방식이 효율적임 (예: SimCLR, MoCo, BYOL 등)
linear classifier
representation?
고양이 사진을 보면 [0.1, -0.3, 2.5, 7.1, ...] 같은 숫자 벡터로 바꿈
이 벡터가 잘 학습된 모델일수록, “고양이다”, “털 있다”, “동물이다” 같은 의미를 담음
linear probing?
- 모델이 만든 representation을 수정하지 않고 그대로 둬 (고정)
- 그걸 입력으로 받아서,
- 단순한 선형 분류기(linear classifier) 하나만 붙여봐 → 그냥 “선 하나 그어주는 것”
- 그리고 그걸로 이미지를 맞히기 (예: 개냐 고양이냐)
✔️ representation이 의미를 잘 담고 있다면?
- 예: “고양이” 벡터들은 오른쪽 위에 몰려 있고, “강아지” 벡터들은 왼쪽 아래에 몰려 있어.
- 선 하나로 쉽게 구분 가능 → 선형 분류기(선 하나)만으로도 잘 맞춤
- 그럼 이 모델은 “고양이”랑 “강아지”의 차이를 잘 이해하고 표현했구나 라고 평가할 수 있음
❌ representation이 단순하면?
예: 색깔, 밝기 정도만 담겨 있음 → 고양이/강아지 모두 비슷한 위치에 있음
- 선 하나로는 못 나눠 → 성능 낮음
- 이 모델은 아직 진짜 의미(semantic)를 잘 못 배웠구나라고 판단
Representation 공간
▲
│
│ 🐱🐱🐱 → 고양이
│ ↘︎
│ ↘︎ ← 선 하나 (linear classifier)
│ ↗︎
│ 🐶🐶🐶 → 강아지
└──────────────►
학습된 representation의 유용성 평가하는법
1. Linear classification (또는 linear probing)
- 학습된 encoder는 **고정(frozen)**함
- 그 위에 linear layer 하나만 붙여서 분류를 시도함
- 학습된 표현이 얼마나 의미를 잘 담고 있는지 측정함
- 보통 ImageNet 같은 데이터셋의 top-1 accuracy로 평가함
✔ linear classification = linear probing
두 표현은 같은 뜻으로 쓰임
- SSL 모델로 이미지에서 representation을 뽑음 (= 특징 추출, 인코더는 고정)
- 그 표현에 linear classifier 하나만 붙임
- 그 linear layer만 학습해서 분류가 잘 되는지 테스트함
- 잘 되면 → SSL 인코더가 좋은 표현을 잘 뽑아낸 것
2. Fine-tuning
- 학습된 encoder를 **전부 또는 일부 재학습(미세조정)**함
- 보통 linear probing보다 성능이 더 잘 나옴
- 하지만 representation 자체의 ‘고정된’ 품질은 판단 못함
- representation 평가용보단 downstream task 성능 확인용임
예제: linear probing (PyTorch)
import torch
import torch.nn as nn
from torch.utils.data import DataLoader
from torchvision import datasets, transforms, models
# pretrained encoder 불러옴 (여기선 ResNet 예시) SSL 인코더도 동일하게 쓸 수 있음
encoder = models.resnet18(pretrained=True)
encoder.fc = nn.Identity() # 마지막 분류기 제거, ResNet의 마지막 layer는 fc라는 이름의 **분류기 (fully connected layer)**임 • 그런데 linear probing에서는 분류기 없이, feature vector만 뽑고 싶음 → 그래서 nn.Identity()로 바꿔서 그냥 통과만 시킴
encoder.eval() # freeze
# linear classifier 정의
classifier = nn.Linear(512, 10) # CIFAR-10용
# 입력은 512차원 (ResNet-18의 마지막 representation 크기)• 출력은 10 (CIFAR-10 클래스 수)
# optimizer 설정, classifier만 학습할 거라 classifier.parameters()만 optimizer에 넘김
#손실 함수는 다중 클래스 분류용 CrossEntropyLoss
optimizer = torch.optim.SGD(classifier.parameters(), lr=0.01, momentum=0.9)
criterion = nn.CrossEntropyLoss()
# 데이터셋 로딩, CIFAR 이미지를 ResNet 입력 크기인 224x224로 resize
transform = transforms.Compose([
transforms.Resize(224),
transforms.ToTensor()
])
train_set = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
train_loader = DataLoader(train_set, batch_size=128, shuffle=True)
# 학습 루프
for epoch in range(10):
for imgs, labels in train_loader:
with torch.no_grad():
feats = encoder(imgs) # representation 추출 (고정) 학습 안 할 encoder는 torch.no_grad()로 감싸서 gradient 계산 생략
preds = classifier(feats) # linear probing encoder의 표현(feats)을 받아서 linear classifier가 분류를 시도
loss = criterion(preds, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f"epoch {epoch} | loss: {loss.item():.4f}")
추가
linear probing으로 서로 다른 모델을 비교할 때 LR이 다르면 절대 공정한 비교가 아니다.
→ 반드시 같은 세팅으로 비교해야 한다.
🔍 왜 LR이 다르면 공정하지 않나?
linear probing의 목적은:
"pretrained representation이 얼마나 good인가"
= "head(1-layer linear classifier)가 얼마나 좋은가"가 아님.
즉, head의 성능이 아니라 backbone feature quality를 재는 것이 핵심.
그런데 LR이 다르면?
LR 매우 작음 LR 매우 큼
| 거의 학습 안 됨 | 과적합 / 불안정 |
| poor score | random luck / 학습 스케일 영향 |
| representation이 좋든 나쁘든 낮게 나옴 | 좋은 feature 없어도 숫자 높게 나올 수 있음 |
➡ 결국 representation quality가 아니라 LR 튜닝 능력을 비교하는 꼴이 됨.
그래서 논문들, DINOV2 코드, iBOT, MAE 모두:
linear probing 시 hyper-parameter 고정
을 강조함.
🔒 Linear probing 비교 시 “고정해야 하는 것”
항목 이유
| LR (학습률) | 성능에 가장 큰 영향 |
| batch size | 작으면 regularization 효과 큼 |
| epochs | epochs ↑ = 더 높은 피팅 가능 |
| optimizer | Adam/SGD 차이가 큼 |
| weight decay | too high ⇒ slope collapse |
| augmentation | stronger aug ⇒ classifier robustness 증가 |
➡ 하나라도 다르면 representation 비교 X
📌 무엇만 달라도 되는가?
항목 달라도 평가에 거의 영향 없음
| Random seed | 영향은 거의 없음 |
| AMP 여부 | 없음 |
| 평가 주기 | 없음 |
| 로그 경로 | 없음 |
💡 정리된 결론 (슬라이드용)
- Linear probing = representation quality metric
- Head를 잘 학습시키는 것이 목적이 아니라 백본의 표현력만 측정
- 따라서 모든 모델을 동일한 세팅으로 학습·평가해야 공정한 비교
- 특히 아래 4개는 절대 고정
- LR
- epochs
- batch size
- optimizer & augmentation
📌 추가 팁 (연구 경험적으로 매우 중요)
만약 서로 다른 모델이 최상의 LR이 다르게 나타난다면?
- 그 자체가 representation의 "linear separability" 차이이기 때문에 의미 있는 분석이 될 수 있음
- 그러나 fair comparison 방식은 다음 두 가지 중 하나를 선택해야 함:
방법 장점 단점
| LR 단일 값 고정 | 가장 공정 | 일부 모델은 underfit or overfit될 수 있음 |
| LR sweep 후 최고값 비교 | 각 모델의 최대 linear separability 측정 | 비용 높음 |
논문에서 주로 쓰는 방식:
LR grid search → 최고 결과를 비교
DINO / MAE / MoCo 모두 이 방법을 공식적으로 사용함.
✔ 연구 방향 조언 (너의 상황에서)
Holopix / stereo / depth fine-tuned DINO 비교 시:
1️⃣ 처음에는 LR fixed (공정 비교)
2️⃣ 차이가 미미하거나 의문이 생기면
LR sweep (1e-5 ~ 1e-1) 을 실험하여
“최고 성능 비교" 그래프 추가
이순서가 논문 리뷰어에게 가장 설득력 있는 방식.
필요하다면
📌 linear probing 자동 실행 + LR sweep + 결과 CSV/그래프 그려주는 스크립트
바로 만들어줄게.