Not fully posed until the ball is chosen (Bernstein & Newhouse, 2024):
Euclidean ball → -\eta\,\mathbf{g}/\|\mathbf{g}\|_2: the SGD direction — the direction assumes Euclidean geometry, while the step length follows a separate rule.
Box (\ell_\infty) → -\eta\,\mathrm{sign}(\mathbf{g}): every coordinate moves the same distance, matching Adam’s per-coordinate equalization (§9.6).
The spectral norm for matrix updates
A hidden matrix transforms activations: \mathbf{y} = \mathbf{W}\mathbf{x}. The size of an update that matters is what it does to activations:
The update keeps the gradient’s singular vectors and replaces its nonzero singular values by one. It equalizes directions rather than coordinates.
Embeddings see one-hot inputs — the induced norm is the max row norm, not the spectral norm. They stay with AdamW.
Orthogonalization without an SVD
Odd matrix polynomials act on singular values alone: p(\mathbf{X}) = \mathbf{U}\,p(\boldsymbol{\Sigma})\,\mathbf{V}^\top. Iterate a polynomial with fixed point 1; the tuned quintic (Jordan et al., 2024)
p(x) = 3.4445\,x - 4.7750\,x^3 + 2.0315\,x^5
has slope 3.44 at 0 → five iterations suffice, in bfloat16, all matmuls.
def newton_schulz(M, num_iters=5, eps=1e-7): a, b, c =3.4445, -4.7750, 2.0315 tall = M.shape[0] > M.shape[1] X = M.T if tall else M # keep the Gram factor X @ X.T small X = X / (X.norm() + eps)for _ inrange(num_iters): A = X @ X.T X = a * X + (b * A + c * A @ A) @ Xreturn X.T if tall else X
Effect of Newton–Schulz iterations on the spectrum
singular values after 5 iterations: [0.68, 1.13]
0 iterations: an order of magnitude of spread.
After 5 iterations, the singular values lie in a band around 1 (approximately 0.7–1.2), using 15 matrix multiplications.
One buffer each vs. AdamW’s two: state memory nearly halves.
Muon and AdamW on the language model
The comparison uses the same initialization, 2,000-step budget, constant learning rate, and four-point grid, with weight decay disabled. The optimizer direction is the intended difference:
final perplexity: AdamW 2.49, Muon+AdamW 2.29
The hybrid finished below AdamW in both single-seed runs while using about half the optimizer state.
The margin ranged from modest (PyTorch) to substantial (JAX) under the identical protocol, which shows that small comparisons are protocol-sensitive.
Training loss and test accuracy on a CNN
test accuracy: AdamW 0.916, Muon+AdamW 0.914
Training loss: the hybrid reaches the memorization regime much faster.
Test accuracy differs by about one point; faster optimization does not imply better prediction on this small, saturated task.
Same compression Adam-vs-SGD showed here (§9.6): the verdict depends on workload and metric.
Related preconditioning methods
K-FAC (2015): layer-wise Fisher ≈ Kronecker product — two small inverses.
Shampoo (2018): AdaGrad-style two-sided factors; won AlgoPerf’s external-tuning track (~30% faster than tuned AdamW).
SOAP (2024): Adam inside Shampoo’s eigenbasis.
Muon has the following Shampoo-style orthogonalization identity:
Lion (2023): the sign branch’s lean member — one buffer, six lines (exercise).
Large-scale results and matched tuning
In production: Moonlight (≈½ the compute of its AdamW baseline); Kimi K2 — 15.5T tokens with MuonClip, zero loss spikes; GLM-4.5; torch.optim.Muon in core.
With matched tuning (Wen et al., 2025), matrix methods are fastest in these experiments, with speedups of about 1.4× at 100M parameters and 1.1× at 1B. Sophia’s 2× did not replicate — reported by its own authors’ group.
AdamW remains the default. Reported Muon gains are typically tens of percent rather than multiples.