0%

Zero Sum SVD:用「损失零和」做全局奇异值预算分配的 LLM 压缩方法

笔记日期: 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
输入:预训练 LLM 权重 {W_ℓ}、校准集、全局参数预算 ρ


对每一层 W_ℓ 计算 S_ℓ(激活协方差 Cholesky)


A_ℓ = W_ℓ · S_ℓ, 做 SVD 得到 U_ℓ Σ_ℓ V_ℓᵀ


做一次反向,得到 G_ℓ = ∇_{W_ℓ} L


H_ℓ = G_ℓ · S_ℓ⁻ᵀ
∆L_{ℓ,i} = −σ_{ℓ,i} · u_{ℓ,i}ᵀ H_ℓ v_{ℓ,i}


维护两个堆 Q⁺(∆L≥0)和 Q⁻(∆L<0)
按零和规则一个一个弹奇异值


达到全局预算后,每一层得到自己的 final rank k_ℓ


(可选)truncate–correct–re-truncate 修正一步


返回压缩后的 {W'_ℓ}

2.2 奇异值敏感度的计算

这一步是 ZS-SVD 最便宜的地方。整个 LLM 只需要:

  1. 对每一层做一次 Cholesky → 得到 S_ℓ;
  2. 对每一层做一次 SVD → 得到 U_ℓ Σ_ℓ V_ℓᵀ;
  3. 对整个模型做一次完整反向 → 得到 G_ℓ;
  4. 对每个奇异值算一个标量 σᵢ · 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
def zs_svd(model, calib_loader, target_budget):
layers = list(model.linear_layers())
# 1. 准备阶段
S, A, U, Σ, V = [], [], [], [], []
for ℓ in layers:
C_ℓ = activation_covariance(ℓ, calib_loader)
S_ℓ = cholesky(C_ℓ + λI)
A_ℓ = ℓ.W @ S_ℓ
U_ℓ, Σ_ℓ, V_ℓ = svd(A_ℓ)
S.append(S_ℓ); A.append(A_ℓ); U.append(U_ℓ); Σ.append(Σ_ℓ); V.append(V_ℓ)

# 2. 一次反向得到所有梯度
L = calibration_loss(model, calib_loader)
G = backward(L) # {G_ℓ}

# 3. 计算 ∆L_{ℓ,i}
ΔL = {}
for ℓ in layers:
H_ℓ = G[ℓ] @ inv(S[ℓ].T)
for i in range(rank(A[ℓ])):
ΔL[(ℓ, i)] = -Σ[ℓ][i] * (U[ℓ][:, i].T @ H_ℓ @ V[ℓ][:, i])

# 4. 双堆 + 零和贪心
Q_pos = MinHeap(key=lambda x: abs(ΔL[x])) # ∆L ≥ 0
Q_neg = MinHeap(key=lambda x: abs(ΔL[x])) # ∆L < 0
cursor = {ℓ: rank(A[ℓ]) - 1 for ℓ in layers} # 每层下一个待砍 σ 的索引(最小的)
for ℓ in layers:
i = cursor[ℓ]
(Q_pos if ΔL[(ℓ, i)] >= 0 else Q_neg).push((ℓ, i))

s = 0
removed = set()
while saved_params(removed) < target_budget:
prefer = Q_pos if s <= 0 else Q_neg
if not prefer: prefer = Q_neg if prefer is Q_pos else Q_pos
(ℓ, i) = prefer.pop()
s += ΔL[(ℓ, i)]
removed.add((ℓ, i))
cursor[ℓ] -= 1
if cursor[ℓ] >= 0:
j = cursor[ℓ]
(Q_pos if ΔL[(ℓ, j)] >= 0 else Q_neg).push((ℓ, j))

# 5. 形成压缩权重
for ℓ in layers:
keep = sorted({i for i in range(rank(A[ℓ])) if (ℓ, i) not in removed})
Uk, Σk, Vk = U[ℓ][:, keep], diag(Σ[ℓ][keep]), V[ℓ][:, keep]
ℓ.W_u = Uk @ sqrt(Σk)
ℓ.W_v = sqrt(Σk) @ Vk.T @ inv(S[ℓ])

复杂度逐项分析:

  • 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%

我看到三个值得说的现象:

  1. 没有 remap 的 vanilla ZS-SVD 在 0.8 / 0.6 上就明显赢 SVD-LLM 和 Dobi-SVD——零和规则单独就足够。
  2. 加 remap 之后,曲线被整体往下压——这是 packed storage 让 ZS-SVD 在同样存储预算下可以保留更多秩。
  3. 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
2
3
4
5
6
7
8
9
LLM 压缩
├── 量化(QAT / PTQ)→ GPTQ / AWQ / SmoothQuant / QuIP / SpinQuant
├── 结构化剪枝 → LLM-Pruner / SliceGPT / Wanda / FLAP
└── 低秩分解(SVD-based)
├── 不带激活信息:FWSVD(用 Fisher)
├── 局部活化重建:ASVD / SVD-LLM(白化)
├── 损失感知 + 启发式:Dip-SVD
├── 损失感知 + 可微优化:Dobi-SVD
└── 损失感知 + 全局贪心 + 零和守恒:ZS-SVD ← 这里

它的精度顶点和 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 即可推理。

我比较关心的几个边界:

  1. 校准集分布:这套全局零和规则强依赖于校准数据的统计代表性。如果你的部署场景和 WikiText2 差很远(比如代码生成、对话),∆Lᵢ 的符号可能完全反过来。论文没系统讨论这一点,只是说"和 SVD-LLM 用同一份校准集做对比"。
  2. 梯度低秩假设:作者用 Figure 3 + 文献证明梯度在预训练点附近低秩。但当 batch size 很大、或者权重已经被严重压缩(比如 ratio 0.4 之后还要做修正)时,∆W' 的有效秩会不会被显著拉高?论文没给"修正后实际秩增长"的曲线。
  3. 和量化的组合复杂度: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)。