상태: 초안 (2026-10-13). 논문 수치는 원문을 열어 조건과 함께 확인한 값입니다. 직접 해 본 것은 노트북 CPU 의 장난감 예제(
code/02_ssl_collapse.py, 30초 안팎)이고, 탁구 영상으로 자기지도 학습을 해 본 적은 없습니다(미실측). 시리즈 「비전 모델 읽기 2」 2편. 앞 편: 대조 학습과 CLIP. ViT 구조 자체는 비전 모델 읽기 1을 보세요.
자기지도 학습 1: 라벨 없이 특징 배우기
목차
1. 직관: 라벨은 비싸고, 그림은 넘친다
탁구 영상을 생각해 보면 바로 와닿습니다. 휴대폰으로 찍은 연습 영상은 몇 시간이고 쌓이지만, 「이 프레임에 공이 여기 있다」를 손으로 찍는 일은 한 시간에 몇백 장이 고작입니다. 그렇다면 라벨 없는 그림 더미 자체에서 무언가를 배울 수는 없을까요.
자기지도 학습(self-supervised learning)은 데이터 안에서 문제를 스스로 만들어 풉니다. 이 편이 다루는 계열의 문제는 이렇습니다.
한 그림을 두 번 다르게 변형(잘라 내기, 색 바꾸기, 흐리기)해도, 모델은 「같은 것」이라고 말해야 한다.
변형을 견디는 특징은 그림의 내용을 잡고 겉모습(밝기, 자른 위치)은 버린 특징일 가능성이 큽니다. 1편의 CLIP 이 「그림과 글」을 짝지었다면, 여기서는 「그림과 그 그림의 다른 변형」을 짝짓습니다. 글조차 필요 없습니다.
2. 문제: 붕괴
그런데 이 문제에는 함정이 있습니다. 「두 변형의 출력을 같게 하라」가 목표의 전부라면, 모든 입력에 똑같은 출력을 내는 모델이 완벽한 정답입니다. 손실은 최솟값인데 특징은 아무 정보도 없습니다. 이것을 붕괴(collapse) 라고 부릅니다.
이 편에 나오는 방법들은 모두 붕괴를 막는 서로 다른 장치라고 보면 정리가 쉽습니다.
| 방법 | 붕괴를 막는 장치 | 손실 |
|---|---|---|
| SimCLR(2020) | 같은 배치의 다른 그림을 오답으로 밀어낸다 | InfoNCE(1편과 같은 꼴) |
| MoCo(2020) | 지난 배치들의 출력을 큐에 쌓아 오답으로 쓴다. 큐를 채우는 인코더는 느리게 따라온다 | InfoNCE |
| BYOL(2020) | 오답 없음. 학생 쪽에만 예측기를 달고, 교사는 학생의 지수 이동 평균(EMA) | 정규화한 출력의 제곱 오차 |
| DINO(2021) | 오답 없음. 교사 출력의 평균을 빼고(가운데 맞추기) 낮은 온도로 날카롭게 | 교사 분포 대 학생 분포의 교차 엔트로피 |
3. 어떻게 학습시키나
SimCLR: 큰 배치와 강한 변형
SimCLR 의 손실은 NT-Xent 라고 부르지만 1편의 InfoNCE 와 같은 꼴입니다. 배치 N장에서 변형 2N개를 만들고, 각 변형의 정답은 짝꿍 변형 하나, 오답은 나머지 2N−2개입니다. 논문이 찾은 요점은 셋입니다.
- 변형의 조합이 결정적이다. 무작위 자르기와 색 왜곡을 함께 쓰는 것이 특히 중요했습니다. 자르기만 쓰면 모델이 색 분포만 보고 짝을 찾아 버립니다.
- 투영 머리(projection head). 인코더 출력 h 위에 작은 MLP 를 하나 더 얹어 z 를 만들고 손실은 z 에 겁니다. 그런데 나중에 쓰는 특징은 머리 앞의 h 입니다. h 가 z 보다 선형 평가에서 10% 넘게 좋았습니다(논문). 손실을 맞추느라 버려지는 정보를 머리가 대신 버려 준다는 해석입니다.
- 큰 배치. 기본 4,096, 실험은 256–8,192. 온도는 0.1 이 가장 좋았습니다(ImageNet 100에폭, 논문).
MoCo: 오답을 큐에 쌓는다
큰 배치는 메모리가 많이 듭니다. MoCo 는 오답을 지난 배치들에서 가져옵니다. 출력을 길이 65,536의 큐에 쌓아 두고 오답으로 씁니다. 문제는 큐 안의 출력들이 서로 다른 시점의 인코더로 만들어졌다는 점입니다. 그래서 큐를 채우는 인코더(key 인코더)는 역전파하지 않고, 학습하는 인코더의 가중치를 아주 천천히 따라오게 합니다.
key 인코더 ← m · key 인코더 + (1 − m) · query 인코더, m = 0.999
m 을 0으로 두면(매번 그대로 복사) 학습이 실패했고, 0.9 에서 55.2%, 0.999 에서 59.0% 였습니다(논문, 큐 4,096 의 절제 실험). 느리게 따라오는 교사라는 이 장치가 BYOL 과 DINO 로 이어집니다.
BYOL: 오답 없이도 버틴다
BYOL 은 오답을 아예 쓰지 않습니다. 학생(online) 인코더 위에 예측기를 하나 더 달아, 다른 변형을 본 교사(target) 인코더의 출력을 맞히게 합니다. 교사는 학생의 EMA 이고 기울기가 흐르지 않습니다(0.996 에서 1까지 서서히). 「한 점으로 모으면 되잖아」라는 지름길이 왜 막히는지는 논문도 완전한 증명을 주지 않지만, 예측기를 빼면 붕괴한다는 실험은 분명합니다(논문). 같은 결과를 아래 예제에서도 봅니다.
DINO: 교사의 분포를 따라 한다
DINO 는 출력을 K칸짜리 확률 분포로 만듭니다. 교사와 학생이 같은 그림의 다른 자르기를 보고, 학생이 교사의 분포를 맞히도록 교차 엔트로피를 줄입니다. 분류기를 증류하는 모습과 같아서 자기 증류(self-distillation) 라고 부릅니다(증류는 4편에서 자세히 다룹니다).
# 02_ssl_collapse.py 의 DINO 부분에서 줄임
with torch.no_grad():
q = softmax((teacher(v1) - center) / 0.04) # 가운데 맞추고, 낮은 온도로 날카롭게
loss = -(q * log_softmax(student(v2) / 0.1)).sum(1).mean()
center = 0.9 * center + 0.1 * teacher_outputs.mean(0) # 교사 출력의 이동 평균
teacher = EMA(student)
붕괴를 막는 두 부품은 서로 반대 방향으로 작동합니다.
- 가운데 맞추기(centering): 교사 출력에서 그 평균을 뺍니다. 한 칸만 늘 크게 나오는 쏠림을 막습니다. 대신 이것만 있으면 출력이 고른 분포로 퍼지는 쪽으로 무너집니다.
- 날카롭게 하기(sharpening): 교사 쪽에만 낮은 온도(0.04–0.07)를 써서 분포를 뾰족하게 만듭니다. 고르게 퍼지는 것을 막습니다. 이것만 있으면 한 칸으로 몰립니다.
논문은 둘 중 하나만 쓰면 각각 그 방향으로 붕괴한다는 것을 그림으로 보였습니다. 학생은 큰 자르기 2장과 작은 자르기 여러 장을 모두 보고, 교사는 큰 자르기만 봅니다(multi-crop). 「작은 조각만 보고도 전체 그림의 뜻을 맞혀라」라는 문제가 됩니다.
DINOv2: 방법보다 데이터
DINOv2 는 손실을 크게 바꾸지 않았습니다(DINO 손실 + 가린 조각 단위의 iBOT 손실 + 특징을 고르게 퍼뜨리는 KoLeo 정규화). 대신 데이터를 고르는 일에 공을 들였습니다. 중복을 지운 12억 장의 원천에서, 이미 정리된 데이터셋과 닮은 그림을 검색해 1억 4,200만 장(LVD-142M)을 골랐습니다. 그리고 가장 큰 ViT-g(11억 파라미터)를 학습한 뒤, 작은 모델은 처음부터 학습하지 않고 큰 모델에서 증류했습니다(논문). 증류가 왜 이기는지는 4편의 주제입니다.
4. 직접 해 보기: 붕괴를 눈으로 보기
code/02_ssl_collapse.py 는 숨은 무리 10개에서 나온 32차원 「그림」을 만듭니다. 그림에는 무리를 정하는 내용 말고도 크게 흔들리는 「배경」이 섞여 있어, 화소를 그대로 비교하면 배경이 거리를 지배합니다. 변형은 배경 다시 칠하기, 화소 30% 지우기, 밝기 배율, 잡음입니다. 모든 방법을 같은 인코더(작은 MLP), 같은 1,500걸음으로 학습했습니다. 라벨(무리 번호)은 평가에만 씁니다.
평가는 두 숫자입니다. 임베딩 차원별 표준편차(0에 가까우면 모두 한 점), 그리고 시험 그림마다 가장 가까운 5개의 무리 번호로 투표하는 k-NN 정확도입니다(출력 그대로, code/02_ssl_collapse.out.txt).
| 방법 | 표준편차 | k-NN 정확도 | 비고 |
|---|---|---|---|
| 무작위 추측 | — | 0.100 | |
| 화소 그대로 | — | 0.315 | 배경이 거리를 지배 |
| 학습 안 한 인코더 | 0.170 | 0.234 | |
| 1. 끌어당기기만 | 0.003 | 0.107 | 손실 −0.9998(최솟값 −1) — 완벽한 붕괴 |
| 2. SimCLR(τ=0.2) | 0.170 | 0.931 | |
| 3. BYOL | 0.087 | 0.816 | |
| 3′. BYOL 에서 예측기를 빼면 | 0.002 | 0.150 | 붕괴 |
| 4. DINO | 0.077 | 0.669 | 쓰인 칸 12/32, 그림당 엔트로피 2.62 |
| 4′. 가운데 맞추기를 빼면 | 0.054 | 0.301 | 쓰인 칸 1/32, 엔트로피 0 — 한 칸으로 붕괴 |
| 4″. 날카롭게 하기를 빼면 | 0.056 | 0.286 | 그림당 엔트로피 3.47 = 최대(log 32) — 고른 분포로 붕괴 |
읽을거리가 몇 가지 있습니다.
- 끌어당기기만 하면 손실은 거의 완벽한데 특징은 쓸모없습니다. 손실이 낮다고 좋은 모델이 아니라는 가장 극적인 예입니다.
- BYOL 의 예측기와 DINO 의 두 부품은 정말로 하중을 받는 부품입니다. 하나만 빼도 무너졌고, 무너지는 방향이 DINO 논문이 설명한 그대로입니다. 가운데 맞추기를 빼니 32칸 가운데 1칸만 쓰였고, 날카롭게 하기를 빼니 모든 그림이 같은 고른 분포를 냈습니다.
- 이 장난감에서는 SimCLR 이 가장 좋았고 DINO 가 가장 낮았습니다. 이것으로 방법의 우열을 말할 수는 없습니다. 하이퍼파라미터(온도, EMA 속도, 칸 수)를 장난감에 맞춰 고르지 않았고, DINO 의 강점인 multi-crop 과 ViT 도 쓰지 않았습니다.
5. 논문 수치
평가는 대부분 선형 평가입니다. 자기지도로 학습한 인코더를 얼리고, 그 위에 선형 분류기 하나만 ImageNet 라벨로 학습해 정확도를 잽니다. 특징이 얼마나 「선형으로 가를 수 있게」 정리됐는지를 봅니다.
| 방법 | 모델 | ImageNet 선형 평가 top-1 | 조건(논문) |
|---|---|---|---|
| MoCo | ResNet-50 | 60.6% | 200에폭, 배치 256 |
| SimCLR | ResNet-50 / 4배 폭 | 69.3% / 76.5% | 1,000에폭. 76.5% 는 지도 학습 ResNet-50 과 같은 수준 |
| MoCo v2 | ResNet-50 | 71.1% | 800에폭, MLP 머리·흐리기 변형 추가 |
| BYOL | ResNet-50 | 74.3% | 1,000에폭, 배치 4,096 |
| DINO | ViT-S/16 · ViT-B/8 | 77.0% · 80.1% | k-NN 은 74.5% · 77.4% |
| DINOv2 | ViT-S/14 · ViT-g/14 | 81.1% · 86.5% | LVD-142M, S 는 g 에서 증류 |
| DINOv3 | ViT-7B/16 | 88.4% | 평가 해상도 512px, LVD-1689M(17억 장) |
변형의 중요성에 대한 숫자도 있습니다. 변형을 자르기 하나만 남기면 BYOL 은 59.4%(−13.1%p)로 버텼지만 SimCLR 은 40.3%(−27.6%p)로 무너졌습니다(BYOL 논문). 오답에 기대는 방법일수록 「색만 보고 짝 찾기」 같은 지름길에 약하다는 뜻으로 읽힙니다.
DINO 에는 숫자 말고도 유명한 관찰이 하나 있습니다. ViT 의 마지막 층 주의(attention) 지도가, 라벨을 한 번도 보지 않았는데 물체의 윤곽을 따라갑니다. 이 지도로 만든 마스크의 겹침(Jaccard)이 ViT-S/16 에서 45.9 로, 같은 구조를 지도 학습한 경우(27.3)보다 높았습니다(논문).
계산량은 이렇습니다. DINO ViT-S/16 은 8-GPU 서버 두 대로 3일, DINOv2 전체는 데이터센터급 GPU 2만 2천 시간, DINOv3 는 6만 1천 시간이었습니다(논문).
6. 한계
- 변형이 곧 가정이다. 「색이 바뀌어도 같은 것」이라고 가르치면 모델은 색을 버립니다. 탁구에서 주황 공과 흰 공을 가려야 하는 일이 있다면, 색 변형은 그 정보를 지우는 쪽으로 작동합니다.
- 그림 한 장 단위의 뜻에 맞춰져 있다. 이 계열은 「이 그림은 무엇인가」에 강합니다. 공이 어디에 있는지 같은 위치나, 언제 튀었는지 같은 시간은 별도의 장치(3편의 가리고 맞히기, 6편의 영상 모델)가 필요합니다. DINOv3 의 그램 고정(Gram anchoring)은 긴 학습에서 조각 단위의 촘촘한 특징이 망가지는 문제를 다루려고 넣은 장치입니다(논문).
- 크게, 오래. 좋은 숫자는 대개 수백–수천 에폭과 큰 데이터에서 나왔습니다. 작은 데이터에서 같은 효과가 난다는 보장은 없습니다.
7. 우리 프로젝트와의 연결
- 라벨이 가장 귀한 곳. TT Score 의 학습 재료는 대부분 비상업 조건의 공개 데이터셋이고, 우리 휴대폰 영상에는 라벨이 거의 없습니다(TT Score 모델 해부 7편). 라벨 없는 우리 영상으로 먼저 자기지도 학습을 하고 적은 라벨로 미세조정하는 길은 이 문제에 맞는 방향입니다. 다만 아직 해 보지 않았고, 공처럼 작은 물체에 이 계열이 얼마나 도움이 될지는 모릅니다(미실측).
- 느린 교사. MoCo 의 key 인코더, BYOL·DINO 의 EMA 교사는 「학생의 과거 평균이 학생보다 안정적인 선생이 된다」는 같은 생각입니다. 4편의 증류, 6편의 V-JEPA 에서 다시 만납니다.
- 특징을 빌려 쓰기. DINOv2 같은 공개 특징 추출기를 얼려서 쓰면, 탁구대 영역이나 선수 영역을 가르는 데 적은 라벨로 출발할 수 있습니다(추정, 미실측).
티티 한마디. 「둘이 같다고만 말해」 하면 모델은 세상 모든 게 같다고 말해 버려요. 그걸 막는 장치가 오답이든, 예측기든, 가운데 맞추기든, 하나라도 빼면 정말로 무너지는 걸 직접 보니 재미있었어요.
참고 문헌
- Chen et al., A Simple Framework for Contrastive Learning of Visual Representations(SimCLR), ICML 2020. https://arxiv.org/abs/2002.05709
- He et al., Momentum Contrast for Unsupervised Visual Representation Learning(MoCo), CVPR 2020. https://arxiv.org/abs/1911.05722
- Chen et al., Improved Baselines with Momentum Contrastive Learning(MoCo v2), arXiv 2020. https://arxiv.org/abs/2003.04297
- Grill et al., Bootstrap Your Own Latent: A New Approach to Self-Supervised Learning(BYOL), NeurIPS 2020. https://arxiv.org/abs/2006.07733
- Caron et al., Emerging Properties in Self-Supervised Vision Transformers(DINO), ICCV 2021. https://arxiv.org/abs/2104.14294
- Oquab et al., DINOv2: Learning Robust Visual Features without Supervision, TMLR 2024. https://arxiv.org/abs/2304.07193
- Siméoni et al., DINOv3, arXiv 2025. https://arxiv.org/abs/2508.10104
- 예제 코드와 출력:
code/02_ssl_collapse.py,code/02_ssl_collapse.out.txt