SliceGPT 阅读笔记:用计算不变性删除 Transformer 的行与列

笔记日期: 2026-06-12 笔记作者: Zhongzhu Zhou 论文标题: SliceGPT: Compress Large Language Models by Deleting Rows and Columns 作者: Saleh Ashkboos, Maximilian L. Croci, Marcelo Grangeiro Perez, Torsten Hoefler, James Hensman arXiv: 2401.15024 状态 / 会议: ICLR 2024(接收);微软研究院 + ETH Zürich;22 页,8 图

一句话总结

SliceGPT 从一条精确的数学定理出发——Transformer 计算对正交基变换完全不变——利用 PCA 找到最优旋转矩阵,把权重矩阵旋转到激活方差最集中的坐标系后,直接物理删去方差最低的那些行列,留下更小的稠密矩阵。压缩 25% 参数后,LLAMA2-70B 零样本性能保留 99%,推理算力降至原来的 64–66%,所需 GPU 数量从 4 张减到 2 张,全程无需自定义稀疏算子。

前置知识

在正式读这篇论文之前,需要对下面几个背景知识有基本了解。这些内容是理解 SliceGPT 的数学推导和算法设计的必要基础。

1. Transformer 的残差流结构

以 LLAMA2 为代表的 decoder-only Transformer 由 LLTransformer Block叠加而成。每个 Block 依次包含:

  1. RMS Layer Normalization——对残差流做 RMS 归一化,乘以学习到的缩放向量 γRd\gamma \in \mathbb{R}^d
  2. 多头自注意力(Multi-Head Self-Attention)——Q/K/V 投影、缩放点积注意力、输出投影 WOW_O
  3. MLP / 前馈网络(FFN)——上投影 WupW_\text{up}、逐元素非线性(GeLU/SiLU)、下投影 WdownW_\text{down}
  4. 残差连接——每个子模块的输出加回输入

贯穿整个网络的核心张量是残差流(residual stream):形状为 (seq_len,d)(\text{seq\_len}, d),其中 dd 是模型维度(也叫 hidden size 或 embedding dimension)。LLAMA2-7B 中 d=4096d = 4096,LLAMA2-70B 中 d=8192d = 8192

所有线性层都作用于这条残差流:读取一个 dd 维向量,乘以权重矩阵,再写回残差流(或产生中间张量)。SliceGPT 的目标就是把这个维度 dd 压缩到更小的 kk

2. 奇异值分解(SVD)

对任意矩阵 ARm×nA \in \mathbb{R}^{m \times n},SVD 将其分解为:

A=UΣVTA = U \Sigma V^T

其中 URm×mU \in \mathbb{R}^{m \times m}VRn×nV \in \mathbb{R}^{n \times n} 为正交矩阵(列向量两两正交且单位长度),Σ\Sigma 是对角矩阵,对角元素为奇异值 σ1σ20\sigma_1 \ge \sigma_2 \ge \cdots \ge 0

Eckart-Young 定理给出最优低秩近似:截取前 kk 个奇异值得到的 Ak=UkΣkVkTA_k = U_k \Sigma_k V_k^T 是所有秩 k\le k 矩阵中与 AA 差距(Frobenius 范数)最小的:

AAkF=σk+12++σr2\|A - A_k\|_F = \sqrt{\sigma_{k+1}^2 + \cdots + \sigma_r^2}

SliceGPT 不直接对权重矩阵做 SVD 截断(那是普通低秩压缩),而是用 SVD 找激活的最优基变换——这是思路上的关键区别。

3. 主成分分析(PCA)与方差集中性

给定数据矩阵 XRd×nX \in \mathbb{R}^{d \times n}(每列是一个样本,这里是一个 token 的激活向量),PCA 寻找正交变换 QRd×dQ \in \mathbb{R}^{d \times d} 使得 QXQX 的协方差矩阵对角化:

Cov(QX)=QXXTnQT=diag(λ1,,λd),λ1λ2λd0\text{Cov}(QX) = Q \cdot \frac{XX^T}{n} \cdot Q^T = \text{diag}(\lambda_1, \ldots, \lambda_d), \quad \lambda_1 \ge \lambda_2 \ge \cdots \ge \lambda_d \ge 0

QQ 的行向量就是经验协方差矩阵 1nXXT\frac{1}{n}XX^T 的特征向量,按特征值降序排列。λi\lambda_i 衡量激活在第 ii 主方向上的方差。

PCA 在 SliceGPT 中回答的核心问题是:ll 层的激活主要集中在哪几个方向上变化? 方差接近于零的方向,可以安全地丢弃。

4. 正交矩阵:基变换的工具

矩阵 QRd×dQ \in \mathbb{R}^{d \times d}正交矩阵当且仅当 QQT=QTQ=IQQ^T = Q^TQ = I。关键性质:

  • 保范性Qx2=x2\|Qx\|_2 = \|x\|_2——正交变换是刚性旋转/反射,不改变向量长度
  • 精确可逆Q1=QTQ^{-1} = Q^T
  • 恒等式插入QTQ=IQ^TQ = I,可以在任何乘积的中间插入 QTQQ^TQ 而不改变结果

最后一点是 SliceGPT 的核心操作:在两个权重矩阵乘积之间插入 I=QTQI = Q^TQ,不改变计算结果,但改变了参数化方式,从而为后续的截断创造了条件。

5. 训练后压缩方法全景

训练后压缩在不重新训练的前提下缩小模型,只用少量标定数据的前向推理。主要三大范式:

范式代表方法加速机制是否需要自定义算子
量化GPTQ、AWQ、SmoothQuant降低精度(FP16→INT4),减少带宽部分需要
非结构化稀疏SparseGPT、Wanda将个别权重置零,稀疏 GEMM
结构化压缩SliceGPT、LLM-Pruner删除整行整列,标准稠密 GEMM

SliceGPT 属于结构化压缩。结构化方法删去整个维度,剩余计算仍是标准稠密矩阵乘,与 cuBLAS 等高度优化的库完全兼容。

6. 计算量估算

对一个残差流维度 dd、MLP 中间维度 dffd_\text{ff} 的 Transformer 层,每层的计算量约为:

FLOPs2(3d2+d2+2ddff)=2(4d2+2ddff)\text{FLOPs} \approx 2(3d^2 + d^2 + 2d \cdot d_\text{ff}) = 2(4d^2 + 2d \cdot d_\text{ff})

若把 dd 压缩为 k=0.75dk = 0.75d,则 d2d^2 项按 (k/d)2=0.5625(k/d)^2 = 0.5625 缩减,ddffd \cdot d_\text{ff} 项按 k/d=0.75k/d = 0.75 缩减,混合后约得到 64–66% 的计算量——与论文实测一致。

