I've been curious about the Muon optimizer for a while, and today I finally made time to read about it. This blog post documents what I learned.
Revisiting the intuition of gradient descent (with geometry in mind!)
Before diving into Muon, I found it helpful to revisit the intuition of gradient descent. Imagine you find yourself in a landscape with hills and valleys, and you want to reach a low point in a valley. How should you choose a path to get there (there is more than one!)? Gradient descent tells you to step in the direction of the fastest local drop in altitude per unit of step length. There is an interesting detail hidden in that sentence: the direction of the fastest drop with respect to step length actually depends on the geometry you use to measure your step length! The most straightforward choice is the Euclidean metric, using the norm for vectors or the Frobenius norm for matrices. This gives the familiar negative-gradient direction.
Mathematically, the steepest descent direction under the Frobenius norm can be obtained by minimizing this linear approximation within a fixed step budget:
Here, is the step budget, is the change in a weight matrix of the neural net, and is the Frobenius inner product. For a nonzero gradient, the solution is . This is a normalized gradient step: it has the same direction as ordinary gradient descent, but its length is fixed at .
For a given gradient, the steepest descent direction depends on how you measure the size (norm) of the step. We can also choose other norms, giving different constraints:

The core rationale behind Muon
With this in mind, we can dive into the Muon optimizer. Here, we focus on a weight matrix in a hidden linear layer of the neural network. With the input held fixed, a weight update changes the output activation by .
Notice that (2) constrains the norm of the weight update. Now comes the core rationale behind this derivation of Muon: we want to choose a norm for the step that also lets us bound the resulting change in the output activation [1]. My intuition is that a large activation change can propagate through later layers, making the first-order approximation below less reliable:
Here, the sum runs over the weight matrices being updated. The bound we derive below controls each layer's direct response to its own weight update at a fixed input; it does not, by itself, guarantee that the approximation is accurate for the whole network.
RMS-to-RMS operator norm
For a vector , its root-mean-square (RMS) norm is
The RMS-to-RMS operator norm measures the largest ratio between the output and input RMS norms when a matrix acts on a nonzero vector:
This gives a bound on the change in the output activation:
The motivation for using RMS norms here is that the layer's inputs and outputs are expected to be dense activations with RMS norms around one [1]. To make the next bound exact, let us assume . Then
We can use this bound to choose a constraint in (2). Keeping as our step budget, we obtain
This update minimizes the linearized loss while keeping for any fixed input with RMS norm at most one!
Connection to the spectral norm
The RMS-to-RMS operator norm is closely related to the spectral norm , which is the largest singular value of . Here is a brief explanation.
Let have shape . Consider its full singular value decomposition (SVD), , where and are square orthogonal matrices and has the same shape as . Substituting into (4),
Because preserves Euclidean length and the output dimension stays the same, it also preserves the RMS norm:
Now define a new vector . Since is also orthogonal,
Substituting into (9), and noting that ranges over all nonzero input vectors,
Let . Since
we have
The upper bound is attained by choosing along a coordinate corresponding to the largest singular value. Therefore,
The optimization problem in (7) can now be expressed as
Solving the constrained minimization
The gradient matrix in (13) can also be decomposed using SVD. From now on, and refer to the singular vectors of the gradient, rather than those of . We use the compact SVD, retaining only the positive singular values:
The matrices form an orthonormal basis for a subspace containing the gradient, with as its coordinates. Intuition for minimizing is:
- needs to be in the same subspace spanned by and every component should point to the opposite direction of .
- Under the spectral norm constraint, the magnitude along each direction can be at most . Since this norm only limits the largest singular value, all of these components can reach magnitude at the same time. To minimize the linearized loss, choose the coefficient for each one.
This gives an optimal solution to (13):
If the gradient is zero, we can simply choose a zero update.
Newton–Schulz iteration
With (15), we have solved the optimization problem, at least theoretically. However, computing an SVD is expensive. Muon uses a Newton–Schulz iteration to approximately perform the transformation to using matrix multiplications. A good explanation of the iteration can be found in Jeremy Bernstein's post [1].
One detail separates this derivation from the practical optimizer: Muon applies the iteration to a momentum update, rather than directly to the gradient. The dimensional scaling can also differ from the factor in (15). Keller Jordan's post [2] covers the implementation; the derivation here focuses on the geometry behind the update.
One consequence of this geometry is that small singular directions no longer receive small updates simply because their gradients are small. Suppose the gradient has two singular values, 100 and 1. Under the Frobenius constraint in (1), the optimal update allocates its magnitude between those directions in a 100:1 ratio. Under the spectral constraint in (13), both can receive magnitude : using the second direction does not increase the largest singular value of the update. This is what makes the update click for me. Equalizing the singular values follows directly from how we define the step budget.