Muon: An optimizer for hidden layers in neural networks
引言
- 在深度学习领域,优化算法对模型训练效率和性能起着关键作用。从经典的随机梯度下降 (SGD) 及其动量法,到自适应优化方法 Adam/AdamW 等,一系列优化器大大加速了神经网络的收敛。然而,随着模型规模和数据量的爆炸式增长,研究者们不断探索更高效的新型优化策略,以进一步缩短训练时间和提高性能
- Muon (Momentum Orthogonalized by Newton-Schulz) 便是近期引起广泛关注的创新成果之一,代表一种利用牛顿–舒尔茨迭代对梯度动量进行正交化处理的优化算法。Muon优化器专门针对神经网络隐藏层的二维权重参数设计,其核心思想是在每次参数更新前,对梯度更新矩阵进行近似正交化处理,从而改善优化动力学。凭借这一独特机制,Muon 在实际训练中取得了惊人的加速效果:例如,它被用于 NanoGPT 和 CIFAR-10 等任务的训练,并刷新了这些任务的速度纪录
- 一句话总结 Muon 的原理:利用牛顿–舒尔茨迭代高效地逼近梯度矩阵的正交化形式,并将其用于更新神经网络中的二维权重参数,从而加速训练收敛
Muon 相关链接
- 代码实现:https://github.com/KellerJordan/Muon
- 博客介绍:
- https://kellerjordan.github.io/posts/muon/
- https://jeremybernste.in/writing/deriving-muon
背景
Muon 优化器的设计初衷是针对神经网络中的线性变换层(即权重为矩阵的层,例如全连接层、卷积层等)提供一种专门优化方案。传统优化器(如 SGD 或 Adam)对所有参数一视同仁地应用统一的更新规则,而 Muon 采取了一种模块化的视角:根据层类型的不同采用不同的优化策略,以充分利用每类层结构的特性。这种“为不同网络模块定制优化器”的理念正是深度学习优化最新趋势的一部分。Muon 优化器聚焦于二维权重矩阵参数(例如全连接层的权重矩阵或卷积核张量展平后的矩阵),通过对这些矩阵形式的梯度更新进行特殊处理,以提升优化效果

Muon 优化器具体实现
Muon 是针对神经网络隐藏层二维参数的优化器。其算法定义如下:
- 梯度计算与动量累积:在每次参数更新迭代 t t t,首先计算当前参数 θ t − 1 \theta_{t-1} θt−1的梯度 G t = ∇ θ L t ( θ t − 1 ) G_t = \nabla_{\theta}\mathcal{L}t(\theta{t-1}) Gt=∇θLt(θt−1)。然后将其累积到动量矩阵 B t B_t Bt中,即 B t ← μ B t − 1 + G t B_t \leftarrow \mu B_{t-1} + G_t Bt←μBt−1+Gt,其中 μ \mu μ是动量超参数(类似于SGD动量法中的动量因子)。初始化时 B 0 = 0 B_0 = 0 B0=0。
- 以下伪代码(Algorithm 2 Muon)展示了Muon优化算法的主要循环步骤,其中 B t B_t Bt表示动量梯度累积, μ \mu μ是动量系数, η \eta η是学习率。在每次迭代中,先计算梯度 G t G_t Gt并累积到 B t B_t Bt中,然后对 B t B_t Bt执行Newton-Schulz迭代(即步骤5的 O t ← N e w t o n S c h u l z 5 ( B t ) O_t \leftarrow \mathrm{NewtonSchulz5}(B_t) Ot←NewtonSchulz5(Bt)),最后用得到的正交化更新 O t O_t Ot对参数进行梯度下降更新(步骤6)