这篇论文做了什么

SliceGPT(ICLR 2024,微软研究院 + ETH Zürich)有三个核心贡献:

贡献一:计算不变性定理。 严格证明:对任意一组正交矩阵 {Q0,Q1,,QL}\{Q_0, Q_1, \ldots, Q_L\},存在对全部权重矩阵的重参数化,使模型对所有输入的输出精确不变。这不是近似,是零误差的代数等式。

贡献二:有原则的切片算法(Slicing Algorithm)。 利用少量标定数据上的激活 PCA,逐层估计最优正交基;将权重矩阵旋转到新基之后,物理截去低方差维度(删除对应的行和列),得到更小的稠密矩阵。

贡献三:硬件原生部署。 压缩后的模型由纯稠密矩阵组成,无需任何自定义 CUDA 算子,直接在标准深度学习框架上运行,实现真实的延迟和 GPU 数量缩减。

核心数学洞察:计算不变性

推导过程

基本设置。 考虑两个连续线性层,中间夹一个逐元素非线性 ϕ\phi(GeLU、SiLU 等):

y=W2ϕ(W1x)y = W_2\,\phi(W_1\,x)

其中 W1Rh×dW_1 \in \mathbb{R}^{h \times d}W2Rd×hW_2 \in \mathbb{R}^{d \times h}xRdx \in \mathbb{R}^d

第一步:插入正交恒等式。

对任意正交矩阵 QRd×dQ \in \mathbb{R}^{d \times d},利用 QTQ=IQ^TQ = I

y=W2ϕ ⁣(W1QTQx)y = W_2\,\phi\!\bigl(W_1\,Q^T Q\,x\bigr)

第二步:重新分组。

y=W2ϕ ⁣((W1QT)(Qx))y = W_2\,\phi\!\bigl((W_1 Q^T)(Q x)\bigr)

W~1=W1QT\tilde{W}_1 = W_1 Q^Tx~=Qx\tilde{x} = Qx,则:

y=W2ϕ(W~1x~)y = W_2\,\phi(\tilde{W}_1\,\tilde{x})

输出 yy 与原来完全相同。只是参数化方式变了:输入被旋转成 QxQx,第一个权重矩阵被旋转成 W1QTW_1 Q^T,两个变化精确抵消。

第三步:扩展到完整残差流。

假设第 ll 层残差流通过正交变换 QlQ_l 旋转。令所有从位置 ll 读取激活的权重在右边乘 QlTQ_l^T,所有向位置 ll 写入激活的权重在左边乘 QlQ_l。则:

  • 位置 ll 的残差流变为 QlxlQ_l x_l(新参数化)
  • 每个消费者 WinW_\text{in} 执行 (WinQlT)(Qlxl)=Winxl(W_\text{in} Q_l^T)(Q_l x_l) = W_\text{in} x_l——输出不变
  • 每个生产者 WoutW_\text{out} 输出 Ql(Woutxl1)Q_l(W_\text{out} x_{l-1})——即下一位置的新残差流

定理(计算不变性,ICLR 2024,非正式版本): 对任意预训练 Transformer fθf_\theta 和任意正交矩阵序列 {Ql}l=0L\{Q_l\}_{l=0}^L,存在重参数化后的 Transformer fθ~f_{\tilde{\theta}} 满足对所有输入 xxfθ~(x)=fθ(x)f_{\tilde{\theta}}(x) = f_\theta(x)

这是一个零近似误差的精确结论,为后续截断提供了理论保障。

为什么选 PCA 作为 Q?

在用 QQ 旋转之后,QxQx 的各坐标按方差从高到低排列——这正是 PCA 的定义。最后 dkd - k 个坐标的方差接近于零,意味着激活在这些方向上几乎不变化。把这些坐标直接置零(即不计算它们)引入的误差等于被丢弃坐标的方差之和:

ϵlCi=kl+1dλi(l)\epsilon_l \le C \sum_{i=k_l+1}^{d} \lambda_i^{(l)}

对经过充分训练的大型模型,特征值谱往往快速衰减(近似幂律分布),使得这个截断误差在合理的 kk 下非常小。

图一:计算不变性示意

flowchart LR
    subgraph 原始参数化["原始参数化"]
        x1["x ∈ ℝᵈ"] --> W1["W₁"]
        W1 --> phi1["φ(·) 逐元素"]
        phi1 --> W2["W₂"]
        W2 --> y1["y ∈ ℝᵈ"]
    end
    subgraph 旋转参数化["插入 Q^T Q = I 后"]
        x2["Qx ∈ ℝᵈ"] --> W1Q["W₁Q^T"]
        W1Q --> phi2["φ(·) 逐元素"]
        phi2 --> W2b["W₂"]
        W2b --> y2["y ∈ ℝᵈ(完全相同)"]
    end
    原始参数化 -. "插入 Q^T Q = I(零误差)" .-> 旋转参数化

图一:插入正交恒等式后,计算结果完全不变。选 Q 为 PCA 旋转矩阵,使最后几个坐标方差最小,为安全截断创造条件。

SliceGPT 算法详解

算法伪代码

输入:
  f_θ          预训练 Transformer(L 层,隐藏维度 d)
  D_calib      标定数据:C 条序列 × T 个 token(论文用 C=256, T=2048,取自 C4)
  s            全局稀疏率(论文用 s=0.25)

输出:
  f_θ̃          压缩后的 Transformer,隐藏维度 k = round(d·(1−s))

─────────────────────────────────────────────────────
预处理:RMSNorm 吸收(精确操作)
  对每个 Block l:
    将缩放参数 γ_l 折叠进紧随其后的权重矩阵:
      W ← W · diag(γ_l)
    从模型图中删除 RMSNorm 层
─────────────────────────────────────────────────────
逐层 PCA + 切片:
  对 l = 0 到 L−1:

    步骤A:采集激活
      对 D_calib 做前向推理,hook 采集第 l 层位置的所有 token 激活
      A_l ← 拼接所有 token 的隐状态,形状 (d, N),N = C × T

    步骤B:计算 PCA 基
      C_l ← (1/N) · A_l @ A_l.T        # 经验协方差矩阵,形状 d×d
      特征值, Q_l ← eigh(C_l)           # 特征分解
      # Q_l 的行向量按特征值降序排列

    步骤C:确定切片宽度
      k_l ← round(d · (1 − s))          # 均匀稀疏版本
      # 非均匀版本:用 EVR 预算优化各层 k_l

    步骤D:变换并切片所有相关权重
      对 W_in ∈ {W_Q, W_K, W_V, W_gate, W_up}(从位置 l 读取残差流):
        W_in ← (W_in @ Q_l.T)[:, :k_l]  # 旋转后保留前 k 列

      对 W_out ∈ {W_O, W_down}(向位置 l+1 写入残差流):
        W_out ← (Q_{l+1} @ W_out)[:k_{l+1}, :]  # 旋转后保留前 k 行
        (k_{l+1} 来自下一轮迭代)

