半结构化剪枝技术详解
引言
在深度神经网络压缩领域,剪枝技术扮演着至关重要的角色。按照粒度和约束条件的不同,剪枝方法大致可分为非结构化剪枝和结构化剪枝。非结构化剪枝以单个权重为单位进行操作,可实现极高的理论压缩率,但难以在通用硬件上获得实际加速;结构化剪枝则移除整个结构单元(如通道、滤波器),虽然压缩率相对较低,但能直接转化为计算加速。介于两者之间的半结构化剪枝,为网络压缩提供了一种平衡方案,既保持一定的规则性以支持硬件加速,又提供比结构化剪枝更高的灵活性和压缩潜力。
半结构化剪枝的基本原理
半结构化剪枝的核心思想是在保持某种结构规律的同时,允许更细粒度的权重移除。这种方法通常会强制稀疏模式遵循特定的结构约束,例如组稀疏、块稀疏或N:M稀疏等。与完全自由的非结构化剪枝不同,半结构化剪枝在硬件友好性和压缩率之间取得了良好的平衡。
在深度神经网络中,一个层的权重可以表示为张量 W ∈ R C o u t × C i n × K × K \mathbf{W} \in \mathbb{R}^{C_{out} \times C_{in} \times K \times K} W∈RCout×Cin×K×K(对于卷积层)或矩阵 W ∈ R n o u t × n i n \mathbf{W} \in \mathbb{R}^{n_{out} \times n_{in}} W∈Rnout×nin(对于全连接层)。半结构化剪枝通过引入特定的结构约束,在这些权重张量或矩阵上创建规则的稀疏模式。
从数学角度看,半结构化剪枝可以表述为以下约束优化问题:
min W ′ L ( W ′ , D ) s.t. W ′ ∈ S semi \min_{\mathbf{W}'} \mathcal{L}(\mathbf{W}', \mathcal{D}) \quad \text{s.t.} \quad \mathbf{W}' \in \mathcal{S}_{\text{semi}} W′minL(W′,D)s.t.W′∈Ssemi
其中 L \mathcal{L} L是损失函数, D \mathcal{D} D是训练数据, S semi \mathcal{S}_{\text{semi}} Ssemi是满足半结构化约束的参数空间。这个参数空间比非结构化稀疏空间 S unstructured = { W : ∥ W ∥ 0 ≤ k } \mathcal{S}_{\text{unstructured}} = \{\mathbf{W} : \|\mathbf{W}\|_0 \leq k\} Sunstructured={W:∥W∥0≤k}更加受限,但比结构化稀疏空间 S structured \mathcal{S}_{\text{structured}} Sstructured(如通道剪枝)更加灵活。
半结构化剪枝的数学表示
为了实现半结构化剪枝,我们首先定义适当的掩码矩阵 M \mathbf{M} M,使得剪枝后的参数为 W ′ = W ⊙ M \mathbf{W}' = \mathbf{W} \odot \mathbf{M} W′=W⊙M,其中 ⊙ \odot ⊙表示逐元素乘法。关键在于设计 M \mathbf{M} M使其满足特定的结构约束。
以最常见的N:M稀疏模式为例,它要求每M个连续权重中至多保留N个非零元素。这可以表示为:
∑ j = i M ( i + 1 ) M − 1 I ( W j ≠ 0 ) ≤ N , ∀ i = 0 , 1 , … , ⌊ ∣ W ∣ − 1 M ⌋ \sum_{j=iM}^{(i+1)M-1} \mathbb{I}(W_j \neq 0) \leq N, \quad \forall i = 0,1,\ldots,\lfloor \frac{|\mathbf{W}|-1}{M} \rfloor j=iM∑(i+1)M−1I(Wj=0)≤N,∀i=0,1,…,⌊M∣W∣−1⌋
其中 I ( ⋅ ) \mathbb{I}(\cdot) I(⋅)是指示函数,当条件成立时值为1,否则为0。
对于组稀疏(Group Sparsity),我们将权重分为多个组,并对每组单独应用稀疏约束。定义权重组 G = { g 1 , g 2 , . . . , g G } \mathcal{G} = \{g_1, g_2, ..., g_G\} G={g1,g2,...,gG},每个组 g i g_i gi包含一组权重指标。组稀疏约束可以表示为:
∑ i = 1 G I ( ∑ j ∈ g i ∣ W j ∣ 2 > 0 ) ≤ k g \sum_{i=1}^G \mathbb{I}\left(\sum_{j \in g_i} |W_j|^2 > 0\right) \leq k_g i=1∑GI(j∈gi∑∣Wj∣2>0)≤kg
其中 k g k_g kg是允许的非零组数量。
对于块稀疏(Block Sparsity),我们考虑权重矩阵中的子块。对于矩阵 W ∈ R m × n \mathbf{W} \in \mathbb{R}^{m \times n} W∈Rm×n,我们可以将其划分为 m b 1 × n b 2 \frac{m}{b_1} \times \frac{n}{b_2} b1m×b2n个大小为 b 1 × b 2 b_1 \times b_2 b1×b2的块。块稀疏约束要求:
∑ i = 1 m / b 1 ∑ j = 1 n / b 2 I ( ∥ W i , j block ∥ F > 0 ) ≤ k b \sum_{i=1}^{m/b_1} \sum_{j=1}^{n/b_2} \mathbb{I}\left(\|\mathbf{W}_{i,j}^{\text{block}}\|_F > 0\right) \leq k_b i=1∑m/b1j=1∑n/b2I(∥Wi,jblock∥F>0)≤kb
其中 W i , j block \mathbf{W}_{i,j}^{\text{block}} Wi,jblock表示第 ( i , j ) (i,j) (i,j)个块, ∥ ⋅ ∥ F \|\cdot\|_F ∥⋅∥F是Frobenius范数, k b k_b kb是允许的非零块数量。
更一般地,半结构化剪枝可以通过结构化正则化来实现。例如,对于组稀疏,我们可以使用混合范数正则化:
R ( W ) = ∑ i = 1 G ∥ W g i ∥ 2 = ∑ i = 1 G ∑ j ∈ g i W j 2 \mathcal{R}(\mathbf{W}) = \sum_{i=1}^G \|\mathbf{W}_{g_i}\|_2 = \sum_{i=1}^G \sqrt{\sum_{j \in g_i} W_j^2} R(W)=i=1∑G∥Wgi∥2=i=1∑Gj∈gi∑Wj2
其中 W g i \mathbf{W}_{g_i} Wgi表示组 g i g_i gi中的权重。这种 ℓ 1 , 2 \ell_{1,2} ℓ1,2范数促进组间稀疏和组内密集。
对于N:M稀疏,可以使用以下正则化形式:
R ( W ) = ∑ i = 0 ⌊ ∣ W ∣ − 1 M ⌋ R top-N ( { W j : j = i M , … , ( i + 1 ) M − 1 } ) \mathcal{R}(\mathbf{W}) = \sum_{i=0}^{\lfloor \frac{|\mathbf{W}|-1}{M} \rfloor} \mathcal{R}_{\text{top-N}}\left(\{W_j : j = iM, \ldots, (i+1)M-1\}\right) R(W)=i=0∑⌊M∣W∣−1⌋Rtop-N({Wj:j=iM,…,(i+1)M−1})
其中 R top-N \mathcal{R}_{\text{top-N}} Rtop-N是一个促进保留最大N个元素的正则化项。
典型的半结构化剪枝方法
N:M稀疏模式
N:M稀疏是最流行的半结构化剪枝模式之一,特别是在NVIDIA Ampere架构GPU上有硬件加速支持。以2:4稀疏(每4个连续权重中保留2个)为例,具体剪枝步骤如下:
首先定义每个稀疏组中权重的重要性度量,如绝对值:
s j = ∣ W j ∣ s_j = |W_j| sj=∣Wj∣
对于每个包含M个连续权重的组,我们保留重要性排名前N的权重,移除其余的权重:
M j = { 1 , if s j is among the top-N values in its group 0 , otherwise M_j = \begin{cases} 1, & \text{if } s_j \text{ is among the top-N values in its group} \\ 0, & \text{otherwise} \end{cases} Mj={1,0,if sj is among the top-N values in its groupotherwise
在训练过程中,我们可以定期更新这一稀疏模式,使网络逐步适应N:M约束。
在实际实现中,可以通过以下步骤实现N:M稀疏:
- 将权重矩阵重塑为形状为 ( ∣ W ∣ M , M ) (\frac{|\mathbf{W}|}{M}, M) (M∣W∣,M)的矩阵
- 对每行执行部分排序,找出前N大的元素
- 将其余元素置零
- 将矩阵重塑回原始形状
更高效的实现可以使用位掩码和位操作来维护N:M稀疏模式,减少内存开销。
为了增强N:M稀疏的有效性,我们可以考虑权重重要性的动态变化。定义时刻t在组i中权重j的动态重要性为:
s i , j t = ∣ W i , j t ∣ + λ ⋅ ∣ ∇ W i , j L t ∣ s_{i,j}^t = |W_{i,j}^t| + \lambda \cdot |\nabla_{\!W_{i,j}} \mathcal{L}^t| si,jt=∣Wi,jt∣+λ⋅∣∇Wi,jLt∣
其中第二项考虑了梯度的幅值, λ \lambda λ是平衡系数。这使得模型能够适应性地调整稀疏模式。
结构化组稀疏
结构化组稀疏(Structured Group Sparsity)考虑了权重之间的结构关系,将相关权重组织为组,并在组层面上应用稀疏约束。对于卷积神经网络,常见的组结构包括:
- 输出通道组: g i = { W i , : , : , : } g_i = \{\mathbf{W}_{i,:,:,:}\} gi={Wi,:,:,:},每组包含一个完整的输出通道
- 输入通道组: g i , j = { W : , j , : , : } g_{i,j} = \{\mathbf{W}_{:,j,:,:}\} gi,j={W:,j,:,:},每组包含一个完整的输入通道
- 卷积核组: g i , j = { W i , j , : , : } g_{i,j} = \{\mathbf{W}_{i,j,:,:}\} gi,j={Wi,j,:,:},每组包含一个 K × K K \times K K×K卷积核
组稀疏的训练目标包含正则化项:
min W L ( W , D ) + λ ∑ g ∈ G ∥ W g ∥ 2 \min_{\mathbf{W}} \mathcal{L}(\mathbf{W}, \mathcal{D}) + \lambda \sum_{g \in \mathcal{G}} \|\mathbf{W}_g\|_2 WminL(W,D)+λg∈G∑∥Wg∥2
其中 λ \lambda λ是正则化强度, ∥ W g ∥ 2 = ∑ j ∈ g W j 2 \|\mathbf{W}_g\|_2 = \sqrt{\sum_{j \in g} W_j^2} ∥Wg∥2=∑j∈gWj2是组 g g g的 ℓ 2 \ell_2 ℓ2范数。
在剪枝阶段,我们计算每个组的范数,并保留范数最大的 k g k_g kg个组:
norm g = ∥ W g ∥ 2 = ∑ j ∈ g W j 2 \text{norm}_g = \|\mathbf{W}_g\|_2 = \sqrt{\sum_{j \in g} W_j^2} normg=∥Wg∥2=j∈g∑Wj2
M g = { 1 , if norm g is among the top- k g values 0 , otherwise M_g = \begin{cases} 1, & \text{if } \text{norm}_g \text{ is among the top-}k_g \text{ values} \\ 0, & \text{otherwise} \end{cases} Mg={1,0,if normg is among the top-kg valuesotherwise
组稀疏性的一个重要变体是结构化稀疏学习(SSL),它对不同的组结构同时应用稀疏约束:
R SSL ( W ) = λ 1 ∑ i ∥ W i , : , : , : ∥ 2 + λ 2 ∑ j ∥ W : , j , : , : ∥ 2 + λ 3 ∑ i , j ∥ W i , j , : , : ∥ 2 \mathcal{R}_{\text{SSL}}(\mathbf{W}) = \lambda_1 \sum_{i} \|\mathbf{W}_{i,:,:,:}\|_2 + \lambda_2 \sum_{j} \|\mathbf{W}_{:,j,:,:}\|_2 + \lambda_3 \sum_{i,j} \|\mathbf{W}_{i,j,:,:}\|_2 RSSL(W)=λ1i∑∥Wi,:,:,:∥2+λ2j∑∥W:,j,:,:∥2+λ3i,j∑∥Wi,j,:,:∥2
这种多级结构化稀疏能够捕捉更复杂的权重相关性。
块稀疏
块稀疏(Block Sparsity)将权重矩阵划分为规则的块,并在块级别应用稀疏约束。对于权重矩阵 W ∈ R m × n \mathbf{W} \in \mathbb{R}^{m \times n} W∈Rm×n,我们将其划分为大小为 b 1 × b 2 b_1 \times b_2 b1×b2的块:
W = [ W 1 , 1 block W 1 , 2 block ⋯ W 1 , n / b 2 block W 2 , 1 block W 2 , 2 block ⋯ W 2 , n / b 2 block ⋮ ⋮ ⋱ ⋮ W m / b 1 , 1 block W m / b 1 , 2 block ⋯ W m / b 1 , n / b 2 block ] \mathbf{W} = \begin{bmatrix} \mathbf{W}_{1,1}^{\text{block}} & \mathbf{W}_{1,2}^{\text{block}} & \cdots & \mathbf{W}_{1,n/b_2}^{\text{block}} \\ \mathbf{W}_{2,1}^{\text{block}} & \mathbf{W}_{2,2}^{\text{block}} & \cdots & \mathbf{W}_{2,n/b_2}^{\text{block}} \\ \vdots & \vdots & \ddots & \vdots \\ \mathbf{W}_{m/b_1,1}^{\text{block}} & \mathbf{W}_{m/b_1,2}^{\text{block}} & \cdots & \mathbf{W}_{m/b_1,n/b_2}^{\text{block}} \end{bmatrix} W= W1,1blockW2,1block⋮Wm/b1,1blockW1,2blockW2,2block⋮Wm/b1,2block⋯⋯⋱⋯W1,n/b2blockW2,n/b2block⋮Wm/b1,n/b2block
块稀疏的优化目标可以表示为:
min W L ( W , D ) + λ ∑ i = 1 m / b 1 ∑ j = 1 n / b 2 ∥ W i , j block ∥ F \min_{\mathbf{W}} \mathcal{L}(\mathbf{W}, \mathcal{D}) + \lambda \sum_{i=1}^{m/b_1} \sum_{j=1}^{n/b_2} \|\mathbf{W}_{i,j}^{\text{block}}\|_F WminL(W,D)+λi=1∑m/b1j=1∑n/b2∥Wi,jblock∥F
其中 ∥ W i , j block ∥ F = ∑ p = 1 b 1 ∑ q = 1 b 2 ( W ( i − 1 ) b 1 + p , ( j − 1 ) b 2 + q ) 2 \|\mathbf{W}_{i,j}^{\text{block}}\|_F = \sqrt{\sum_{p=1}^{b_1} \sum_{q=1}^{b_2} (W_{(i-1)b_1+p,(j-1)b_2+q})^2} ∥Wi,jblock∥F=∑p=1b1∑q=1b2(W(i−1)b1+p,(j−1)b2+q)2是块的Frobenius范数。
在剪枝阶段,我们保留范数最大的 k b k_b kb个块:
norm i , j block = ∥ W i , j block ∥ F \text{norm}_{i,j}^{\text{block}} = \|\mathbf{W}_{i,j}^{\text{block}}\|_F normi,jblock=∥Wi,jblock∥F
M i , j block = { 1 , if norm i , j block is among the top- k b values 0 , otherwise M_{i,j}^{\text{block}} = \begin{cases} 1, & \text{if } \text{norm}_{i,j}^{\text{block}} \text{ is among the top-}k_b \text{ values} \\ 0, & \text{otherwise} \end{cases} Mi,jblock={1,0,if normi,jblock is among the top-kb valuesotherwise
块稀疏特别适合于矩阵乘法运算的加速,因为它允许使用优化的稀疏BLAS(Basic Linear Algebra Subprograms)库。
加权熵稀疏正则化
加权熵稀疏正则化(Weighted Entropy-based Sparsity Regularization, WESR)是一种灵活的半结构化剪枝方法,它通过软约束和加权策略实现灵活的稀疏模式。WESR定义如下:
R WESR ( W ) = ∑ g ∈ G ω g ⋅ H ( ∣ W g ∣ ∑ j ∈ g ∣ W j ∣ ) \mathcal{R}_{\text{WESR}}(\mathbf{W}) = \sum_{g \in \mathcal{G}} \omega_g \cdot H\left(\frac{|\mathbf{W}_g|}{\sum_{j \in g} |W_j|}\right) RWESR(W)=g∈G∑ωg⋅H(∑j∈g∣Wj∣∣Wg∣)
其中 H ( p ) = − ∑ i p i log p i H(p) = -\sum_i p_i \log p_i H(p)=−∑ipilogpi是Shannon熵, ω g \omega_g ωg是组 g g g的权重系数。熵越小,权重分布越集中,促进组内稀疏。
WESR的一个变体是结合 ℓ 1 / 2 \ell_{1/2} ℓ1/2正则化:
R WESR-L1/2 ( W ) = ∑ g ∈ G ω g ⋅ H ( ∣ W g ∣ ∑ j ∈ g ∣ W j ∣ ) + λ ∑ j ∣ W j ∣ 1 / 2 \mathcal{R}_{\text{WESR-L1/2}}(\mathbf{W}) = \sum_{g \in \mathcal{G}} \omega_g \cdot H\left(\frac{|\mathbf{W}_g|}{\sum_{j \in g} |W_j|}\right) + \lambda \sum_{j} |W_j|^{1/2} RWESR-L1/2(W)=g∈G∑ωg⋅H(∑j∈g∣Wj∣∣Wg∣)+λj∑∣Wj∣1/2
这种组合能够在不同粒度上促进稀疏性。
半结构化剪枝的理论分析
压缩率与计算加速分析
半结构化剪枝的压缩率和计算加速取决于具体的稀疏模式。对于N:M稀疏,理论压缩率为:
理论压缩率 = M N \text{理论压缩率} = \frac{M}{N} 理论压缩率=NM
例如,2:4稀疏的理论压缩率为2。
在考虑存储格式的实际压缩率通常较低,因为需要额外的索引信息:
实际压缩率 = 32 ⋅ ∣ W ∣ 32 ⋅ N M ⋅ ∣ W ∣ + 索引开销 \text{实际压缩率} = \frac{32 \cdot |\mathbf{W}|}{32 \cdot \frac{N}{M} \cdot |\mathbf{W}| + \text{索引开销}} 实际压缩率=32⋅MN⋅∣W∣+索引开销32⋅∣W∣
对于块稀疏,索引开销相对较小,因为只需要记录每个块的状态:
块稀疏压缩率 = 32 ⋅ m ⋅ n 32 ⋅ k b ⋅ b 1 ⋅ b 2 + log 2 ( 2 ) ⋅ m ⋅ n b 1 ⋅ b 2 \text{块稀疏压缩率} = \frac{32 \cdot m \cdot n}{32 \cdot k_b \cdot b_1 \cdot b_2 + \log_2(2) \cdot \frac{m \cdot n}{b_1 \cdot b_2}} 块稀疏压缩率=32⋅kb⋅b1⋅b2+log2(2)⋅b1⋅b2m⋅n32⋅m⋅n
其中 log 2 ( 2 ) = 1 \log_2(2) = 1 log2(2)=1比特用于表示每个块是否被保留。
计算加速方面,N:M稀疏的理论加速比也为 M N \frac{M}{N} NM。但实际加速取决于硬件支持。例如,NVIDIA Ampere架构通过张量核心直接支持2:4稀疏,理论上可以实现接近2倍的加速。
块稀疏的计算加速取决于块大小和硬件特性。对于块大小为 b 1 × b 2 b_1 \times b_2 b1×b2的块稀疏,理论加速比为:
块稀疏加速比 = m ⋅ n ⋅ p k b ⋅ b 1 ⋅ b 2 ⋅ p + 调度开销 \text{块稀疏加速比} = \frac{m \cdot n \cdot p}{k_b \cdot b_1 \cdot b_2 \cdot p + \text{调度开销}} 块稀疏加速比=kb⋅b1⋅b2⋅p+调度开销m⋅n⋅p
其中 p p p是另一个维度(如批量大小)。
表达能力与性能保持分析
半结构化剪枝的一个关键问题是:相比于结构化和非结构化剪枝,它如何影响网络的表达能力?通过信息论和矩阵近似理论,我们可以分析这一问题。
对于给定的压缩率 r r r,不同剪枝方法保留的参数数量如下:
- 非结构化剪枝: ∣ W ∣ r \frac{|\mathbf{W}|}{r} r∣W∣个任意参数
- 结构化剪枝: ∣ W ∣ r \frac{|\mathbf{W}|}{r} r∣W∣个结构化参数(如完整通道)
- 半结构化剪枝: ∣ W ∣ r \frac{|\mathbf{W}|}{r} r∣W∣个半结构化参数(如满足N:M约束)
从随机矩阵理论角度,对于矩阵 W ∈ R m × n \mathbf{W} \in \mathbb{R}^{m \times n} W∈Rm×n的最佳秩- k k k近似为其前 k k k个奇异值对应的成分。非结构化剪枝理论上可以近似这一最优解,而结构化剪枝则受到很大限制。半结构化剪枝提供了一个折中方案,尤其是当结构单元(如块)的大小适当选择时。
具体而言,对于块大小为 b × b b \times b b×b的块稀疏,矩阵近似误差与最优秩- k k k近似的比值上界为:
∥ W − W block ∥ F ∥ W − W k ∥ F ≤ m n k b 2 \frac{\|\mathbf{W} - \mathbf{W}_{\text{block}}\|_F}{\|\mathbf{W} - \mathbf{W}_k\|_F} \leq \sqrt{\frac{mn}{kb^2}} ∥W−Wk∥F∥W−Wblock∥F≤kb2mn
其中 W block \mathbf{W}_{\text{block}} Wblock是块稀疏近似, W k \mathbf{W}_k Wk是最优秩- k k k近似。当 b b b增大时,近似质量提高。
对于N:M稀疏,我们可以从信息熵角度分析其表达能力。如果非结构化剪枝保留参数的熵为 H unstr H_{\text{unstr}} Hunstr,则N:M稀疏的熵约为:
H N:M ≈ ∣ W ∣ M ⋅ log 2 ( M N ) H_{\text{N:M}} \approx \frac{|\mathbf{W}|}{M} \cdot \log_2 \binom{M}{N} HN:M≈M∣W∣⋅log2(NM)
当 N / M N/M N/M固定时, H N:M H_{\text{N:M}} HN:M随着 M M M的增加而增加,表明更细粒度的组划分能够提供更大的表达灵活性。
优化理论分析
从优化角度看,半结构化剪枝介于非结构化和结构化剪枝之间。考虑损失函数对权重的敏感度:
Δ L = ∑ i , j ∂ L ∂ W i , j Δ W i , j + 1 2 ∑ i , j , k , l ∂ 2 L ∂ W i , j ∂ W k , l Δ W i , j Δ W k , l + O ( ∥ Δ W ∥ 3 ) \Delta \mathcal{L} = \sum_{i,j} \frac{\partial \mathcal{L}}{\partial W_{i,j}} \Delta W_{i,j} + \frac{1}{2} \sum_{i,j,k,l} \frac{\partial^2 \mathcal{L}}{\partial W_{i,j} \partial W_{k,l}} \Delta W_{i,j} \Delta W_{k,l} + O(\|\Delta \mathbf{W}\|^3) ΔL=i,j∑∂Wi,j∂LΔWi,j+21i,j,k,l∑∂Wi,j∂Wk,l∂2LΔWi,jΔWk,l+O(∥ΔW∥3)
非结构化剪枝可以选择敏感度最低的单个权重进行剪枝,而结构化剪枝需要移除整个结构单元,即使其中包含高敏感度权重。半结构化剪枝在更小的结构单元(如块或N:M组)内选择敏感度最低的权重,提供了更好的平衡。对于N:M稀疏,在每个包含M个权重的组内,我们保留敏感度最低的N个权重。如果权重敏感度在组内均匀分布,那么相比于选择整个网络中敏感度最低的 N M ∣ W ∣ \frac{N}{M}|\mathbf{W}| MN∣W∣个权重(非结构化剪枝),N:M稀疏的额外损失约为:
Δ L extra ≈ 1 2 ⋅ M − N M ⋅ N M ⋅ ∑ i = 1 ∣ W ∣ / M max j ∈ g i s j − min j ∈ g i s j \Delta \mathcal{L}_{\text{extra}} \approx \frac{1}{2} \cdot \frac{M-N}{M} \cdot \frac{N}{M} \cdot \sum_{i=1}^{|\mathbf{W}|/M} \max_{j \in g_i} s_j - \min_{j \in g_i} s_j ΔLextra≈21⋅MM−N⋅MN⋅i=1∑∣W∣/Mj∈gimaxsj−j∈giminsj
其中 s j s_j sj是权重 j j j的敏感度, g i g_i gi是第 i i i个组。当组内敏感度差异小时,N:M稀疏接近非结构化剪枝的性能。
半结构化稀疏模式和微结构设计
N:M结构细粒度设计
N:M稀疏模式允许在不同维度上应用,从而产生不同的微结构特性。以卷积层为例,给定权重张量 W ∈ R C o u t × C i n × K × K \mathbf{W} \in \mathbb{R}^{C_{out} \times C_{in} \times K \times K} W∈RCout×Cin×K×K,我们可以设计以下变体:
-
通道内N:M稀疏:在每个输出通道内应用N:M稀疏
∑ j = ( i − 1 ) M i M − 1 I ( W c o u t , c i n , j m o d K , ⌊ j / K ⌋ ≠ 0 ) ≤ N , ∀ i , c o u t , c i n \sum_{j=(i-1)M}^{iM-1} \mathbb{I}(W_{c_{out},c_{in},j \mod K, \lfloor j/K \rfloor} \neq 0) \leq N, \quad \forall i, c_{out}, c_{in} j=(i−1)M∑iM−1I(Wcout,cin,jmodK,⌊j/K⌋=0)≤N,∀i,cout,cin -
滤波器内N:M稀疏:在每个 K × K K \times K K×K滤波器内应用N:M稀疏
∑ h = 1 K ∑ w = 1 K I ( W c o u t , c i n , h , w ≠ 0 ) ≤ N M ⋅ K 2 , ∀ c o u t , c i n \sum_{h=1}^K \sum_{w=1}^K \mathbb{I}(W_{c_{out},c_{in},h,w} \neq 0) \leq \frac{N}{M} \cdot K^2, \quad \forall c_{out}, c_{in} h=1∑Kw=1∑KI(Wcout,cin,h,w=0)≤MN⋅K2,∀cout,cin -
输出通道内N:M稀疏:在每个输出通道内跨所有输入通道应用N:M稀疏
∑ c i n = 1 C i n ∑ h = 1 K ∑ w = 1 K I ( W c o u t , c i n , h , w ≠ 0 ) ≤ N M ⋅ C i n ⋅ K 2 , ∀ c o u t \sum_{c_{in}=1}^{C_{in}} \sum_{h=1}^K \sum_{w=1}^K \mathbb{I}(W_{c_{out},c_{in},h,w} \neq 0) \leq \frac{N}{M} \cdot C_{in} \cdot K^2, \quad \forall c_{out} cin=1∑Cinh=1∑Kw=1∑KI(Wcout,cin,h,w=0)≤MN⋅Cin⋅K2,∀cout
这些变体提供了不同程度的结构规律性和灵活性,可根据硬件特性和应用需求选择。
研究表明,2:4稀疏是一个特别有效的选择,因为它既提供了足够的压缩率,又能保持良好的模型性能。实验结果显示,在相同的压缩率下,2:4稀疏通常优于1:2稀疏,接近于非结构化剪枝的性能。这可以从信息论角度解释:2:4稀疏的熵为:
H 2 : 4 = ∣ W ∣ 4 ⋅ log 2 ( 4 2 ) = ∣ W ∣ 4 ⋅ log 2 6 ≈ 0.65 ⋅ ∣ W ∣ H_{2:4} = \frac{|\mathbf{W}|}{4} \cdot \log_2 \binom{4}{2} = \frac{|\mathbf{W}|}{4} \cdot \log_2 6 \approx 0.65 \cdot |\mathbf{W}| H2:4=4∣W∣⋅log2(24)=4∣W∣⋅log26≈0.65⋅∣W∣
这意味着2:4稀疏可以表达的模式数量比1:2稀疏( H 1 : 2 = ∣ W ∣ 2 ⋅ log 2 2 = 0.5 ⋅ ∣ W ∣ H_{1:2} = \frac{|\mathbf{W}|}{2} \cdot \log_2 2 = 0.5 \cdot |\mathbf{W}| H1:2=2∣W∣⋅log22=0.5⋅∣W∣)更多,因此能够更好地近似原始密集网络。
分组和重叠块设计
块稀疏可以通过分组和重叠设计进一步增强。考虑权重矩阵 W ∈ R m × n \mathbf{W} \in \mathbb{R}^{m \times n} W∈Rm×n,除了标准的不重叠块划分外,我们还可以设计:
-
重叠块:相邻块之间有重叠区域,增加表达灵活性
W i , j overlap = W ( i − 1 ) b 1 − o 1 : ( i − 1 ) b 1 + b 1 + o 1 , ( j − 1 ) b 2 − o 2 : ( j − 1 ) b 2 + b 2 + o 2 \mathbf{W}_{i,j}^{\text{overlap}} = \mathbf{W}_{(i-1)b_1-o_1:(i-1)b_1+b_1+o_1, (j-1)b_2-o_2:(j-1)b_2+b_2+o_2} Wi,joverlap=W(i−1)b1−o1:(i−1)b1+b1+o1,(j−1)b2−o2:(j−1)b2+b2+o2
其中 o 1 o_1 o1和 o 2 o_2 o2是重叠大小。 -
层次化块:大块内包含小块,允许多粒度稀疏
W = { W large 1 , W large 2 , … } \mathbf{W} = \{\mathbf{W}_{\text{large}}^1, \mathbf{W}_{\text{large}}^2, \ldots\} W={Wlarge1,Wlarge2,…}
W large i = { W small i , 1 , W small i , 2 , … } \mathbf{W}_{\text{large}}^i = \{\mathbf{W}_{\text{small}}^{i,1}, \mathbf{W}_{\text{small}}^{i,2}, \ldots\} Wlargei={Wsmalli,1,Wsmalli,2,…} -
变形块:非矩形形状的块,适应特定结构模式
W shape i = { W p , q : ( p , q ) ∈ shape i } \mathbf{W}_{\text{shape}}^i = \{W_{p,q} : (p,q) \in \text{shape}_i\} Wshapei={Wp,q:(p,q)∈shapei}
其中 shape i \text{shape}_i shapei定义了块的形状。
这些高级块设计可以适应不同的网络结构和数据特性,提供更精细的剪枝控制。实验表明,适当的块设计可以显著提高半结构化剪枝的有效性。
优化算法
基于ADMM的半结构化剪枝优化
交替方向乘子法(ADMM)是求解半结构化剪枝问题的有效方法。我们首先将原问题重新表述为:
min W , Z L ( W , D ) s.t. W = Z , Z ∈ S semi \min_{\mathbf{W}, \mathbf{Z}} \mathcal{L}(\mathbf{W}, \mathcal{D}) \quad \text{s.t.} \quad \mathbf{W} = \mathbf{Z}, \mathbf{Z} \in \mathcal{S}_{\text{semi}} W,ZminL(W,D)s.t.W=Z,Z∈Ssemi
构造增广拉格朗日函数:
L ρ ( W , Z , U ) = L ( W , D ) + ρ 2 ∥ W − Z + U ∥ F 2 − ρ 2 ∥ U ∥ F 2 \mathcal{L}_{\rho}(\mathbf{W}, \mathbf{Z}, \mathbf{U}) = \mathcal{L}(\mathbf{W}, \mathcal{D}) + \frac{\rho}{2}\|\mathbf{W} - \mathbf{Z} + \mathbf{U}\|_F^2 - \frac{\rho}{2}\|\mathbf{U}\|_F^2 Lρ(W,Z,U)=L(W,D)+2ρ∥W−Z+U∥F2−2ρ∥U∥F2
ADMM迭代步骤为:
-
更新 W \mathbf{W} W: W k + 1 = arg min W L ( W , D ) + ρ 2 ∥ W − Z k + U k ∥ F 2 \mathbf{W}^{k+1} = \arg\min_{\mathbf{W}} \mathcal{L}(\mathbf{W}, \mathcal{D}) + \frac{\rho}{2}\|\mathbf{W} - \mathbf{Z}^k + \mathbf{U}^k\|_F^2 Wk+1=argminWL(W,D)+2ρ∥W−Zk+Uk∥F2
-
更新 Z \mathbf{Z} Z: Z k + 1 = Π S semi ( W k + 1 + U k ) \mathbf{Z}^{k+1} = \Pi_{\mathcal{S}_{\text{semi}}}(\mathbf{W}^{k+1} + \mathbf{U}^k) Zk+1=ΠSsemi(Wk+1+Uk)
-
更新乘子: U k + 1 = U k + W k + 1 − Z k + 1 \mathbf{U}^{k+1} = \mathbf{U}^k + \mathbf{W}^{k+1} - \mathbf{Z}^{k+1} Uk+1=Uk+Wk+1−Zk+1
其中 Π S semi \Pi_{\mathcal{S}_{\text{semi}}} ΠSsemi是将参数投影到半结构化稀疏空间的操作。对于N:M稀疏,这个投影操作是:
Π N:M ( V ) = V ⊙ M N:M \Pi_{\text{N:M}}(\mathbf{V}) = \mathbf{V} \odot \mathbf{M}_{\text{N:M}} ΠN:M(V)=V⊙MN:M
其中 M N:M \mathbf{M}_{\text{N:M}} MN:M是保留每M个连续元素中绝对值最大的N个元素的掩码。
对于块稀疏,投影操作为:
Π block ( V ) = V ⊙ M block \Pi_{\text{block}}(\mathbf{V}) = \mathbf{V} \odot \mathbf{M}_{\text{block}} Πblock(V)=V⊙Mblock
其中 M block \mathbf{M}_{\text{block}} Mblock是保留Frobenius范数最大的 k b k_b kb个块的掩码。
基于正则化的优化
半结构化剪枝也可以通过适当的正则化项实现。例如,对于块稀疏,我们可以使用组范数正则化:
min W L ( W , D ) + λ ∑ i = 1 m / b 1 ∑ j = 1 n / b 2 ∥ W i , j block ∥ F \min_{\mathbf{W}} \mathcal{L}(\mathbf{W}, \mathcal{D}) + \lambda \sum_{i=1}^{m/b_1} \sum_{j=1}^{n/b_2} \|\mathbf{W}_{i,j}^{\text{block}}\|_F WminL(W,D)+λi=1∑m/b1j=1∑n/b2∥Wi,jblock∥F
对于N:M稀疏,我们可以使用以下正则化形式:
min W L ( W , D ) + λ ∑ i = 0 ⌊ ∣ W ∣ − 1 M ⌋ Φ ( { W j : j = i M , … , ( i + 1 ) M − 1 } ) \min_{\mathbf{W}} \mathcal{L}(\mathbf{W}, \mathcal{D}) + \lambda \sum_{i=0}^{\lfloor \frac{|\mathbf{W}|-1}{M} \rfloor} \Phi\left(\{W_j : j = iM, \ldots, (i+1)M-1\}\right) WminL(W,D)+λi=0∑⌊M∣W∣−1⌋Φ({Wj:j=iM,…,(i+1)M−1})
其中 Φ \Phi Φ是促进组内稀疏的函数,例如:
Φ ( w ) = ∥ w ∥ 1 − ∑ i = 1 N ∣ w [ i ] ∣ \Phi(\mathbf{w}) = \|\mathbf{w}\|_1 - \sum_{i=1}^N |w_{[i]}| Φ(w)=∥w∥1−i=1∑N∣w[i]∣
这里 w [ i ] w_{[i]} w[i]是 w \mathbf{w} w中第 i i i大的元素(按绝对值)。这个正则化项惩罚除了绝对值最大的N个元素之外的所有元素。
基于动态稀疏训练的优化
动态稀疏训练(Dynamic Sparse Training, DST)是一种有效的半结构化剪枝优化方法。在DST框架下,我们维持固定的半结构化稀疏模式,但允许非零权重的位置动态变化。
具体而言,在每次迭代 t t t中,我们执行以下步骤:
- 前向传播和反向传播,更新当前活跃权重
- 计算每个组(如N:M组或块)中权重的潜在贡献: s j t = ∣ W j t ∣ + γ ⋅ ∣ ∇ W j L t ∣ s_j^t = |W_j^t| + \gamma \cdot |\nabla_{\!W_j} \mathcal{L}^t| sjt=∣Wjt∣+γ⋅∣∇WjLt∣
- 在每个组内,保留贡献最大的N个权重,剪掉其余的,得到新的掩码 M t + 1 \mathbf{M}^{t+1} Mt+1
- 更新参数: W t + 1 = W t ⊙ M t + 1 \mathbf{W}^{t+1} = \mathbf{W}^t \odot \mathbf{M}^{t+1} Wt+1=Wt⊙Mt+1
DST的一个重要变体是RigL(Rigged Lottery)算法,它为半结构化剪枝进行了扩展。RigL-Semi算法添加了半结构化约束:
M t + 1 = TopValues ( S t , M t , f semi ) \mathbf{M}^{t+1} = \text{TopValues}(\mathbf{S}^t, \mathbf{M}^t, f_{\text{semi}}) Mt+1=TopValues(St,Mt,fsemi)
其中 f semi f_{\text{semi}} fsemi是确保新掩码满足半结构化约束的函数。
基于强化学习的策略优化
强化学习(RL)为半结构化剪枝提供了一种自动优化框架。在RL框架中,智能体学习一个策略,为不同的层和结构单元选择最优的剪枝决策。
状态空间可以包括网络结构信息、当前稀疏度、每层敏感度等。动作空间包括对每个结构单元(如块或N:M组)的剪枝决策。奖励信号基于验证精度和满足资源约束的程度:
r ( s t , a t ) = α ⋅ Acc ( W t ) − β ⋅ max ( 0 , R ( W t ) − R target ) r(s_t, a_t) = \alpha \cdot \text{Acc}(\mathbf{W}_t) - \beta \cdot \max(0, R(\mathbf{W}_t) - R_{\text{target}}) r(st,at)=α⋅Acc(Wt)−β⋅max(0,R(Wt)−Rtarget)
其中 α \alpha α和 β \beta β是权重系数。
基于深度Q网络(DQN)或近端策略优化(PPO)的算法可以学习最优剪枝策略,自动决定每层的最佳半结构化稀疏模式。
半结构化剪枝的硬件加速
半结构化剪枝的一个主要优势是能够在现代硬件上实现高效加速。不同的半结构化稀疏模式适合不同的硬件架构。
N:M稀疏的硬件加速
N:M稀疏特别适合NVIDIA Ampere架构的GPU,它直接支持2:4稀疏模式。在Ampere的Tensor Core中,2:4稀疏通过以下方式实现加速:
- 将权重矩阵的2:4稀疏模式编码为元数据
- 在Tensor Core计算中,只处理非零权重
- 通过硬件支持的稀疏矩阵乘法,实现近2倍的计算吞吐量
具体而言,对于矩阵乘法 C = A × B C = A \times B C=A×B,其中 B B B是2:4稀疏的,计算过程为:
C i , j = ∑ k = 1 n A i , k ⋅ B k , j = ∑ k : B k , j ≠ 0 A i , k ⋅ B k , j C_{i,j} = \sum_{k=1}^n A_{i,k} \cdot B_{k,j} = \sum_{k: B_{k,j} \neq 0} A_{i,k} \cdot B_{k,j} Ci,j=k=1∑nAi,k⋅Bk,j=k:Bk,j=0∑Ai,k⋅Bk,j
通过硬件优化,这个计算的效率几乎是密集矩阵乘法的2倍。
块稀疏的硬件加速
块稀疏特别适合通用硬件和专用加速器。对于块大小为 b × b b \times b b×b的块稀疏矩阵乘法,计算过程可以重组为处理非零块:
C = A × B = ∑ ( i , j ) ∈ NZ A : , i × B j , : C = A \times B = \sum_{(i,j) \in \text{NZ}} A_{:,i} \times B_{j,:} C=A×B=(i,j)∈NZ∑A:,i×Bj,:
其中 NZ \text{NZ} NZ是非零块的索引集合。这种计算可以利用优化的BLAS库或专用硬件单元高效执行。
块稀疏的一个重要优势是内存访问效率。相比于非结构化稀疏,块稀疏可以减少内存随机访问和指令分支,提高缓存命中率。对于块大小为 b × b b \times b b×b的块稀疏,内存访问减少比例约为:
内存访问减少 ≈ b 2 − 1 b 2 ⋅ ( 1 − k b ⋅ b 2 m ⋅ n ) \text{内存访问减少} \approx \frac{b^2 - 1}{b^2} \cdot (1 - \frac{k_b \cdot b^2}{m \cdot n}) 内存访问减少≈b2b2−1⋅(1−m⋅nkb⋅b2)
这显著提高了内存带宽利用率。
软硬件协同设计
为了最大化半结构化剪枝的加速效果,软硬件协同设计至关重要。这包括:
- 硬件感知的稀疏模式选择:根据目标硬件特性选择最优的半结构化稀疏模式
- 编译器优化:生成高效的指令序列,最大化硬件利用率
- 内存布局优化:设计专用的稀疏矩阵存储格式,减少内存访问开销
- 计算调度:优化工作负载分配和同步策略
例如,对于支持2:4稀疏的GPU,我们可以设计以下优化流程:
- 选择2:4稀疏作为半结构化剪枝模式
- 在训练阶段强制权重满足2:4稀疏约束
- 使用专用的存储格式编码2:4稀疏矩阵
- 通过优化的CUDA核函数实现高效推理
对于块稀疏,我们可以根据目标硬件的SIMD宽度和缓存行大小选择最优的块大小,实现计算和内存访问的最佳平衡。