MoE 压缩(一)Pruning
MoE 压缩(一)Pruning
NAEE
Not All Experts are Equal: Efficient Expert Pruning and Skipping for Mixture-of-Experts Large Language Models(ACL’24)
Method
枚举式剪枝 给定保留专家的数量 , 枚举剪枝集合 ,计算剪枝前的MoE层 和剪枝后的 ,计算重建损失:
很显然枚举只使用于Mixtral-8x7B这种专家数量极少的模型,对于目前包含上百专家的前沿SMoE,计算成本是不现实的。
动态跳过 根据routing weights判定是否跳过专家的计算。具体的,例如当激活专家数量为 时,考虑被激活的权重 ,当 时,不计算 。超参数 可以设置为在校准数据集上关于 的中位数。
Experiment
- 验证模型Mixtral-8x7B,Mixtral-8x7B-Instruct
- 校准集为C4,128条2K样本
- 剪枝时间30min(r=6),90min(r=4)
MoE-I
MoE-I^2: Compressing Mixture of Experts Models through Inter-Expert Pruning and Intra-Expert Low-Rank Decomposition(EMNLP’24 findings)
Method
专家间剪枝
- 估计每层的重要性 - 刨掉某个专家,计算lmloss作为该专家的重要性:
每一层的重要性就是所有专家取个总和 ,归一化之后就得到每层的剪枝率。
- 使用基因搜索算法代替暴搜:每个节点为可能的剪枝组合 ,初始化 的集合 ,对于每个节点计算其剪枝带来的误差:
选出最小损失的组合进行分裂,分裂出的子节点会随机替换其中的被剪枝的专家,重复迭代50次,获得每层最好的 个剪枝组合。
- Block-wise KT-Reception Field: block-wise就是 层作为一块一起考虑最优剪枝,然后仍然是暴搜所有剪枝组合,即 种搜索空间。
专家内剪枝
- 根据先前算出的专家的重要性 来计算每个专家的秩,给定每个专家的目标平均秩为 :
是剪枝后第 层的专家个数, 是平滑因子,避免秩分布的过度线性。
-
根据秩分配 ,使用SVD-LLM的方法进行分解:
- 截断感知的数据白化 (Truncation-aware Data Whitening)
- 分层闭式更新 (Hierarchical Closed-form Updates)
-
微调:最后还要对MoE的权重进行LoRA微调
CAMERA
CAMERA: Multi-Matrix Joint Compression for MoE Models via Micro-Expert Redundancy Analysis (AAAI’26)
Method
结构化剪枝方法,将FFN中的intermediate维度进行剪枝。将MoE的计算从神经元的粒度进行表示:
表示router输出的权重。从校准集计算定义每个神经元的energy,激活模长&权重模长:
表示校准集采集到的所有第 个神经元的激活值。计算完成后根据energy进行排序,取Top-|S|个即为剪枝结果。Energy定义可以进行扩充,进一步考虑激活值中最大值的影响:
每一层剪枝率固定,从上而下逐层剪枝(需要将剪枝后的MoE层重新计算输出作为下一层的输入)。
混合量化部分暂略。
Experiment
- 验证模型Deepseek-MoE-16B-base,Qwen2-57B-A14B,Qwen3-30B-A3B
- 校准集为Wikitext2,128条2K样本
- baselines:NAEE,-MoE
- 剪枝时间0.1 GPU hours
- 在40%,60%剪枝率下显著优于对比方法
REAP
REAP THE EXPERTS: WHY PRUNING PREVAILS FOR ONE-SHOT MOE COMPRESSION(ICLR’26)
Method
本质是找了一个新测度,通过测量其对每一层输出的大小(magnitude)的共享来判断重要性。对于专家 ,其根据topk权重 选出的输入,显著性得分为:
得分最低就剪掉。
Experiment
- 验证模型Qwen3-30B-A3B,GLM-4.5-Air,Qwen3-Coder480B-A35BInstruct-FP8,Kimi-K2-Instruct-W4A16,每层MoE剪枝或者合并25%,50%的专家。
- 校准集:对多选题和代码生成,使用c4和evol-codealpaca来校准;对于大于110B模型额外使用xlam-function-calling和SWE-smith-trajectories;对创作和数学任务,使用WritingPrompts curated和tulu–sft-personas-math。
- 小于110B的模型用1024条2K样本,大于110B模型用12228条16K样本
- baselines:M-SMoE,HC-SMoE,frequency-pruning,EAN
Points
为什么merging很困难?
- 作者定量分析了合并MoE的质量,通过测量N-gram diversity发现合并后的模型多样性显著低于REAP和原模型。
- 作者将merging的困难归因于专家合并的非局部特性(non-local)和专家集群的高基数特征(high cardinality)
- 哪怕用了权重匹配(Weight Matching)、SVD分解这些对齐手段,这些专家在权重空间和奇异向量方向上依然高度不一致。专家们已经分化得太厉害了,强行合并(比如取平均值)会导致模型性能崩塌
- 无论是 HC-SMoE 还是 M-SMoE,都产生了大量的“独苗簇”,这种情况等同于剪枝。
垂域校准的重要性
作者比较了使用c4和evol-codealpaca对于code任务的影响,通用数据显著弱于垂域数据。
Mosaic Pruning
Mosaic Pruning: A Hierarchical Framework for Generalizable Pruning of Mixture-of-Experts Models
这篇文章的算法还是比较复杂的。
Method
Global Variability-aware Pruning (GVP)
- 提出测度Activation Variability Score ,用来衡量每个专家的specialization(特殊化、专门化程度),本质是计算router的logits和均匀分布之间的KL散度:
其中 是token总数, 是router对于token 分配给专家 的概率值, 是归一化常数 。显然当KL散度为0时,说明这个专家对于所有token都分配了相同的概率值;相反,如果KL散度很大,说明这个专家只对于特殊的部分token分配了高概率,就说明其专门化程度高。
- 保留 个通用化专家。
- 再从剩下的选出最具有专门化的 个专家。
- 那么最终保留的专家集合就是
Mosaic Pruning (MoP)
作者认为GVP的缺陷在于实际上有很多专门化的专家本质是十份相似的,直接对于 作排序然后择优会导致这些专家之间存在“专门化”上的重复。所以使用了先聚类再选择的策略。
- 使用多领域的校准数据集,确保聚类边界清晰,使用K-means对所有token的嵌入聚类到 个类别;
- 专家之间根据 Spearman’s rank correlation coefficient计算出其相似矩阵,每个专家的描述子定义为 :
其中 表示所有属于域 的token, 表示原始MoE计算得到的激活向量值。
- 层次聚类。没太看懂的一点是聚类时对于两个聚类 的衡量究竟是根据上一步的相似度矩阵还是根据Ward’slinkage:
其中 为聚类中心。
- 最终是从 个聚类里选出 最高的那个专家。
Experiment
- 验证模型Mixtral-8x7B-Instruct,Qwen1.5-MoE-A2.7B-Chat
- 校准集:混合数据集,文章没说,但github里看起来是c4_en,wikipedia_en,the_stack_python,squad,local_math,alpaca的组合。
- baseline只是枚举和GVP,而且枚举方法的校准集仅仅是c4,通用选择题上的性能优势一般,对于math和coding任务也只比较了枚举方法。
- Mixtral上的热力图显示枚举方法对于8裁4会所有层只集中激活第一个专家,丧失了多样性。