─────────────────────────────────────────────────────
边界变换:
  输入 embedding 矩阵 E ∈ ℝ^{V×d}:
    E ← (E @ Q_0.T)[:, :k_0]
  输出 LM head W_lm ∈ ℝ^{V×d}:
    W_lm ← (W_lm @ Q_L.T)[:, :k_L]
─────────────────────────────────────────────────────
可选:1 epoch 恢复微调
  用 LoRA 在 D_calib 或更大数据集上微调 f_θ̃ 1 个 epoch

各步骤详解

步骤A:为什么逐层采集激活?

ll 层的 PCA 基必须反映真实推理时激活的分布,而这个分布取决于第 0,,l10, \ldots, l-1 层的权重和标定数据。用随机高斯激活会得到错误的基(残差流激活高度非高斯)。逐层前向扫描正确地捕获了这一点。

步骤B:通过协方差特征分解求 PCA 基。

经验协方差矩阵 Cl=1NAlAlTRd×dC_l = \frac{1}{N} A_l A_l^T \in \mathbb{R}^{d \times d} 是对称半正定矩阵。其特征向量给出主方向,特征值 λi\lambda_i 给出各方向的方差。对 LLAMA2-70B(d=8192d=8192),每个 ClC_l 是 64M 个元素(FP32 下 256MB)——有 80 层,总存储约 20GB,可在 A100 上一次性完成。

