GS-MoE: Training-Free MoE Compression via Groupwise Subspace Sharing and Pruning

Carson Cary, Yukai Jin, Yihao Huang, Zhankai Ye, Fangyi Li, Ting Hua, Xin Liu, Shangqian Gao · arXiv 2610.32009 · 发表 2026-10-23
12 分钟阅读时长 4535字 4.10综合分 第 4 名10-26 Infra 日报
目录 · 7 节1它到底在解决什么问题?2方法:分组共享加删神经元3分组真的有用吗?4实验结果5我认为的局限6一个团队可以怎么试7一句话结论
相关 4新颖 4实用 4证据 4时效 5

混合专家模型(MoE)每个 token 只激活少数几个专家,算得省,但所有专家的参数都得放在显存里,部署时最先卡住的往往是显存。这篇论文提出 GS-MoE,不需要任何再训练,从两个方向同时压缩专家:一是把相似的专家分成组,组内共用一对输入和输出投影,每个专家只保留一个小的私有矩阵;二是在每个专家内部删掉不重要的中间神经元,并用保留下来的神经元近似还原被删掉的部分。在 DeepSeek-MoE-16B 上去掉 60% 的参数后,7 项推理任务的平均准确率还保留了原模型的约 90%,对比方法 D2-MoE 只保留了 73%。

在显存紧张的机器上部署细粒度 MoE(专家多、每个专家小,比如 DeepSeek 和 Qwen2 的 MoE 版本)的团队值得看。它只需一次前向收集统计量、一张卡就能压缩,代码公开,成本很低。但要注意两点:它在专家少而大的 Mixtral 上并不占优;而且论文自己的拆解实验显示,大部分收益来自“删神经元”这一半,“分组共享”这一半的增益在多数设置下不大。

它到底在解决什么问题?

MoE 模型把一层前馈网络换成几十个并列的“专家”,每个 token 由路由器挑出其中几个来算。比如 DeepSeek-MoE-16B 每层有 64 个专家,每个 token 只用 6 个。计算量因此下降,但另外 58 个专家的参数仍然要常驻显存,因为下一个 token 可能就要用到它们。

已有的压缩方法大致有三类。第一类直接删掉或合并整个专家,删多了效果掉得很快。第二类让所有专家共用一套低秩基底,比如 MoE-SVD;但整层只有一个共用的子空间,某个专家独特的方向如果不在里面,就再也表示不出来。第三类是 D2-MoE(共享一份基础权重、每个专家只存压缩后的差值),也是把整层绑在一起。另外还有只删专家内部神经元的做法,它不利用专家之间的共性,每个专家仍然各存各的。

作者的出发点是:专家之间的共性不是整层统一的,而是一部分专家彼此相似。那就应该先分组,组内共享,组和组之间各用各的子空间,同时把专家内部的冗余也一起压掉。

方法:分组共享加删神经元

论文图 1:GS-MoE 的结构。左边是未压缩的专家,一个上投影矩阵和一个下投影矩阵。右边是压缩后,专家被分成 G 个大小相同的组,每组共用一个输入投影 P↑ 和一个输出投影 P↓,组内每个专家只保留自己的小矩阵 A↑ 和 A↓;斜线格子表示被删掉的部分,可以看到不同组的共享维度不同,不同专家保留的神经元数也不同。
论文图 1:GS-MoE 的结构。左边是未压缩的专家,一个上投影矩阵和一个下投影矩阵。右边是压缩后,专家被分成 G 个大小相同的组,每组共用一个输入投影 P↑ 和一个输出投影 P↓,组内每个专家只保留自己的小矩阵 A↑ 和 A↓;斜线格子表示被删掉的部分,可以看到不同组的共享维度不同,不同专家保留的神经元数也不同。

压缩后,一个专家的计算变成四步:输入先乘组共享的输入投影,压到一个较低的维度;再乘这个专家自己的小矩阵,得到保留下来的中间激活;过激活函数后,乘这个专家自己的另一个小矩阵回到低维;最后乘组共享的输出投影,回到模型维度。显存的节省来自两处:共享投影一组只存一份,私有矩阵因为两边都变小而很小。

具体有四个环节。

第一步是挑神经元。作者用一批校准数据跑一遍原模型,记录每个专家中间激活的统计量,再用一个叫岭杠杆分数的指标衡量每个神经元有多“不可替代”:一个神经元的激活如果能被其他神经元的组合很好地表示,分数就低,可以删。一层里所有专家的神经元放在一起排序,取前 K 个,所以不同专家保留的宽度不一样。K 由总预算决定,见后面第四步。

