TT Lab
요금제

한국어

시작하기
블로그

블로그

자기지도 학습 2: MAE — 그림의 4분의 3을 가리고 맞히게 하면 왜 잘 배우나

상태: 초안 (2026-10-13). 논문 수치는 원문을 열어 조건과 함께 확인했습니다. 직접 해 본 것은 노트북 CPU 의 장난감 예제(code/03_mae_toy.py, 3분 안팎)입니다. 실제 사진이나 탁구 영상으로 MAE 를 학습해 본 적은 없습니다(미실측). 시리즈 「비전 모델 읽기 2」 3편. 앞 편: 자기지도 학습 1. ViT 가 그림을 조각(패치)으로 나누는 방식은 비전 모델 읽기 1의 ViT 편을 보세요.

자기지도 학습 2: MAE

목차

1. 직관: 빈칸 채우기

2편의 방법들은 「두 변형이 같은 것이다」를 가르쳤습니다. MAE(Masked Autoencoder)는 다른 문제를 냅니다. 그림의 일부를 가리고, 가린 부분을 맞혀 보라.

글에서는 이 문제가 이미 큰 성공을 거뒀습니다. BERT 는 문장 단어의 15% 를 가리고 맞히게 해서 언어 모델의 바탕을 만들었습니다. 그림에서도 같은 생각을 해 볼 수 있습니다. 가린 곳을 그럴듯하게 채우려면 「여기는 탁구대 모서리가 이어질 것이다」, 「이 팔은 어깨에 붙어 있을 것이다」 같은 구조를 알아야 하니까요.

그런데 그림을 15%만 가리면 너무 쉽습니다. 옆 화소를 대충 이어 붙이면 채워집니다. 그림은 글보다 정보가 훨씬 덜 빽빽합니다. 이웃한 화소끼리 거의 같은 값을 가지니까요. MAE 의 답은 과감합니다. 75%를 가립니다. 이 정도면 이어 붙이기로는 안 되고, 그림 전체의 구조를 이해해야 채울 수 있습니다.

2. 그림: 비대칭 인코더-디코더

75% 를 가리고, 보이는 25% 만 인코더에 16조각 중 4개만 보임 인코더(ViT) 보이는 4개만 계산 ≈ ¼ 얕은 디코더 제자리 + 빈칸 마스크 토큰 → 가린 조각 화소 복원 손실 = 가린 조각에서만 잰 제곱 오차 목표 화소는 조각마다 평균·표준편차로 정규화 학습이 끝나면 디코더는 버리고 인코더만 쓴다 가리는 비율 BERT(글) 15% · BEiT 약 40% MAE 75% · VideoMAE 90% 중복이 많을수록 더 많이 가려도 된다
그림: 조각 75% 를 가리고 보이는 25% 만 인코더에 넣는 MAE

MAE 의 두 번째 생각은 계산입니다.

  1. 그림을 ViT 처럼 작은 정사각형 조각(16×16 화소, ViT-H 는 14×14)으로 나눕니다.
  2. 조각의 75% 를 무작위로 고릅니다. 고른 조각은 인코더에 아예 넣지 않습니다. 큰 ViT 인코더는 보이는 25% 만 처리합니다.
  3. 인코더의 출력을 제자리에 돌려놓고, 빈자리에는 「여기는 가려졌다」는 학습 가능한 벡터(마스크 토큰)를 채웁니다.
  4. 작고 얕은 디코더가 가린 조각의 화소를 복원합니다.
  5. 학습이 끝나면 디코더는 버리고 인코더만 씁니다.

트랜스포머의 계산량은 토큰 수에 비례하거나(MLP) 그 제곱에 비례합니다(주의). 토큰을 4분의 1로 줄이면 큰 인코더의 계산이 크게 줄어듭니다. 디코더는 토큰당 계산량이 인코더의 10% 미만이 되도록 얕게 만들었습니다(논문).