计算复杂度为 O(d2N)O(d^2 N)(构建 AlAlTA_l A_l^T+O(d3)+ O(d^3)(特征分解)。对 d=8192d = 8192N=524288N = 524288,前者 ~3.5×10¹² FLOPs,后者 ~5.5×10¹¹ FLOPs;在 GPU 上可以高效并行执行。

步骤C:选取切片宽度的依据。

均匀稀疏 k=d(1s)k = \lfloor d(1-s) \rfloor 最简单。更精细的非均匀版本最小化全局截断误差:

mink0,,kLli>klλi(l)s.t.lparams(kl)B\min_{k_0, \ldots, k_L} \sum_l \sum_{i > k_l} \lambda_i^{(l)} \quad \text{s.t.} \quad \sum_l \text{params}(k_l) \le B

可贪心求解:将所有层按边际截断误差(每减少一个参数带来的误差增量)排序,优先保护误差增量大的层。

步骤D:权重变换与切片的几何意义。

变换 WinWinQlT[:,:k]W_\text{in} \leftarrow W_\text{in} Q_l^T[:, :k] 等价于:先把输入空间旋转到激活方差最集中的方向,再截取前 kk 维。这保证了被丢弃的 dkd-k 列对应的输入方向在实际数据上几乎没有贡献(方差极小),故截断误差小。

Q 矩阵在推理时消失。 变换完成后,权重矩阵已经内嵌了 Q 的信息,推理时不需要再查询任何 Q 矩阵——完全透明。

图二:SliceGPT 压缩流程图

flowchart TD
    A["预训练 LLM\n隐藏维度 d"] --> B["标定数据\n256 × 2048 token(C4)"]
    B --> C["步骤1:吸收 RMSNorm γ\n精确折叠进相邻权重"]
    C --> D["对每层 l:\n前向推理 → 采集 A_l ∈ ℝ^{d×N}"]
    D --> E["PCA:C_l = A_l A_l^T → 特征分解 → Q_l"]
    E --> F["设定 k_l = d·(1−s)"]
    F --> G["W_in ← (W_in Q_l^T)[:, :k]\nW_out ← (Q_{l+1} W_out)[:k, :]"]
    G --> H{还有下一层?}
    H -->|是| D
    H -->|否| I["变换 embedding E、LM head W_lm"]
    I --> J["(可选)1 epoch LoRA 微调"]
    J --> K["压缩后模型\n隐藏维度 k = 0.75d\n纯稠密矩阵,无需自定义算子"]

图二:SliceGPT 完整压缩流程。标定阶段只需前向推理,无需梯度。Q 矩阵被吸收进权重,推理时不存储。

特殊模块的处理方式

RMSNorm 的吸收

RMSNorm 计算:

RMSNorm(x)=xx2/dγ\text{RMSNorm}(x) = \frac{x}{\|x\|_2 / \sqrt{d}} \cdot \gamma

RMS 缩放因子 x2/d\|x\|_2 / \sqrt{d} 在正交变换下不变(因为 Qx2=x2\|Qx\|_2 = \|x\|_2)。所以缩放因子本身对基变换透明,只需把 γ\gamma 折叠进下游权重:

WWdiag(γ)W \leftarrow W \cdot \text{diag}(\gamma)

这一步精确无误差,之后可从模型图中彻底删去 RMSNorm 层。压缩后的模型没有归一化层——只有线性层和非线性激活函数,结构更简洁,推理略快。

多头自注意力

在 LLAMA2 的多头注意力中,Q/K/V 投影矩阵 WQ,WK,WVW_Q, W_K, W_V 读取同一个残差流位置 ll,因此都接受相同的输入基变换:

W~Q=(WQQlT)[:, :k],W~K=(WKQlT)[:, :k],W~V=(WVQlT)[:, :k]\tilde{W}_Q = (W_Q Q_l^T)[\text{:, :k}], \quad \tilde{W}_K = (W_K Q_l^T)[\text{:, :k}], \quad \tilde{W}_V = (W_V Q_l^T)[\text{:, :k}]

每个矩阵的输入维度从 dd 缩减到 kk;每个头的输出维度 dheadd_\text{head} 保持不变

输出投影 WORd×(Hdhead)W_O \in \mathbb{R}^{d \times (H \cdot d_\text{head})} 写入残差流位置 l+1l+1

W~O=(Ql+1WO)[:k, :]\tilde{W}_O = (Q_{l+1} W_O)[\text{:k, :}]

输出维度从 dd 缩减到 kl+1k_{l+1};输入维度 HdheadH \cdot d_\text{head} 保持不变。

分组查询注意力(GQA,LLAMA2-70B使用): K/V 头在多个 Q 头之间共享。SliceGPT 处理方式相同——WK,WVW_K, W_V 的输入维度从 dd 缩减到 kk,每个头的维度不变。

MLP 块(SwiGLU)

LLAMA2 的 MLP 使用 SwiGLU:

MLP(x)=Wdown ⁣(SiLU(Wgatex)Wupx)\text{MLP}(x) = W_\text{down}\!\bigl(\text{SiLU}(W_\text{gate}\, x) \odot W_\text{up}\, x\bigr)

WgateW_\text{gate}WupW_\text{up} 从第 ll 层残差流读取:

W~gate=(WgateQlT)[:, :k],W~up=(WupQlT)[:, :k]\tilde{W}_\text{gate} = (W_\text{gate}\, Q_l^T)[\text{:, :k}], \quad \tilde{W}_\text{up} = (W_\text{up}\, Q_l^T)[\text{:, :k}]

WdownW_\text{down} 写入第 l+1l+1 层残差流:

W~down=(Ql+1Wdown)[:k, :]\tilde{W}_\text{down} = (Q_{l+1}\, W_\text{down})[\text{:k, :}]

中间维度 dffd_\text{ff}(LLAMA2 SwiGLU 中约为 8d/38d/3)在基础算法中不切片。切片 dffd_\text{ff} 需要对非线性后的激活额外做一轮 PCA,作为未来工作留存。

图三:各组件切片映射

flowchart LR
    RS_l["残差流 l\n维度: k_l"] --> WQ["W_Q Q_l^T [:, :k]\nd_h × k_l"]
    RS_l --> WK["W_K Q_l^T [:, :k]\nd_h × k_l"]
    RS_l --> WV["W_V Q_l^T [:, :k]\nd_h × k_l"]
    RS_l --> Wg["W_gate Q_l^T [:, :k]\nd_ff × k_l"]
    RS_l --> Wu["W_up Q_l^T [:, :k]\nd_ff × k_l"]
    WQ & WK & WV --> Attn["注意力计算\n(内部 d_h 不变)"]
    Attn --> WO["Q_{l+1} W_O [:k, :]\nk_{l+1} × d_h"]
    Wg & Wu --> MLP["SiLU / GeLU\n(d_ff 不变)"]
    MLP --> Wd["Q_{l+1} W_down [:k, :]\nk_{l+1} × d_ff"]
    WO & Wd --> RS_lp1["残差流 l+1\n维度: k_{l+1}"]

图三:从残差流读取的权重输入维度从 d 切到 k;向残差流写入的权重输出维度从 d 切到 k。内部维度(d_h, d_ff)不变。

标定数据与稀疏度配置

标定数据规模

SliceGPT 使用 C4 数据集(网页爬取语料)的 256 条序列,每条 2048 个 token,合计约 52 万个 token——相比预训练数据可以忽略不计,且仅需推理前向传播,无需存储梯度。

实验表明:

  • C4 与 Wikitext-2 作为标定数据效果几乎相同,说明 PCA 基对数据分布(在自然语言范围内)不敏感
  • 128 条序列已足够,512 条效果提升边际
  • 推理模式下运行,显存峰值约为模型权重的 1.5–2 倍

已解释方差比(EVR)

压缩后第 ll 层保留的”信息量”可以用 EVR 量化:

EVR(k,l)=i=1kλi(l)i=1dλi(l)\text{EVR}(k, l) = \frac{\sum_{i=1}^{k} \lambda_i^{(l)}}{\sum_{i=1}^{d} \lambda_i^{(l)}}

LLAMA2-70B 在 k=0.75dk = 0.75d 下,早中期层的 EVR 通常超过 99.5%,末尾几层略低至 ~98.5%,印证了大型模型激活方差高度集中的特性。

非均匀稀疏度分配

均匀切片是最简单的方案,但不同层的激活方差集中程度不同。非均匀版本在全局参数预算约束下最小化各层截断误差之和,可用贪心法求解,对小模型(<13B)效果更明显。

实验与结果分析

评估设置

  • 评估模型: LLAMA2-7B/13B/70B;OPT-13B/30B/66B;Phi-2 (2.7B)
  • 标定数据: 256×2048 token,来自 C4
  • 评估框架: EleutherAI LM-Eval-Harness,7 个零样本任务(WinoGrande、HellaSwag、PIQA、ARC-easy、ARC-challenge、OpenBookQA、BoolQ)
  • 基线: SparseGPT(50% 非结构化稀疏)、Wanda(50%非结构化)、LLM-Pruner(20% 结构化)

表一:25% 参数削减下的零样本精度

模型稠密精度SliceGPT保留率稠密 GPU 数压缩后 GPU 数
LLAMA2-7B64.0%58.2%91.0%1×A1001×A100
LLAMA2-13B66.8%61.4%91.9%2×A1001×A100
LLAMA2-70B70.4%69.8%99.1%4×A1002×A100
OPT-66B66.7%66.1%99.1%4×A1002×A100
Phi-2 (2.7B)71.2%63.9%89.7%1×RTX30901×RTX3090

核心规律:模型越大,压缩损失越小。 70B 模型丢失不到 1 个百分点;7B 模型丢失约 6 个百分点——背后是大型模型存在更多冗余,PCA 可以识别并安全丢弃。LLAMA2-13B 压缩后从 2 张 GPU 缩到 1 张,是实用价值最显著的案例之一。

表二:Wikitext-2 困惑度(越低越好)

模型稠密SliceGPT 20%SliceGPT 25%SparseGPT 50%
LLAMA2-7B5.475.826.826.51
LLAMA2-13B4.885.125.725.40
LLAMA2-70B3.323.403.523.51
OPT-66B9.349.559.809.76

在 66–70B 规模上,SliceGPT 25% 结构化压缩的困惑度与 SparseGPT 50% 非结构化稀疏大致相当,但 SliceGPT 的实际硬件收益更直接(无需自定义算子,GPU 数减半)。

算力缩减分析

对 LLAMA2-70B,s=0.25s = 0.25,理论 FLOP 比为:

FLOPscompressed/FLOPsdense=(k/d)2=0.752=0.562556%\text{FLOPs}_\text{compressed} / \text{FLOPs}_\text{dense} = (k/d)^2 = 0.75^2 = 0.5625 \approx 56\%

实测为 64–66%(略高于理论,因为 embedding 和 MLP 中间维度未完全削减)。更重要的是,LLAMA2-70B 从需要 4 张 A100 缩减到 2 张——直接节省一半硬件成本。

恢复微调效果

1 epoch LoRA 微调后:

  • LLAMA2-70B:恢复 ~0.2 点(已接近稠密质量,效果有限)
  • LLAMA2-7B:恢复 ~2 点(58.2% → 60.1%)
  • Phi-2:恢复 ~3 点(63.9% → 67.1%)

微调对初始损失较大的小模型帮助最显著;对大模型基本无需微调即可实用。

图四:方法横向比较(LLAMA2-70B,Wikitext-2 PPL)

flowchart LR
    subgraph Methods["方法比较"]
        Dense["稠密基线\nPPL=3.32\n4×GPU\n无自定义算子"]
        SparseGPT["SparseGPT 50%\nPPL=3.51\n4×GPU(仍然)\n需要稀疏 GEMM"]
        Wanda["Wanda 50%\nPPL=3.53\n4×GPU(仍然)\n需要稀疏算子"]
        SliceGPT["SliceGPT 25%\nPPL=3.52\n2×GPU ✓\n无需自定义算子 ✓"]
    end

图四:SliceGPT 是唯一同时满足「无自定义算子」和「真实 GPU 数减半」的方法,在 66–70B 上困惑度与非结构化稀疏方法持平。

与已有方法的比较

为何计算不变性比量级剪枝更有原则

大多数结构化剪枝方法(LLM-Pruner、ShortGPT 等)通过量级、梯度、Taylor 展开等启发式指标来选择剪去哪些神经元/通道。SliceGPT 的不同之处在于:

  1. 先通过 PCA 找到理论最优基变换(在最小化截断误差意义上,PCA 是最优的——这是 Eckart-Young 定理的直接推论)
  2. 基变换本身引入零误差——只有后续截断引入近似
  3. 截断误差有明确的上界(丢弃特征值之和),可以定量指导稀疏度选择

图五:训练后 LLM 压缩方法分类

flowchart TD
    root["训练后 LLM 压缩"]
    root --> Quant["量化\nGPTQ · AWQ · SmoothQuant"]
    root --> Unstruct["非结构化稀疏\nSparseGPT · Wanda · 量级剪枝"]
    root --> Struct["结构化剪枝\nSliceGPT · LLM-Pruner · ShortGPT · FLAP"]
    root --> LowRank["低秩分解\nSVD-LLM · ASVD · TrLoRA"]
    Struct -->|"理论依据:\n计算不变性 + PCA"| SliceGPT_node["SliceGPT(本文)"]

图五:SliceGPT 属于结构化剪枝,与其他方法的关键区别在于背后有精确的理论推导,而非量级启发式。

局限性与适用边界

规模依赖性是根本限制

99% 精度保留的结论仅对 60B+ 参数的模型成立。7B 模型下损失约 6 个百分点。根本原因:

  • 大型模型过度参数化,激活方差高度集中在少数主方向(特征值谱快速衰减)
  • 小型模型利用率更高,各方向都有实质性贡献(特征值谱较为平坦)

SliceGPT 本质上在利用过度参数化提供的”冗余方差”,这在小模型中天然不足。

MLP 中间维度未切片

基础算法只削减残差流维度 dd,MLP 的中间维度 dff8d/3d_\text{ff} \approx 8d/3(SwiGLU)保持不变。这意味着:

  • Wgate,WupW_\text{gate}, W_\text{up} 矩阵尺寸:dff×dd_\text{ff} \times ddff×kd_\text{ff} \times k(节省 ss 比例)
  • WdownW_\text{down} 矩阵尺寸:d×dffd \times d_\text{ff}k×dffk \times d_\text{ff}(节省 ss 比例)
  • 但非线性后的中间激活仍占 dffd_\text{ff} 维,MLP 内部的算力节省不完全按 s2s^2 比例

对 MoE 等 MLP 算力占主导的架构,这一局限更为明显。

评估基准过于单一

所有实验仅在 7 个短答案零样本分类任务上评估。以下类型任务没有覆盖:

  • 代码生成(HumanEval、MBPP)
  • 数学推理(GSM8K、MATH)
  • 长文本生成指令跟随(MT-Bench、AlpacaEval)
  • 长上下文任务(LongBench、SCROLLS)

残差流维度削减对需要精确维护多步推理状态的任务可能更有损害,但论文未验证。

KV 缓存未受益

由于每个注意力头的维度 dheadd_\text{head} 未切片,WK,WVW_K, W_V 输出的 K/V 向量维度不变,KV 缓存大小不减少。对长序列服务(KV 缓存是主要内存瓶颈)而言,SliceGPT 没有直接收益——论文未提及这一局限。

批判性分析:不足与可改进之处

(一)方法缺陷与弱点

“25% 参数削减”标题存在误导性。 SliceGPT 把残差流维度从 dd 缩减到 0.75d0.75d,权重矩阵在一个维度上缩减了 25%。对形状为 d×dd \times d 的权重矩阵,参数量从 d2d^2 减到 kd=0.75d2kd = 0.75d^2,确实是 25%。但形状为 dff×dd_\text{ff} \times d 的 MLP 矩阵仅在一个维度上缩减,而 Embedding 矩阵 V×dV \times dV=32000V = 32000)的参数量削减依赖于 dd 缩减的绝对值,占比微乎其微。论文报告”含 embedding 最多削减 25% 参数”,但 Table 2 中各模型的实际削减率有差异,这一细节应更突出。

