상태: 초안 (2026-10-31). 논문 수치는 arXiv 원문(본문은 같은 판의 HTML)을 직접 열어 표·그림 번호와 함께 옮겼습니다. 특잇값 그림(3절)은 필자가 노트북 CPU 에서 직접 잰 값입니다. 학습 실측은 2편에 있습니다. 작성 규칙: 실측 데이터가 기본이고, 못 잰 것은 「미실측」, 확인하지 못한 것은 「미확인」으로 표시합니다.
목차
- 1. 옵티마이저는 「얼마나, 어느 쪽으로」를 정한다
- 2. 행렬로 보면 업데이트가 몇 방향에 몰려 있다
- 3. SVD 없이 직교화하기: Newton–Schulz 5회
- 4. 전체 알고리즘과 「어디에」 쓰는가
- 5. 2025–2026년의 갈래
- 6. 정리, 그리고 확인하고 싶은 것
- 원자료와 참고 문헌
1. 옵티마이저는 「얼마나, 어느 쪽으로」를 정한다
학습 한 걸음은 기울기 G 를 보고 가중치 W 를 조금 움직이는 일입니다. 가장 단순한 SGD 는 W ← W − η·G 라서 기울기가 큰 쪽으로 크게, 작은 쪽으로 작게 움직입니다. Adam 은 여기에 좌표마다 「지금까지 이 좌표의 기울기가 얼마나 컸나」를 기억해 두고 그 크기로 나눕니다. 그래서 좌표 하나하나의 걸음이 비슷해집니다. LLM 사전학습이 몇 년 동안 AdamW(Adam + 분리형 weight decay)를 기본으로 써 온 까닭이 이 안정성입니다.
그런데 Adam 은 가중치를 숫자들의 묶음으로 봅니다. 트랜스포머의 가중치 대부분은 행렬이고, 행렬에는 좌표가 아니라 방향이라는 구조가 있습니다. Muon 은 여기서 출발합니다.
2. 행렬로 보면 업데이트가 몇 방향에 몰려 있다
어떤 행렬이든 특잇값 분해(SVD)로 G = U·Σ·Vᵀ 처럼 쓸 수 있습니다. U·V 의 열은 서로 수직인 방향들이고, Σ 의 대각 원소(특잇값)는 그 방향의 세기입니다. 언어 모델의 기울기·모멘텀 행렬은 특잇값이 소수에 몰려 있는 경우가 많다고 알려져 있습니다(Keller Jordan 의 Muon 글은 「거의 낮은 계수(low rank)」라고 씁니다). 그러면 SGD 든 Adam 이든 실제 업데이트는 몇 개의 강한 방향으로만 움직이고, 나머지 방향은 거의 배우지 못합니다.
Muon 의 처방은 간단합니다. 특잇값을 전부 1 로 바꾼 U·Vᵀ 를 업데이트로 쓴다. 방향은 그대로 두고 세기를 고르게 하는 것입니다. U·Vᵀ 는 원래 행렬에 가장 가까운 「직교 행렬」이라서 이 연산을 직교화라고 부릅니다.
3. SVD 없이 직교화하기: Newton–Schulz 5회
매 걸음 큰 행렬마다 SVD 를 하면 느립니다. Muon 은 행렬 곱만으로 같은 일을 근사합니다. X 를 프로베니우스 노름으로 나눠 특잇값을 1 이하로 만든 뒤, 다음 반복을 다섯 번 합니다.
def newton_schulz5(G, steps=5, eps=1e-7):
a, b, c = 3.4445, -4.7750, 2.0315 # Keller Jordan 이 고른 계수
X = G.bfloat16()
if G.size(0) > G.size(1): # 세로로 긴 행렬은 눕혀서 계산
X = X.T
X = X / (X.norm() + eps) # 특잇값을 1 이하로
for _ in range(steps):
A = X @ X.T
B = b * A + c * A @ A
X = a * X + B @ X # 특잇값 s 가 a·s + b·s³ + c·s⁵ 로 바뀐다
if G.size(0) > G.size(1):
X = X.T
return X
반복 한 번은 특잇값마다 다항식 a·s + b·s³ + c·s⁵ 를 적용합니다(방향 U·V 는 그대로). 계수가 작은 s 를 빠르게 키우도록 골라져 있어서, 0 근처의 작은 특잇값도 다섯 번이면 1 근처로 올라옵니다. 대신 정확히 1 로 모이지는 않습니다. 계수가 「빨리 키우기」를 위해 정확도를 조금 양보한 값이기 때문입니다.
직접 재 보았습니다. 512×2048 행렬을 특잇값이 1, 1/2, 1/3, … 로 줄어들게 만들고(기울기처럼 몇 방향에 몰린 모양) 위 함수를 bf16 으로 돌리며 반복마다 특잇값을 쟀습니다(코드: 원자료 절).
| 반복 횟수 | 가장 큰 특잇값 | 가장 작은 특잇값 | 중앙값 | 위 10개 방향의 에너지 몫 |
|---|---|---|---|---|
| 0(정규화만) | 0.776 | 0.0024 | 0.0048 | 93.7% |
| 1 | 1.075 | 0.0083 | 0.017 | 84.8% |
| 3 | 1.202 | 0.098 | 0.196 | 19.7% |
| 5 | 1.205 | 0.679 | 1.112 | 2.5% |
| 정확한 U·Vᵀ | 1.000 | 1.000 | 1.000 | 1.95% |
입력에서는 512개 방향 중 위 10개가 에너지의 93.7% 를 차지했습니다. 다섯 번 뒤에는 2.5% 로, 모든 방향이 거의 같은 세기(0.68–1.21)가 됐습니다. 정확한 U·Vᵀ(1.95%)에 꽤 가깝습니다. 비용은 행렬 곱 15번이고 bf16 으로 돌아서 GPU 에서는 싸다는 것이 Muon 의 실용적인 핵심입니다. 실제 학습에서 잰 부담은 2편에 있습니다(처리량 5.4% 감소, 배치를 4배로 키우면 1.5%).
4. 전체 알고리즘과 「어디에」 쓰는가
Keller Jordan 의 공개 구현(블로그가 연결한 muon.py)을 따르면 한 걸음은 이렇습니다.
- 모멘텀:
M ← β·M + (1−β)·G, β=0.95, 업데이트에는 네스테로프 형태(1−β)·G + β·M을 씁니다. - 직교화:
O = NS5(위의 값). - 크기 보정:
O ← O · sqrt(max(1, 행/열)). 이 줄은 블로그 본문에는 없고 코드에만 있습니다. - 갱신:
W ← W − η·O(기본 η=0.02).
중요한 것은 적용 범위입니다. Muon 은 은닉층의 2차원 행렬(주의의 Q·K·V·O, MLP 의 두 행렬)에만 씁니다. 임베딩, 출력층(lm_head), 정규화층의 이득, 편향은 AdamW 로 둡니다. 임베딩은 한 번에 몇 행만 기울기를 받는 표(룩업)라서 「행렬의 방향」이라는 그림이 맞지 않고, 1차원 파라미터에는 직교화할 행렬이 없기 때문입니다. Q·K·V 를 한 행렬로 합쳐 둔 구현이라면 셋으로 나눠 따로 직교화하라고 권합니다.
크기 보정 규약이 논문마다 다르다
직교 행렬은 원소 하나의 크기(RMS)가 행렬 모양에 따라 정해집니다. 그래서 「업데이트를 얼마나 키울지」를 정하는 줄이 논문마다 다르고, 같은 「학습률 0.02」라도 뜻이 달라집니다.
| 규약 | 보정 | 쓰는 곳 | 학습률 감각 |
|---|---|---|---|
| Keller Jordan | sqrt(max(1, 행/열)) | 원 구현, modded-nanogpt | 0.02 안팎 |
| Moonlight | 0.2·sqrt(max(행, 열)) | Moonlight, Essential AI | AdamW 와 같은 값(1e-3 안팎) |
| 차원 비 | sqrt(행/열) | Scion, MUON+, Spectral Allocation | 0.005–0.06 |
Moonlight(arXiv 2502.16982)의 0.2·sqrt(max) 는 업데이트의 RMS 를 AdamW 의 전형적인 값 0.2 에 맞춰, AdamW 용으로 맞춘 학습률과 weight decay 를 그대로 옮겨 쓰려는 장치입니다. 512×512 행렬이라면 Keller 규약의 0.02 는 Moonlight 규약으로 약 4.4e-3 에 해당합니다(계산). 논문의 학습률을 옮겨 쓸 때 가장 많이 틀리는 지점입니다.
5. 2025–2026년의 갈래
Moonlight: 규모를 키우려면 weight decay 와 크기 보정
Moonlight 는 Muon 을 큰 모델에 쓰려면 두 가지가 필요하다고 보였습니다. 분리형 weight decay(W ← W − η(O + λW))를 더하지 않으면 가중치와 출력 크기가 계속 자라고, 행렬 모양마다 업데이트 크기가 달라지는 것을 0.2·sqrt(max) 로 맞춰야 한다는 것입니다. 계산 최적 조건에서 AdamW 의 약 52% FLOPs 로 같은 성능에 닿았다고 보고합니다(그림 1a, 표 3).
큰 배치에서 데이터 효율을 지킨다(2505.02222)
Essential AI 의 「Practical Efficiency of Muon for Pretraining」은 배치를 키울 때를 봅니다. 배치를 키우면 걸음 수가 줄어 빨라지지만, 어느 지점(임계 배치 크기)을 넘으면 같은 손실에 토큰이 더 듭니다. 이 논문은 같은 손실에 닿기까지 AdamW 와 Muon 이 쓴 토큰의 비율을 배치 크기별로 그려, Muon 이 토큰을 10–15% 덜 쓰고 그 이점이 배치가 커져도 유지되거나 커진다고 썼습니다(그림 2·3). 원문 표현은 "retaining data efficiency at large batch sizes, far beyond the so-called critical batch size" 입니다. 「임계 배치 크기가 더 크다」는 점 추정에 기대지 않고, 토큰 비율이 줄지 않는다는 데 근거를 둡니다. 2편에서 이 주장을 작게 재 봅니다.
MUON+: 직교화 뒤에 정규화 한 번(2602.21545)
직교화하면 행·열의 크기도 고르게 될 것 같지만, 실제로 쓰는 5회 반복에서는 오히려 행·열 노름의 불균형이 커질 수 있다는 지적입니다(2.1절, 그림 2·3). 5회 반복은 정확한 U·Vᵀ 가 아니라는 점(위 표에서 특잇값이 0.68–1.21 로 퍼져 있던 것)과 같은 뿌리의 문제입니다. 저자들은 이 불균형이 안정적으로 쓸 수 있는 걸음의 최대 크기를 줄인다고 분석했습니다. MUON+ 는 직교화 결과의 열 노름으로 나누고, 이어서 행 노름으로 나누는 한 단계를 더합니다. 상태가 늘지 않고 코드 몇 줄입니다. 60M–7B 의 GPT·LLaMA 모두에서 Muon 보다 검증 PPL 이 낮았고(LLaMA-60M 25.75 → 25.25, 표 2), 같은 손실까지 스텝을 22.4–37.1% 줄였다고 보고합니다(표 5). 우리 실험 모델과 거의 같은 크기인 LLaMA-60M 에서는 이득이 약 0.5 PPL 로 작았다는 점도 함께 기억해 둘 만합니다.
Spectral Allocation: 방향마다 다른 걸음(2608.25990)
Muon 은 모든 방향에 같은 걸음을 줍니다. 이 논문은 학습 중 모멘텀 행렬의 특이 방향마다 「보지 않은 배치에서 손실을 가장 많이 줄이는 걸음」을 직접 쟀습니다. 맨 위 방향은 안정성의 경계(Edge of Stability)에 걸려 있고, 나머지 방향은 몇 배 큰 걸음도 견딘다는 결과입니다. 그래서 위 방향은 Muon 크기로 두고 나머지를 γ배 키운 SAMuon 을 제안했고, 같은 손실에 토큰을 13–24% 덜 썼다고 합니다(표 7). 이 관점에서 「Muon > Adam > SGD」 순서도 설명됩니다. SGD 는 강한 방향에 걸음을 몰아주고, Adam 은 그것을 좌표 단위로만 누그러뜨리고, Muon 은 방향 단위로 고르게 합니다. 이 논문의 표 5 에서 AdamW 와 Muon 의 손실 차이는 배치 1024 시퀀스에서 0.048, 4096 시퀀스에서 0.110 으로 배치가 클수록 벌어졌습니다.
큰 규모의 비교: SOAP, Muon, and Beyond(2607.20548)
NVIDIA 의 이 논문은 8B 밀집, 30B·72B MoE 모델을 1–3T 토큰으로 학습하며 AdamW, Muon, SOAP 을 비교했습니다. Muon 과 SOAP 은 AdamW 를 일관되게 이겼고, 전역 배치를 100M 토큰까지 키워도 버텼지만 AdamW 는 나빠졌습니다(초록, 5.3절). SOAP 의 큰 배치 불안정을 고친 KL-SOAP 이 Muon 보다 「일관되지만 근소하게」 앞섰습니다(그림 7·8). 다만 여기서 말하는 공정 비교는 옵티마이저마다 학습률을 따로 찾은 것이 아니라 업데이트 RMS 를 맞춰 옮긴 것이라고 저자들이 밝힙니다. 8B 하이브리드 모델의 수학 평균은 오히려 AdamW 가 높았다는 점(표 5, 84.04 대 80.79)도 원문에 있습니다.
작은 모델 레시피도 Muon 계열로
2026년에 나온 작은 모델 사전학습 레시피 두 편도 옵티마이저 자리에 Muon 계열을 씁니다. IMU-1(2602.02522, 430M)은 NorMuon 에 Cautious Weight Decay 와 μP 를, Puro-2B(2608.27370)는 MuonH 를 썼습니다. 둘 다 임베딩·출력층·1차원 파라미터는 AdamW 입니다. 이 갈래는 4편에서 다시 다룹니다.
6. 정리, 그리고 확인하고 싶은 것
- Muon 은 은닉 행렬의 업데이트를
U·Vᵀ로 바꿔 모든 방향에 고른 걸음을 줍니다. 계산은 행렬 곱 다섯 번입니다. - 쓰는 곳(은닉 2차원 행렬만)과 크기 보정 규약을 같이 적어야 학습률 숫자가 뜻을 가집니다.
- 2026년의 흐름은 「직교화 결과를 더 다듬기」(MUON+), 「방향마다 걸음을 다르게」(Spectral Allocation), 「큰 규모·큰 배치에서 공정하게 비교하기」(NVIDIA, Essential AI) 셋입니다.
논문들은 수억–수천억 파라미터에서 이 결론을 냈습니다. 그렇다면 8GB 노트북 GPU 한 장으로 돌릴 수 있는 3,400만 파라미터 모델, 토큰 1억 개에서도 같은 일이 일어날까요? 학습률을 옵티마이저마다 따로 찾아 공정하게 맞추면 차이는 얼마나 남을까요? 큰 배치에서 격차가 벌어질까요? 2편에서 직접 잽니다.
원자료와 참고 문헌
- 특잇값 측정 코드:
ns_spectrum.py(이 시리즈의 실험 폴더). 노트북 CPU, PyTorch 2.15, 시드 0. 같은 NS 함수를 2편의 학습 코드가 씁니다. - Keller Jordan, "Muon: An optimizer for hidden layers in neural networks"(블로그 글, 2024)와 공개 구현
muon.py. - Liu 외, "Muon is Scalable for LLM Training", arXiv 2502.16982.
- Essential AI, "Practical Efficiency of Muon for Pretraining", arXiv 2505.02222.
- Zhang 외, "MUON+", arXiv 2602.21545.
- Wu 외, "Spectral Allocation", arXiv 2608.25990.
- Khona 외, "SOAP, Muon, and Beyond", arXiv 2607.20548.