第二步是求投影。输出那一侧有闭式解:组内各专家输出的协方差加起来,取前几个特征向量就是共享输出投影。输入那一侧没有闭式解,因为各专家看到的输入分布不同。作者的做法是:先把组内各专家的输入协方差按路由到它的 token 数加权平均,当作整组共用的输入分布,在这个平均分布下求共享输入投影。目标是:输入经过低维投影后,组内每个专家保留神经元的激活前的值仍能被重建出来。在平均分布下这有近似解:对每个专家,用它保留下来的那几行上投影矩阵,算出“转置乘自身”,得到一个模型维度乘模型维度的方阵(所以各专家保留的神经元数不同也不影响大小);把这些方阵按 token 数加权求和,左右各乘一次平均输入协方差的平方根,对结果取前若干个特征向量,再乘上协方差平方根的逆并正交化,就是共享输入投影;共享投影固定后,再用每个专家自己的输入协方差做一次最小二乘,求出它的私有矩阵,让它在自己的输入上重建保留神经元的激活误差最小。被删掉的神经元,用 Nyström 近似(用保留下来的那几列来还原整个协方差矩阵的经典方法)补偿:根据校准时记录的中间激活协方差,算出一个线性映射,用保留神经元的激活预测完整的中间激活;再把这个映射乘进下投影的私有矩阵。这样下投影只读保留的神经元,输出却近似于原来全部神经元的贡献。

第三步是分组。作者推出了一个打分:给定一个候选子空间,某个专家放进去后重建误差能降低多少。具体做法是:先为每个专家单独拟合一个子空间,然后把专家 i 放进专家 j 的子空间里,重建专家 i 保留神经元的激活前值和专家 i 的输出,两项误差相加(删神经元会让激活前值那一项变小,所以输出那一项要乘一个系数来平衡;系数等于删神经元后,所有专家上投影输出的能量保留下来的比例),算出总误差比“什么都不重建”时降低了多少;再除以专家 i 放进自己子空间时的降低量。这个比值越接近 1,说明 j 的子空间几乎和 i 自己的一样好用,1 减去这个比值就是两者的不相似度。有了 64×64 的不相似度矩阵,再做大小均衡的聚类,每组专家数相同。

第四步是分配容量。层与层之间,先给每层打一个重要性分数:对路由到某个专家的每个 token,取专家输出向量的长度,乘以路由权重,再除以输入向量的长度;在该专家的所有 token 上取平均,再把这一层所有专家的平均值加起来。预算分配分三步。先由目标压缩比算出专家参数整体要保留的比例 R,再用一个超参数 ν 把它拆成“宽度保留比例取 R 的 ν 次方”,ν 默认在 0.45 到 0.55 之间。共享维度的保留比例再由 R 反推:压缩后每多保留一维共享维度,要同时付出共享投影和所有私有矩阵各一列的参数,所以共享维度保留比例等于 R 除以“宽度保留比例加上共享投影的开销比例”,开销比例是组数乘模型维度,再除以专家数乘中间维度。然后把需要删掉的宽度和维度按重要性分摊到各层:对每层分数取对数后加负号,除以一个温度,再做 softmax 得到各层的删减份额;因为加了负号,分数越低的层份额越大,删得越多。最后各层宽度不动,把各层的共享维度乘同一个系数,让全模型保留的专家参数正好等于 R;层内先按前面的神经元分数定好每个专家的宽度,再分配各组的共享维度:第二步求投影时用到的那些矩阵,其前 t 个特征值之和衡量“给这一组 t 维能降低多少误差”。在这一层的参数预算内,作者让各组的这个和加起来最大,每组维度限定在平均值的 0.35 倍到 2.5 倍之间,用二分搜索拉格朗日乘子近似求解,剩余预算再贪心补齐。

整个过程只需要一次前向收集统计量,用的是 512 条 Alpaca 样本、每条 2048 个 token,一张 GPU 即可完成,压缩后不做任何训练。

分组真的有用吗?

论文图 2(c):DeepSeek-MoE-16B 第 22 层 64 个专家两两之间的不相似度,颜色越深越相似。横轴是按每个专家拟合的子空间,纵轴是被评估的专家,白框是最终分出的 8 个组。框内颜色明显更深,说明聚到一组的专家确实更适合共用一个子空间;也有几行整行偏亮,对应和谁都不太像的专家。
论文图 2(c):DeepSeek-MoE-16B 第 22 层 64 个专家两两之间的不相似度,颜色越深越相似。横轴是按每个专家拟合的子空间,纵轴是被评估的专家,白框是最终分出的 8 个组。框内颜色明显更深,说明聚到一组的专家确实更适合共用一个子空间;也有几行整行偏亮,对应和谁都不太像的专家。