与 SparseGPT 的比较处于不同操作点。 论文将 SliceGPT 25% 结构化稀疏与 SparseGPT 50% 非结构化稀疏比较困惑度,声称”具有竞争力”。但两者在实际 FLOP 削减和推理加速上差距显著:SparseGPT 50% 非结构化在没有稀疏内核的情况下几乎没有延迟收益(有些情况下反而更慢),而 SliceGPT 25% 有真实的 ~34% FLOP 削减。公平比较应当在相同的实测吞吐量下做横向对比,而非在参数削减率上对齐。

没有对标定数据大小和领域的系统消融。 论文仅做了 C4 对比 Wikitext-2 的一次比较,但对于垂直领域模型(医疗、代码、法律),C4 作为标定数据是否足够、领域匹配标定数据是否必要,完全未研究。这是一个实用性缺口。

无真实延迟测量。 论文给出 FLOP 削减数字和 GPU 数量变化,但没有报告实际 tokens/second。对内存带宽受限的推理场景(小批次),FLOP 削减不直接等于延迟削减——论文”更快”的结论在技术上是理论的而非实测的。

微调恢复分析不足。 1 epoch LoRA 微调结果仅作为附加说明,没有探讨:更多 epoch 能恢复多少、全量微调 vs LoRA 孰优孰劣、最优训练数据选择策略。

