Muon: What Happens When an LLM Optimizer Treats a Weight Matrix Like a Matrix Developer Shrijith Venkatramana explains Muon, an optimizer that treats neural network weight matrices as matrices rather than collections of scalar coordinates, orthogonalizing momentum updates by preserving singular directions while discarding singular-value magnitudes. The technique, introduced publicly in October 2024 by Keller Jordan and collaborators during the NanoGPT speedrunning competition, set a training-speed record about 35% faster than the previous result and has since scaled to multi-billion-parameter language models and entered the mainstream PyTorch optimization stack. Hello, I'm Shrijith Venkatramana, and I'm building LiveReview — a blast-radius aware AI code review built for your business-critical systems. Star us https://github.com/HexmosTech/LiveReview/ to help devs discover the project, give it a try, and share your feedback to help improve the product. Most LLM developers know the AdamW update by heart: take the gradient, keep moving averages, normalize the update, change the weights. But there is a question hiding underneath all of this: What exactly is a 4096 x 4096 weight matrix? AdamW mostly treats it as 16 million scalar coordinates. Muon treats it as a matrix. That distinction is the whole story. Muon is an optimizer for the hidden matrix parameters of neural networks. Its core operation takes the momentum update, looks at its singular directions, throws away the singular-value magnitudes, and keeps the directions. It then approximates this operation cheaply with a few Newton-Schulz iterations. The result is an optimizer that has produced faster training in small-model competitions, scaled to multi-billion-parameter language models, and is now part of the mainstream PyTorch optimization stack. The interesting part is not merely that "Muon beats AdamW." The interesting part is why someone thought to optimize a neural network matrix as a matrix in the first place. Consider a transformer linear layer: y = W x where W might be a 4096 x 4096 matrix. During backpropagation we obtain a gradient: G = dL/dW AdamW maintains statistics for each scalar element of G . Very roughly: m t = beta1 m t-1 + 1-beta1 G t v t = beta2 v t-1 + 1-beta2 G t^2 update = m t / sqrt v t The important detail is G t^2 : the second-moment estimate is elementwise. This gives Adam a coordinate-wise view of the parameter space. Muon starts from a different observation: W is not merely a bag of numbers. It represents a linear transformation. For a matrix, one of the natural ways to understand that transformation is through its singular value decomposition: G = U Sigma V^T Here: U and V = directions Sigma = magnitudes along those directions So there are two different questions: Muon makes a very particular choice: preserve the directions, but approximately equalize their magnitudes. That is what orthogonalizing the update means. The idea appeared publicly in October 2024, when Keller Jordan and collaborators were working on the NanoGPT speedrunning competition. On October 15, 2024, a Muon-based run set a new training-speed record, improving the previous result by about 35%. The project then became a collaboration involving people such as Jeremy Bernstein, Laker Newhouse, Yuchen Jin, Vlado Boza, Jiacheng You, and Franz Cesista. Jordan's account is unusually concrete about the engineering: Boza found that treating Q, K, and V separately worked better; Jin pushed experiments to larger models and supplied much of the H100 compute; Bernstein, You, and Cesista reduced the cost of the matrix orthogonalization itself. That history matters because Muon did not emerge from a giant benchmark suite first. It emerged from people trying to make a tiny training program go faster. Suppose an update matrix has the form G = U diag 20, 3, 0.2 V^T The gradient has three principal matrix directions. One direction has magnitude 20. Another has magnitude 3. Another has magnitude 0.2. Muon constructs an approximation of U diag 1, 1, 1 V^T up to the appropriate scaling for the matrix shape. The singular vectors remain. The singular values disappear. For a square matrix, this produces an ordinary orthogonal matrix. For a rectangular matrix, it produces a semi-orthogonal matrix. Another way to write the operation is: Ortho G ~= U V^T This has a useful geometric interpretation. Imagine that your update is saying: "Move strongly in direction A, somewhat in direction B, and barely at all in direction C." Muon says: "Those are the important directions. Let's give them roughly equal opportunity to affect the layer." The original Muon write-up notes that transformer updates often have high condition numbers: a few directions can dominate the update while other directions have much smaller singular values. The authors proposed that orthogonalization may help those lower-magnitude directions contribute more. That explanation is an empirical hypothesis rather than the complete theoretical justification for Muon. This also explains why Muon is fundamentally different from simply changing Adam's hyperparameters. Adam changes how each coordinate is scaled. Muon changes the matrix geometry of the update . There is an analogy to dimensionality reduction, but in reverse. PCA asks: Which directions contain most of the variation? Muon asks: What if the update contains a few dominant directions, but I want the matrix update to retain all of its principal directions at comparable scale? There is an obvious problem. If we literally want: php G = U Sigma V^T G - U V^T we could compute an SVD. For a huge transformer, doing a full SVD for every large weight matrix at every optimizer step would be an unattractive idea. Muon's practical insight is: we do not need to compute the SVD explicitly. Instead, use Newton-Schulz iteration. Start by normalizing the matrix: X = G / ||G|| F Then repeatedly apply a matrix polynomial. The production Muon implementation uses: X next = a X + b X X^T X + c X X^T ^2 X with coefficients approximately: a = 3.4445 b = -4.7750 c = 2.0315 and typically five iterations. Why does this work? Take the SVD: X = U Sigma V^T The polynomial operation preserves the singular vectors: p X = U p Sigma V^T So instead of manipulating the whole matrix conceptually, we can think about what the polynomial does to each singular value. The quintic mapping is: p s = a s + b s^3 + c s^5 Repeatedly apply it. The goal is for the singular values to converge toward 1. So: U Sigma V^T | v U p Sigma V^T | v U p p Sigma V^T | v U I V^T The fascinating implementation detail is that we never explicitly calculate U , Sigma , or V . We only perform matrix multiplications. This is where numerical linear algebra meets GPU engineering. The early Muon work considered several ways of doing the orthogonalization. SVD was too slow. Other Newton-style methods had numerical problems in lower precision. Newton-Schulz could be run efficiently in bfloat16, which made it much more suitable for modern accelerators. The coefficients themselves were tuned experimentally; Jordan describes researchers using Desmos to explore polynomial shapes during the NanoGPT speedrun. That is a useful general lesson for ML engineers: an algorithm that is mathematically expensive may become practical when you find a formulation that maps onto the hardware's favorite operations. There is a deeper way to understand all of this. Suppose a linear layer is: y = W x and we change the weights by: php W - W + dW The resulting change in the output is: dy = dW x So we can ask: How large should a weight update be if I care about controlling the change it causes to the layer's output? Suppose we measure vectors using RMS: ||x|| RMS = sqrt 1/d sum i x i^2 Then a matrix has an operator norm describing its maximum RMS-to-RMS amplification: php ||W|| RMS- RMS Now imagine the optimization problem: php minimize