3. 어떻게 학습시키나

손실

L = 가린 조각들에 대해서만 평균한 (예측 화소 − 정답 화소)²

보이는 조각의 복원 오차는 세지 않습니다. 보이는 것을 베끼는 일은 배울 거리가 없기 때문입니다.

정답 화소에는 한 가지 손질을 합니다. 조각마다 평균을 빼고 표준편차로 나눈 화소를 목표로 씁니다. 조각 전체의 밝기보다 조각 안의 무늬(가장자리, 결)를 맞히는 데 집중하게 만드는 셈입니다. ViT-L 에서 미세조정 정확도가 84.9% 에서 85.4% 로, 선형 평가가 73.5% 에서 73.9% 로 올랐습니다(논문).

라벨과 데이터

라벨은 쓰지 않습니다. 논문은 ImageNet-1K 의 그림만 썼고, 사전학습 뒤에 라벨로 미세조정하거나 선형 평가를 했습니다.

가리는 방식

같은 75% 라도 어떻게 가리는지가 중요했습니다(논문, ViT-L, 미세조정 / 선형 평가).

가리는 방식 비율 미세조정 선형 평가
무작위 조각 75% 84.9 73.5
큰 덩어리(block) 50% 83.9 72.3
큰 덩어리 75% 82.8 63.9
격자(한 칸 건너) 75% 84.0 66.0

격자로 가리면 보이는 조각이 고르게 퍼져 있어 이웃끼리 이어 붙이기가 쉬워지고, 큰 덩어리로 75% 를 가리면 너무 어려워집니다. 무작위가 그 사이의 균형입니다.

BEiT 와의 차이

MAE 보다 조금 앞선 BEiT 는 가린 조각의 화소 대신, 미리 학습된 토크나이저(dVAE, 낱말 8,192개)가 그 조각에 붙인 낱말 번호를 맞히게 했습니다. 약 40% 를 덩어리로 가렸습니다(논문). MAE 는 토크나이저 없이 화소를 바로 맞혀도 된다는 것을 보였고, 그만큼 구조가 단순합니다.

4. 직접 해 보기

code/03_mae_toy.py 는 16×16 흑백 그림에 점 두 개를 그립니다. 그림의 「무늬」(라벨)는 두 점의 배치입니다: 가로로 나란히, 세로로 나란히, 「\」 대각, 「/」 대각. 점의 위치·크기·밝기는 그림마다 다릅니다. 무늬를 알려면 조각 하나가 아니라 조각 사이의 관계를 봐야 합니다.

그림을 4×4 조각 16개로 나누고, 작은 트랜스포머(인코더 3층, 디코더 1층, 폭 64)로 MAE 를 학습했습니다. 가리는 비율만 바꿔 같은 800걸음씩 학습하고, 인코더 특징에 선형 분류기만 얹어 무늬 분류 정확도(선형 탐침)를 쟀습니다. 무늬 라벨은 이 탐침에서만 씁니다.

# 03_mae_toy.py 에서 줄임
order = torch.rand(n, 16).argsort(1)             # 그림마다 다른 무작위 가리기
keep, masked = order[:, :n_keep], order[:, n_keep:]
z = encoder(gather(embed(patches) + pos, keep))  # 보이는 조각만 인코더로
full = mask_token.repeat(n, 16, 1); full.scatter_(1, keep, z)
pred = head(decoder(full + dec_pos))
loss = mse_per_patch(pred, normalize_per_patch(patches)).gather(1, masked).mean()   # 가린 조각에서만

결과(시드 2개 평균, code/03_mae_toy.out.txt):

가리는 비율 인코더가 보는 조각 가린 조각 복원 오차(정규화 화소 MSE) 선형 탐침 정확도
기준: 화소 그대로 — — 0.407
기준: 학습 안 한 인코더 16 — 0.575
25% 12 0.699 0.803
50% 8 0.736 0.812
75% 4 0.839 0.783
90% 2 0.880 0.763