(二)作者淡化或回避的局限

KV 缓存无收益被完全略去。 由于每个注意力头维度 dheadd_\text{head} 未切片,K/V 投影输出维度不变,KV 缓存大小不减少。论文完全没有提及这一点。对于长上下文推理场景,KV 缓存是显存瓶颈,SliceGPT 在此场景下没有实质性帮助。

张量并行分片的潜在问题。 压缩后的隐藏维度 k=0.75dk = 0.75d 在 LLAMA2-70B 中为 6144。对于张量并行度为 8 或 16 的部署,6144/16 = 384,整除没问题;但对某些非 2 次幂的并行度,可能需要 padding 或不规则分片,增加部署复杂性。论文未分析。

压缩时的显存峰值被略去。 压缩过程中需要同时持有原始权重和变换后的权重(WWWQTW Q^T),峰值显存约为模型权重的两倍。对 LLAMA2-70B(FP16 约 140GB),峰值约 280GB,超过 4×A100-80GB(320GB 合计)的单一张量限制,需要精细的逐层显存管理。论文声称 4×A100-80GB 足够,但未说明内存管理细节。

(三)可以改进的地方

1. 同时切片 MLP 中间维度。 对 SwiGLU 后激活向量(非线性后的中间向量)额外运行一轮 PCA,用于切片 dffd_\text{ff}——将 Wgate/WupW_\text{gate}/W_\text{up} 的输出维度和 WdownW_\text{down} 的输入维度同时削减。理论上在 s=0.25s=0.25 下可将 MLP 算力进一步降至 (1s)2=56%(1-s)^2 = 56\%,改善目前的 “只切一边” 问题。

2. 带验证反馈的非均匀层分配。 在均匀稀疏之外,使用少量保留集(16–32 条序列)逐层测试不同 klk_l 对困惑度的影响,并用贪心策略保护最敏感的层(通常是首尾几层)。已有多项研究表明首尾层对结构化剪枝极为敏感,系统性消融此处有望显著改善精度-压缩曲线。

3. 扩展评测集,纳入推理与代码任务。 增加 GSM8K(数学)、HumanEval(代码)、MT-Bench(指令跟随)评估。若 SliceGPT 在这些需要精确多步推理的任务上损失显著大于零样本分类,这对实用部署决策至关重要,应透明报告。

4. 与量化组合并测量联合效果。 在 SliceGPT 后接 AWQ 或 GPTQ(INT4),与单独 AWQ 在相同硬件上对比。若 SliceGPT + INT4 能在更低延迟下达到 INT4 单独的精度,则形成极具说服力的部署方案——此组合在论文中完全未探索。

5. 注意力头维度 PCA 切片。 在当前算法的基础上,对每个注意力头的 K/V 激活向量单独做 PCA,进一步削减 dheadd_\text{head}。这将直接缩减 KV 缓存大小,对长序列推理服务产生切实价值,是弥补现有局限的最直接方向。

深度解析:SliceGPT 与权重级低秩分解的根本区别

SliceGPT 和 SVD-LLM、ASVD 等方法都涉及 SVD,都会产生更小的权重矩阵,很容易被混为一谈。但两者在数学上有本质区别,理解这个区别对于选择压缩方法至关重要。

权重级低秩分解(SliceGPT 不是这个)

传统低秩压缩独立地对每个权重矩阵做截断 SVD:

WUkΣkVkTW \approx U_k \Sigma_k V_k^T

其中 UkRm×kU_k \in \mathbb{R}^{m \times k}VkTRk×nV_k^T \in \mathbb{R}^{k \times n}。原来的一次矩阵乘变成两次:先乘 ΣkVkT\Sigma_k V_k^T,再乘 UkU_k

权重级 SVD 的问题:

  • 每个矩阵独立近似,忽略了相邻层的近似误差会在残差流中累积
  • 近似误差定义在权重空间——被截断的方向未必对应激活真正占据的方向
  • 两个小矩阵 Uk,VkTU_k, V_k^T 都需要存储,除非 kmin(m,n)k \ll \min(m,n),否则推理时两次 GEMM 的开销可能反而更大

SliceGPT 的实际做法

SliceGPT 对激活而不是权重做 SVD/PCA,核心数学区别如下:

步骤一(SliceGPT): 找到 QlQ_l,使激活 AlA_l 在前 klk_l 个坐标上方差最大。

步骤二(SliceGPT): 对所有触及位置 ll 的权重做一致的基变换——这一步是精确的(计算不变性定理保证零误差)。

步骤三(SliceGPT): 截去最后 dkld - k_l 个坐标。这是唯一的近似步骤,误差等于被丢弃的特征值之和。

结果是一个单独的矩阵(不是乘积对):原来 m×dm \times d 的矩阵变成 m×km \times k——一个矩阵,不是两个。这就是为什么推理计算真正减少,而不仅仅是被重新排列。

误差上界的形式化比较

权重 WW 的低秩 SVD 误差:

Error=WUkΣkVkTF=i>kσi(W)2\text{Error} = \|W - U_k \Sigma_k V_k^T\|_F = \sqrt{\sum_{i>k} \sigma_i(W)^2}

这个误差在权重空间,可能不反映激活实际使用哪些方向。

SliceGPT 第 ll 层的截断误差:

ErrorlCi>klλi(l)\text{Error}_l \le C \sum_{i > k_l} \lambda_i^{(l)}

其中 λi(l)\lambda_i^{(l)}激活协方差的特征值。这个误差在激活空间,直接衡量实际运行时被丢弃了多少信息——对下游任务性能的预测更直接、更紧。

图六:SliceGPT 与权重级低秩分解对比

flowchart TB
    subgraph WeightSVD["权重级 SVD(如 SVD-LLM)"]
        W1["W ∈ ℝ^{m×d}"] -->|"SVD 截断"| UV["U_k (m×k) × Σ_k V_k^T (k×d)\n两个矩阵,两次 GEMM"]
        UV --> Err1["误差:‖W − U_kΣ_kV_k^T‖_F\n(权重空间,不反映激活分布)"]
    end
    subgraph SliceGPT_Diag["SliceGPT(激活空间)"]
        W2["W ∈ ℝ^{m×d}"] -->|"旋转:W Q_l^T(精确,零误差)"| WQ["W Q_l^T ∈ ℝ^{m×d}"]
        WQ -->|"切片:保留前 k 列"| Wk["W Q_l^T [:, :k] ∈ ℝ^{m×k}\n一个矩阵,一次 GEMM"]
        Wk --> Err2["误差:Σ_{i>k} λᵢ(激活协方差特征值)\n(激活空间,直接量化信息损失)"]
    end

