TT Lab
Blog

한국어 English 日本語 中文

Get started
Blog

Blog

AdamW vs Muon vs MUON+ Measured on a Small GPT

Status: Draft (2026-10-31), measured. All training was run directly by the author on a single 8GB laptop GPU. The conditions, learning rate candidates, and decision criteria were written down before the first run (preregistration), and the execution proceeded automatically according to those rules. The paper figures are the original verified copies as in Part 1. Writing rules: Measured data is the default; unmeasured items are marked as "Unmeasured", and unverified items are marked as "Unverified".

Table of Contents

1. What We Are Verifying

Part 1We distilled the claims of the papers seen in into three questions.

  1. When changing only the optimizer under the same model, data, and tokens, even after tuning the learning rate separately for each optimizer , does Muon reach a lower loss than AdamW?
  2. Does MUON+'s "one step of normalization after orthogonalization" make a difference even at this scale?
  3. Does increasing the batch size widen the gap between AdamW and Muon (as claimed by 2505.02222 and 2608.25990)?

The scale is much smaller than the papers: a 34M-parameter model and 100M tokens. Therefore, the conclusion of this post is "this is how it behaved at this scale" rather than verifying or refuting the papers.

2. Experimental Design

Model and Data

Things Held Constant

Data order (fixed permutation, all runs see the same sequences in the same order), token budget, batch size, bf16 automatic mixed precision, torch.compile, gradient norm clipping 1.0, learning rate schedule (WSD: initial 2% linear warmup, constant phase, final 20% linear decay to 0), evaluation set. Seeds change initialization only.

Three Optimizers

Hidden matrices (q, k, v, o, two MLPs) Embedding, Output Layer, Norm Gains
AdamW AdamW β=(0.9, 0.95), weight decay 0.1 Same AdamW (norm gains decay 0)
Muon Nesterov momentum 0.95 → Newton–Schulz 5 iterations (bf16) → sqrt(max(1, rows/cols)) correction Auxiliary AdamW, learning rate = optimal value from AdamW sweep
MUON+ Same as Muon, but orthogonalization result is divided once more by column norm → row norm Same

Two aspects were intentionally aligned. First, the auxiliary AdamW learning rate for the Muon run was fixed to the optimal value of the AdamW run, ensuring that the difference between the two runs is solely the "hidden matrix optimizer". Second, the weight decay rate per step (learning rate × λ) was made equal to AdamW. Muon's learning rate convention (around 0.02) differs from AdamW's (around 1e-3) by about twentyfold, so leaving λ identical at 0.1 results in a twentyfold difference in actual decay (Part 1, Section 4).

MUON+ differs from the paper's pseudocode in two places. The paper does not use Nesterov and uses sqrt(rows/cols) for size correction, whereas here it is kept identical to Muon with just one additional normalization step. Since the paper states that "the only change is this single step," this choice narrows the difference down to that step, and the scale difference is absorbed by the learning rate sweep.

Learning Rate Sweep and Main Run (Preset Rules)

  1. Sweep: 50M tokens, batch 64 sequences (32,768 tokens, 1,525 steps), seed 0. Candidates: 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}. Pick the lowest final validation loss, and if it is at the edge of the grid, run one more point in that direction (only once).
  2. Main run: 100M tokens (3,051 steps), batch 64 sequences, respective optimal learning rates, seeds 0, 1, and 2.
  3. Large batch: 100M tokens, batch 256 sequences (131,072 tokens, 762 steps), AdamW and Muon, learning rates at 1x and 2x of the batch 64 optimal values. One additional seed for the better performing one.
  4. Decision criterion: If the final loss difference is greater than the sum of the two optimizers' seed standard deviations, it is "better"; if smaller, it is "indistinguishable".

This sequence was automatically chained by the execution script according to the rules, in order to eliminate any opportunity to intervene after seeing the results.

Environment

Executed on a single 8GB laptop GPU, PyTorch 2.9 (CUDA 12.8), training jobs on Kubernetes (Kubeflow Trainer). At the end of each run, validation loss curves (~40 points), throughput (excluding the first 11 steps), and maximum GPU memory were recorded.

3. Learning Rate Sweep: Different Optimizers Have Different "Good Neighborhoods"

학습률 탐색: 최적값 기준으로 몇 배인가 50M 토큰, 시드 0, 실측. 4.4 보다 큰 값(발산에 가까운 점)은 위 끝에 붙여 그림 3.6 3.8 4 4.2 4.4 -1 0 1 2 3 4 log2(학습률 / 그 옵티마이저의 최적값) 마지막 검증 손실 AdamW Muon MUON+
Figure: Learning rate sweep
Optimizer Learning Rate → Final Validation Loss (50M tokens) Selected Value
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

Three things are visible.

