大模型压缩:1-大模型各种剪枝-原理剖析+方法对比+实战案例

目录

  1. 剪枝概述
  2. 权重剪枝
  3. 神经元剪枝
  4. 结构化剪枝
  5. 动态剪枝
  6. 低秩分解剪枝
  7. 随机剪枝
  8. 基于重要性评分的剪枝
  9. 自动化剪枝
  10. 剪枝方法对比分析
  11. 实战案例
  12. 剪枝的注意事项

一、剪枝概述

剪枝是一种删除不必要或冗余组件来减小模型大小或复杂度的有效技术。众所周知,许多冗余参数对模型的性能影响很小甚至没有影响,因此,直接剪枝这些冗余参数后,模型性能的下降最小。同时,剪枝可以使模型存储友好、内存效率和计算效率提高。

1.1 剪枝的基本分类

剪枝可以分为非结构化剪枝结构化剪枝

结构化剪枝和非结构化剪枝的主要区别在于剪枝目标和由此产生的网络结构:

  • 结构化剪枝根据特定规则删除连接或层次结构,同时保留整体网络结构
  • 非结构化剪枝会修剪单个参数,从而产生不规则的稀疏结构

1.2 数学基础

剪枝的核心目标是寻找一个稀疏网络 N s \mathcal{N}_s Ns,使其在保持性能的同时最小化参数数量。设原始网络为 N \mathcal{N} N,参数集合为 Θ = { w 1 , w 2 , . . . , w n } \Theta = \{w_1, w_2, ..., w_n\} Θ={w1,w2,...,wn},剪枝问题可以表述为:

min ⁡ M ∣ M ∣ s.t. L ( N s , D ) ≤ L ( N , D ) + ϵ \min_{\mathcal{M}} |\mathcal{M}| \quad \text{s.t.} \quad \mathcal{L}(\mathcal{N}_s, \mathcal{D}) \leq \mathcal{L}(\mathcal{N}, \mathcal{D}) + \epsilon MminMs.t.L(Ns,D)L(N,D)+ϵ

其中:

  • M \mathcal{M} M 是剪枝掩码矩阵
  • ∣ M ∣ |\mathcal{M}| M 表示保留参数的数量
  • L \mathcal{L} L 是损失函数
  • D \mathcal{D} D 是训练或验证数据集
  • ϵ \epsilon ϵ 是可容忍的性能损失阈值

1.3 大语言模型剪枝的特殊性

最近的研究致力于将 LLM 与剪枝技术相结合,旨在解决 LLM 的巨大规模和计算成本问题。大语言模型的剪枝面临独特挑战:

  1. 规模巨大:参数量通常在数十亿到数千亿之间
  2. 层次复杂:包含多头注意力机制、前馈网络等复杂结构
  3. 训练成本高:重新训练或微调成本极高
  4. 性能敏感:小幅度的参数减少可能导致显著性能下降

二、权重剪枝(Weight Pruning)

2.1 基本原理

权重剪枝根据权重的重要性,移除接近零或对损失函数影响小的权重。这是最直观的剪枝方法,基于一个简单假设:绝对值较小的权重对模型输出的贡献较小。

2.2 数学表述

对于权重矩阵 W ∈ R m × n W \in \mathbb{R}^{m \times n} WRm×n,权重剪枝可以表示为:

W p r u n e d = W ⊙ M W_{pruned} = W \odot M Wpruned=WM

其中 M ∈ { 0 , 1 } m × n M \in \{0, 1\}^{m \times n} M{0,1}m×n 是二进制掩码矩阵, ⊙ \odot 表示元素级乘法。

掩码矩阵的生成基于重要性评分 s i j s_{ij} sij

