Two identical networks, same initial weights, same minibatches. Only the optimizer differs. Pause at any time to poke the models, then resume.
AdamW treats every weight as its own one-dimensional problem. It keeps a running mean m and a running mean square v of each weight's gradient, divides one by the square root of the other, and shrinks the weight a little (decoupled weight decay):
Muon (MomentUm Orthogonalized by Newton–Schulz) treats each hidden weight matrix as one object. It keeps a momentum matrix and writes it as U Σ Vᵀ. Then it throws Σ away and steps along U Vᵀ, so every direction in the update gets the same step size:
Gradients of hidden layers are usually dominated by a few directions (low "stable rank"). AdamW's update inherits that shape. Muon's update is close to orthogonal: rare directions get about as much step as the dominant ones. The Shape of the last update chart shows this live. The AdamW line drops right after the first direction. The Muon line stays high across many directions, then drops only where the momentum holds almost nothing (below about 1/500 of its norm, see the right column). In these tiny networks the gradient spans only a few dozen of the 64 directions, so Muon's "effective rank" is high but not 64.
Muon is meant only for hidden 2D weights. Here the Muon network still uses AdamW (same settings as the AdamW network) for biases, the character embedding, the output layer, and the 2D input layer, as Muon's authors recommend. Tick Muon on every matrix to see why.
After dividing by the Frobenius norm, every singular value σ of the momentum lies in (0, 1]. Each iteration maps σ to f(σ) = aσ + bσ³ + cσ⁵. The coefficients are tuned for speed, not exactness: small σ grow by about 3.4× per step, so five steps lift anything above roughly 1/500 of the norm into a band near 1 (about 0.7–1.2) instead of exactly 1. Weaker directions, which are mostly noise, stay small. That is good enough, and it costs a few matrix products per step. The opt ms column shows that cost.