其中,‘NewtonSchulz5’被定义为以下 Newton-Schulz 矩阵迭代
# Pytorch 代码
def newtonschulz5(G, steps=5, eps=1e-7):assert G.ndim == 2a, b, c = (3.4445, -4.7750, 2.0315)X = G.bfloat16()X /= (X.norm() + eps)if G.size(0) > G.size(1):X = X.Tfor _ in range(steps):A = X @ X.TB = b * A + c * A @ AX = a * X + B @ Xif G.size(0) > G.size(1):X = X.Treturn X
牛顿–舒尔茨迭代介绍
这一步是 Muon 的核心创新,即对累积梯度 B t B_t Bt应用 Newton-Schulz 迭代以计算其近似正交化矩阵 O t O_t Ot。Newton-Schulz 迭代是一种用于近似计算矩阵函数(例如矩阵平方根或逆)的算法。这里它被用于逼近 B t B_t Bt的逆平方根(或相关变换),以达到正交化的效果。Muon使用固定步数的Newton-Schulz迭代来处理 B t B_t Bt,典型地迭代 5 次就能取得足够精度。在实现中,作者选择在半精度(bfloat16)下运行该迭代以提高效率,并发现这种迭代在低精度下仍然数值稳定。相比直接进行奇异值分解(SVD),Newton-Schulz迭代可以充分利用GPU的并行计算能力,大幅降低计算开销。例如,作者最初实现的Newton-Schulz迭代每次更新对形状为 n × m n\times m n×m的参数需约 6 n m 2 6n m^2 6nm2次浮点运算,随后经过改进将复杂度降低到 4 n m 2 + 2 m 3 4n m^2 + 2 m^3 4nm2+2m3(在实际中 m ≤ n m \le n m≤n,因此复杂度进一步受限于参数矩阵较小的一维),显著提升了运算效率。通过这样处理,Muon在每步更新中增加的计算和内存开销相对可控,却换来了更有效的梯度方向调整。
Muon 原理分析
Muon 在每次迭代时首先使用常规方法计算梯度并累积动量,然后对动量梯度矩阵进行**正交化(orthogonalization)**处理,再用于更新权重。所谓对梯度矩阵正交化,是指找到一个与原梯度矩阵最接近的“半正交矩阵”作为更新,其中“半正交”意味着矩阵的行向量或列向量是正交的(满足 O T O = I O^T O = I OTO=I 或 O O T = I O O^T = I OOT=I )。等价地,这相当于将梯度矩阵进行奇异值分解 G = U S V T G=USV^T G=USVT ,然后用 U V T UV^T UVT (即将奇异值矩阵 S S S 置为单位矩阵)替换原梯度——这一结果被称为“正交化梯度”。Muon 的更新步骤正是用这样的正交化梯度替代原始梯度动量进行参数调整。
那么,引入正交化的直观意义何在? 简单来说,它可以丰富更新的方向性。研究者通过对 Transformer 等网络的梯度观察发现,传统优化器产生的梯度更新矩阵往往条件数很高,接近于秩亏(也就是被少数几个主导方向所支配)。换言之,许多神经元对应的更新方向非常相似,梯度矩阵接近低秩。这意味着一些“罕见方向”(对应较小奇异值的方向)在更新中作用很弱,但这些方向可能对进一步降低损失仍然重要。通过正交化处理,Muon 实质上放大了这些罕见方向在更新中的作用,因为正交化将所有奇异值归一,无论原本大小,从而赋予每个独立方向以均等的尺度权重。这种调整有助于避免训练过程中某些重要方向被忽略,提高了搜索参数空间的效率。 从经验上看,正是这种对梯度更新方向分量的重新均衡,使得 Muon 相较于传统优化方法展现出更快的收敛和更高的效率。
Muon 实践注意事项
在具体实现中,还有一些实用技巧和细节:首先,Muon 目前仅针对二维权重张量(包括将卷积核展平成矩阵的情况)应用。对于标量或向量参数(例如偏置项、LayerNorm 中的缩放参数等),以及输入层和输出层的权重,作者建议仍采用常规优化器 (如 AdamW) 进行训练。这部分原因在于:嵌入层(输入层)参数的优化动态确实有别于其他层,需要特殊对待;输出层是否需要区别对待则是基于经验的优化选择。实际实验表明,如果对 Transformer 模型的词嵌入层和最后分类头仍使用 AdamW 优化,而对中间的线性层使用 Muon 优化,能够取得最佳性能。其次,在动量的具体形式上,Muon 采用Nesterov动量略优于传统动量,因此作者在公开实现中将 Nesterov 作为默认方案。最后,对于 Transformer 中特有的多头注意力,研究者发现将查询 Q、键 K、值 V 各自的权重矩阵分别应用 Muon 优化效果更佳,而不是将它们合并为一个大矩阵一起正交化。这一拆分处理使每个子矩阵的正交化更精确,有助于训练稳定。上述这些实现层面的经验总结,体现了 Muon 在不同网络结构中的适配性和灵活性。
实验
-
Muon 取得以下优化结果
- 将 CIFAR-10 训练到 94% 准确率的速度记录从 3.3 A100-秒提高到 2.6 A100-秒
- 在 FineWeb 上将训练到 3.28 验证损失(一项被称为 NanoGPT 速度竞赛的竞争任务)的速度记录提高了 1.35 倍。
- 在扩展到 7.74 亿和 15 亿参数时,持续显示训练速度的改进。
- 在 10 个 8xH100 小时内,将一个 15 亿参数的 Transformer 训练到 GPT-2 XL 在 HellaSwag 上的性能水平。使用 AdamW 实现相同结果需要 13.3 小时。
-
下图展示了在NanoGPT语言模型任务中,不同优化器随时间推进的验证集损失下降曲线(横轴为在8×H100 GPU上消耗的实际时间,纵轴为验证损失)比较。可以看到,Muon(紫色曲线)相对于标准的Adam(蓝色)收敛更快。与此同时,图中标注的每步迭代耗时显示,Muon每步约142毫秒,与Adam的139毫秒几乎相当。这意味着Muon在提供更快收敛的同时,并未引入明显的单步时间开销