M i j = { 1 , if  s i j > τ 0 , otherwise M_{ij} = \begin{cases} 1, & \text{if } s_{ij} > \tau \\ 0, & \text{otherwise} \end{cases} Mij={1,0,if sij>τotherwise

其中 τ \tau τ 是剪枝阈值。

2.3 重要性评分方法

2.3.1 基于权重幅度(Magnitude-based)

最简单的评分方法:
s i j = ∣ W i j ∣ s_{ij} = |W_{ij}| sij=Wij

2.3.2 基于梯度信息(Gradient-based)

考虑权重对损失函数的影响:
s i j = ∣ W i j ⋅ ∂ L ∂ W i j ∣ s_{ij} = |W_{ij} \cdot \frac{\partial \mathcal{L}}{\partial W_{ij}}| sij=WijWijL

2.3.3 基于二阶信息(Second-order)

使用 Hessian 矩阵信息:
s i j = 1 2 ⋅ ( ∂ L ∂ W i j ) 2 ∂ 2 L ∂ W i j 2 s_{ij} = \frac{1}{2} \cdot \frac{(\frac{\partial \mathcal{L}}{\partial W_{ij}})^2}{\frac{\partial^2 \mathcal{L}}{\partial W_{ij}^2}} sij=21Wij22L(WijL)2

2.4 剪枝策略

2.4.1 全局剪枝(Global Pruning)

基于全模型权重的重要性排序剪枝:

  1. 计算所有参数的重要性评分
  2. 全局排序选择top-k重要参数
  3. 设置统一阈值进行剪枝

数学表述:
τ = percentile ( { s i j } , p ) \tau = \text{percentile}(\{s_{ij}\}, p) τ=percentile({sij},p)
其中 p p p 是保留比例。

2.4.2 局部剪枝(Layer-wise Pruning)

按层级单独剪枝,控制剪枝比例:

对于第 l l l 层,设定剪枝比例 r l r_l rl
∣ { ( i , j ) : M i j ( l ) = 0 } ∣ = r l ⋅ ∣ W ( l ) ∣ |\{(i,j): M_{ij}^{(l)} = 0\}| = r_l \cdot |W^{(l)}| {(i,j):Mij(l)=0}=rlW(l)

2.5 优缺点分析

优点:

  • 细粒度剪枝,保留模型结构灵活性
  • 理论简单,易于实现
  • 可以达到很高的压缩比

缺点:

  • 剪枝后稀疏权重存储需要特殊优化
  • 不规则稀疏模式难以在标准硬件上高效执行
  • 需要专门的稀疏矩阵库支持

三、神经元剪枝(Neuron Pruning)

3.1 基本原理

神经元剪枝根据神经元的输出激活值或梯度贡献,剪除不重要的神经元。这种方法的核心思想是:如果一个神经元在大多数输入下都不活跃或其输出对最终结果影响很小,则可以被安全移除。

3.2 数学建模

对于第 l l l 层的第 i i i 个神经元,其重要性可以通过多种方式评估:

3.2.1 基于激活值的评分

s i ( l ) = E x ∼ D [ ∣ a i ( l ) ( x ) ∣ ] s_i^{(l)} = \mathbb{E}_{\mathbf{x} \sim \mathcal{D}}[|a_i^{(l)}(\mathbf{x})|] si(l)=ExD[ai(l)(x)]

其中 a i ( l ) ( x ) a_i^{(l)}(\mathbf{x}) ai(l)(x) 是神经元 i i i 在输入 x \mathbf{x} x 下的激活值。

3.2.2 基于梯度的评分

s i ( l ) = E x ∼ D [ ∣ a i ( l ) ( x ) ⋅ ∂ L ∂ a i ( l ) ∣ ] s_i^{(l)} = \mathbb{E}_{\mathbf{x} \sim \mathcal{D}}\left[|a_i^{(l)}(\mathbf{x}) \cdot \frac{\partial \mathcal{L}}{\partial a_i^{(l)}}|\right] si(l)=ExD[ai(l)(x)ai(l)L]

3.2.3 基于方差的评分

评估神经元激活的变化程度:
s i ( l ) = Var x ∼ D [ a i ( l ) ( x ) ] s_i^{(l)} = \text{Var}_{\mathbf{x} \sim \mathcal{D}}[a_i^{(l)}(\mathbf{x})] si(l)=VarxD[ai(l)(x)]

3.3 剪枝方法

3.3.1 阈值剪枝

设定阈值 τ \tau τ,移除重要性评分低于阈值的神经元:
Keep neuron  i  if  s i ( l ) > τ \text{Keep neuron } i \text{ if } s_i^{(l)} > \tau Keep neuron i if si(l)>τ

3.3.2 比例剪枝

保留每层前 k % k\% k% 重要的神经元:
Keep top- k %  neurons per layer \text{Keep top-}k\% \text{ neurons per layer} Keep top-k% neurons per layer

3.4 实现细节

神经元剪枝涉及的操作包括:

  1. 前向传播分析:收集激活统计信息
  2. 重要性评估:计算神经元重要性评分
  3. 结构修改:移除不重要神经元及相关连接
  4. 维度调整:调整后续层的输入维度

3.5 优缺点分析

优点:

  • 粗粒度剪枝,直接减小计算量
  • 保持网络的规则结构
  • 容易在标准硬件上实现加速

缺点:

  • 剪枝粒度较大,可能过度影响模型性能
  • 需要仔细设计重要性评估策略
  • 对不同层可能需要不同的剪枝策略

四、结构化剪枝(Structured Pruning)

4.1 基本原理

结构化剪枝移除整个卷积核、通道、层或块,保持网络的规则结构。这种方法特别适合大语言模型,因为它们通常具有高度规则的架构。

4.2 Transformer架构剪枝

对于 Transformer 模型,结构化剪枝可以应用于多个层面:

4.2.1 注意力头剪枝

多头注意力机制中,第 h h h 个注意力头的重要性可以评估为:
s h = E x ∼ D [ ∥ Attention h ( x ) ∥ F 2 ] s_h = \mathbb{E}_{\mathbf{x} \sim \mathcal{D}}\left[\|\text{Attention}_h(\mathbf{x})\|_F^2\right] sh=ExD[Attentionh(x)F2]

其中 ∥ ⋅ ∥ F \|\cdot\|_F F 是 Frobenius 范数。

4.2.2 层剪枝

层剪枝方法如 Layer Collapse (LaCo) 允许后层网络折叠到前层中,实现快速的模型尺寸减少同时保持模型结构。

对于第 l l l 层,其重要性可以通过层输出的变化来衡量:
s l = ∥ h ( l ) − h ( l − 1 ) ∥ 2 s_l = \|\mathbf{h}^{(l)} - \mathbf{h}^{(l-1)}\|_2 sl=h(l)h(l1)2

4.2.3 FFN 维度剪枝

前馈网络中间维度的剪枝:
F F N ( x ) = W 2 ⋅ ReLU ( W 1 x + b 1 ) + b 2 \mathbf{FFN}(\mathbf{x}) = \mathbf{W}_2 \cdot \text{ReLU}(\mathbf{W}_1 \mathbf{x} + \mathbf{b}_1) + \mathbf{b}_2 FFN(x)=W2ReLU(W1x+b1)+b2

可以通过剪除 W 1 \mathbf{W}_1 W1 W 2 \mathbf{W}_2 W2 的对应维度来减少计算量。

4.3 通道剪枝数学模型

对于卷积层或线性层,通道剪枝可以表述为:

设权重矩阵 W ∈ R d o u t × d i n \mathbf{W} \in \mathbb{R}^{d_{out} \times d_{in}} WRdout×din,通道剪枝选择输入维度的子集:
W p r u n e d = W [ : , S ] \mathbf{W}_{pruned} = \mathbf{W}[:, \mathcal{S}] Wpruned=W[:,S]

其中 S ⊂ { 1 , 2 , . . . , d i n } \mathcal{S} \subset \{1, 2, ..., d_{in}\} S{1,2,...,din} 是保留的通道索引集合。

通道重要性评分:
s j = ∥ W [ : , j ] ∥ 2 2 + λ ⋅ BN_scale j 2 s_j = \|\mathbf{W}[:, j]\|_2^2 + \lambda \cdot \text{BN\_scale}_j^2 sj=W[:,j]22+λBN_scalej2

其中 BN_scale j \text{BN\_scale}_j BN_scalej 是 BatchNorm 层对应的缩放参数。

4.4 核剪枝(Kernel Pruning)

对于卷积核剪枝,重要性评分:
s k = ∥ K k ∥ F 2 s_k = \|\mathbf{K}_k\|_F^2 sk=KkF2

其中 K k \mathbf{K}_k Kk 是第 k k k 个卷积核。

4.5 优缺点分析

优点:

  • 剪枝后模型保持密集计算,便于硬件加速
  • 不需要特殊的稀疏矩阵支持
  • 可以实现显著的内存和计算节省

缺点:

  • 剪枝粒度较大,易影响模型性能
  • 需要仔细设计重要性评估指标
  • 可能需要更多的微调来恢复性能

五、动态剪枝(Dynamic Pruning)

5.1 基本原理

动态剪枝在训练或推理时动态调整网络结构,实时决定剪枝策略。这种方法的核心思想是根据输入样本的特性,自适应地激活网络的不同部分。

5.2 数学框架

动态剪枝可以建模为一个条件计算问题:
y = f ( x , θ , g ( x ) ) \mathbf{y} = f(\mathbf{x}, \mathbf{\theta}, g(\mathbf{x})) y=f(x,θ,g(x))

其中:

  • f f f 是网络函数
  • θ \mathbf{\theta} θ 是网络参数
  • g ( x ) g(\mathbf{x}) g(x) 是基于输入 x \mathbf{x} x 的门控函数

5.3 实现方法

5.3.1 门控网络(Gating Networks)

引入门控机制控制神经元的激活:
z = σ ( W g x + b g ) \mathbf{z} = \sigma(\mathbf{W}_g \mathbf{x} + \mathbf{b}_g) z=σ(Wgx+bg)
h = z ⊙ ReLU ( W x + b ) \mathbf{h} = \mathbf{z} \odot \text{ReLU}(\mathbf{W} \mathbf{x} + \mathbf{b}) h=zReLU(Wx+b)

其中 z ∈ [ 0 , 1 ] d \mathbf{z} \in [0,1]^d z[0,1]d 是门控向量。

5.3.2 自适应阈值

动态调整剪枝阈值:
τ ( t ) = τ 0 ⋅ α ⌊ t / T ⌋ \tau(t) = \tau_0 \cdot \alpha^{\lfloor t/T \rfloor} τ(t)=τ0αt/T

其中 t t t 是时间步, T T T 是调整间隔, α < 1 \alpha < 1 α<1 是衰减因子。

5.3.3 基于注意力的选择

使用注意力机制选择重要的网络组件:
a = softmax ( W a x ) \mathbf{a} = \text{softmax}(\mathbf{W}_a \mathbf{x}) a=softmax(Wax)
h s e l e c t e d = ∑ i a i h i \mathbf{h}_{selected} = \sum_{i} a_i \mathbf{h}_i hselected=iaihi

5.4 早退机制(Early Exit)

在 Transformer 模型中实现动态深度:
P ( exit at layer  l ) = σ ( W e h ( l ) + b e ) P(\text{exit at layer } l) = \sigma(\mathbf{W}_e \mathbf{h}^{(l)} + b_e) P(exit at layer l)=σ(Weh(l)+be)

当置信度超过阈值时提前输出:
if  P ( exit at layer  l ) > τ e x i t  then output \text{if } P(\text{exit at layer } l) > \tau_{exit} \text{ then output} if P(exit at layer l)>τexit then output

5.5 优缺点分析

优点:

  • 动态优化计算量,适应不同输入
  • 可以实现输入相关的计算节省
  • 提供了计算-精度的灵活权衡

缺点:

  • 增加了额外的控制复杂度
  • 门控网络本身需要额外计算
  • 难以预测实际的计算节省

六、低秩分解(Matrix Decomposition Pruning)

6.1 基本原理

低秩分解将权重矩阵分解成低秩矩阵,用较少的参数近似原权重。这种方法基于观察:深度网络中的权重矩阵通常具有冗余性,可以用低秩近似。

6.2 奇异值分解(SVD)

对权重矩阵 W ∈ R m × n \mathbf{W} \in \mathbb{R}^{m \times n} WRm×n 进行 SVD 分解:
W = U Σ V T \mathbf{W} = \mathbf{U} \mathbf{\Sigma} \mathbf{V}^T W=VT

低秩近似保留前 r r r 个奇异值:
W r = U : r Σ : r V : r T \mathbf{W}_r = \mathbf{U}_{:r} \mathbf{\Sigma}_{:r} \mathbf{V}_{:r}^T Wr=U:rΣ:rV:rT

参数减少量:
原参数数量:  m n \text{原参数数量: } mn 原参数数量mn
分解后参数数量:  r ( m + n ) \text{分解后参数数量: } r(m + n) 分解后参数数量r(m+n)
压缩比:  m n r ( m + n ) \text{压缩比: } \frac{mn}{r(m + n)} 压缩比r(m+n)mn

6.3 张量分解

6.3.1 Tucker 分解

对于高阶张量 W ∈ R I 1 × I 2 × I 3 \mathcal{W} \in \mathbb{R}^{I_1 \times I_2 \times I_3} WRI1×I2×I3
W ≈ G × 1 U ( 1 ) × 2 U ( 2 ) × 3 U ( 3 ) \mathcal{W} \approx \mathcal{G} \times_1 \mathbf{U}^{(1)} \times_2 \mathbf{U}^{(2)} \times_3 \mathbf{U}^{(3)} WG×1U(1)×2U(2)×3U(3)

其中 G ∈ R J 1 × J 2 × J 3 \mathcal{G} \in \mathbb{R}^{J_1 \times J_2 \times J_3} GRJ1×J2×J3 是核心张量, J i < I i J_i < I_i Ji<Ii

6.3.2 CP 分解

W ≈ ∑ r = 1 R λ r u r ( 1 ) ∘ u r ( 2 ) ∘ u r ( 3 ) \mathcal{W} \approx \sum_{r=1}^{R} \lambda_r \mathbf{u}_r^{(1)} \circ \mathbf{u}_r^{(2)} \circ \mathbf{u}_r^{(3)} Wr=1Rλrur(1)ur(2)ur(3)

其中 ∘ \circ 表示外积, R R R 是张量的秩。

6.4 在 Transformer 中的应用

6.4.1 注意力矩阵分解

将注意力权重矩阵分解:
W Q = U Q V Q T , W K = U K V K T , W V = U V V V T \mathbf{W}_Q = \mathbf{U}_Q \mathbf{V}_Q^T, \quad \mathbf{W}_K = \mathbf{U}_K \mathbf{V}_K^T, \quad \mathbf{W}_V = \mathbf{U}_V \mathbf{V}_V^T WQ=UQVQT,WK=UKVKT,WV=UVVVT

6.4.2 FFN 分解

前馈网络的权重分解:
W 1 ≈ U 1 V 1 T , W 2 ≈ U 2 V 2 T \mathbf{W}_1 \approx \mathbf{U}_1 \mathbf{V}_1^T, \quad \mathbf{W}_2 \approx \mathbf{U}_2 \mathbf{V}_2^T W1U1V1T,W2U2V2T

6.5 秩选择策略

6.5.1 基于奇异值的选择

保留累计能量达到阈值 η \eta η 的奇异值:
∑ i = 1 r σ i 2 ≥ η ∑ i = 1 min ⁡ ( m , n ) σ i 2 \sum_{i=1}^{r} \sigma_i^2 \geq \eta \sum_{i=1}^{\min(m,n)} \sigma_i^2 i=1rσi2ηi=1min(m,n)σi2

6.5.2 基于重构误差的选择

最小化重构误差:
r ∗ = arg ⁡ min ⁡ r ∥ W − W r ∥ F 2 s.t. r ≤ r m a x r^* = \arg\min_r \|\mathbf{W} - \mathbf{W}_r\|_F^2 \quad \text{s.t.} \quad r \leq r_{max} r=argrminWWrF2s.t.rrmax

6.6 优缺点分析

优点:

  • 保留全连接层或卷积层整体信息
  • 减少存储和计算量
  • 理论基础扎实

缺点:

  • 分解计算开销较大
  • 可能需要额外的微调
  • 低秩假设不总是成立

七、随机剪枝(Random Pruning)

7.1 基本原理

随机剪枝无需评估重要性,直接随机裁剪部分参数。虽然看似简单粗暴,但研究表明在某些情况下随机剪枝可以作为有效的基线方法。

7.2 数学表述

对于参数集合 Θ = { w 1 , w 2 , . . . , w n } \Theta = \{w_1, w_2, ..., w_n\} Θ={w1,w2,...,wn},随机剪枝按概率 p p p 保留参数:
M i = Bernoulli ( p ) M_i = \text{Bernoulli}(p) Mi=Bernoulli(p)
w i p r u n e d = w i ⋅ M i w_i^{pruned} = w_i \cdot M_i wipruned=wiMi

7.3 变种方法

7.3.1 分层随机剪枝

每层设置不同的保留概率:
M i ( l ) = Bernoulli ( p l ) M_i^{(l)} = \text{Bernoulli}(p_l) Mi(l)=Bernoulli(pl)

7.3.2 结构化随机剪枝

随机选择整个通道或注意力头进行剪枝:
Randomly select  k  channels to remove \text{Randomly select } k \text{ channels to remove} Randomly select k channels to remove

7.4 理论分析

随机剪枝的期望行为可以分析如下:

保留参数的期望数量:
E [ ∣ retained parameters ∣ ] = p ⋅ ∣ Θ ∣ \mathbb{E}[|\text{retained parameters}|] = p \cdot |\Theta| E[retained parameters]=p∣Θ∣

权重的期望值保持不变:
E [ w i p r u n e d ] = p ⋅ w i \mathbb{E}[w_i^{pruned}] = p \cdot w_i E[wipruned]=pwi

但方差增加:
Var [ w i p r u n e d ] = p ( 1 − p ) ⋅ w i 2 \text{Var}[w_i^{pruned}] = p(1-p) \cdot w_i^2 Var[wipruned]=p(1p)wi2

7.5 优缺点分析

优点:

  • 简单直接,无需复杂计算
  • 可以作为其他方法的基线
  • 实现成本极低

缺点:

  • 可能对性能影响较大
  • 没有利用参数重要性信息
  • 结果具有随机性

八、基于重要性评分的剪枝

8.1 基本原理

使用评分方法评估参数的重要性,如梯度、权重大小、熵等,对评分低的参数或结构进行剪枝。这类方法试图量化每个参数对模型性能的贡献。

8.2 重要性评分方法

8.2.1 基于梯度的评分

一阶梯度信息:
s i = ∣ ∂ L ∂ w i ∣ s_i = \left|\frac{\partial \mathcal{L}}{\partial w_i}\right| si= wiL

Taylor 展开近似:
s i = ∣ w i ⋅ ∂ L ∂ w i ∣ s_i = \left|w_i \cdot \frac{\partial \mathcal{L}}{\partial w_i}\right| si= wiwiL

8.2.2 基于 Fisher 信息的评分

Fisher 信息矩阵对角元素:
s i = E [ ( ∂ log ⁡ p ( y ∣ x ) ∂ w i ) 2 ] s_i = \mathbb{E}\left[\left(\frac{\partial \log p(\mathbf{y}|\mathbf{x})}{\partial w_i}\right)^2\right] si=E[(wilogp(yx))2]

8.2.3 基于 SNIP 的评分

SNIP(Single-shot Network Pruning)方法利用连接敏感度:
s i = ∣ ∂ L ∂ w i ∣ ⋅ ∣ w i ∣ s_i = \left|\frac{\partial \mathcal{L}}{\partial w_i}\right| \cdot |w_i| si= wiL wi

8.2.4 基于 GRASP 的评分

梯度信号保存评分:
s i = ∣ ∂ ∂ w i ( ∇ w L ⋅ w ) ∣ s_i = \left|\frac{\partial}{\partial w_i}\left(\nabla_{\mathbf{w}} \mathcal{L} \cdot \mathbf{w}\right)\right| si= wi(wLw)

8.3 Wanda 方法

Wanda(Pruning by Weights and activations)方法结合权重和激活信息进行剪枝,专门针对大语言模型设计。

Wanda 的评分函数:
s i j W a n d a = ∣ W i j ∣ ⋅ ∥ X i ∥ 2 s_{ij}^{Wanda} = |W_{ij}| \cdot \|X_i\|_2 sijWanda=WijXi2

其中 X i X_i Xi 是第 i i i 行对应的输入激活。

8.4 基于信息论的评分

8.4.1 互信息评分

参数与输出的互信息:
s i = I ( w i ; y ) s_i = I(w_i; \mathbf{y}) si=I(wi;y)

8.4.2 熵减评分

参数对输出熵的贡献:
s i = H ( y ) − H ( y ∣ w i = 0 ) s_i = H(\mathbf{y}) - H(\mathbf{y}|w_i = 0) si=H(y)H(ywi=0)

8.5 组合评分策略

将多种评分方法结合:
s i = α ⋅ s i g r a d + β ⋅ s i w e i g h t + γ ⋅ s i a c t i v a t i o n s_i = \alpha \cdot s_i^{grad} + \beta \cdot s_i^{weight} + \gamma \cdot s_i^{activation} si=αsigrad+βsiweight+γsiactivation

其中 α + β + γ = 1 \alpha + \beta + \gamma = 1 α+β+γ=1

8.6 优缺点分析

优点:

  • 理论基础较强
  • 可以精确控制剪枝行为
  • 适应性强,可针对不同任务调整

缺点:

  • 计算重要性评分有额外开销
  • 不同评分方法可能给出不同结果
  • 需要仔细调参

九、自动化剪枝(Auto-Pruning)

9.1 基本原理

利用自动化算法(如 NAS 或强化学习)搜索剪枝策略,自动确定最优的剪枝配置。这种方法将剪枝策略的设计转化为搜索优化问题。

9.2 基于强化学习的剪枝

9.2.1 问题建模

将剪枝策略搜索建模为马尔可夫决策过程:

  • 状态 s t s_t st:当前网络结构和性能
  • 动作 a t a_t at:剪枝决策(剪枝哪个组件)
  • 奖励 r t r_t rt:性能-效率权衡指标
9.2.2 奖励函数设计

r t = α ⋅ Accuracy ( M t ) − β ⋅ Complexity ( M t ) r_t = \alpha \cdot \text{Accuracy}(M_t) - \beta \cdot \text{Complexity}(M_t) rt=αAccuracy(Mt)βComplexity(Mt)

其中:

  • M t M_t Mt 是第 t t t 步的模型
  • α , β \alpha, \beta α,β 是权衡参数
9.2.3 策略网络

使用神经网络作为策略函数:
π θ ( a t ∣ s t ) = softmax ( W π ϕ ( s t ) ) \pi_\theta(a_t|s_t) = \text{softmax}(\mathbf{W}_\pi \phi(s_t)) πθ(atst)=softmax(Wπϕ(st))

其中 ϕ ( s t ) \phi(s_t) ϕ(st) 是状态特征提取函数。

9.3 基于进化算法的剪枝

9.3.1 个体编码

将剪枝策略编码为基因:
g = [ p 1 , p 2 , . . . , p L ] \mathbf{g} = [p_1, p_2, ..., p_L] g=[p1,p2,...,pL]

其中 p l p_l pl 是第 l l l 层的剪枝比例。

9.3.2 适应度函数

Fitness ( g ) = w 1 ⋅ Accuracy + w 2 ⋅ Speedup + w 3 ⋅ Compression \text{Fitness}(\mathbf{g}) = w_1 \cdot \text{Accuracy} + w_2 \cdot \text{Speedup} + w_3 \cdot \text{Compression} Fitness(g)=w1Accuracy+w2Speedup+w3Compression

9.3.3 遗传操作

交叉操作:
g c h i l d = α ⋅ g p a r e n t 1 + ( 1 − α ) ⋅ g p a r e n t 2 \mathbf{g}_{child} = \alpha \cdot \mathbf{g}_{parent1} + (1-\alpha) \cdot \mathbf{g}_{parent2} gchild=αgparent1+(1α)gparent2

变异操作:
g i ′ = g i + N ( 0 , σ 2 ) \mathbf{g}'_i = \mathbf{g}_i + \mathcal{N}(0, \sigma^2) gi=gi+N(0,σ2)

9.4 基于神经架构搜索(NAS)的剪枝

9.4.1 搜索空间定义

定义剪枝决策的搜索空间:
S = { ( l , c , r ) : l ∈ [ 1 , L ] , c ∈ { head, ffn, layer } , r ∈ [ 0 , 1 ] } \mathcal{S} = \{(l, c, r) : l \in [1, L], c \in \{\text{head, ffn, layer}\}, r \in [0, 1]\} S={(l,c,r):l[1,L],c{head, ffn, layer},r[0,1]}

其中:

  • l l l 是层索引
  • c c c 是组件类型
  • r r r 是剪枝比例
9.4.2 可微分搜索

使用 Gumbel-Softmax 使搜索过程可微:
α i = exp ⁡ ( ( log ⁡ π i + g i ) / τ ) ∑ j exp ⁡ ( ( log ⁡ π j + g j ) / τ ) \alpha_i = \frac{\exp((\log \pi_i + g_i)/\tau)}{\sum_j \exp((\log \pi_j + g_j)/\tau)} αi=jexp((logπj+gj)/τ)exp((logπi+gi)/τ)

其中 g i g_i gi 是 Gumbel 噪声, τ \tau τ 是温度参数。

9.5 贝叶斯优化剪枝

9.5.1 代理模型

使用高斯过程建模性能函数:
p ( f ( x ) ) = G P ( μ ( x ) , k ( x , x ′ ) ) p(f(\mathbf{x})) = \mathcal{GP}(\mu(\mathbf{x}), k(\mathbf{x}, \mathbf{x}')) p(f(x))=GP(μ(x),k(x,x))

9.5.2 获取函数

期望改进(EI)获取函数:
EI ( x ) = ( μ ( x ) − f + − ξ ) Φ ( Z ) + σ ( x ) ϕ ( Z ) \text{EI}(\mathbf{x}) = (\mu(\mathbf{x}) - f^+ - \xi) \Phi(Z) + \sigma(\mathbf{x}) \phi(Z) EI(x)=(μ(x)f+ξ)Φ(Z)+σ(x)ϕ(Z)

其中 Z = μ ( x ) − f + − ξ σ ( x ) Z = \frac{\mu(\mathbf{x}) - f^+ - \xi}{\sigma(\mathbf{x})} Z=σ(x)μ(x)f+ξ

9.6 优缺点分析

优点:

  • 剪枝策略优化自动化,无需人工调参
  • 可以发现人类专家难以发现的优化策略
  • 适应不同的硬件和性能约束

缺点:

  • 搜索过程计算开销巨大
  • 需要大量的模型训练和评估
  • 搜索空间设计需要专业知识

十、剪枝方法对比分析

10.1 性能对比

剪枝方法 压缩比 精度保持 推理加速 内存节省 实现难度
权重剪枝 高(90%+) 中等 低* 中等
神经元剪枝 中等(70%) 中等
结构化剪枝 中等(60%)
动态剪枝 可变 中等 中等
低秩分解 中等(50%) 中等
随机剪枝 可调 可变 可变 极低
重要性评分 可变
自动化剪枝 优化 优化 优化 极高

*权重剪枝的推理加速需要专门的稀疏计算库支持

10.2 适用场景分析

10.2.1 大语言模型推理优化

推荐方法排序:

  1. 结构化剪枝 - 最适合部署环境
  2. 重要性评分剪枝 - 平衡性能和效果
  3. 动态剪枝 - 适合可变长度输入
10.2.2 资源受限设备部署

推荐方法排序:

  1. 低秩分解 - 显著减少内存占用
  2. 神经元剪枝 - 简单有效的压缩
  3. 结构化剪枝 - 便于硬件优化
10.2.3 研究和实验

推荐方法排序:

  1. 自动化剪枝 - 探索最优策略
  2. 重要性评分剪枝 - 深入理解模型
  3. 权重剪枝 - 理论研究基础

10.3 计算开销对比

各种剪枝方法的时间复杂度分析:

方法 重要性评估 剪枝决策 微调需求 总开销
权重剪枝 O ( P ) O(P) O(P) O ( P log ⁡ P ) O(P \log P) O(PlogP) 中等 中等
神经元剪枝 O ( N ⋅ B ) O(N \cdot B) O(NB) O ( N ) O(N) O(N)
结构化剪枝 O ( S ) O(S) O(S) O ( S ) O(S) O(S)
动态剪枝 O ( 1 ) O(1) O(1) O ( 1 ) O(1) O(1) 中等
低秩分解 O ( P 3 ) O(P^3) O(P3) O ( P 2 ) O(P^2) O(P2) 中等
随机剪枝 O ( 1 ) O(1) O(1) O ( 1 ) O(1) O(1)
自动化剪枝 O ( T ⋅ E ) O(T \cdot E) O(TE) O ( T ⋅ E ) O(T \cdot E) O(TE) 极高

其中: P P P = 参数数量, N N N = 神经元数量, B B B = 批次大小, S S S = 结构数量, T T T = 搜索步数, E E E = 每步评估开销


十一、实战案例

11.1 案例一:LLaMA-7B 结构化剪枝

11.1.1 目标设定
  • 原始模型:LLaMA-7B(70亿参数)
  • 目标压缩比:50%(保留35亿参数)
  • 性能要求:MMLU 评分下降不超过5%
11.1.2 剪枝策略

第一阶段:层级分析
通过激活值分析确定各层重要性:

Layer Importance Analysis:
- Layers 1-8: 高重要性(保留100%)
- Layers 9-16: 中等重要性(保留75%)
- Layers 17-24: 低重要性(保留50%)
- Layers 25-32: 中等重要性(保留75%)

第二阶段:注意力头剪枝
基于注意力权重分布进行剪枝:

对每个注意力头计算重要性评分:
s h ( l ) = 1 T ∑ t = 1 T ∥ A h ( l ) ( t ) ∥ F s_h^{(l)} = \frac{1}{T} \sum_{t=1}^{T} \|\mathbf{A}_h^{(l)}(t)\|_F sh(l)=T1t=1TAh(l)(t)F

其中 A h ( l ) ( t ) \mathbf{A}_h^{(l)}(t) Ah(l)(t) 是第 l l l 层第 h h h 个头在时间步 t t t 的注意力矩阵。

第三阶段:FFN 维度压缩
将 FFN 中间维度从 11008 压缩到 8192:

W 1 n e w = W 1 [ : , : 8192 ] , W 2 n e w = W 2 [ : 8192 , : ] \mathbf{W}_1^{new} = \mathbf{W}_1[:, :8192], \quad \mathbf{W}_2^{new} = \mathbf{W}_2[:8192, :] W1new=W1[:,:8192],W2new=W2[:8192,:]

11.1.3 实施结果
指标 原始模型 剪枝后 变化
参数量 7.0B 3.5B -50%
显存占用 14.2GB 7.1GB -50%
推理速度 100 tokens/s 180 tokens/s +80%
MMLU 得分 35.1% 33.8% -3.7%
HellaSwag 76.1% 74.2% -2.5%
11.1.4 关键发现
  1. 层间重要性差异显著:浅层和深层比中间层更重要
  2. 注意力头冗余明显:60%的注意力头可以安全移除
  3. FFN 压缩效果好:25%的维度压缩只导致轻微性能下降

11.2 案例二:ChatGLM-6B 权重剪枝优化

11.2.1 背景

针对资源受限环境(8GB 显存)部署 ChatGLM-6B 模型。

11.2.2 剪枝实施

Wanda 方法应用
使用 Wanda 算法进行无训练剪枝:

重要性计算:
s i j = ∣ W i j ∣ ⋅ ∥ X j ∥ 2 s_{ij} = |W_{ij}| \cdot \|X_j\|_2 sij=WijXj2

其中 X j X_j Xj 是校准数据集上的激活统计。

分层剪枝策略

嵌入层: 5% 剪枝
注意力层: 20% 剪枝
FFN 层: 40% 剪枝  
输出层: 10% 剪枝
11.2.3 性能评估

压缩效果:

  • 原始大小:12.1GB
  • 压缩后:7.8GB
  • 压缩比:35.5%

推理性能:

任务         原始    剪枝后   下降
CEVAL       52.4%   48.9%   -6.7%
MMLU        40.6%   38.1%   -6.2%
GSM8K       29.8%   27.3%   -8.4%
HumanEval   22.7%   20.1%   -11.5%
11.2.4 优化策略

渐进式剪枝:
将40%剪枝分4步执行,每步10%:

步骤1: 90% → 微调100步
步骤2: 80% → 微调100步  
步骤3: 70% → 微调200步
步骤4: 60% → 微调300步

结果改善:

任务         改善后   提升
CEVAL       50.7%   +3.7%
MMLU        39.2%   +2.9%
GSM8K       28.9%   +5.9%
HumanEval   21.3%   +6.0%

11.3 案例三:BERT-Large 知识蒸馏结合剪枝

11.3.1 实验设计

目标:将 BERT-Large 压缩到 BERT-Base 大小,保持90%以上性能。

方法组合

  1. 结构化剪枝(层数 24→12)
  2. 知识蒸馏
  3. 微调优化
11.3.2 层选择策略

使用CKA(Centered Kernel Alignment)分析层间相似性:
CKA ( X , Y ) = tr ( K X H K Y H ) tr ( K X H K X H ) ⋅ tr ( K Y H K Y H ) \text{CKA}(\mathbf{X}, \mathbf{Y}) = \frac{\text{tr}(\mathbf{K}_X \mathbf{H} \mathbf{K}_Y \mathbf{H})}{\sqrt{\text{tr}(\mathbf{K}_X \mathbf{H} \mathbf{K}_X \mathbf{H}) \cdot \text{tr}(\mathbf{K}_Y \mathbf{H} \mathbf{K}_Y \mathbf{H})}} CKA(X,Y)=tr(KXHKXH)tr(KYHKYH) tr(KXHKYH)

基于相似性保留代表性层:

保留层索引: [1, 3, 5, 7, 10, 12, 15, 17, 19, 21, 23, 24]
11.3.3 知识蒸馏损失

L t o t a l = α L t a s k + β L d i s t i l l \mathcal{L}_{total} = \alpha \mathcal{L}_{task} + \beta \mathcal{L}_{distill} Ltotal=αLtask+βLdistill

其中:
L d i s t i l l = KL ( softmax ( z s / T ) , softmax ( z t / T ) ) \mathcal{L}_{distill} = \text{KL}(\text{softmax}(\mathbf{z}_s/T), \text{softmax}(\mathbf{z}_t/T)) Ldistill=KL(softmax(zs/T),softmax(zt/T))

T = 4 T=4 T=4 为温度参数, α = 0.5 , β = 0.5 \alpha=0.5, \beta=0.5 α=0.5,β=0.5

11.3.4 结果对比
模型 参数量 GLUE平均 推理速度 显存
BERT-Large 340M 82.3 45 sent/s 2.8GB
直接剪枝 110M 76.1 132 sent/s 1.1GB
剪枝+蒸馏 110M 79.8 132 sent/s 1.1GB

关键发现

  • 知识蒸馏显著减少剪枝带来的性能损失
  • 剪枝+蒸馏的组合效果超过直接使用 BERT-Base
  • 推理速度提升约3倍

十二、剪枝的注意事项

12.1 剪枝前的预训练

12.1.1 重要性

确保初始模型性能良好,以降低剪枝对精度的负面影响。一个训练充分的模型具有更好的剪枝鲁棒性。

12.1.2 最佳实践
  • 充分预训练:确保模型在剪枝前已收敛
  • 多任务预训练:提高模型的泛化能力
  • 正则化训练:使用权重衰减等技术提高剪枝鲁棒性
12.1.3 剪枝友好训练

在预训练中引入剪枝意识:
L t r a i n = L t a s k + λ L s p a r s i t y \mathcal{L}_{train} = \mathcal{L}_{task} + \lambda \mathcal{L}_{sparsity} Ltrain=Ltask+λLsparsity

其中稀疏性正则项:
L s p a r s i t y = ∑ i ∣ w i ∣ p , p ∈ [ 0 , 1 ] \mathcal{L}_{sparsity} = \sum_i |w_i|^p, \quad p \in [0, 1] Lsparsity=iwip,p[0,1]

12.2 剪枝后的微调

12.2.1 微调必要性

剪枝后需要重新训练模型以恢复性能。微调策略直接影响最终效果。

12.2.2 学习率调度

剪枝后微调建议使用较小学习率:
η f i n e t u n e = α ⋅ η p r e t r a i n , α ∈ [ 0.01 , 0.1 ] \eta_{finetune} = \alpha \cdot \eta_{pretrain}, \quad \alpha \in [0.01, 0.1] ηfinetune=αηpretrain,α[0.01,0.1]

12.2.3 渐进式微调

对于大幅剪枝,采用渐进式微调策略:

# 伪代码
for epoch in range(total_epochs):
    if epoch < warmup_epochs:
        lr = lr_max * (epoch / warmup_epochs)
    else:
        lr = lr_max * cosine_decay(epoch - warmup_epochs)
12.2.4 知识蒸馏辅助微调

结合原始模型进行知识蒸馏:
L f i n e t u n e = L t a s k + β L K D \mathcal{L}_{finetune} = \mathcal{L}_{task} + \beta \mathcal{L}_{KD} Lfinetune=Ltask+βLKD

12.3 剪枝比例控制

12.3.1 渐进式剪枝

避免一次性大幅剪枝,采用多步骤渐进策略:
p t = p f i n a l ⋅ ( 1 − ( 1 − t T ) 3 ) p_t = p_{final} \cdot \left(1 - \left(1 - \frac{t}{T}\right)^3\right) pt=pfinal(1(1Tt)3)

其中 p t p_t pt 是第 t t t 步的剪枝比例。

12.3.2 层间剪枝比例平衡

不同层的重要性不同,需要差异化剪枝:

浅层网络: 保守剪枝 (10-20%)
中间层: 激进剪枝 (30-50%)  
深层网络: 适中剪枝 (20-30%)
输出层: 保守剪枝 (5-10%)
12.3.3 性能监控

设置性能下降阈值:
Stop if  Acc o r i g i n a l − Acc p r u n e d Acc o r i g i n a l > ϵ \text{Stop if } \frac{\text{Acc}_{original} - \text{Acc}_{pruned}}{\text{Acc}_{original}} > \epsilon Stop if AccoriginalAccoriginalAccpruned>ϵ

建议 ϵ ∈ [ 0.05 , 0.15 ] \epsilon \in [0.05, 0.15] ϵ[0.05,0.15]

12.4 硬件支持考虑

12.4.1 稀疏计算支持

GPU 稀疏支持

  • NVIDIA V100/A100: 2:4 结构化稀疏
  • AMD MI100: 有限稀疏支持
  • 新架构: 逐步增强稀疏计算能力
12.4.2 内存访问模式

结构化剪枝有利于内存合并访问:

密集矩阵: 连续内存访问
非结构化稀疏: 随机内存访问 (性能损失)
结构化稀疏: 部分连续访问 (性能友好)
12.4.3 推理框架支持
框架 权重剪枝 结构化剪枝 动态剪枝
PyTorch 支持 完全支持 部分支持
TensorFlow 支持 完全支持 支持
ONNX 有限支持 完全支持 不支持
TensorRT 部分支持 完全支持 不支持

12.5 评估和验证

12.5.1 多维度评估

性能指标

  • 准确率/BLEU/Rouge 等任务指标
  • 推理延迟和吞吐量
  • 内存占用
  • 能耗(移动设备重要)
12.5.2 长期稳定性测试

剪枝模型可能存在长期退化:

# 稳定性测试伪代码
for month in range(12):
    accuracy = evaluate_model(pruned_model, test_data)
    if accuracy < threshold:
        trigger_retraining()
12.5.3 边界情况测试

测试剪枝模型在特殊输入下的行为:

  • 超长序列
  • 罕见词汇
  • 对抗样本
  • 分布外数据

12.6 生产部署注意事项

12.6.1 模型版本管理

维护剪枝模型的版本信息:

{
  "model_version": "v1.2-pruned-50%",
  "base_model": "llama-7b-v1.2",
  "pruning_method": "structured",
  "compression_ratio": 0.5,
  "performance_metrics": {...}
}
12.6.2 监控和回退机制

建立监控体系:

# 监控指标
metrics = {
    "response_quality": quality_score,
    "inference_latency": avg_latency,
    "error_rate": error_rate,
    "user_satisfaction": satisfaction_score
}

# 自动回退机制
if any(metric < threshold for metric in metrics.values()):
    rollback_to_original_model()
12.6.3 A/B 测试策略

在生产环境中谨慎部署剪枝模型:

阶段1: 10% 流量使用剪枝模型
阶段2: 如表现良好,扩展到50%
阶段3: 全面部署剪枝模型

总结

本文全面介绍了大语言模型剪枝技术的各个方面,从基础理论到实际应用。每种剪枝方法都有其适用场景和局限性,在实际应用中需要根据具体需求选择合适的方法。

关键要点总结:

  1. 方法选择:结构化剪枝最适合生产部署,权重剪枝适合研究探索
  2. 实施策略:渐进式剪枝比一次性剪枝更安全有效
  3. 性能保持:知识蒸馏等技术可以显著减少性能损失
  4. 硬件考虑:选择方法时必须考虑目标硬件的支持能力
  5. 评估验证:需要多维度、长期的性能评估

随着硬件技术的发展和算法的进步,剪枝技术将继续是大语言模型优化的重要手段。未来的发展方向包括自动化剪枝、硬件感知剪枝和任务自适应剪枝等。

Logo

更多推荐