TT Lab
요금제

한국어

시작하기
블로그

블로그

자기지도 학습 1: SimCLR·MoCo 에서 DINO·DINOv2 까지 — 라벨 없이 특징을 배우는 법과 「붕괴」 막기

상태: 초안 (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 · MoCo 오답을 밀어낸다(InfoNCE) 한 그림의 두 변형 다른 그림 = 오답 BYOL 오답 없이, 예측기 + 느린 교사 학생 인코더 예측기 교사 인코더 맞힌다 교사 = 학생의 이동 평균(EMA) 예측기를 빼면 붕괴 DINO: 교사의 분포를 학생이 따라 한다 큰 자르기 2장 작은 자르기 여럿 교사(EMA) 학생 가운데 맞추기 + 날카롭게(τ 0.04) 소프트맥스(τ 0.1) 손실 = 교사 분포와 학생 분포의 교차 엔트로피 가운데 맞추기만 → 고른 분포로 붕괴 날카롭게만 → 한 칸으로 붕괴 둘이 서로를 막을 때만 버틴다 (논문 그림 7, 이 글의 예제)
그림: SimCLR·MoCo, BYOL, DINO 가 붕괴를 막는 방식
방법 붕괴를 막는 장치 손실
SimCLR(2020) 같은 배치의 다른 그림을 오답으로 밀어낸다 InfoNCE(1편과 같은 꼴)
MoCo(2020) 지난 배치들의 출력을 큐에 쌓아 오답으로 쓴다. 큐를 채우는 인코더는 느리게 따라온다 InfoNCE
BYOL(2020) 오답 없음. 학생 쪽에만 예측기를 달고, 교사는 학생의 지수 이동 평균(EMA) 정규화한 출력의 제곱 오차
DINO(2021) 오답 없음. 교사 출력의 평균을 빼고(가운데 맞추기) 낮은 온도로 날카롭게 교사 분포 대 학생 분포의 교차 엔트로피

3. 어떻게 학습시키나

SimCLR: 큰 배치와 강한 변형

SimCLR 의 손실은 NT-Xent 라고 부르지만 1편의 InfoNCE 와 같은 꼴입니다. 배치 N장에서 변형 2N개를 만들고, 각 변형의 정답은 짝꿍 변형 하나, 오답은 나머지 2N−2개입니다. 논문이 찾은 요점은 셋입니다.

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)

붕괴를 막는 두 부품은 서로 반대 방향으로 작동합니다.

논문은 둘 중 하나만 쓰면 각각 그 방향으로 붕괴한다는 것을 그림으로 보였습니다. 학생은 큰 자르기 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) — 고른 분포로 붕괴

읽을거리가 몇 가지 있습니다.

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. 한계

7. 우리 프로젝트와의 연결

티티 한마디. 「둘이 같다고만 말해」 하면 모델은 세상 모든 게 같다고 말해 버려요. 그걸 막는 장치가 오답이든, 예측기든, 가운데 맞추기든, 하나라도 빼면 정말로 무너지는 걸 직접 보니 재미있었어요.

참고 문헌

로그인하면 좋아요를 누를 수 있습니다

댓글

아직 댓글이 없습니다.

로그인하면 댓글을 쓸 수 있습니다