作者在 DeepSeek-MoE-16B、60% 压缩、只做分组共享不删神经元的设置下做了消融。不分组时 WikiText-2 困惑度是 29.49;按打分分组后降到 25.23,因为组内专家更相似,共享子空间损失更小。再加上组间的维度分配,三个数据集上平均又降了 0.57。如果不分组,单做维度分配基本没有改善。

分组还有一个副作用:同一个 token 选中的几个专家如果落在同一组,共享投影只需算一次。在 8 组的设置下,每个 token 平均只触发 3.68 个组,比随机分组少约 19%。

实验结果

作者在三个模型上和 MoE-SVD、D2-MoE、TD-MoE 等方法比较,指标是 7 个零样本推理任务的平均准确率,以及 WikiText-2 和 PTB(另一个语言建模测试集)上的困惑度。压缩比指整个模型参数量的减少比例。

模型与压缩比原模型D2-MoEGS-MoE
DeepSeek-MoE-16B,40%0.560.490.54
DeepSeek-MoE-16B,60%0.560.410.50
Qwen2-57B-A14B,40%0.590.580.59
Mixtral-8x7B,40%0.630.570.57
Mixtral-8x7B,60%0.630.520.50

上表是 7 项任务的平均准确率。在两个细粒度模型上 GS-MoE 优势明显:DeepSeek 60% 压缩时 0.50 对 0.41;Qwen2 在 60% 压缩时平均准确率仍是 0.59,和原模型持平,第二好的 TD-MoE 只有 0.52。但在只有 8 个大专家的 Mixtral 上,它和 D2-MoE 打平,60% 时还略差,说明它的优势主要来自专家多而细的结构。

困惑度的情况更复杂。DeepSeek 60% 压缩时,GS-MoE 在 PTB 上是 22.21,比 D2-MoE 的 27.73 低 20%,这是摘要里“域外困惑度低 20%”的来源;但在 WikiText-2 上它是 17.55,明显差于 D2-MoE 的 11.67。所以“哪个更好”取决于你看哪项指标。

速度上,60% 压缩的 Mixtral 在 B200 上,GS-MoE 不分组时每秒 374.77 个 token,是 D2-MoE 的 3.32 倍,因为 D2-MoE 每个专家要额外还原残差。分组数从 1 加到 8,DeepSeek 上吞吐只降了 9.6%。

我认为的局限

第一,两部分的贡献不均衡。附录里把方法拆成“只分组共享”和“只删神经元”分别测:在 Qwen2 和 Mixtral 上,只删神经元的版本和完整方法几乎一样;只有在 DeepSeek 60% 压缩时,完整方法才明显更好(0.503 对 0.487)。也就是说,很多场景下只用 Nyström 删神经元就能拿到大部分收益。

第二,专家少而大的模型不适用。作者自己也承认,Mixtral 的中间维度大、专家只有 8 个,降子空间维度伤害更大,分组也没什么可分的。

第三,只评测了语言建模和多选推理题,没有生成类任务、长文本和代码,也没有和量化方法组合测试。实际部署中 MoE 更常见的做法是量化或把冷门专家放到内存里,这篇没有与之比较。

一个团队可以怎么试

  1. 先确认你的模型是细粒度 MoE,专家数在 64 个左右或更多。
  2. 先只跑“删神经元”的部分,在你自己的评测集上看 40% 压缩时的损失,这一步最便宜。
  3. 如果要压到 60% 左右,再加上分组共享,同时检查生成质量,而不只是困惑度。
  4. 分组数从小往大试,每一档都测吞吐,因为组越多共享投影越多,速度会略降。

一句话结论

细粒度 MoE 的专家之间有局部相似性,先分组共享、再删冗余神经元,可以不经训练压掉 60% 的参数而保住大部分推理能力;但大部分收益来自删神经元,专家少的模型上不占优。

维度评价
问题重要性中高。MoE 的显存占用是部署的直接障碍
方法创新性中。分组打分和容量分配是新的,各个组件都是已有工具
实验证据中。三个模型、多个压缩比,有消融和吞吐;困惑度和准确率结论不一致,缺生成任务
工程成本低。不训练,一次前向,单卡完成,代码公开
是否值得尝试在显存受限环境部署细粒度 MoE 的团队可以试,先从删神经元开始

读完这篇,你觉得

点一下即可,无需登录;再点一次撤回。只统计匿名次数,不记录你是谁。

讨论

欢迎补充实验细节、复现经验或不同看法。需 GitHub 登录。

正在加载讨论…