图六:权重级 SVD 产生矩阵乘积对、误差在权重空间;SliceGPT 产生单一更小矩阵、误差在激活空间,与实际任务性能更直接相关。

稀疏度扩展行为与各层特性分析

精度随稀疏度如何下降?

理解精度-稀疏度曲线对于选择实际部署点至关重要:

  • 0–10% 稀疏度: 所有规模模型精度几乎无损。高方差的 PCA 方向远比低方差方向重要;只丢弃尾部代价几乎可忽略。
  • 10–20% 稀疏度: 70B+ 模型损失可忽略;7–13B 模型损失约 1–2 个百分点,仍可实用。
  • 25% 稀疏度(论文主要场景): 大型模型的”甜蜜点”——70B 保留 99%;7B 损失 6 个百分点,开始明显。
  • 30%+ 稀疏度: 精度下降加速呈非线性。特征值谱衰减快但不是无限,高稀疏度下开始删除有实质方差的方向。

这个非线性降级规律与数学预测一致:截断误差最初增长缓慢(只丢弃小特征值),之后迅速增大(开始丢弃有意义的特征值)。

各层激活特征值谱的差异

分析不同层 AlAlTA_l A_l^T 的特征值谱,呈现规律性结构:

  • 早期层(l=0l = 01010): 谱相对平坦,激活方差分散在较多方向。这些层较难压缩,非均匀分配中应分配更小的稀疏率。
  • 中间层(l=10l = 106060,对 70B 而言): 谱陡峭,即使 k=0.5dk = 0.5d 时 EVR 也很高。冗余极大。
  • 末尾几层(l>60l > 60): 谱居中。LM head 需要区分大量不同 token,最后几层需要更多维度。

这一分层结构解释了为何均匀稀疏在平均意义上工作良好,而保护首尾层的非均匀分配可在相同算力预算下解锁更好的精度。

与具体架构变体的交互

RoPE 位置编码(LLAMA2使用): RoPE 在 Q/K 投影之后施加,作用在每个注意力头的维度 dheadd_\text{head} 上。SliceGPT 不改变 dheadd_\text{head},故 RoPE 完全不受影响。

ALiBi 位置偏置(OPT使用): 注意力分数中的加性偏置,同样作用在注意力分数空间(dheadd_\text{head} 维),SliceGPT 不改变,无需特殊处理。

权重共享 Embedding(部分模型): 若输入 embedding EE 与输出 LM head WlmW_\text{lm} 共享权重,SliceGPT 的实现需要在压缩后重新绑定,代码库已处理此情况。

消融实验补充分析

均匀稀疏 vs. 非均匀稀疏

论文简短提及非均匀分配效果”边际改进”。从理论上看,非均匀分配的优势在于可以保护激活谱较平坦(冗余少)的层,同时对激活谱陡峭(冗余多)的层更激进地压缩。对于大型模型(70B)因本身冗余极大,均匀稀疏效果已经很好;对于小型模型(7B),非均匀分配有望恢复 1–3 个百分点。

不同稀疏率下的 GPU 内存对比

在 LLAMA2-70B 上,不同稀疏率下推理所需的 GPU 内存:

稀疏率 s隐藏维度 kFP16 权重大小(估算)最少 GPU(A100-40G)
0%8192~138GB4
20%6554~90GB3
25%6144~80GB2
30%5734~69GB2

25% 稀疏度是”从 4 张变 2 张 GPU”的临界点,兼顾精度和基础设施节省。

可复现性

  • 代码: github.com/microsoft/TransformerCompression(MIT 许可,截至 2025 年 6 月仍在维护)
  • 标定数据: HuggingFace allenai/c4 英文子集,256 × 2048 token
  • 压缩耗时: LLAMA2-70B 约 1–2 小时(4×A100-80GB,纯推理,无梯度)
  • 评估: EleutherAI LM-Eval-Harness v0.3+,--no_cache 保证可复现性
  • 确定性: 给定相同标定序列顺序完全确定性;仅标定采样涉及随机种子
  • 依赖: PyTorch ≥ 2.0,transformersdatasetsscipy.linalg.eigh

从零实现 SliceGPT 核心逻辑约需 200 行 PyTorch——是理解计算不变性原理的极好教学案例。

一张表格总结全文

在结束之前,用一张表格提炼 SliceGPT 的核心设计决策:

设计决策原因留下的开放问题
用 PCA 选取 Q(而非随机)Eckart-Young 最优:最小化激活重建误差需要标定前向传播
默认均匀稀疏率对大型模型近似最优,简单易用小模型上次优;非均匀效果更好
吸收 RMSNorm 进权重精确代数化简,推理无额外开销仅适用于对角缩放归一化
不切片 dffd_\text{ff}避免第二轮 PCA;简化实现留下 MLP 算力节省未利用
256 序列标定稳定 PCA 所需且开销低垂直领域模型可能需要领域内数据
可选微调大模型无需微调即可实用小模型从 1 epoch 微调中受益显著

每一行”留下的开放问题”都是一个具体的研究方向,合在一起构成了扩展 SliceGPT 的路线图。

总结

SliceGPT 的贡献是干净的:一个精确的数学定理(计算不变性)加上一个原则性的工程实现(PCA 旋转 + 物理截断),产出了无需自定义算子、可立即部署在标准硬件上的更小更快 Transformer。

在 70B 规模上,该方法的压缩-质量权衡极具吸引力:25% 参数削减、99% 任务性能保留、GPU 数量减半、FLOP 缩减到 64–66%——对于 LLAMA2 规模的工业部署,这是目前部署门槛最低的压缩方案之一。

其局限同样清晰:小模型(<13B)效果大幅下降;仅在短答案零样本分类任务上做了验证;MLP 中间维度未切片;KV 缓存未受益;与量化组合的效果未知。这些不是方法的根本缺陷,但划定了它适用的边界条件。

对后续研究者:计算不变性定理本身是值得深入发掘的理论工具——对注意力头维度、MLP 中间维度乃至 MoE 的路由空间都有潜在的拓展价值。对工程实践者:在 70B+ 规模且任务以零样本分类为主的场景,SliceGPT 是当前最”开箱即用”的结构化压缩选项。

个人感受: 这篇论文很适合作为进入模型压缩领域的入门读物。数学洞察用五行公式讲清楚,代码开源干净,大型模型结果令人信服。评估范围不够宽(缺少推理与代码任务)和小模型表现欠佳是真实的局限,但不影响核心贡献的价值。建议仔细读一遍计算不变性的形式化证明,对理解 Transformer 内部结构很有帮助。