가리고 맞히기만으로 학습한 인코더는 어느 비율에서나 학습 안 한 인코더(0.575)와 화소(0.407)보다 훨씬 좋은 특징을 냈습니다. 라벨 없이 「관계」를 배웠다는 뜻입니다.

그런데 이 장난감에서는 75% 가 최선이 아니었습니다. 25–50% 가 조금 더 좋았습니다(시드 사이 차이가 ±3%p 라 25%와 50%는 가르지 못합니다). 이것이 MAE 의 핵심 가정을 거꾸로 보여 줍니다. 우리 그림은 16조각뿐이고 대부분이 빈 배경이라, 정보가 두 점에 몰려 있습니다. 4개만 보여 주면 두 점이 아예 안 보이는 경우가 흔하고, 그러면 맞힐 근거가 없습니다. 높은 가리기 비율은 그림이 중복으로 가득할 때 통하는 처방입니다. 실제 사진 한 장은 수백 조각이고 이웃 조각끼리 많이 닮았습니다. 6편의 영상은 이웃 프레임끼리 더 닮아서 90% 까지 올라갑니다.

학습 시간은 기계 부하에 따라 크게 흔들렸습니다. 같은 코드를 두 번 돌렸을 때 25% 는 21.5·21.6초, 75% 는 27.9·16.5초, 90% 는 23.7·15.7초였습니다(정확도·오차 숫자는 두 번 모두 같았습니다). 덜 바쁠 때 돌린 두 번째 값에서도 인코더 토큰을 ¼(12개 → 4개)로 줄인 효과는 시간 25% 남짓 단축에 그쳤습니다. 이 크기의 모델에서는 토큰 수보다 파이썬과 라이브러리의 고정 비용, 그리고 줄지 않는 디코더(16개 토큰 전부)가 크기 때문입니다. 큰 ViT 에서 생기는 3배 넘는 이득은 아래 논문 수치로 확인하세요.

5. 논문 수치

모두 MAE 논문(He 외, CVPR 2022)의 값이고, ImageNet-1K 만으로 사전학습했습니다.

항목 값 조건
미세조정 top-1 ViT-B 83.6 · ViT-L 85.9 · ViT-H 86.9 · ViT-H(448px) 87.8 사전학습 1,600에폭
선형 평가 top-1 ViT-B 68.0 · ViT-L 75.8 · ViT-H 76.6 대조 학습 계열(MoCo v3 ViT-L 77.6)보다 낮다
학습 속도 연산량 3.3배 감소, 실제 시간 ViT-L 2.8배·다른 설정 3.5–4.1배 단축 TPU 128코어, 800에폭
가리기 비율 민감도 선형 평가는 비율에 민감(최적점 근처와 최대 약 20%p 차이), 미세조정은 40–80% 에서 대체로 괜찮다 ViT-L

두 줄째가 흥미롭습니다. MAE 는 선형 평가에서는 대조 학습보다 약하고, 미세조정에서는 강합니다. 가리고 맞히기로 배운 특징은 그대로 선형으로 가르기는 덜 좋지만, 조금만 고쳐 쓰면 아주 좋은 출발점이라는 뜻입니다. 2편의 DINO 계열과 이 편의 MAE 계열이 서로 다른 장점을 가진 이유입니다. 8편의 ViTPose 는 MAE 로 사전학습한 ViT 에 작은 디코더만 붙여 자세를 맞힙니다.

6. 한계

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

티티 한마디. 4분의 3을 가려도 맞힐 수 있다는 건, 그만큼 그림에 반복이 많다는 뜻이에요. 제 장난감 그림처럼 점 두 개뿐인 그림은 4분의 3을 가리면 점이 사라져서 못 맞혀요. 가리는 비율은 데이터가 얼마나 반복적인지에 맞춰 골라야 해요.

참고 문헌

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

댓글

아직 댓글이 없습니다.

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