상태: 초안 (2026-10-31), 실측. 모든 학습은 필자가 8GB 노트북 GPU 한 장에서 직접 돌렸습니다. 조건·학습률 후보·판정 기준은 첫 실행 전에 적어 두었고(사전 등록), 실행은 그 규칙대로 자동으로 이어졌습니다. 논문 수치는 1편과 같은 원문 확인본입니다. 작성 규칙: 실측 데이터가 기본이고, 못 잰 것은 「미실측」, 확인하지 못한 것은 「미확인」으로 표시합니다.
목차
- 1. 무엇을 확인하나
- 2. 실험 설계
- 3. 학습률 탐색: 옵티마이저마다 「좋은 동네」가 다르다
- 4. 본 실행: 토큰 1억, 시드 3개
- 5. 큰 배치: 격차가 벌어졌다
- 6. 사후 점검: 결과를 본 뒤 생긴 의문 셋
- 7. 해석
- 8. 한계
- 원자료
1. 무엇을 확인하나
1편에서 본 논문들의 주장을 세 가지 질문으로 줄였습니다.
- 같은 모델·데이터·토큰에서 옵티마이저만 바꾸면, 학습률을 옵티마이저마다 따로 맞춘 뒤에도 Muon 이 AdamW 보다 낮은 손실에 닿는가?
- MUON+ 의 「직교화 뒤 정규화 한 단계」는 이 크기에서도 차이를 만드는가?
- 배치를 키우면 AdamW 와 Muon 의 격차가 벌어지는가(2505.02222, 2608.25990 의 주장)?
규모는 논문보다 훨씬 작습니다. 3,400만 파라미터 모델에 토큰 1억 개입니다. 그래서 이 글의 결론은 「이 크기에서는 이랬다」이지 논문을 확인하거나 반박하는 것이 아닙니다.
2. 실험 설계
모델과 데이터
- 모델: 직접 쓴 decoder-only 트랜스포머(nanoGPT 계열). 차원 512, 8층, 머리 8개, 문맥 512, RMSNorm(앞 정규화), RoPE, GELU MLP(4배), 편향 없음, 임베딩과 출력층 분리. 전체 3,356만 파라미터, 그중 은닉층 2차원 행렬이 2,517만.
- 데이터: FineWeb-Edu(ODC-By 1.0)의 공개 표본 첫 조각에서 앞쪽 약 10억 글자. 여기서 어휘 8,192 의 바이트 BPE 를 직접 학습했습니다. 학습 2.60억 토큰(1토큰 ≈ 3.9글자), 검증은 학습과 겹치지 않는 문서 4,000편 가운데 52만 토큰.
- 어휘를 8k 로 줄인 까닭: GPT-2 어휘(5만)를 쓰면 이 크기 모델에서 임베딩(2,570만)이 은닉 행렬보다 커집니다. 비교하려는 것은 은닉 행렬의 옵티마이저입니다.
- 한국어는 섞지 않았습니다. 영어 글로 만든 8k 어휘에서는 한국어가 바이트 단위로 쪼개지고, 섞는 비율이 또 하나의 변수가 되기 때문입니다.
같게 묶은 것
데이터 순서(고정 순열, 모든 실행이 같은 시퀀스를 같은 순서로 봄), 토큰 예산, 배치, bf16 자동 혼합정밀, torch.compile, 기울기 노름 자르기 1.0, 학습률 스케줄(WSD: 처음 2% 선형 워밍업, 일정 구간, 마지막 20% 를 0까지 선형 감소), 평가 집합. 시드는 초기화만 바꿉니다.
옵티마이저 세 가지
| 은닉 행렬(q·k·v·o, MLP 두 개) | 임베딩·출력층·정규화 이득 | |
|---|---|---|
| AdamW | AdamW β=(0.9, 0.95), weight decay 0.1 | 같은 AdamW(정규화 이득은 decay 0) |
| Muon | 네스테로프 모멘텀 0.95 → Newton–Schulz 5회(bf16) → sqrt(max(1, 행/열)) 보정 | 보조 AdamW, 학습률 = AdamW 탐색의 최적값 |
| MUON+ | Muon 과 같고, 직교화 결과를 열 노름 → 행 노름으로 한 번 더 나눔 | 같음 |
두 가지를 일부러 맞췄습니다. 첫째, Muon 실행의 보조 AdamW 학습률을 AdamW 실행의 최적값으로 고정해, 두 실행의 차이가 「은닉 행렬의 옵티마이저」 하나가 되게 했습니다. 둘째, weight decay 는 한 걸음에 가중치가 줄어드는 비율(학습률 × λ)을 AdamW 와 같게 했습니다. Muon 의 학습률 규약(0.02 안팎)은 AdamW(1e-3 안팎)와 스무 배쯤 달라서, λ 를 똑같이 0.1 로 두면 실제 감쇠가 스무 배 차이 납니다(1편 4절).
MUON+ 는 논문 의사코드와 두 군데가 다릅니다. 논문은 네스테로프를 쓰지 않고 크기 보정이 sqrt(행/열)인데, 여기서는 Muon 과 똑같이 두고 정규화 한 단계만 더했습니다. 논문이 「바꾼 것은 이 한 단계」라고 말하므로 차이를 그 단계로 좁히려는 선택이고, 크기 차이는 학습률 탐색이 흡수합니다.
학습률 탐색과 본 실행(미리 정한 규칙)
- 탐색: 토큰 5천만, 배치 64 시퀀스(32,768 토큰, 1,525 걸음), 시드 0. 후보는 AdamW {1e-3, 2e-3, 4e-3, 8e-3}, Muon {0.01, 0.02, 0.04, 0.08}, MUON+ {0.02, 0.04, 0.08, 0.16}. 가장 낮은 마지막 검증 손실을 고르고, 그것이 격자 끝이면 그 방향으로 한 점 더 돌립니다(한 번만).
- 본 실행: 토큰 1억(3,051 걸음), 배치 64 시퀀스, 각 최적 학습률, 시드 0·1·2.
- 큰 배치: 토큰 1억, 배치 256 시퀀스(131,072 토큰, 762 걸음), AdamW 와 Muon, 학습률은 배치 64 최적값의 1배와 2배. 나은 쪽을 시드 하나 더.
- 판정: 최종 손실 차이가 두 옵티마이저 시드 표준편차의 합보다 크면 「낫다」, 작으면 「구별 못 함」.
이 순서는 진행 스크립트가 규칙대로 자동으로 이었습니다. 결과를 보고 끼어들 자리를 없애려는 것입니다.
환경
8GB 노트북 GPU 한 장, PyTorch 2.9(CUDA 12.8), 쿠버네티스 위의 학습 작업(Kubeflow Trainer)으로 실행했습니다. 실행 하나가 끝날 때마다 검증 손실 곡선(약 40점), 처리량(처음 11 걸음 제외), GPU 최대 메모리를 남겼습니다.
3. 학습률 탐색: 옵티마이저마다 「좋은 동네」가 다르다
| 옵티마이저 | 학습률 → 마지막 검증 손실(50M 토큰) | 고른 값 |
|---|---|---|
| AdamW | 5e-4: 3.863 · 1e-3: 3.727 · 2e-3: 3.829 · 4e-3: 4.315 · 8e-3: 6.351 | 1e-3 |
| Muon | 0.005: 3.611 · 0.01: 3.602 · 0.02: 3.633 · 0.04: 3.973 · 0.08: 5.195 | 0.01 |
| MUON+ | 0.01: 3.612 · 0.02: 3.643 · 0.04: 4.105 · 0.08: 5.186 · 0.16: 6.463 | 0.01 |
세 가지가 보입니다.
- 최적값 자체가 열 배쯤 다릅니다. AdamW 는 1e-3, Muon 은 0.01 입니다. 1편에서 본 「크기 보정 규약」 때문입니다. 같은 학습률 숫자로 비교하면 어느 한쪽은 반드시 손해를 봅니다.
- AdamW 는 최적에서 두 배만 벗어나도 0.10 나빠졌고, 네 배에서는 0.59 나빠졌습니다. Muon 은 최적의 절반(0.005)과 두 배(0.02)에서 각각 0.009, 0.032 차이였습니다. 이 크기에서는 Muon 이 학습률에 덜 예민했습니다. AdamW 의 곡선을 보면 스파이크 없이 처음부터 꾸준히 느렸습니다. 워밍업이 짧은 탓일 수 있어 6절에서 따로 확인했습니다.
- MUON+ 는 Muon 과 거의 같은 곡선이었습니다. 다만 MUON+ 의 최적(0.01)은 한 번 넓힌 격자의 끝이라, 0.005 쪽이 더 좋을 가능성이 남았습니다(6절).
4. 본 실행: 토큰 1억, 시드 3개
| 옵티마이저 | 학습률 | 마지막 검증 손실(평균 ± 표준편차) | 시드별 | 처리량(토큰/초) | GPU 최대 메모리 |
|---|---|---|---|---|---|
| AdamW | 1e-3 | 3.4896 ± 0.0026 | 3.4902, 3.4867, 3.4918 | 99,583 | 3.24GB |
| Muon | 0.01 | 3.4085 ± 0.0033 | 3.4087, 3.4117, 3.4052 | 94,170 | 3.15GB |
| MUON+ | 0.01 | 3.4214 ± 0.0029 | 3.4181, 3.4227, 3.4236 | 93,610 | 3.15GB |
판정(미리 정한 기준: 차이 > 두 표준편차의 합)
- AdamW − Muon = 0.081, 표준편차 합 0.006 → Muon 이 낫다. 시드 셋 모두에서 Muon 이 AdamW 보다 0.07 이상 낮았습니다.
- AdamW − MUON+ = 0.068 → MUON+ 도 AdamW 보다 낫다.
- Muon − MUON+ = −0.013, 표준편차 합 0.006 → 이 크기·이 학습률에서는 Muon 이 MUON+ 보다 조금 낫다. 논문의 LLaMA-60M 결과(MUON+ 가 25.75 → 25.25 PPL 로 조금 나음)와 방향이 반대입니다. 학습률이 격자 끝이었다는 점을 6절에서 다시 봅니다.
같은 손실에 토큰이 얼마나 드나
곡선 가운데 일정 학습률 구간(2M–80M 토큰)은 두 옵티마이저가 같은 스케줄 위에 있으므로, 같은 손실에 처음 닿는 토큰을 비교할 수 있습니다. 2505.02222 의 토큰 비율 R = T(AdamW) / T(Muon) 과 같은 정의입니다.
| 목표 손실 | AdamW 가 쓴 토큰 | Muon 이 쓴 토큰 | 비 |
|---|---|---|---|
| 4.2 | 27.4M | 16.8M | 1.63 |
| 4.0 | 37.4M | 23.6M | 1.59 |
| 3.8 | 58.9M | 39.4M | 1.50 |
| 3.7 | 78.1M | 54.2M | 1.44 |
AdamW 는 같은 손실에 Muon 보다 토큰이 1.4–1.6배 들었고, 학습이 진행될수록 비율이 조금씩 줄었습니다. 마지막 감소 구간까지 포함하면 Muon 은 AdamW 의 최종 손실(3.490)에 9,020만 토큰에서 닿았습니다(시드 셋 모두). 다만 감소 구간에서는 손실이 스케줄 모양을 따라 급히 떨어지므로, 이 「약 10% 절약」은 하한으로만 읽어야 합니다. 9,000만 토큰 예산으로 처음부터 Muon 을 돌리면 그 시점에 이미 감소가 끝나 더 낮았을 것이기 때문입니다(그 실행은 미실측).
논문의 「같은 손실에 토큰 10–15% 적게」(2505.02222, 수억–수십억 파라미터, Chinchilla 의 몇 배 토큰)보다 이 실험의 이점이 훨씬 큽니다. 모델이 작고(3,400만), 토큰이 파라미터의 약 3배로 매우 짧은 학습이라 그럴 수 있습니다. 위 표에서도 학습이 길어질수록 비율이 줄었습니다.
시간과 메모리
- 처리량은 Muon 이 AdamW 보다 5.4% 낮았습니다(94,170 대 99,583 토큰/초). Newton–Schulz 행렬 곱이 걸음마다 들기 때문입니다. MUON+ 의 정규화 한 단계는 0.6% 를 더했습니다.
- 그래도 시간으로 따지면 Muon 이 앞섭니다. AdamW 최종 손실에 닿기까지 학습 시간은 Muon 15.9분, AdamW 16.5분(끝까지 돌아야 닿음)이었습니다.
- GPU 메모리는 Muon 이 0.09GB 적었습니다. 은닉 행렬마다 AdamW 는 상태 두 개(1차·2차 모멘트), Muon 은 하나(모멘텀)를 둡니다. 2,517만 파라미터 × 4바이트 ≈ 0.1GB 와 맞습니다.
5. 큰 배치: 격차가 벌어졌다
배치를 4배(131,072 토큰)로 키우고 같은 토큰 1억을 762 걸음에 학습했습니다. 학습률은 배치 64 최적값의 1배와 2배를 돌려 나은 쪽을 골랐고(둘 다 1배가 나았음), 그 값으로 시드를 하나 더 돌렸습니다.
| 배치 | AdamW | Muon | AdamW − Muon |
|---|---|---|---|
| 32,768 토큰(3,051 걸음) | 3.490(시드 3) | 3.409(시드 3) | 0.081 |
| 131,072 토큰(762 걸음) | 3.727(1e-3, 시드 2: 3.726·3.729) | 3.508(0.01, 시드 2: 3.507·3.509) | 0.219 |
| 큰 배치의 2배 학습률 | 3.936(2e-3) | 3.515(0.02) |
같은 토큰을 4분의 1 걸음으로 쓰면 둘 다 손해를 보지만, 손해의 크기가 다릅니다. AdamW 는 0.24 나빠졌고 Muon 은 0.10 나빠졌습니다. 격차는 0.081 에서 0.219 로 2.7배가 됐습니다. 일정 학습률 구간의 토큰 비율도 같은 방향입니다. 손실 4.2 에 닿는 토큰 비가 배치 64 에서 1.63, 배치 256 에서 1.78 이었습니다(4.0 에서는 1.59 대 1.76). 「큰 배치에서 Muon 의 데이터 효율이 유지되거나 커진다」(2505.02222)와 「배치가 클수록 AdamW–Muon 차이가 벌어진다」(2608.25990 표 5: 0.048 → 0.110)와 같은 방향입니다.
덤으로, 큰 배치에서는 Muon 의 처리량 부담이 1.5% 로 줄었습니다(99,604 대 101,120 토큰/초). Newton–Schulz 는 걸음마다 한 번이라 걸음 수가 줄면 몫도 줄어듭니다.
6. 사후 점검: 결과를 본 뒤 생긴 의문 셋
아래 다섯 실행은 위 결과를 본 뒤에 정했습니다. 그래서 위의 판정을 바꾸지 않고, 「그 판정을 얼마나 믿을 수 있나」를 보는 데만 씁니다. 모두 시드 하나입니다.
| 의문 | 실행 | 결과 | 비교 대상 |
|---|---|---|---|
| MUON+ 의 학습률이 격자 끝이었다 | MUON+ 0.005, 50M 토큰 | 3.5953 | MUON+ 0.01: 3.6120, Muon 최적 0.01: 3.6018 |
| AdamW 가 워밍업 2%(30 걸음)에 손해를 봤나 | AdamW 1e-3, 워밍업 10% | 3.7723 | 워밍업 2%: 3.7270 |
| 〃 | AdamW 2e-3, 워밍업 10% | 3.7235 | 워밍업 2%: 3.8286 |
| 큰 배치 격차가 짧은 워밍업(15 걸음) 탓인가 | AdamW 1e-3, 배치 256, 워밍업 10% | 3.7082 | 워밍업 2%: 3.7271 |
| 〃 | Muon 0.01, 배치 256, 워밍업 10% | 3.5192 | 워밍업 2%: 3.5082 |
- MUON+ 는 학습률을 더 낮추자 Muon 을 조금 앞섰습니다(50M 토큰에서 0.006). 4절의 「Muon 이 MUON+ 보다 낫다」는 MUON+ 학습률이 덜 맞춰진 탓일 가능성이 큽니다. 다만 차이가 시드 흔들림(표준편차 약 0.003)의 두 배 정도라, 이 크기에서는 「둘은 거의 같다」가 정직한 결론입니다.
- AdamW 는 워밍업을 늘리면 최적 학습률이 2e-3 으로 옮겨 갔지만, 도달한 손실은 거의 같았습니다(3.7235 대 3.7270). 짧은 워밍업이 AdamW 의 최선을 깎아 먹은 것은 아니었습니다.
- 큰 배치에서 워밍업을 늘리면 격차는 0.219 에서 0.189 로 줄었습니다. 짧은 워밍업이 AdamW 에 0.02 정도 불리했지만, 배치 64 의 격차(0.081)보다 두 배 넘게 크다는 결론은 그대로입니다.
7. 해석
- 이 크기에서도 Muon 은 분명히 이겼습니다. 학습률을 따로 맞추고, weight decay 의 실제 세기를 맞추고, 보조 AdamW 를 같게 둔 뒤에도 차이는 시드 흔들림의 열 배가 넘었습니다.
- 이점은 「짧고 큰 배치」 쪽에서 컸습니다. 학습 초반일수록, 배치가 클수록 차이가 컸습니다. 걸음 수가 적을 때 한 걸음을 모든 방향에 고르게 쓰는 것이 더 값지다는 1편의 그림과 맞습니다. 거꾸로 말하면, 긴 학습에서는 차이가 줄어들 것으로 보이고 논문의 10–15% 도 그 쪽 숫자입니다.
- MUON+ 의 이득은 이 크기에서 잡음과 구분되지 않았습니다. 미리 정한 탐색으로 고른 학습률에서는 오히려 0.013 나빴고, 사후 점검에서 학습률을 낮추자 0.006 앞섰습니다. 논문에서도 60M 모델의 이득은 작았습니다(0.5 PPL). 「정규화 한 단계」는 학습률을 다시 맞춰야 효과를 볼 수 있는 변화이고, 그 효과는 작은 모델에서 작습니다. 차이를 정규화 한 단계로 좁히려고 네스테로프와 크기 보정을 Muon 과 같게 둔 것이 논문 설정과 다른 점입니다.
8. 한계
- 모델 하나(3,400만), 데이터 하나(FineWeb-Edu 영어), 토큰 1억(파라미터의 약 3배)입니다. 논문들의 결론(수억–수천억 파라미터, 긴 학습)을 확인하거나 반박하는 실험이 아닙니다.
- 학습률은 50M 토큰에서 고르고 100M 토큰에 썼습니다. 큰 배치는 학습률 두 점만 봤습니다.
- 워밍업(2%)·스케줄·β·weight decay 는 옵티마이저마다 따로 맞추지 않았습니다. 학습률 하나만 맞췄습니다.
- 큰 배치와 MUON+ 는 시드가 둘·셋이고, 탐색은 시드 하나입니다.
- 「같은 손실까지의 토큰」은 일정 학습률 구간에서만 쟀습니다. 감소까지 포함한 정확한 절약 비율은 예산을 바꾼 실행이 더 있어야 합니다(미실측).
원자료
- 코드:
train_gpt.py(모델·옵티마이저·학습 루프),driver.py(미리 정한 탐색·본 실행·큰 배치 순서),prep_data.py(데이터·토크나이저),analyze_a.py·token_ratio.py(표). - 원자료: 실행마다
log.csv(평가 지점별 토큰·검증 손실·시간)와done.json(최종 손실·처리량·메모리), 사전 등록 문서PLAN.md. - 데이터: FineWeb-Edu sample-10BT 첫 조각의 행 묶음 0–213(ODC-By 1.0). 모델·옵티마이저 코드는 직접 썼습니다.