Muon 后续工作进展
- kimi 团队对 Muon 做了进一步优化:https://ar5iv.labs.arxiv.org/html/2502.16982
- 由于Muon需要对每个二维权重矩阵执行Newton-Schulz迭代,如果在分布式环境下一个矩阵分散在不同设备上,如何高效地完成迭代成为一个问题。kimi 这里开发了内存优化且通信高效的分布式Muon实现。
- 最初的Muon实验主要集中在十亿参数量级以内的模型上(如1.5B参数的Transformer)。一个悬而未决的问题是:Muon能否在数百亿乃至上万亿参数、万亿级别token数据的大规模训练中保持优势并稳定运行?kimi 这里的结果展示了通过在 Muon 中引入权重衰减(weight decay)以及按参数尺度调整更新幅度等改进,可以使 Muon 在无需特殊超参数调优的情况下,直接应用于超大规模模型的训练


总结
- Muon 激发了人们对于优化器创新的热情——长久以来,Adam/AdamW 几乎是大多数任务的不二之选,而 Muon 证明了通过深入挖掘梯度结构特性,我们仍能找到显著优于现有方法的新途径。
- 当然,Muon 目前也并非完美无缺。它对模型结构有特定假设(主要作用于稠密的线性层),在一些场景下的通用性还有待进一步验证。此外,对于更大规模模型、更长训练阶段(如微调、强化学习等)的效果也需要更多实验来检验
相关文章:
Muon: An optimizer for hidden layers in neural networks
引言 在深度学习领域,优化算法对模型训练效率和性能起着关键作用。从经典的随机梯度下降 (SGD) 及其动量法,到自适应优化方法 Adam/AdamW 等,一系列优化器大大加速了神经网络的收敛。然而,随着模型规模和数据量的爆炸式增长&…...
网络安全运维应急响应与溯源分析实战案例
在日常运维过程中,网络安全事件时有发生,快速响应和精准溯源是保障业务稳定运行的关键。本文将通过一个实际案例,详细解析从发现问题到溯源定位,再到最终解决的完整流程。 目录 一、事件背景 二、事件发现 1. 监控告警触发 2…...
【VSCODE 插件 可视化】:SVG 编辑插件 SVG Editor
插件下载 svgeditor 创建文件 Windows/Linux 快捷键 Ctrl Shift P 打开VSCODE 命令面板查找 New File With Svg Editor 编辑文件 保存文件 打开文件以继续编辑 CG 选中多个:shift单击没找到横向分布功能无法用键盘微调位置...
Cursor插件市场打不开解决
问题现象: cursor搜索插件的时候提示错误,无法搜索安装插件 error while fetching extensions.failed to fetch 问题原因 cursor默认安装使用的并不是vs code的插件市场,国内网络有时候打不开 解决 修改插件市场地址并重启cursor 打开cur…...
嵌入式开发之STM32学习笔记day06
基于STM32F103C8T6的开发实践——从入门到精通01 1. 引言 STM32系列微控制器是STMicroelectronics推出的一款高性能、低功耗的32位微控制器,广泛应用于嵌入式系统中。STM32F103C8T6是其中非常受欢迎的一款,凭借其强大的性能、丰富的外设接口和低廉的价格…...
K8S学习之基础三十五:k8s之Prometheus部署模式
Prometheus 有多种部署模式,适用于不同的场景和需求。以下是几种常见的部署模式: 1. 单节点部署 这是最简单的部署模式,适用于小型环境或测试环境。 特点: 单个 Prometheus 实例负责所有的数据采集、存储和查询。配置简单&…...
AI驱动的视频字幕提取与翻译工具
青梧字幕是一款基于Whisper技术的AI字幕提取工具,专为视频制作者、翻译人员和自媒体创作者设计。它通过先进的语音识别算法,能够自动从视频文件中提取字幕内容,并支持多种语言和字幕格式,极大地简化了字幕制作流程。 目前暂支持 …...
Android ARouter的详细使用指南
Android ARouter的详细使用指南。我需要先确定用户的基础,可能他们已经有Android开发经验,但对ARouter不太熟悉。首先,我应该介绍ARouter是什么,解决什么问题,比如模块化中的页面跳转问题。然后,需要分步骤…...
【MySQL】MySQL审计工具Audit Plugin安装使用
MySQL审计工具Audit Plugin安装使用 https://www.cnblogs.com/waynechou/p/mysql_audit.html MySQL 5.6 开启审计功能 https://blog.51cto.com/u_15127556/4344503 MySQL之添加日志审计功能 https://blog.csdn.net/weixin_43279032/article/details/105507170 MySQL开启日志记录…...
游戏引擎学习第163天
我们可以在资源处理器中使用库 因为我们的资源处理器并不是游戏的一部分,所以它可以使用库。我说过我不介意让它使用库,而我提到这个的原因是,今天我们确实有一个选择——可以使用库。 生成字体位图的两种方式:求助于 Windows 或…...
JVM常用概念之锁省略
问题 synchronized(同步-重量级锁)会解除所有编译器优化吗? 基础知识 使用当前的 Java 内存模型,未观察到的锁不一定会产生任何内存效应。除其他情况外,这意味着对非共享对象进行同步是徒劳的,因此运行时不必在那里做任何事情。这给编译优…...
用python代码将excel中的数据批量写入Json中的某个字段,生成新的Json文件
需求 需求: 1.将execl文件中的A列赋值给json中的TrackId,B列赋值给json中的OId 要求 execl的每一行,对应json中的每一个OId json 如下: {"List": [{"BatchNumber": "181-{{var}}",// "Bat…...
《我的Python觉醒之路》之转型Python(十五)——控制流
[今天是2025年3月17日,继续复习第一章节、第二章节的内容 ] 《我的Python觉醒之路》之转型Python(十四)——控制流...
路由器与防火墙配置命令
路由器与防火墙配置命令 小明啊,你不是学计算机的嘛,叔叔家的路由器坏了,可以过来帮叔叔看看吗 命令可以用缩写,造就一堆容易造成歧义的缩写,比如add是address的缩写,sh是shutdown的缩写。 默认为Cisco路…...
PosterRender 实现微信下程序 分享商品生成海报
PosterRender 是什么 PosterRender 是一种专注于生成高质量海报图像的技术或工具,常用于生成静态图片,特别是适合用于营销、宣传和展示的图形设计。它通常用于在服务端或客户端渲染复杂的图像,包括文字、图形、图标、背景等,生成…...
C语言及内核开发中的回调机制与设计模式分析
在C语言以及操作系统内核开发中,回调机制是一种至关重要的编程模式。它通过注册框架和定义回调函数,实现了模块间的解耦和灵活交互,为系统的扩展性和可维护性提供了有力支持。本文将深入探讨这种机制的工作原理、应用场景以及与设计模式的关联。 一、回调机制的核心概念 (…...
第27周JavaSpringboot git初识
Git 课程笔记 一、Git 的介绍 1. Git 的诞生背景 Git 是 Linux 内核的作者 Linus Torvalds 为了更好地管理 Linux 内核开发而创建的版本控制系统。在 Linux 内核开发初期,由于开发者众多,协作成本很高,后来使用了 BitKeeper 工具来辅助协作…...
代码随想录算法训练营第34天 | 62.不同路径 63. 不同路径 II 整数拆分 不同的二叉搜索树 (跳过)
62.不同路径 62. 不同路径 - 力扣(LeetCode) 本题大家掌握动态规划的方法就可以。 数论方法 有点非主流,很难想到。 代码随想录 视频讲解:动态规划中如何初始化很重要!| LeetCode:62.不同路径_哔哩哔哩_b…...
Java使用JDBC连接操作Sqlite 笔记250314
Java使用JDBC连接操作Sqlite 以下是使用 Java JDBC 连接和操作 SQLite 数据库的详细步骤: 1. 添加 SQLite JDBC 驱动 在项目中引入 SQLite JDBC 驱动依赖。 Maven 项目在 pom.xml 中添加:<dependency><groupId>org.xerial</groupId>…...
消息队列导致数据库数据读取不一致解决方案
我使用的是在数据库添加一个版本字段,记录版本,保证版本一致性,就能保证每次读取的是需要的内容。 具体问题:使用消息队列时,发送方给接收方发送消息,接收方修改了数据库的同时发送方查询数据库࿰…...
如何利用 Zeabur 实现 OceanBase 的一键部署
引言 Zeabur 是一个功能强大且即开即用的自动化部署平台,它不仅能迅速部署多种应用,还支持一键安装 MySQL、PostgreSQL 等数据库服务。 Zeabur 拥有众多国内外用户,如 AFFiNE、Bytebase 等企业客户,以及大量全栈和独立开发者。将…...
计算机网络进化论:从比特流到量子通信的深层解构
第一章 物理媒介与链路层(1960-1970) 1.1 比特流物理编码 // 曼彻斯特编码实现 vector<bool> manchester_encode(uint8_t byte) {vector<bool> bits;for(int i=7; i>=0; --i) {bool bit = (byte >> i) & 1;bits.push_back(bit); // 前半周期bits…...
超参数优化算法:scikit-opt库、Scikit-Optimize库
1 scikit-opt库:https://www.cnblogs.com/luohenyueji/p/18333387 https://blog.csdn.net/weixin_45750972/article/details/124683402 a 差分进化算法 (Differential Evolution):一种基于群体搜索的优化算法,通过模拟生物进化的过程来寻找最…...
go语言学习教程推荐,零基础到做项目
一、基础入门阶段 官方教程(免费) • A Tour of Go:交互式入门教程,边学边练 • Go by Example:通过300代码片段学习语法 入门书籍 • 📘《Go语言圣经》中文版(免费在线阅读)&#…...
【商城实战(30)】从0到1搭建商城数据分析功能,开启数据驱动增长引擎
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
(hash表+vector 数位和相等数对的最大和)leetcode 2342
一定要断点调试看看数据对不对的上!!!不然很容易弄不清楚值和下标 这个题意思是在nums中找出相同数位和的值 如 数位和为7 nums中符合要求的有 43,7 在这些数中选两个相加取最大值,再与其他数位和取得的相加最大值比…...
c++中字符串string常用的函数
在C中, std::string 类有许多常用函数,以下是一些常见的: 1. length() 或 size() :返回字符串的长度(字符个数),二者功能相同。例如: #include <iostream> #include <str…...
NO.39十六届蓝桥杯备战|结构体八道练习|加号小于号运算符重载|自定义排序(C++)
加号运算符重载_牛客题霸_牛客网 #include <iostream> using namespace std;class Time {public:int hours; // 小时int minutes; // 分钟Time() {hours 0;minutes 0;}Time(int h, int m) {this->hours h;this->minutes m;}void show() {cout <<…...
kmp报错→Cannot find skiko-windows-x64.dll.sha256
1、前言 学习kmp(Kotlin MultiPlatform简称)过程中报了错误,这个报错在直接运行desktop的main方法才会出现,用gradle运行却不会报错,新建的kmp项目也不会出现,我学习的写了一些代码的项目才会出现。 运…...
Cocos Creator Shader入门实战(四):预处理宏定义和Chunk
引擎: 3.8.5 您好,我是鹤九日! 回顾 学习Shader,前期是让人烦躁无味的,后期可能就是各种的逻辑让人抓耳挠腮。 一成不变的内容:遵循引擎设定的规则,理解引擎要求的规范。 这里,简单…...