4. Main Run: 100M Tokens, 3 Seeds

검증 손실: 같은 토큰에서 비교(시드 3개 평균) 약 3,400만 파라미터 GPT, FineWeb-Edu, 배치 32,768 토큰, 8GB 노트북 GPU 실측 3.5 3.75 4 4.25 4.5 0 20 40 60 80 100 학습한 토큰(백만) 검증 손실 AdamW MUON+ Muon
Figure: Validation loss curves
Optimizer Learning Rate Final Validation Loss (mean ± standard deviation) Per-seed Throughput (tokens/sec) Max GPU Memory
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

Decision (Preset criterion: difference > sum of two standard deviations)

How Many Tokens Are Required for the Same Loss

Because the constant learning rate phase (2M–80M tokens) of the curves places both optimizers on the same schedule, we can compare the tokens required to reach a given loss for the first time. This is the same definition as the token ratio R = T(AdamW) / T(Muon) from 2505.02222.

Target Loss Tokens Used by AdamW Tokens Used by Muon Ratio
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 required 1.4–1.6x the tokens of Muon to reach the same loss, and the ratio gradually decreased as training progressed. Including the final decay phase, Muon reached AdamW's final loss (3.490) at 90.2M tokens (across all seed sets). However, since the loss drops steeply following the schedule shape during the decay phase, this "approximate 10% savings" should be read only as a lower bound, because running Muon from the start with a 90M token budget would have already finished decaying by that point, yielding an even lower loss (that run is unmeasured).

The advantage in this experiment is much larger than the paper's "10–15% fewer tokens for the same loss" (2505.02222, hundreds of millions to billions of parameters, several times Chinchilla optimal tokens). This is likely because the model is small (34M) and training is very short at roughly 3 tokens per parameter. As seen in the table above, the ratio decreased the longer training lasted.

Time and Memory

5. Large Batch: The Gap Widened

We increased the batch size 4x (131,072 tokens) and trained on the same 100M tokens in 762 steps. For the learning rate, we tested 1x and 2x the optimal value of the 64-batch and picked the better one (both favored 1x), and ran one more seed with that value.

배치를 4배로 키우면 격차는? 100M 토큰, 각 배치에서 고른 학습률, 시드 평균, 실측 AdamW Muon 3.3 3.4 3.5 3.6 3.7 3.8 마지막 검증 손실 3.490 3.409 배치 32,768 토큰 3.727 3.508 배치 131,072 토큰
Figure: Final loss by batch size
Batch AdamW Muon AdamW − Muon
32,768 tokens (3,051 steps) 3.490 (seed 3) 3.409 (seed 3) 0.081
131,072 tokens (762 steps) 3.727 (1e-3, seed 2: 3.726•3.729) 3.508 (0.01, seed 2: 3.507•3.509) 0.219
2x learning rate for large batch 3.936 (2e-3) 3.515(0.02)

Using the same tokens with a quarter of the steps hurts both, but the magnitude of the penalty differs. AdamW worsened by 0.24 and Muon by 0.10. The gap widened 2.7x from 0.081 to 0.219. The token ratio in the constant learning rate phase shows the same trend. The token ratio to reach a loss of 4.2 was 1.63 for batch 64 and 1.78 for batch 256 (at 4.0, it was 1.59 vs. 1.76). This aligns with "Muon's data efficiency is maintained or increases at large batch sizes" (2505.02222) and "The larger the batch, the wider the AdamW–Muon gap" (2608.25990 Table 5: 0.048 → 0.110).

As a bonus, the throughput overhead of Muon decreased to 1.5% at large batch sizes (99,604 vs. 101,120 tokens/sec). Because Newton–Schulz runs once per step, reducing the number of steps also reduces its share of overhead.

6. Post-hoc Checks: Three Questions Arising from the Results

The following five runs were decided after seeing the results above. Therefore, they do not change the above judgments and are used solely to check "how much we can trust those judgments." All use a single seed.

Question Run Result Comparison Target
The learning rate of MUON+ was at the edge of the grid MUON+ 0.005, 50M tokens 3.5953 MUON+ 0.01: 3.6120, Muon optimal 0.01: 3.6018
Did AdamW suffer from a 2% warmup (30 steps)? AdamW 1e-3, 10% warmup 3.7723 2% warmup: 3.7270
〃 AdamW 2e-3, 10% warmup 3.7235 2% warmup: 3.8286
Is the large-batch gap due to the short warmup (15 steps)? AdamW 1e-3, batch 256, 10% warmup 3.7082 2% warmup: 3.7271
〃 Muon 0.01, batch 256, 10% warmup 3.5192 2% warmup: 3.5082

7. Interpretation

8. Limitations

Raw Data

Sign in to like

Comments

No comments yet.

Sign in to leave a comment