| Weights and gradients | |
|---|---|
| one weight matrix; rows index outputs, columns inputs | |
| minibatch gradient at step t; the same with rows stacked into a vector | |
| the weights as one vector | |
| learning rate; step index; number of steps | |
| singular value decomposition of the gradient or momentum | |
| Preconditioners | |
| full-matrix AdaGrad statistic | |
| Shampoo's factors and | |
| averages , (Morwani et al., SOAP) | |
| Kronecker product; | |
| Shampoo's preconditioner (Step 3) | |
| eigenvectors and eigenvalues of L; of R | |
| gradient in the two eigenbases | |
| second moment of the vectorized gradient (Morwani et al.) | |
| Shampoo's and the grafted optimizer's step for one layer | |
| SOAP's momentum; its per-entry second moment of the rotated gradient | |
| Constants | |
| small constant on the diagonal of each accumulated matrix | |
| bound on the rank of every gradient, in the regret theorem | |
| largest distance , in the regret theorem | |
| loss revealed at step t; comparison matrix, in the regret theorem | |
| moving-average rates of SOAP's momentum; of its second moment and of L, R | |
| variance of each gradient entry in the shape example | |
| tolerance of the adaptive basis rule (Eschenhagen et al.) | |
| Local to one step | |
| singular vectors and values of one gradient (Step 1) | |
| ; weight of the uneven split (Step 2) | |
| (Step 3) | |
| singular values and unit-norm factors of the rearranged H (Step 6) | |
| row and column sums of ; columns of , (Step 7) | |
| per-entry scales and power of a rotated step (Step 8) | |
| last computed eigenvectors; (Step 8) | |
Context. Adamthe default optimizer for neural networks: it divides each coordinate of a running average of the gradient by the square root of a running average of that coordinate's squared gradient rescales each coordinate of the gradient separately, so its step can only be stretched or shrunk along the coordinate axes. Full-matrix AdaGradAdaGrad with a dense preconditioner: it multiplies the gradient vector by , where is the sum of over all past gradients can rotate as well, but for a weight matrix with rows and columns its preconditioner has entries, about for one layer of GPT-2 small, so it is not run on networks. Shampoo (Gupta et al., 2018) keeps two small matrices per weight matrix instead, a running sum of and one of , where is the matrix's gradient, and multiplies on the left and on the right by an inverse root of each. Anil et al. (2020) made it fast enough to beat well-tuned first-order optimizers in wall-clock time, and the PyTorch implementation of Shi et al. (2023) won the external-tuning track of AlgoPerfAlgoPerf: a benchmark that scores a training algorithm by the time it needs to reach fixed validation targets on eight deep learning workloads; in the external-tuning track each submission supplies a hyperparameter search space and is scored with five tuning trials per workload (Kasimbeg et al., 2025). Morwani et al. (2025) worked out what the two matrices approximate, SOAP (Vyas et al., 2025) runs Adam in their eigenvectors, and Muonthe speedrun's optimizer for hidden weight matrices: it replaces the momentum , written in its singular value decomposition, by , computed approximately with a few matrix-multiply iterations with its momentum turned off is Shampoo with its sums removed (Bernstein and Newhouse, 2024).
Shampoo's step is a change of basis and a rescaling: it rotates the gradient into a basis, the eigenvectors of the two accumulated matrices, divides each entry by a scale, and rotates back. In the experiments that separate the two (Steps 7 and 8, on language models up to 660M parameters and small vision models), the basis carries the advantage over Adam and still helps when it is recomputed only every 10 to 100 steps. The scale, a product of the two matrices' eigenvalues to the power , gives differently shaped layers inconsistent step sizes and is updated only when the basis is recomputed. Apart from the engineering that makes the roots affordable (Steps 4 and 5), the fixes that made Shampoo work act on the scale: each layer's step length borrowed from Adam (grafting), a square-root power in place of the fourth root (with a trace factor, in the analysis), and in SOAP, Adam's own per-entry scale computed in Shampoo's basis and updated every step. Muon applies Shampoo's fourth-root formula, with no sums and , to the current momentum alone, which rotates into the momentum's singular vectors and sets every singular value to one (approximately, in practice).
# one weight matrix W (m x n) with gradient G; L, R start at eps * I
L = L + G @ G.T # m x m
R = R + G.T @ G # n x n
lam, QL = torch.linalg.eigh(L) # in practice recomputed every 10-100 steps
mu, QR = torch.linalg.eigh(R)
Gr = QL.T @ G @ QR # the gradient in the two eigenbases
scale = torch.outer(lam, mu) ** 0.25 # entry (i, j) is divided by (lam_i * mu_j)^(1/4)
W = W - lr * (QL @ (Gr / scale) @ QR.T)
# SOAP keeps QL and QR but replaces scale by Adam's per-entry second moment of Gr:
# V = b2 * V + (1 - b2) * Gr**2; scale = V.sqrt() + eps
For a tensor with dimensions Shampoo keeps one such matrix per dimension and uses the power on each; a matrix is the case .The Kronecker product of the two square roots dominates full-matrix AdaGrad. If every gradient has rank at most a bound on the rank of every gradient ; for a linear layer each example's gradient is an outer product, so a batch of examples gives , then for every in the Loewner order means that is positive semidefinite, so for every vector (Steps 1 and 2). The left side is up to the term, so the Kronecker product is at least that large in every direction. The analysis of full-matrix AdaGrad then goes through with , the square root of the right side, in place of , and Shampoo keeps AdaGrad's regretthe total loss over the steps minus the total loss of the best fixed weight matrix chosen in hindsight; regret that grows more slowly than the number of steps means the average loss approaches the best fixed one of order after the number of steps steps (Step 3). The fourth roots in Shampoo come from this square root.
Squared, the Shampoo preconditioner is close to the best Kronecker approximation, and that points to the power . The bound above holds up to the factor and so leaves open how close the Kronecker product is to the full matrix. Morwani et al. (2025) take a distribution of gradients, the second-moment matrix of the vectorized gradient; for AdaGrad the expectation is the average over past steps, for the Gauss-Newton reading it is over data with labels sampled from the model, and ask for the Kronecker product closest to in Frobenius norm. Rearranging the entries of turns every into the rank-one matrix (Van Loan and Pitsianis), so the answer is the top singular pair of the rearranged , and power iterationthe method that finds the top singular vectors of a matrix by repeating , on it reads, in matrix form, and . Started from identity matrices, one step gives and , the averages of what Shampoo accumulates. With the expectation taken over past steps these are and up to the term, so we keep the letters: write and . So , the square of Shampoo's , is one power-iteration step toward the best Kronecker approximation, and in their measurements it is nearly as close to as the optimum while Shampoo's own product is much further away (Step 6). If is exactly a Kronecker product, then , and AdaGrad's becomes a square-root power on each side:Shi et al. (2023) report this power as often effective, found by tuning (Step 5).
The scale is where Shampoo is weak, and the practical fixes act on it. In the rotated form of the Setting, the basis changes slowly once training is under way (Step 8), so a basis computed tens of steps earlier is still close to current. The scale is weaker in two ways. Its size depends on the layer's shape: if the gradient entries are independent with mean zero and variance the variance of each gradient entry in the example, assumed equal for all entries of the layer, then and (with averages in place of sums), Shampoo's step is , while Adam's is . So Shampoo's step is an eighth of Adam's for a matrix and about a forty-fifth for a matrix (our computation; Eschenhagen et al., 2025, prove bounds with this dimension factor), so one learning rate cannot give both layers Adam-sized steps. And the eigenvalues are refreshed only with the basis, while the size of the gradient changes every step. GraftingAgarwal et al.'s (2020) rule: rescale each layer's update direction from one optimizer to the Frobenius norm of the update another optimizer would take for that layer at the same step, used in the large-scale results of Anil et al. and Shi et al. (Steps 4 and 5), rescales each layer's Shampoo step to the length of the step that Adam (or AdaGrad, or SGD) would take on that layer:Eschenhagen et al. (2025) show that grafting compensates for the eigenvalues: the basis never changes a step's length, and a scale that is correct and current made grafting unnecessary in their tests (Step 8). The trace-scaled square-root form of the previous paragraph is correct in the example above, where it gives exactly (our check). SOAP keeps it current: in Shampoo's eigenbasis that form is Adafactora memory-saving variant of Adam that replaces the per-entry average of squared gradients by a rank-one estimate built from its row sums and column sums, whose estimate of the squared rotated gradient has row sums and column sums , and SOAP replaces it by Adam's full per-entry average, updated every step even while the basis is stale (Step 7).
The guarantee (Gupta et al., 2018). Gupta et al. analyze Shampoo as an algorithm for online convex optimizationa repeated game: at each step the learner commits to , then a convex loss is revealed and the learner incurs ; stochastic optimization is the case of losses drawn independently from one distribution: at each step a convex loss the loss revealed at step , for example the loss on step 's minibatch, convex in arrives after the learner has chosen , and regret compares the learner's total loss with that of a fixed matrix any fixed comparison matrix, typically a minimizer of the total loss. An online-to-batch conversion turns a regret bound into a stochastic optimization error of order regret divided by . The theorem says Shampoo's regret grows like , the best possible rate in this setting, with a constant made of the traces of the final fourth roots. If every is convexwhy: the regret bound for preconditioned online gradient steps (Step 3) uses convexity to bound by and every has rank at most why: Step 1 splits the gradient into rank-one pieces, and the Cauchy-Schwarz inequality used there loses a factor ; with no rank bound one takes , then Shampoo with satisfies, for every ,where the largest distance from an iterate to the comparison matrix, . With and gradients of spectral norm at most 1, gives , and likewise , so the regret is at most . For a tensor with dimensions the bound is a product of traces of powers.
Measured gains. The theorem is for convex losses; the case for Shampoo in deep learning is empirical. On large models Anil et al. (2020) reached the same quality as Adam or AdaGrad in about half the steps on WMT'14 English to French translation with a Transformer, cutting training from about 12 to 6.7 hours, and reached the target AUC of a click-through-rate model in 31,000 steps where the tuned baseline needed 64,000. With the same hyperparameters as a tuned SGD-with-Nesterov recipe for ResNet-50 on ImageNet, Shi et al. (2023) reached the recipe's 90-epoch accuracy with 1.5 times fewer steps and 1.35 times less time. Across the eight AlgoPerf workloads their implementation trained about 28% faster on average than the NAdamWAdam with Nesterov momentum and decoupled weight decay, the AlgoPerf baseline baseline (Kasimbeg et al., 2025). SOAP reached AdamW's final loss with at least 40% fewer steps and 35% less time on 360M- and 660M-parameter language models trained with 2-million-token batches, and with about 20% less of both than Shampoo (Vyas et al., 2025). The costs are a slower step, about extra numbers per matrix for the factors and their roots or eigenvectors, eigendecompositions in float32 or float64, and the engineering in Steps 4 and 5.
Where it stands. Against Adam-type optimizers the Shampoo family needs fewer steps in every comparison above, and on AlgoPerf it was also fastest in time; elsewhere, whether it wins on time depends on how cheaply its matrix roots can be computed. Remove the sums and set , keeping the original power . Then and give for , with the inverse roots taken on the range of (the reduced singular value decomposition); a small gives instead (our check). This is Muon's orthogonalized update applied to the gradient, which Bernstein and Newhouse (2024) read as steepest descent under the spectral norm. With the square-root power the same computation gives , which enlarges the weakest directions most (our check), so Muon is the accumulation-free form of the original fourth-root Shampoo. Muon applies the map to its momentum instead of the gradient, every step and with no grafting, and approximates with a few matrix multiplications in bfloat16 that leave the singular values only roughly at one; it stores nothing beyond its momentum. On the speedrun's own comparison at about 2.7 billion tokens (Jordan et al., 2024), SOAP ended at Muon's loss, the distributed Shampoo slightly higher, and Adam clearly higher; Muon reached the target first, at 142 milliseconds per step on 8 H100 GPUs against 301 for SOAP and 154 to 179 for Shampoo (the times printed in the post's figure legends; Jordan et al. mark SOAP's implementation as under development). The speedrun also has an optimization track that scores the number of steps to a validation loss of 3.28 (modded-nanogpt Track 3 records). Its table lists Muon with no momentum and Shampoo with no accumulation, no momentum, power and roots every step as one entry, and its record as of November 2026 (2690 steps) runs Muon on momentum first preconditioned with SOAP's row and column statistics, refreshed every step. Open questions are how often to recompute the basis, whether full-matrix AdaGrad or Adam is the right target to approximate at all (Eschenhagen et al. end on this), and how the gains hold at the largest scales; SOAP's tests stop at 660M parameters.
One gradient's outer product is bounded by each one-sided factor. Write the gradient in its singular value decomposition , with the columns of , so . For any vectors , , because for every vector by Cauchy-Schwarz; hence . Bounding leaves , and bounding leaves :Each bound alone discards the structure of one side; the factor is the Cauchy-Schwarz loss over rank-one pieces.
The geometric mean of the two bounds is the Kronecker bound. Sum Step 1 over and add . With , this gives and . The two right sides commute, and for commuting positive semidefinite matrices the geometric mean is monotone in each argument (Ando et al.), soThe square roots come from splitting the two bounds evenly. Anil et al. (2020) split unevenly: weights and give for any , and keeps only the left factor, so AdaGrad's square root gives the step , which is how they precondition layers too large for a right factor.
AdaGrad's regret argument goes through with the Kronecker preconditioner. Write Shampoo's preconditioner on the vectorized weights, , so that the step is , so the step is ; increases with because and do. The standard bound for preconditioned online gradient steps with nondecreasing preconditioners givesThe sum is where Step 2 enters. Let , full-matrix AdaGrad's preconditioner with multiplied by . Step 2 times , and the operator monotonicity of the square root (Loewner), give . AdaGrad's own potential argument gives . Chaining the two, . Choosing balances the two terms at , and gives the theorem. The tensor case is the same argument with a geometric mean of one-sided bounds.
Roots on idle CPUs, partial preconditioners for large layers, and grafting make Shampoo run at scale. The inverse roots were the bottleneck, up to 100 times a training step. For a Transformer layer the factor's condition number was to during training, and an inverse root loses about of the condition number in bits of precision, so the roots need float64, which accelerators do slowly. Anil et al. compute them with the coupled Newton iterationan iteration for inverse matrix roots that uses only matrix products and stays numerically stable (Guo and Higham; Iannazzo); here started from the previous root, warm-started from the previous root, in float64 on the CPUs attached to the accelerators, asynchronously, and swap in new roots every few hundred steps; recomputing them that rarely had no significant effect on quality. Large layers get partial preconditioners: embedding and softmax layers use one side only (, from the unequal split in Step 2), and large dense layers are cut into blocks, each its own Shampoo matrix. Grafting from AdaGrad, or from the layer-wise scaling of LAMB, sets each layer's step length, because the preconditioners' norms spread over a wide range across layers and caused instability. They also report that treating the power as a hyperparameter sometimes helped, and they used the square root on each side in their autoencoder experiments. On a Transformer for WMT'14 English to French (93M parameters) Shampoo needed 1.95 times fewer steps at about 16% more time per step; on a click-through-rate model on the 1 TB Criteo data it reached the target AUC of 80.25% in 30,970 steps against 64,000; BERT-Large needed 16% fewer steps than LAMB; and ResNet-50 at batch size 32,768 reached 75.9% top-1 accuracy in 1,729 steps against 2,512.
Spreading the preconditioners across GPUs keeps the step within 10% of Adam's, and the result won AlgoPerf. In standard data-parallel training every worker repeats the whole optimizer step, which is cheap for Adam but would make some large models' Shampoo steps 50% to 75% slower. Shi et al. assign each layer's factors and grafting state to one worker, balanced greedily by size, let each worker compute only its layers' preconditioned directions, and gather the directions with one AllGather; the step then costs at most about 10% more than a diagonal method's. The roots use a symmetric eigendecomposition in float32 (retried in float64 if it fails), with the eigenvalues shifted to be at least . They describe grafting as one of the main requirements for Shampoo to work in practice, and report that the square-root power (or the fourth-root power multiplied by 1.82) is often effective for networks made mostly of linear layers. On ResNet-50 for ImageNet, with roots recomputed every 50 steps, blocks of at most 2048 dimensions and grafting from SGD with the tuned Nesterov recipe's hyperparameters unchanged, Shampoo reached 77.44% validation accuracy in 90 epochs against 76.85% (means over five seeds) at 8% more time, and the Nesterov 90-epoch accuracy with 1.5 times fewer steps and 1.35 times less time. With Adam grafting and roots every 100 steps, the implementation won the external-tuning track of AlgoPerf, about 28% faster on average than the NAdamW baseline and about 2% faster than the second-place entry, though five different entries were fastest on at least one workload (Kasimbeg et al., 2025).
is one power-iteration step toward the best Kronecker approximation, and one step is enough in practice. Rearrange so that the entry sits at row and column . A Kronecker product then becomes , the Frobenius distance is preserved, and multiplying the rearranged by gives ; this is the matrix form of power iteration in the mechanism above. Starting from and gives and . Why one step suffices: write the singular value decomposition of the rearranged as , with unit-norm matrices . One step from the identity gives , so it lands near the top factor when is large next to the other . The top factor is positive semidefinite, and among positive semidefinite matrices of unit Frobenius norm the scaled identity has the largest worst-case overlap with the others, while if is positive definite the later are not positive semidefinite, so their traces can cancel. In their measurements on binary MNIST, CIFAR-5M and ImageNet, the cosine similarity of with stayed close to that of the optimal Kronecker product throughout training, and Shampoo's was clearly lower, for both AdaGrad's statistic and the Gauss-Newton matrixthe Hessian of the loss with the network linearized at the current weights, , where is the Jacobian of the network output with respect to the weights and the Hessian of the loss in the output; for cross-entropy it equals with labels sampled from the model. If exactly, then and , so . Since practitioners tune the power anyway, the paper notes that squaring adds no new power to try; it changes which power to expect. For the Gauss-Newton reading they also find that averaging gradients over a batch is harmless with labels sampled from the model; with the real labels, as Shampoo uses, the approximation is still good at batch size 1 but degrades at larger batches, because real-label gradients do not average to zero.
In Shampoo's eigenbasis the square-root form is Adafactor, so SOAP runs Adam there instead. Take the idealized Shampoo with averages over the data, the square-root power and the trace factor, so entry of is divided by . Adafactor run on estimates by from its row sums and column sums , andwith the -th column of and the -th column of ; likewise , and . The two scales are the same. Shampoo can update its scale only when it recomputes , but the per-entry average is cheap, so SOAP keeps it as Adam does, with momentum SOAP's momentum, an exponential moving average of the gradient with rate , kept in the original coordinates and rotated each step and second moment SOAP's per-entry second moment, an exponential moving average with rate of the squared rotated gradient updated every step:Here the exponential-moving-average rates of the momentum and of the second moment (and of and ), as in Adam are Adam's rates, and and are themselves moving averages with rate . The basis is refreshed every 10 steps in the main runs by one step of power iteration with a QR decomposition, started from the previous ; one-dimensional parameters run plain Adam, and a very large dimension keeps the identity on its side. Grafting goes away, and the only hyperparameter beyond Adam's is how often to refresh the basis. Anil et al. (2020) had described essentially this algorithm for matrices in an appendix and reported no gain in unpublished experiments; Vyas et al. attribute the difference to implementation details. On 360M- and 660M-parameter language models with batches of 2 million tokens, SOAP needed at least 40% fewer steps and 35% less time than AdamW to reach AdamW's final loss, and about 20% less of both than the distributed Shampoo. As the refresh interval grew from 1 to 100 steps both beat AdamW throughout, they were close at 1, and SOAP lost quality much more slowly. At 256,000-token batches the gain fell to 25% fewer steps than AdamW and about 10% fewer than Shampoo. SOAP stores numbers per matrix, as the distributed Shampoo does, against AdamW's (both counts include the gradient). The times were measured on one GPU with gradient accumulation.
Grafting corrects Shampoo's eigenvalues, and a correct, current scale removes the need for it. Without grafting and with roots recomputed every 100 steps, Shampoo trained worse than AdamW at every learning rate and tried, for a vision transformer and a ConvNeXt V2 on Imagewoof, and many settings diverged. Any step of the form , with orthogonal , per-entry scales and a power , has Frobenius norm between and , so only the scale sets a step's length; the basis never does. For full-matrix Adam, diagonal Adam and the per-entry-corrected Shampoo, all with , the limits can be taken as and ; for Shampoo, with independent gradient entries, they carry the extra factor of the example in the mechanism above, and stale eigenvalues can push the step outside them. With roots recomputed every step, the trace-scaled square-root Shampoo matched or beat grafted Shampoo; with the basis recomputed every 100 steps and a per-entry scale updated every step, as in SOAP, the result matched or beat grafted Shampoo, and Adam's best learning rate carried over. On AlgoPerf workloads it needed 2,536 steps against 4,301 on FastMRI (10.4 against 14.0 minutes) and 8,320 against 12,574 on OGBG (means over the runs that reached the target), and about the same on ImageNet with a vision transformer. For the basis they propose recomputing a factor only when the rotated factor , with the last computed eigenvectors, has drifted from diagonal; while the tolerance of the adaptive rule: a factor's eigenbasis is recomputed only when the off-diagonal part of the rotated factor exceeds this fraction of its Frobenius norm, the old basis is kept. On the Imagewoof vision transformer, recomputing every 100 steps took 20% more time than this rule checked every 50 steps with . On the same vision transformer, an accurate basis mattered mostly early in training: a basis computed at the first step and never updated still beat AdamW (final training loss about 0.12 against 0.3), and the whole gap to AdamW came from the bases of two-dimensional parameters, so vectors can be left to Adam.
Terms
- Shampoo
- with running sums of , ; full-matrix AdaGrad with
- Rotate, rescale, rotate back
- with
- Kronecker bound
- rank gradients: ; gives regret
- Regret bound
- for convex losses
- Shampoo squared
- is one power-iteration step toward the best Kronecker approximation of ; exact up to when that is a Kronecker product
- Square-root power
- : AdaGrad's step under the Kronecker approximation; a power practitioners found by tuning
- Grafting
- rescale each layer's Shampoo step to the Frobenius norm of Adam's (or SGD's) step; compensates for mis-scaled, stale eigenvalues
- SOAP
- Adam run on the gradient rotated into Shampoo's eigenbasis; basis refreshed every 10 steps, scale every step; no grafting
- Shampoo and Adafactor
- in Shampoo's eigenbasis the trace-scaled square-root step is Adafactor, whose row and column sums are the eigenvalues of L and R
- Accumulation-free Shampoo
- with , Muon's map without momentum; with power it is
- Distributed Shampoo
- factors split across GPUs, directions gathered with one AllGather; at most about 10% slower per step than Adam; AlgoPerf external-tuning winner
Quiz
- Gradient entries of a layer are independent with variance . Why can one learning rate not give Shampoo (fourth roots, no grafting) Adam-sized steps on both a and a layer?Here and , so . The step length depends on the layer's shape, which grafting or a trace-scaled square root corrects.
- Removing the sums from Shampoo, so and for , gives Muon's with the original power and . What does the square-root power give instead?and , so the product is . On a single gradient the square-root power inverts the singular values.
- On the speedrun's comparison at about 2.7 billion tokens, SOAP matched Muon's loss per token. Why did Muon still reach the target first?With equal loss per token, time to target is set by time per step. SOAP's step took about twice as long as Muon's, whose orthogonalization is a few bfloat16 matrix multiplications; the post marks SOAP's implementation as still under development.
Sources
- Vineet Gupta, Tomer Koren, and Yoram Singer. Shampoo: Preconditioned Stochastic Tensor Optimization. ICML, 2018.
- Rohan Anil, Vineet Gupta, Tomer Koren, Kevin Regan, and Yoram Singer. Scalable Second Order Optimization for Deep Learning. arXiv preprint, 2020.
- Hao-Jun Michael Shi, Tsung-Hsien Lee, Shintaro Iwasaki, Jose Gallego-Posada, Zhijing Li, Kaushik Rangadurai, Dheevatsa Mudigere, and Michael Rabbat. A Distributed Data-Parallel PyTorch Implementation of the Distributed Shampoo Optimizer for Training Neural Networks At-Scale. arXiv preprint, 2023.
- Depen Morwani, Itai Shapira, Nikhil Vyas, Eran Malach, Sham Kakade, and Lucas Janson. A New Perspective on Shampoo's Preconditioner. ICLR, 2025.
- Nikhil Vyas, Depen Morwani, Rosie Zhao, Mujin Kwun, Itai Shapira, David Brandfonbrener, Lucas Janson, and Sham Kakade. SOAP: Improving and Stabilizing Shampoo using Adam. ICLR, 2025.
- Runa Eschenhagen, Aaron Defazio, Tsung-Hsien Lee, Richard E. Turner, and Hao-Jun Michael Shi. Purifying Shampoo: Investigating Shampoo's Heuristics by Decomposing its Preconditioner. NeurIPS, 2025.
- Priya Kasimbeg, Frank Schneider, Runa Eschenhagen, Juhan Bae, Chandramouli Shama Sastry, Mark Saroufim, Boyuan Feng, Less Wright, Edward Z. Yang, Zachary Nado, Sourabh Medapati, Philipp Hennig, Michael Rabbat, and George E. Dahl. Accelerating Neural Network Training: An Analysis of the AlgoPerf Competition. ICLR, 2025.
- Jeremy Bernstein and Laker Newhouse. Old Optimizer, New Norm: An Anthology. OPT 2024 workshop, 2024.
- Keller Jordan et al. Muon: An optimizer for hidden layers in neural networks. Blog post, 2024.
- Keller Jordan et al. Modded-NanoGPT optimization benchmark (Track 3): records and active techniques. GitHub repository, 2026.