笔记日期: 2026-05-15 笔记作者: Zhongzhu Zhou 所读论文: Zero Sum SVD: Balancing Loss Sensitivity for Low Rank LLM Compression 论文作者: Ali Abbasi, Chayne Thrash, Haoran Qin, Shansita Sharma, Sepehr Seifi, Soheil Kolouri(Vanderbilt University,Department of Computer Science) arXiv: 2602.02848v1,2026-02-02 收录状态: Preprint
简短结论
这篇论文回答了一个我一直觉得"被绕过去"的问题:LLM 做 SVD 压缩时,每一层到底应该砍掉几个奇异值才合理?
历来的做法有两种极端:
- 同质化分配:所有大小相似的矩阵都用同一个 rank(SVD-LLM、ASVD 走这条路);
- 在每一层上做昂贵的优化来挑 rank(Dobi-SVD 是代表)。
Zero Sum SVD(下面缩写 ZS-SVD)走的是第三条路。它的核心想法是:不要去优化"每一层留多少 rank",而是直接在所有层的奇异值池里做一次全局贪心选择,让"被砍掉那些奇异值带来的预测损失变化"在累计上始终保持在零附近。这一条规则就自然产生了异质化 rank 分配,不用解任何优化问题。
具体在干这几件事:
- 在白化后的坐标系里给每个奇异值算一个有符号的一阶损失敏感度 ∆Lᵢ ≈ −σᵢ · gσ,ᵢ(gσ,ᵢ 是损失对奇异值的方向导数)。
- 全局维护两个最小堆:∆L 为正的、∆L 为负的,每一步根据当前累计和 s 的符号决定优先从哪个堆里弹一个。s ≤ 0 就选 ∆L ≥ 0 的(这些会让损失下降);s > 0 就选 ∆L < 0 的(这些会让损失上升)。这一步就是论文标题里"Zero Sum"的字面含义。
- 在每个矩阵内部仍然保持"先砍最小奇异值"的局部秩序,避免破坏 SVD 在白化空间里的最优性。
- 砍完之后可选地做一步"truncate–correct–re-truncate"修正:让权重短暂离开 low-rank 流形做一次梯度更新,再投回低秩流形。论文证明这次回投影的误差很小,因为预训练点附近梯度本身就低秩。
在 LLaMA-7B / 2-7B / 13B、Vicuna-7B、OPT-6.7B、LLaMA-30B 上做 perplexity 和七项常识推理任务(OpenBookQA、ARC-E、ARC-C、WinoGrande、HellaSwag、PIQA、MathQA),各个压缩率下 ZS-SVD 都超过了 ASVD、SVD-LLM、Dobi-SVD 这些 SVD 基线,也优于 LLM-Pruner、SliceGPT、Wanda-sp、FLAP 等结构化剪枝基线。压缩到 0.4 维持比时,加上 Dobi-SVD 风格的 remapping,ZS-SVD 在 LLaMA-7B 上把 WikiText2 PPL 从未压缩的 5.68 推到 6.96,而 SVD-LLM 同压缩率下 PPL 高达 53.74。GPU 上吞吐方面,60% 压缩在 RTX A5000 上比未压缩快 5.86×。
我自己读完最深的一个体会是:它把"全局 rank 分配"这件原本要解一个组合优化问题的事情,化简成了一条简单的贪心规则——只需要 σᵢ 排序 + 一个标量符号判断。这种"用一阶展开 + 一个累计守恒量"代替优化的写法,在系统/数值领域并不少见(NTK 里的 lazy regime、ZeRO 里的通信均摊),但在 LLM 压缩这个口子上还没被这么干净地用过,值得仔细看看它在做什么取舍。
1. 前置知识
这一节是写给已经训过 transformer、但没有把 SVD / 低秩压缩这条线吃透的同学的。我会把奇异值分解、白化、激活重建、校准损失、Fisher 信息这五件事讲清楚,再进入论文。
1.1 一句话讲清 SVD
任何一个 m×n 的矩阵 A 都可以写成 A = U Σ Vᵀ,其中 U(m×m)和 V(n×n)是正交矩阵,Σ 是对角的非负矩阵,对角线上从大到小排列着 r = min(m, n) 个奇异值 σ₁ ≥ σ₂ ≥ … ≥ 0。所谓"rank-k 截断 SVD"就是只保留前 k 列 / 前 k 个奇异值,得到 Aₖ = Uₖ Σₖ Vₖᵀ。Eckart–Young 定理告诉我们:在 Frobenius 范数下,Aₖ 是所有秩 ≤ k 的矩阵中最逼近 A 的那一个。
这件事翻译成 LLM 压缩:一个 W ∈ ℝ^{m×n} 的矩阵原本占 mn 个参数;写成 rank-k 的两个矩阵 Wᵤ ∈ ℝ^{m×k} 和 Wᵥ ∈ ℝ^{k×n} 之后,只占 k(m+n) 个参数。当 k(m+n) ≤ mn 时(也就是 k ≤ mn/(m+n)),存储就真的省了。
1.2 为什么直接对 W 做 SVD 还不够
这是这篇论文(以及最近几年所有 SVD-based LLM 压缩工作)的出发点。直接拿 W 做 SVD、把小奇异值砍掉,看起来很对——但 W 是要乘上一个激活 X 之后才进入下一层的,模型最终关心的不是 ‖W − W′‖,而是 ‖W X − W′ X‖。如果 W 里有一个方向 V_i 在白噪声意义上很小,但实际激活 X 恰好就经常落在这个方向上,那砍掉它就会"看起来误差小、其实损失爆炸"。所以光看权重本身做 SVD 是不够的。
1.3 白化(whitening):把激活拉成各向同性
正确的做法是把激活的协方差信息提前"折"进 W 里。定义激活的二阶矩 C = X Xᵀ ∈ ℝ^{n×n}(实际只用一个 256 条 × 2048 token 的小校准集估),找一个矩阵 S 使得 S Sᵀ = C(典型做法是 Cholesky 分解,可加一个小 ridge λI 保数值稳)。然后定义"白化后的权重" A = W S。
这时候有一个很重要的代数恒等式:
‖W X − W′ X‖²_F = tr[(W − W′) C (W − W′)ᵀ] = ‖(W − W′) S‖²_F
也就是说激活空间下的重建误差,等于白化空间下的 Frobenius 误差。因此在白化空间里对 A 做最优 rank-k 截断(再把 S⁻¹ 乘回去),等价于在激活空间里做最优 rank-k 投影。这就是 SVD-LLM、ASVD、Dobi-SVD 全部基于的代数事实,论文里写成了 Theorem 3.1 和 Corollary 3.2。
1.4 校准损失(calibration loss):跨层的真实目标
激活重建误差仍然是局部目标——它只关心"这一层的输出有没有失真"。但 LLM 的真实目标是端到端的下一个 token 预测损失。砍掉某一层的一个奇异值,可能会通过非线性层在下游被放大或抵消,所以"局部失真小"不等于"损失变化小"。
这就引出了所谓的校准损失(calibration loss) L:拿一小批校准数据(论文里是 WikiText2 的 256 条长度 2048 的序列),跑一遍完整的前向,得到 LLM 在这批数据上的语言建模损失。然后对 ZS-SVD 来说,关心的就是"砍掉某一个 σᵢ 之后,L 会变多少"。
1.5 Fisher 信息和"按重要性加权"
更老一些的 SVD 压缩工作(FWSVD、Dip-SVD)会用 Fisher 信息 F 来对参数加权——Fisher 信息直观上是"损失曲面在这个参数方向上的二阶曲率"。曲率大 = 这个参数动一动损失变很多 = 重要 = 不要砍。这是一种"局部 + 二阶"的视角。ZS-SVD 的差别是它只用一阶信息,但因为一阶展开就够精准(在预训练点附近梯度本来就低秩),同时它在全局层面累加这些一阶项,所以反而比 Fisher-style 启发式更稳。
1.6 后训练压缩(post-training compression)
"训练完一个 LLM 再压缩"的范式叫 post-training compression。它的对立面是"训练时就压缩"(QAT、LoRA 这种)。Post-training 的好处是:
- 不需要大规模重训;
- 不需要原始训练数据,只需要一个小校准集;
- 可以叠加在已经发布的 checkpoint 上。
ZS-SVD 完全在 post-training 框架内,硬件无关(只用 BLAS 算 SVD),跟量化、蒸馏、剪枝是并列关系,理论上可以再和量化叠加(论文里的 remapping / HQ 方案就是在做这件事)。
1.7 异质 rank 分配(heterogeneous rank allocation)
每一层 transformer 都有六个常被 SVD 压缩的矩阵:q_proj、k_proj、v_proj、o_proj(attention 投影)和 gate_proj、up_proj、down_proj(MLP)。它们大小不一样、对损失的敏感程度也不一样。"同质 rank" = 给每一种矩阵设一个全局比例 ρ,每一层都按这个比例砍。"异质 rank" = 不同层、不同矩阵可以保留不同比例。直觉上后者更优,但难点在于"怎么挑"。Dobi-SVD 是用一个可微分 SVD 把每一层的截断秩当作连续变量来优化;ZS-SVD 用零和规则直接得到异质 rank,省掉了优化过程。
1.8 一阶展开(first-order expansion)
整篇论文的"魂"是这条简单的代数:对参数空间里任何小扰动 ∆W,损失变化可以近似为
∆L ≈ ⟨∇_W L, ∆W⟩
对"砍掉 A 的第 i 个奇异值"这件事,∆A = −σᵢ uᵢ vᵢᵀ;因为 A = W S,扰动会通过 S⁻¹ 传回 W:∆W = ∆A S⁻¹。把它代进去:
∆Lᵢ ≈ ⟨∇_W L · S⁻ᵀ, ∆A⟩ = ⟨H, −σᵢ uᵢ vᵢᵀ⟩ = −σᵢ uᵢᵀ H vᵢ
这里 H = ∇_W L · S⁻ᵀ 是"白化后的梯度"。注意它是有符号的:σᵢ 是正的,uᵢᵀ H vᵢ 可正可负。所以砍掉某些奇异值反而会让校准损失变小——这是后面"零和规则"成立的前提。
2. 方法
2.1 总流程
1 | 输入:预训练 LLM 权重 {W_ℓ}、校准集、全局参数预算 ρ |
2.2 奇异值敏感度的计算
这一步是 ZS-SVD 最便宜的地方。整个 LLM 只需要:
- 对每一层做一次 Cholesky → 得到 S_ℓ;
- 对每一层做一次 SVD → 得到 U_ℓ Σ_ℓ V_ℓᵀ;
- 对整个模型做一次完整反向 → 得到 G_ℓ;
- 对每个奇异值算一个标量 σᵢ · uᵢᵀ H vᵢ。
第 1~3 步在工程上和 SVD-LLM 是一个数量级的开销(SVD-LLM 也要算白化和一次 SVD),第 4 步是 O(k) 的标量乘加,几乎免费。论文 Table 8 报告 LLaMA-7B 上 ZS-SVD 全流程 15.9 分钟(SVD-LLM 7.9 分钟,Dobi-SVD 19.25 小时——后者主要花在它的 differentiable rank 优化上)。ZS-SVD 把"接近 Dobi-SVD 的精度"用"略高于 SVD-LLM 的时间预算"做出来了,这是它最实用的卖点。
2.3 零和选择规则
这里是论文最有意思的代数。维护一个累计变量
s = Σ_{j∈D} ∆L_j
D 是当前已经被砍掉的奇异值集合。直觉是:s 是 ZS-SVD 预测的整体损失漂移,我们希望它一直贴近 0。规则就是:
- 当 s ≤ 0(预测损失偏低),下一个挑 ∆Lᵢ ≥ 0 的,让损失"补一点回来";
- 当 s > 0(预测损失偏高),下一个挑 ∆Lᵢ < 0 的,让损失"再降一点"。
每个层各自维护"在我这一层里下一个被砍的最小奇异值是哪个"。所有这些候选者按 ∆L 的符号分别进入 Q⁺ 或 Q⁻,堆内的排序键是 |∆Lᵢ|(取绝对值最小的——也就是预测影响最小的那个)。每弹一个,s 就更新一次,再从对应层的下一个 σ 替补进来。
关键约束:每个矩阵内部仍保持 spectral order,下一个候选只能是它当前剩下的最小那个 σ。这条约束论文用消融试过——如果允许跳着砍(不按从小到大),效果会显著变差(Table 6)。这是因为如果不在每层内保持 spectral order,就破坏了"白化空间最优截断 = 留最大的几个 σ"这条性质,于是局部重建误差爆炸。零和规则只控全局,不控局部;局部还得靠 Eckart–Young。
2.4 一步修正:truncate–correct–re-truncate
砍完之后,模型已经是低秩形态了,但还有进一步的优化空间。论文设计了一个非常轻量的修正:
- 设当前截断后的权重是 W'_k,截断残差 ∆W = W − W'_k;
- 在 W'_k 处算一次梯度 g = ∇_W L(W'_k);
- 求一个最小 Frobenius 范数的 ∆W',让它满足 ⟨g, ∆W'⟩ = ⟨g, ∆W⟩——它在一阶意义上等价于"如果我能让权重瞬间回到 W 会发生的损失变化",但用最小的 perturbation 实现。论文给出闭式解 ∆W' = (⟨g, ∆W⟩ / ⟨g, g⟩) · g。
- 把 ∆W' 加上去,再 re-truncate 回 rank k。
为什么 re-truncate 不会把刚才的好处全部毁掉?因为 rank(∆W') = rank(g) = rank(∇_W L),而经验证据(论文 Figure 3)和文献(PowerSGD、LoRA、GaLore)都表明预训练点附近的梯度是低秩的:在 LLaMA-2-7B 第 1/16/32 层、20% 压缩时,gradient 的有效秩 / weight 的有效秩比值在 0.001 ~ 0.4 之间,大部分模块上更接近 0.05。所以 ∆W' 本身是低秩的,加进去之后总秩 ≤ k + ℓ(ℓ 是梯度的秩),再 re-truncate 回 k 的投影误差就很小。
这一步可以重复 1×、5×、10×。Table 1 显示越多越好,在 0.4 维持比下 PPL 从 ZS-SVD 的 45.17 一路降到 ZS-SVD-10× 的 18.49。
2.5 Remapping:和量化耦合的存储模式
直接用 ρ = k(m+n)/mn 当做"压缩比例"有一个不对称的现象——当 ρ = 1 时 k = mn/(m+n) < min(m,n),并不能取到满秩。Dobi-SVD 引入了一种 packed storage:把 Vₖ 用 8-bit 打包进 Uₖ 的前 n 行(假设 m ≥ n),存储足迹变成 k·max(m,n)。在这种 remapping 下,ρ̃ = k/rank(W) 是和 k 一一对应的。ZS-SVD 把这条 remapping 直接接入它的 budget accounting:每砍掉一个奇异值的存储节省是 max(m,n) 个 fp16 等价参数。
在压缩比 ≥ 50% 的极端场景,论文还提了一个变体叫 HQ(Half-prune + Quantize):先做 50% 的 SVD 压缩,然后对所有目标参数统一 halve 位宽(典型 fp16 → fp8),等价的总占用相同,但 perplexity 更稳。论文里在 0.4 维持比下 HQ 版的 ZS-SVD 把 PPL 拉到 6.73——已经接近未压缩 baseline 的 5.68。
2.6 一些工程细节
- 校准集:WikiText2 的 256 条序列、长度 2048。和 SVD-LLM 一致,可控变量。
- 只压缩 transformer block 里的"主线性"矩阵(q/k/v/o + MLP),embedding / layer norm 不动。
- 梯度低秩的实验测的是 τ = 0.95 的有效秩(能量 95% 所需的最小奇异向量数量)。
- 整个流程是单卡可跑的,论文跑在 RTX PRO 6000 Blackwell Max-Q 96 GB。
2.7 伪代码与复杂度
整套零和选择的逻辑可以用下面这段简化伪代码看清楚:
1 | def zs_svd(model, calib_loader, target_budget): |
复杂度逐项分析:
- Cholesky:每层 O(n³),其中 n 是 W 的列数。LLaMA-7B 的 hidden = 4096,所以一次 ~ 7×10¹⁰ flops。
- SVD:每层 O(m·n²)(randomized SVD 可降到 O(m·n·k))。
- 反向:一次 256×2048 mini-batch 完整 forward+backward,和正常一次训练 step 同量级。
- 内积 uᵢᵀ H vᵢ:每个 σ 一个 O(m·n) 标量乘加,全部一起也只是矩阵乘量级。
- 堆操作:O(N log N),其中 N 是全模型奇异值总数,对于 7B 大约 10⁷ 量级,毫秒级开销。
所以全流程的瓶颈是 SVD 和反向,和 SVD-LLM 完全同量级;ZS-SVD 比 SVD-LLM 多出来的那一倍时间主要在反向 + 显存换入换出。
2.8 与 Dobi-SVD 的工程对比
| 维度 | Dobi-SVD | ZS-SVD |
|---|---|---|
| rank 决策方式 | 反向传播优化 | 全局贪心 + 零和守恒 |
| 需要的迭代次数 | 数千步可微 SVD 优化 | 1 次反向 + 1 次堆贪心 |
| 显存峰值 | 高(IPCA 反传) | 中(一次完整反向 + 一次 SVD) |
| LLaMA-7B 端到端时间 | 19.25 小时 | 15.9 分钟 |
| 精度顶点 | 高 | 略高 |
| 可解释性 | 黑盒优化 | 一阶展开 + 守恒律 |
ZS-SVD 的工程胜利不在于"算的少"——它算的不见得少多少——而在于"避开了一段长长的、需要 fine-tune 的优化循环"。这对部署工程师特别友好:你拿一个已经发布的 checkpoint,跑 15 分钟就出一个不错的压缩版本,不用任何额外训练数据。
3.5b 额外消融解读:为什么"贪心负 ∆L"会爆炸
我想多花一段讲 Table 6 里那条 PPL 飙到 160000 的"Most negative ∆L"策略,因为它揭示了 ZS-SVD 设计的关键工程直觉。
设想一个简化场景:你在 W₀ 处展开 L(W₀+∆W) ≈ L(W₀) + ⟨g, ∆W⟩。这条一阶近似在 ‖∆W‖ 足够小的范围内(线性邻域 R)有效。一旦 ‖∆W‖ 跑出 R,近似失效,真实 L 就由二阶以上的项主导。
"贪心负 ∆L"做的事情是每一步都让 s 进一步往负方向走——也就是每一步都让 ‖∆W‖ 朝同一个方向累加。这等价于沿着一个固定方向走出一条直线,很快就跑出 R。
零和规则做的事情是让 s 在 0 附近震荡。这相当于沿着一个随机游走式的轨迹前进,在 t 步之后期望偏移大约只是 O(√t) 而不是 O(t)。也就是说,它把"经过 t 次决策"对应的 ‖∆W‖ 控制在 √t 量级。在 7B 模型上这一项可能差几个数量级——这就是 PPL 从 45.2 跳到 160594 的原因。
这种"用随机游走代替直线推进"的设计在数值优化里有个经典名字:conservation-based step control。它在 stochastic optimal control 和 simulated annealing 都有体现。ZS-SVD 把它搬进 LLM 压缩,是这条领域里第一篇这么做的。
3. 实验
我主要看了五个实验:主表 perplexity、压缩极端下的 vs SVD baseline、vs 结构化剪枝、跨模型规模、消融。
3.1 主表(Table 1,LLaMA-7B)
维持比 0.8/0.6/0.4,对比 ASVD、SVD-LLM、Dobi-SVD,加 1×/5× truncate-correct 迭代,再加 Dobi-SVD remapping 和 HQ 变体。
| 维持比 | 方法 | WikiText2 PPL | 平均 Acc | 相对 drop |
|---|---|---|---|---|
| 1.0 | Baseline | 5.68 | 0.55 | 0.0% |
| 0.8 | ASVD | 11.14 | 0.43 | 21.8% |
| 0.8 | SVD-LLM | 7.94 | 0.44 | 20.0% |
| 0.8 | Dobi-SVD | 8.54 | 0.46 | 16.4% |
| 0.8 | ZS-SVD | 6.74 | 0.50 | 9.1% |
| 0.8 | ZS-SVD 5× | 6.43 | 0.51 | 7.3% |
| 0.8 | ZS-SVD* (remap) | 5.90 | 0.54 | 1.8% |
| 0.6 | SVD-LLM | 13.11 | 0.37 | 32.7% |
| 0.6 | Dobi-SVD | 13.54 | 0.38 | 30.9% |
| 0.6 | ZS-SVD 5× | 9.45 | 0.42 | 23.6% |
| 0.6 | ZS-SVD* (remap) | 6.96 | 0.50 | 9.1% |
| 0.4 | SVD-LLM | 53.74 | 0.31 | 43.6% |
| 0.4 | Dobi-SVD | 46.18 | 0.32 | 41.8% |
| 0.4 | ZS-SVD 10× | 18.49 | 0.35 | 36.4% |
| 0.4 | ZS-SVD† (HQ) | 6.73 | 0.51 | 7.3% |
我看到三个值得说的现象:
- 没有 remap 的 vanilla ZS-SVD 在 0.8 / 0.6 上就明显赢 SVD-LLM 和 Dobi-SVD——零和规则单独就足够。
- 加 remap 之后,曲线被整体往下压——这是 packed storage 让 ZS-SVD 在同样存储预算下可以保留更多秩。
- HQ 在 0.4 这种极端压缩下是最优的——把"硬砍秩"和"半位宽"叠加比"硬砍到 60% 秩"更稳。
3.2 vs Dip-SVD(Table 2,30% pruning)
| 模型 | 方法 | W2 PPL | PTB | C4 |
|---|---|---|---|---|
| LLaMA-7B | ASVD | 95.3 | 200.9 | 86.3 |
| LLaMA-7B | FWSVD | 33.0 | 53.6 | 38.2 |
| LLaMA-7B | SVD-LLM | 9.5 | 29.0 | 26.4 |
| LLaMA-7B | Dip-SVD | 9.4 | 22.3 | 19.9 |
| LLaMA-7B | ZS-SVD | 8.2 | 19.6 | 16.8 |
| Vicuna-7B | SVD-LLM | 12.4 | 124.5 | 39.5 |
| Vicuna-7B | Dip-SVD | 12.1 | 81.1 | 28.8 |
| Vicuna-7B | ZS-SVD | 10.2 | 48.0 | 21.8 |
Dip-SVD 是最直接的对手——它也用梯度信息,但是用 Fisher-style 启发式来给"每一层的整体重要性"打分。ZS-SVD 比它精细一档,因为它打分的对象是"每一个奇异值"。结果是 ZS-SVD 在 PTB / C4 上把 Dip-SVD 的 PPL 几乎全部砍掉 20% 以上。
3.3 vs 结构化剪枝(Tables 3 & 4)
- LLaMA-2-7B、0.6 维持比下,ZS-SVD 0.45 平均 Acc vs LLM-Pruner 0.48 vs SliceGPT 0.51;Dobi-SVD* 56% Acc,ZS-SVD* 57%。
- 0.4 维持比下 HQ 版 ZS-SVD 平均 Acc 0.59,远超所有 SVD 和剪枝基线。
- LLaMA-13B、0.8 维持比下 ZS-SVD* 平均 Acc 0.70,和未压缩 baseline 持平。
意思是:当你愿意把 SVD 和量化耦合在一起做存储(HQ 或 remap),ZS-SVD 在大模型上的表现可以达到"几乎无损"。
3.4 跨模型规模(Table 5,20% pruning)
| 方法 | OPT-6.7B PPL/Acc | Vicuna-7B PPL/Acc | LLaMA-30B PPL/Acc |
|---|---|---|---|
| Original | 10.86 / 0.52 | 6.78 / 0.56 | 4.10 / 0.61 |
| ASVD | 82.00 / 0.32 | 16.23 / 0.33 | 6.74 / 0.44 |
| SVD-LLM | 16.04 / 0.41 | 8.41 / 0.51 | 6.61 / 0.54 |
| ZS-SVD | 11.40 / 0.51 | 8.08 / 0.53 | 4.83 / 0.59 |
在 LLaMA-30B 上几乎只损失了 0.02 准确率——零和规则对模型族泛化得不错。
3.5 消融:四种选择策略(Table 6)
这张表是论文最有说服力的。固定全局预算,比较四种"选哪个 σ"的策略:
| 策略 | Per-W σ 排序 | Ratio 0.4 PPL | Ratio 0.6 PPL |
|---|---|---|---|
| Most negative ∆L | × | 160594 | 373585 |
| Magnitude of ∆L | × | 341.3 | 88.7 |
| Most negative ∆L | ✓ | 182452 | 369350 |
| Magnitude of ∆L | ✓ | 51.8 | 12.0 |
| Magnitude of σ | ✓ | 803599 | 32750 |
| Zero-sum ∆L (ZS-SVD) | ✓ | 45.2 | 11.4 |
几个关键 takeaway:
- "贪心地一直让 ∆L 最负"(疯狂选会让损失下降的奇异值)反而是灾难——结果 PPL 爆炸到几十万。这一条反直觉的现象正好揭示了一阶展开在远离当前点之后会失效:单看局部线性预测会把损失降到很低,但你已经偏离了线性近似的有效邻域,真实损失反而炸了。零和规则就是在用"累计漂移贴近 0"来强行把每一步都钉在线性近似有效的区域里。
- "在每层内保持 σ 排序"也是必要的——把它去掉之后所有策略都崩。
- "只看 σ 大小、不看损失敏感度"也不行——光靠白化空间的局部最优会忽略下游层的复合放大。
这条消融基本上把 ZS-SVD 的核心论点钉死了。
3.6 推理效率(Table 7)
| 压缩 | 方法 | RTX A5000 吞吐 | 峰值显存 |
|---|---|---|---|
| 0% | 原模型 | 130.03 | 13.56 |
| 40% | SVD-LLM | 675.24 | 15.86 |
| 40% | Dobi-SVD | 692.49 | 17.07 |
| 40% | ZS-SVD | 731.68 | 15.78 |
| 60% | ZS-SVD | 762.34 | 13.37 |
ZS-SVD 在 RTX A5000 上 60% 压缩时吞吐是未压缩的 5.86×。在显存受限的 Titan Xp(12GB,baseline 必须 offload)上提升 2.61×。注意 SVD 类压缩对硬件零依赖——你不需要特殊 kernel、特殊指令集,只需要"两次小矩阵乘法代替一次大矩阵乘法"。
4. 我的解读
我把这篇论文放在我自己的 reading mental map 里大约是这样的:
1 | LLM 压缩 |
它的精度顶点和 Dobi-SVD 接近,但避开了 Dobi-SVD 用反向传播去优化 rank 的工程负担,把整套流程压到了 16 分钟 vs 19 小时。这个时间差是非常实用的:如果你只是想给一个已发布的 checkpoint 做一次性的 4-bit/低秩组合压缩,ZS-SVD 就是性价比最好的选项之一。
它的工程要点也很清晰:
- 需要的资源:1 张能装下 LLM 的 GPU,做一次 SVD + 一次反向,不需要 fine-tune。
- 校准集:256 × 2048 token,很小。
- 输出:每一层一个 (Uₖ, Vₖ) 替代矩阵,标准 BLAS 即可推理。
我比较关心的几个边界:
- 校准集分布:这套全局零和规则强依赖于校准数据的统计代表性。如果你的部署场景和 WikiText2 差很远(比如代码生成、对话),∆Lᵢ 的符号可能完全反过来。论文没系统讨论这一点,只是说"和 SVD-LLM 用同一份校准集做对比"。
- 梯度低秩假设:作者用 Figure 3 + 文献证明梯度在预训练点附近低秩。但当 batch size 很大、或者权重已经被严重压缩(比如 ratio 0.4 之后还要做修正)时,∆W' 的有效秩会不会被显著拉高?论文没给"修正后实际秩增长"的曲线。
- 和量化的组合复杂度:HQ 和 remapping 已经在做这件事,但理论上还有 joint allocation 的空间——同时优化"每一层留几个 σ + 每一层用几位宽"。论文把这个明确列为 future work。
最后一个观察是结构上的:ZS-SVD 的写法很像数值优化里的"primal feasibility + dual control"——σ 排序保 local feasibility,零和守恒保 global dual。这种"用一个标量守恒量代替全局优化"的模式,我猜接下来会被推广到剪枝("零和剪枝")和量化("零和位宽分配")。这条线值得关注。
5. 局限与可复现性
5.1 局限
- 校准集偏差:所有 ∆Lᵢ 都基于一份 WikiText2 校准;论文未做跨数据集的鲁棒性研究。
- 一阶近似适用边界:消融 Table 6 已经显示 ∆L 极度跑偏时一阶展开崩溃;零和规则只是"经验上"贴近线性邻域。
- 极端压缩(≤0.4)必须搭配 quantization (HQ/remap) 才能维持精度——不是纯 SVD 路线。
- 对 attention 矩阵和 MLP 矩阵一视同仁——没考虑 attention head 内部的几何(比如 head pruning 的工作)。
5.2 可复现性
- 代码已开源:https://github.com/mint-vu/Zero-Sum-SVD(论文摘要里给的)。
- 校准集:WikiText2 256 × 2048 token,可复现。
- 评测:lm-eval-harness 标准设置,OpenBookQA / ARC-E / ARC-C / WinoGrande / HellaSwag / PIQA / MathQA。
- 模型:LLaMA-7B / 2-7B / 13B / 30B、Vicuna-7B、OPT-6.7B,全部是开放 checkpoint。
- 硬件:单卡 96 GB RTX PRO 6000 Blackwell Max-Q;普通研究者用一张 80 GB A100 重现 7B-13B 应该没问题,30B 可能要做一点 offloading。
- 计时是公平的——SVD-LLM 7.9 min、ZS-SVD 15.9 min、Dobi-SVD 19.25 h,作者明确说在同一台机器上测的。
整体看可复现性不错。我个人下一步会试着把 ZS-SVD 的"零和规则"挪到结构化剪枝场景(neuron-level),看一阶展开 + 全局守恒能不能在剪枝里也跑通——这是论文没碰但显然顺手的延伸。
参考资料
- Abbasi 等, Zero Sum SVD: Balancing Loss Sensitivity for Low Rank LLM Compression, arXiv 2602.02848v1 (2026)。
- Wang 等, SVD-LLM: Truncation-aware Singular Value Decomposition for Large Language Model Compression, ICLR 2025。
- Qinsi 等, Dobi-SVD: Differentiable SVD for LLM Compression and Some New Perspectives, ICLR 2025。
- Yuan 等, ASVD: Activation-aware Singular Value Decomposition for Compressing LLMs, arXiv 2312.05821 (2025)。
- Ding 等, Dip-SVD: Dual-importance Protected SVD for Efficient LLM Compression, arXiv 2506.20353 (2025)。
- Hsu 等, Language Model Compression with Weighted Low-Rank Factorization (FWSVD), ICLR 2022。
- Hu 等, LoRA: Low-Rank Adaptation of Large Language Models, ICLR 2022。
- Zhao 等, GaLore: Memory-Efficient LLM Training by Gradient Low-Rank Projection, ICML 2024。
- Balzano 等, An Overview of Low-Rank Structures in the Training and Adaptation of Large Models, arXiv 2503.19859 (2025)。