상태: 초안 (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. 그림: 비대칭 인코더-디코더
MAE 의 두 번째 생각은 계산입니다.
- 그림을 ViT 처럼 작은 정사각형 조각(16×16 화소, ViT-H 는 14×14)으로 나눕니다.
- 조각의 75% 를 무작위로 고릅니다. 고른 조각은 인코더에 아예 넣지 않습니다. 큰 ViT 인코더는 보이는 25% 만 처리합니다.
- 인코더의 출력을 제자리에 돌려놓고, 빈자리에는 「여기는 가려졌다」는 학습 가능한 벡터(마스크 토큰)를 채웁니다.
- 작고 얕은 디코더가 가린 조각의 화소를 복원합니다.
- 학습이 끝나면 디코더는 버리고 인코더만 씁니다.
트랜스포머의 계산량은 토큰 수에 비례하거나(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. 한계
- 화소를 맞히는 데 힘을 쓴다. 나뭇잎의 결이나 바닥 무늬처럼 뜻과 상관없는 세부도 맞혀야 손실이 줄어듭니다. 그래서 「화소 말고 특징을 맞히자」는 후속 연구가 나왔습니다(6편의 V-JEPA 가 그 예입니다).
- 선형 평가가 약하다. 특징을 얼려서 그대로 쓰려는 용도라면 2편의 계열이 더 낫습니다(위 표).
- 작은 물체에 대한 근거는 약하다. 75% 를 무작위로 가리면 탁구공처럼 몇 화소짜리 물체는 대개 가려지거나 통째로 보입니다. 이런 물체에서 MAE 사전학습이 얼마나 도움이 되는지는 논문이 다루지 않았습니다(미확인).
7. 우리 프로젝트와의 연결
- 영상 쪽이 더 잘 맞는다. 휴대폰 영상은 이웃 프레임이 거의 같아 중복이 엄청나게 많습니다. MAE 의 가정이 그림보다 영상에서 더 잘 맞습니다. 6편의 VideoMAE 가 90% 를 가리는 이유입니다.
- 자세 모델의 바탕. 8편의 ViTPose 는 MAE 사전학습 ViT 를 그대로 씁니다. TT Score 의 자세 코칭이 쓰는 RTMPose 와는 다른 길이라, 두 길을 비교할 근거가 됩니다(TT Score 모델 해부 4편).
- 라벨 없는 우리 영상. 2편과 같은 이유로, 라벨 없는 연습 영상을 쓸 수 있다는 점이 매력입니다. 아직 시도하지 않았습니다(미실측).
티티 한마디. 4분의 3을 가려도 맞힐 수 있다는 건, 그만큼 그림에 반복이 많다는 뜻이에요. 제 장난감 그림처럼 점 두 개뿐인 그림은 4분의 3을 가리면 점이 사라져서 못 맞혀요. 가리는 비율은 데이터가 얼마나 반복적인지에 맞춰 골라야 해요.
참고 문헌
- He et al., Masked Autoencoders Are Scalable Vision Learners(MAE), CVPR 2022. https://arxiv.org/abs/2111.06377
- Bao et al., BEiT: BERT Pre-Training of Image Transformers, ICLR 2022. https://arxiv.org/abs/2106.08254
- 예제 코드와 출력:
code/03_mae_toy.py,code/03_mae_toy.out.txt