延伸阅读

想深入了解相关背景的读者,可以参考以下工作:

  • SparseGPT(Frantar & Alistarh, NeurIPS 2023)——非结构化对应方案;对比两者的标定策略:SparseGPT 用逐层 Hessian 重建,SliceGPT 用 PCA 协方差
  • SVD-LLM(Wang et al., 2024)——直接对权重矩阵做 SVD 的低秩压缩;与 SliceGPT 的激活空间思路形成鲜明对比
  • ASVD(Yuan et al., 2023)——激活感知 SVD,在概念上与 SliceGPT 最接近,但仍在权重空间做近似
  • QuIP#(Tseng et al., NeurIPS 2024)——在量化前对权重施加随机正交变换(非相关性处理),使量化误差更均匀分布;正交变换思路与 SliceGPT 同源,但服务于量化而非切片
  • LLM-Pruner(Ma et al., 2023)——梯度引导的结构化剪枝;展示了启发式方法与 SliceGPT 原则方法的精度-压缩权衡差异
  • TransformerCompression(GitHub)——微软研究院官方开源实现,代码整洁、注释清晰、持续维护,是动手实验的最佳起点
  • 线性代数教材中的 Eckart-Young 定理——理解为什么 PCA 是最优截断基的数学依据,把整篇论文的数学背景贯穿起来

推荐概念阅读路径

对于刚接触训练后压缩的读者,建议按以下顺序阅读:

  1. SliceGPT(本文)——从这里开始,理解理论框架和计算不变性思想
  2. SparseGPT——看看非结构化方法如何用 Hessian(而非 PCA)解决同样的标定问题
  3. SVD-LLM / ASVD——直接对比权重空间 SVD 与激活空间 SVD 的差异
  4. QuIP#——同样使用正交变换,但服务于量化而非切片,帮助理解思路的普适性
  5. LLM-Pruner——梯度引导的结构化剪枝,反衬出 SliceGPT 仅靠标定数据前向推理的简洁性

这条路径建立了一个连贯的心智模型:上述所有方法的共同线索是用标定数据指导压缩决策,区别在于压缩对象(权重、激活、结构)和如何使用标定信号(Hessian、PCA、梯度)。

实现要点备忘(写给想自己动手的人)

从零实现 SliceGPT 的几个容易踩坑的地方:

  1. 协方差矩阵的数值稳定性。scipy.linalg.eigh(对称矩阵特征分解)而非 numpy.linalg.eig(通用特征分解);前者更稳定,且保证实数特征值。

  2. Q 矩阵的行列顺序。 PCA 返回的特征向量可能按升序排列,需要翻转为降序(方差最大的方向排在前面)才能正确切片。

  3. 残差连接的一致性。 同一层的所有读写权重必须使用同一个 QlQ_l——即注意力的 Q/K/V/O 投影和 MLP 的 gate/up/down 都共享一个层级的 QlQ_l

  4. 末层 LM head 的处理顺序。 如果模型权重共享(embedding = LM head 的转置),只能变换一次;需要在应用 QLQ_L 后重新绑定。

  5. 显存管理。 逐层处理:采集完第 ll 层激活后立刻计算 QlQ_l、变换并切片权重,释放 AlA_l,再进入第 l+1l+1 层。不要试图一次性存储所有层的激活矩阵。

  6. 验证正确性。 压缩完成后,对同一批标定数据计算稠密模型和压缩模型的困惑度之差——如果差距超过 0.2(对 70B 模型,25% 稀疏度),说明实现有误(最常见的错误是 Q 矩阵的方向搞反,或某层权重漏了变换)。

  7. RMSNorm 吸收的时机。 在开始逐层 PCA 之前就完成 RMSNorm 吸收,否则激活协方差的估计会包含归一化缩放的影响,导致 PCA 基计算不准确。正确顺序:折叠 γ → 采集激活 → 计算 PCA → 切片。

这些实现细节在论文附录和官方代码中有说明,但容易被快速阅读者跳过。上手时对着代码逐行检验数学公式,是最可靠的验证方法。

一个思维实验:如果激活方差完全均匀会怎样?

SliceGPT 的效果依赖于激活方差的不均匀分布——少数主方向承载绝大多数方差。那么,如果激活方差完全均匀(所有特征值相等),会发生什么?

数学上: 如果 λ1=λ2==λd=λ\lambda_1 = \lambda_2 = \cdots = \lambda_d = \lambda,那么任何正交基 QQ 下截断误差都是 λ(dk)\lambda \cdot (d-k)——与 QQ 的选择无关。PCA 不再提供优势,截断 25% 维度会均匀地损失 25% 的激活”信息”。

实际意义: 这种极端情形在实践中不会发生,但随机初始化的模型(训练前)激活方差确实比较均匀。训练的过程会让激活方差越来越集中到少数方向(这与神经网络的隐式低秩性有关)。这就是为什么 SliceGPT 只能用于已训练模型:预训练带来的”激活低秩性”是方法有效的前提。

这个思维实验也解释了另一个现象:更大的模型、训练更充分的模型,激活方差往往集中度更高(特征值谱更陡),因此 SliceGPT 在大型充分训练的模型上效果最好。反过来,欠拟合的小模型或对话微调导致激活方差重新分散的模型,可能不适合用 SliceGPT 压缩。

这个思维实验还引出了一个有趣的问题:未来的训练方法能否主动提升激活的低秩性(让特征值谱更陡),从而使后续的 SliceGPT 压缩损失更小?目前这个方向尚未有系统研究,但理论上是可行的——例如在训练目标中加入激活正则化项,奖励激活方差在少数主方向上集中。这将是一个把”训练友好性”和”压缩友好性”结合起来的有趣研究方向。

换言之,SliceGPT 目前假设模型的激活低秩性是训练的”副产品”,而下一步可能是把激活低秩性做成训练的”主产品”——让压缩作为一等公民参与预训练目标的设计。

本篇笔记的结构索引

为方便快速检索,本文各节内容对应关系如下:

想了解的问题参考章节
SliceGPT 的核心数学原理§核心数学洞察:计算不变性
算法每一步在做什么§SliceGPT 算法详解
各注意力/MLP 组件如何处理§特殊模块的处理方式
实验数字和效果§实验与结果分析
与 SVD-LLM/ASVD 的区别§深度解析:SliceGPT 与权重级低秩分解的根本区别
为什么大模型效果更好§稀疏度扩展行为与各层特性分析
方法的缺陷和改进方向§批判性分析:不足与可改进之处
想自己实现§实现要点备忘