模型剪枝是一种通过移除神经网络中冗余或不重要的参数来压缩模型的技术。在边缘设备部署场景中,剪枝不仅能够减少模型的存储需求,还能显著降低推理时的计算量和内存占用。本章将深入探讨剪枝的数学原理、实践策略以及在大语言模型中的应用,重点关注如何在保持模型性能的同时最大化压缩率。
非结构化剪枝(Unstructured Pruning)是指在权重矩阵中任意位置移除单个权重元素,不考虑特定的结构模式。这种方法最早可以追溯到1990年代的Optimal Brain Damage (OBD)和Optimal Brain Surgeon (OBS)工作。
数学表示: 对于权重矩阵 $\mathbf{W} \in \mathbb{R}^{m \times n}$,非结构化剪枝通过二值掩码矩阵 $\mathbf{M} \in {0,1}^{m \times n}$ 实现:
\[\mathbf{W}_{\text{pruned}} = \mathbf{W} \odot \mathbf{M}\]其中 $\odot$ 表示逐元素乘法(Hadamard积)。
稀疏度定义: 稀疏度 $s$ 定义为零元素的比例:
\[s = \frac{\|\mathbf{M}\|_0}{mn} = \frac{\text{非零元素数量}}{\text{总元素数量}}\]历史发展轨迹:
稀疏存储格式: 非结构化稀疏矩阵通常使用以下格式存储:
对于稀疏度为 $s$ 的矩阵,COO格式的存储需求从 $mn$ 降至 $3(1-s)mn$,只有当 $s > 2/3$ 时才有存储优势。
存储格式详细分析:
原始矩阵: COO表示:
[0 0 3 0] row: [0, 1, 2, 3]
[0 5 0 0] col: [2, 1, 0, 2]
[1 0 0 0] val: [3, 5, 1, 7]
[0 0 7 0]
存储需求:12个值(3×4)vs 16个原始值
块稀疏存储(BCSR): 将矩阵划分为 $b \times b$ 块,只存储非零块: \(\text{Storage} = \text{block\_indices} + b^2 \times \text{num\_blocks}\)
当块内稠密度高时更有效。
优势:
劣势:
实际加速分析: 稀疏矩阵乘法的实际性能受多个因素影响: \(T_{\text{sparse}} = T_{\text{compute}} + T_{\text{memory}} + T_{\text{overhead}}\)
其中:
通常只有当稀疏度超过90-95%时,在GPU上才能获得实际加速。
稀疏矩阵运算优化技术:
边缘设备上的非结构化剪枝:
在资源受限的边缘设备上,非结构化剪枝面临特殊挑战:
内存带宽限制: 边缘设备的内存带宽通常是瓶颈: \(\text{Bandwidth}_{\text{required}} = \frac{\text{nnz} \times (\text{sizeof(value)} + \text{sizeof(index)})}{\text{time}}\)
对于移动GPU(如Mali G78),带宽约为50GB/s,远低于桌面GPU。
能效考虑: 稀疏运算的能效分析: \(\text{Energy} = E_{\text{compute}} + E_{\text{memory}} + E_{\text{control}}\)
其中控制开销 $E_{\text{control}}$ 在稀疏运算中占比可达30-40%。
结构化剪枝(Structured Pruning)按照预定义的结构模式移除参数,如整个通道、滤波器或注意力头。这种方法的核心优势在于剪枝后的模型仍然保持规则的张量结构,可以直接利用现有的高度优化的密集计算库。
主要类型:
通道剪枝(Channel Pruning): 对于卷积层权重 $\mathbf{W} \in \mathbb{R}^{C_{\text{out}} \times C_{\text{in}} \times K \times K}$,通道剪枝移除整个输入或输出通道:
\[\mathbf{W}_{\text{pruned}} \in \mathbb{R}^{C'_{\text{out}} \times C'_{\text{in}} \times K \times K}\]其中 $C’{\text{out}} \leq C{\text{out}}$,$C’{\text{in}} \leq C{\text{in}}$
计算量减少比例: \(\text{FLOPs}_{\text{reduction}} = 1 - \frac{C'_{\text{out}} \times C'_{\text{in}}}{C_{\text{out}} \times C_{\text{in}}}\)
滤波器剪枝(Filter Pruning): 移除整个滤波器(输出通道),这是最常用的结构化剪枝形式:
\[\mathbf{W}_{i,:,:,:} = \mathbf{0}, \quad i \in \mathcal{P}\]其中 $\mathcal{P}$ 是被剪枝的滤波器索引集合。
级联效应:剪枝第 $l$ 层的输出通道会影响第 $l+1$ 层的输入通道: \(C_{\text{in}}^{(l+1)} = C_{\text{out}}^{(l)} - |\mathcal{P}^{(l)}|\)
注意力头剪枝(Attention Head Pruning): 对于多头注意力,移除整个注意力头:
\[\text{MultiHead}(\mathbf{Q}, \mathbf{K}, \mathbf{V}) = \text{Concat}(\text{head}_i)_{i \notin \mathcal{P}} \mathbf{W}^O\]每个头的计算复杂度为 $O(n^2 d_h)$,其中 $n$ 是序列长度,$d_h = d_{\text{model}}/h$ 是每个头的维度。
块剪枝(Block Pruning): 将权重矩阵划分为 $b \times b$ 的块,以块为单位进行剪枝:
\[\mathbf{W} = \begin{bmatrix} \mathbf{B}_{11} & \mathbf{B}_{12} & \cdots \\ \mathbf{B}_{21} & \mathbf{B}_{22} & \cdots \\ \vdots & \vdots & \ddots \end{bmatrix}\]其中 $\mathbf{B}_{ij} \in \mathbb{R}^{b \times b}$ 要么全零要么保留。
硬件友好性分析:
结构化剪枝后的计算可以直接映射到密集矩阵运算:
实际加速效果: 对于结构化剪枝,实际加速比接近理论值: \(\text{Speedup}_{\text{actual}} \approx \frac{\text{FLOPs}_{\text{original}}}{\text{FLOPs}_{\text{pruned}}} \times \eta\)
其中效率因子 $\eta \in [0.8, 0.95]$,取决于硬件架构和实现质量。
与批归一化的交互: 通道剪枝需要特别处理批归一化层:
近年来,NVIDIA等硬件厂商开始支持半结构化稀疏模式,如2:4稀疏(每4个连续元素中保留2个)。这种方法试图在非结构化剪枝的灵活性和结构化剪枝的硬件效率之间找到平衡点。
2:4稀疏模式: 对于向量 $\mathbf{v} = [v_1, v_2, v_3, v_4]$,2:4稀疏要求恰好两个元素为零:
\[\|\mathbf{v}\|_0 = 2\]这种模式在NVIDIA Ampere架构(A100)及更新的GPU上通过Sparse Tensor Core可以获得理论上2倍的加速。
硬件实现原理: NVIDIA的Sparse Tensor Core通过专门的硬件单元实现2:4稀疏加速:
数学优化问题: 寻找最优的2:4稀疏模式可以表述为:
\(\min_{\mathbf{M}} \|\mathbf{W} - \mathbf{W} \odot \mathbf{M}\|_F^2\) \(\text{s.t. } \sum_{j=4k}^{4k+3} M_{ij} = 2, \quad \forall i,k\)
这是一个组合优化问题,对于每组4个元素,需要从 $\binom{4}{2} = 6$ 种可能中选择最优方案。
贪婪算法: 对每组4个连续元素,保留绝对值最大的2个:
For each group [w1, w2, w3, w4]:
indices = argsort(|wi|, descending)
keep indices[0] and indices[1]
prune indices[2] and indices[3]
SR-STE (Sparse-Refined Straight-Through Estimator): NVIDIA提出的训练时方法,使用可微分的top-k操作:
\[\mathbf{W}_{\text{sparse}} = \text{SR-STE}(\mathbf{W}) = \mathbf{W} \odot \text{TopK-Mask}(\mathbf{W}, k=2, \text{group}=4)\]反向传播时使用直通估计器,允许被剪枝权重的梯度流动。
其他半结构化模式:
向量稀疏(Vector-wise Sparsity): 整个向量要么全保留要么全剪枝,适合SIMD架构: \(\mathbf{W} = [\mathbf{v}_1, \mathbf{v}_2, ..., \mathbf{v}_n], \quad \mathbf{v}_i \in \{0\}^d \cup \mathbb{R}^d\)
硬件支持现状:
性能分析: 2:4稀疏的实际加速取决于多个因素: \(\text{Speedup}_{\text{2:4}} = \frac{2}{1 + \alpha}\)
其中 $\alpha$ 是额外开销比例,包括:
实践中,$\alpha \approx 0.2-0.5$,因此实际加速比约为1.3-1.7倍。
选择合适的剪枝模式需要考虑多个因素,这是一个多目标优化问题,需要在模型大小、推理速度、精度和硬件兼容性之间权衡。
决策框架: 剪枝模式选择可以形式化为多目标优化问题: \(\min_{\mathbf{M}} \{\mathcal{L}_{\text{accuracy}}(\mathbf{M}), \mathcal{L}_{\text{latency}}(\mathbf{M}), \mathcal{L}_{\text{memory}}(\mathbf{M}), \mathcal{L}_{\text{energy}}(\mathbf{M})\}\)
使用Pareto优化找到非支配解集。
硬件能力评估矩阵:
硬件类型 | 非结构化 | 结构化 | 2:4稀疏 | 块稀疏
----------------|---------|--------|---------|--------
CPU (x86/ARM) | ✗ | ✓✓ | ✗ | ✓
GPU (消费级) | ✗ | ✓✓ | ✗ | ✓
GPU (A100/H100) | ✓ | ✓✓ | ✓✓ | ✓
移动GPU | ✗ | ✓✓ | ✗ | ✓
DSP/NPU | ✗ | ✓ | ✗ | ✓
✓✓: 硬件优化支持 ✓: 可运行 ✗: 无加速或不支持
模型组件的剪枝敏感性分析:
对于Transformer/LLM模型,经验性的剪枝敏感性排序:
\[\text{Embedding} < \text{FFN}_{\text{up}} < \text{FFN}_{\text{down}} < \text{Attention}_{\text{V}} < \text{Attention}_{\text{K,Q}} < \text{LayerNorm}\]详细分析:
层级剪枝率分配策略:
基于泰勒展开的敏感度分配: \(p_l = p_{\text{avg}} \cdot \left(1 + \lambda \cdot \frac{S_{\text{avg}} - S_l}{S_{\text{avg}}}\right)\)
其中:
混合剪枝策略:
现代实践中,常采用混合策略以获得最佳效果:
Layer Type | Pruning Method | Typical Rate
-------------------|--------------------|--------------
Embedding | Structured (dim) | 50-70%
Attention Q,K,V | Structured (head) | 25-40%
Attention Output | Semi-structured | 40-50%
FFN Layer 1 | Structured (neuron) | 50-60%
FFN Layer 2 | Semi-structured | 40-50%
Final Linear | Unstructured | 70-80%
动态剪枝模式选择:
根据运行时条件动态选择剪枝模式:
实际部署案例分析:
第2阶段:半结构化剪枝
第3阶段:INT8量化
空间维度:动态token剪枝
通道维度:结构化剪枝
注意力:头剪枝+2:4稀疏
剪枝模式选择决策树:
是否有专用硬件支持?
├─ 是:检查硬件类型
│ ├─ NVIDIA A100+:优先2:4稀疏
│ ├─ TPU:块稀疏(128×128)
│ └─ 移动NPU:结构化剪枝
└─ 否:通用硬件
├─ 精度要求高?
│ ├─ 是:渐进式结构化剪枝
│ └─ 否:激进结构化剪枝
└─ 延迟要求严格?
├─ 是:通道/滤波器剪枝
└─ 否:混合剪枝策略
渐进式剪枝策略的核心思想是避免一次性大幅度剪枝带来的性能损失,通过逐步增加稀疏度让网络有时间适应结构变化。这类方法在实践中被证明能够达到更高的压缩率同时保持模型性能。
渐进幅度剪枝(Gradual Magnitude Pruning, GMP)是一种在训练过程中逐步增加稀疏度的方法,最早由Zhu和Gupta在2017年提出,现已成为标准方法之一。
稀疏度调度函数: 给定初始稀疏度 $s_0$、目标稀疏度 $s_f$、开始步数 $t_0$ 和结束步数 $t_f$,在步数 $t$ 时的稀疏度为:
\[s_t = s_f + (s_0 - s_f) \left(1 - \frac{t - t_0}{t_f - t_0}\right)^3\]这里使用三次多项式确保平滑过渡。其他常用的调度函数包括:
线性调度: \(s_t = s_0 + (s_f - s_0) \cdot \frac{t - t_0}{t_f - t_0}\)
余弦调度: \(s_t = s_f + \frac{s_0 - s_f}{2} \left(1 + \cos\left(\pi \cdot \frac{t - t_0}{t_f - t_0}\right)\right)\)
指数调度: \(s_t = s_f - (s_f - s_0) \cdot \exp\left(-\alpha \cdot \frac{t - t_0}{t_f - t_0}\right)\)
调度函数选择的理论依据: 不同调度函数对应不同的剪枝哲学:
自适应调度策略: 基于验证集性能动态调整剪枝速度: \(s_{t+\Delta t} = s_t + \Delta s \cdot \exp\left(-\beta \cdot \frac{\Delta \mathcal{L}}{\mathcal{L}_{\text{threshold}}}\right)\)
其中 $\Delta \mathcal{L}$ 是验证损失的增加量。当损失增加过快时,自动减缓剪枝速度。
剪枝频率优化: 不是每个训练步都更新稀疏模式,而是每隔 $\Delta t$ 步更新一次:
\[\Delta t = \frac{t_f - t_0}{n_{\text{updates}}}\]其中 $n_{\text{updates}}$ 通常选择100-1000,平衡更新开销和适应性。
剪枝阈值计算: 在每个剪枝步骤,计算权重幅度的第 $k$ 个百分位数作为阈值:
\[\theta = \text{Percentile}(|\mathbf{W}|, 100 \cdot s_t)\]然后更新掩码:
\[M_{ij} = \begin{cases} 1, & \text{if } |W_{ij}| \geq \theta \\ 0, & \text{otherwise} \end{cases}\]动量辅助剪枝决策: 考虑权重的历史变化趋势,使用指数移动平均:
\[\bar{W}_{ij}^{(t)} = \beta \bar{W}_{ij}^{(t-1)} + (1-\beta) |W_{ij}^{(t)}|\]剪枝决策基于平滑后的权重幅度 $\bar{W}_{ij}$ 而非瞬时值。
层级同步剪枝: 为了维持层间平衡,可以采用全局阈值或层级归一化阈值:
与优化器的交互: GMP与不同优化器的交互需要特别注意:
优化器状态处理的深入分析:
这防止了被剪枝权重的动量累积。
学习率缩放补偿: 剪枝改变了有效参数数量,需要调整学习率: \(\eta_{\text{effective}} = \eta \cdot \sqrt{\frac{N_{\text{total}}}{N_{\text{active}}}}\)
其中 $N_{\text{active}} = N_{\text{total}} \cdot (1-s)$。
实践中的GMP配置:
迭代剪枝通过多轮”剪枝-恢复训练”循环来达到目标稀疏度。这种方法的理论基础是网络具有自我修复能力,可以通过重新训练补偿部分权重移除带来的影响。
算法流程:
理论分析: 假设每轮剪枝后的精度损失为 $\Delta_i$,且通过恢复训练可以恢复 $\alpha \Delta_i$ 的精度($0 < \alpha < 1$),则总精度损失约为:
\[\Delta_{\text{total}} \approx \sum_{i=1}^N (1-\alpha)^i \Delta_1\]当 $\alpha$ 接近1时,多轮迭代可以显著减少精度损失。收敛条件为: \(\Delta_{\text{total}} < \frac{\Delta_1}{1-(1-\alpha)} = \frac{\Delta_1}{\alpha}\)
自适应恢复训练: 根据每轮的精度损失动态调整恢复训练的强度:
\[T_i = T_{\text{base}} \cdot \left(1 + \gamma \cdot \frac{\Delta_i}{\Delta_{\text{threshold}}}\right)\]其中:
剪枝率退火策略: 随着剪枝轮数增加,逐渐降低每轮的剪枝率:
\[p_i = p_{\text{init}} \cdot \exp(-\lambda \cdot i)\]这种策略在后期更加保守,有助于维持模型性能。
早停机制: 监控验证集性能,当连续 $k$ 轮恢复训练无法改善性能时停止:
\[\text{Stop if } \mathcal{L}_{\text{val}}^{(i)} - \mathcal{L}_{\text{val}}^{(i-k)} < \epsilon\]批量剪枝 vs. 单元素剪枝:
批量大小的选择影响收敛速度和最终性能: \(m = \max(1, \lfloor p \cdot |\mathbf{W}| / N \rfloor)\)
动态稀疏训练(Dynamic Sparse Training, DST)允许在训练过程中改变稀疏模式,这种方法受到神经科学中突触可塑性的启发。代表性工作包括Sparse Evolutionary Training (SET)和Rigged Lottery (RigL)。
核心思想: 保持固定的稀疏度,但允许权重连接的拓扑结构动态变化:
权重更新策略:
理论基础 - 神经可塑性类比: DST模拟了生物神经网络的突触可塑性:
数学建模: \(\frac{d\mathbf{M}}{dt} = \alpha_{\text{grow}} \cdot \mathbf{G} - \alpha_{\text{prune}} \cdot \mathbf{P}\)
其中 $\mathbf{G}$ 是生长信号,$\mathbf{P}$ 是剪枝信号。
生长策略对比:
梯度准则(RigL): \(\text{Score}_{ij} = |\nabla_{W_{ij}} \mathcal{L}| \cdot |\nabla_{a_j} \mathcal{L}|\) 其中 $\nabla_{a_j} \mathcal{L}$ 是对激活的梯度。
随机生长(SET): \(P(W_{ij} \text{ grows}) = \frac{1}{|\mathcal{Z}|}\) 其中 $\mathcal{Z}$ 是所有零权重的集合。
动量准则: \(\text{Score}_{ij} = |m_{ij}|\) 使用优化器的动量信息指导生长。
二阶准则: \(\text{Score}_{ij} = \frac{(\nabla_{W_{ij}} \mathcal{L})^2}{H_{ij,ij} + \epsilon}\) 考虑Hessian信息的影响。
更新调度: DST的更新频率随训练进行逐渐降低:
\[f_{\text{update}}(t) = f_0 \cdot \left(1 - \frac{t}{T}\right)^\beta\]其中 $\beta$ 控制衰减速度,通常取0.5-1.0。
稀疏模式演化分析: 定义稀疏模式的Hamming距离:
\[d_H(\mathbf{M}^{(t)}, \mathbf{M}^{(t+1)}) = \frac{1}{mn}\sum_{i,j} |M_{ij}^{(t)} - M_{ij}^{(t+1)}|\]好的动态稀疏策略应该:
稀疏拓扑的有效性度量: 定义连接有效性分数:
\[E(\mathbf{M}) = \frac{\sum_{i,j} M_{ij} \cdot |W_{ij}| \cdot |\nabla_{W_{ij}} \mathcal{L}|}{\sum_{i,j} M_{ij}}\]高分表示当前稀疏拓扑包含了重要的连接。
与批归一化的交互: DST在有BN层的网络中需要特别处理:
收敛性保证: 在温和条件下(Lipschitz连续梯度),DST可以保证收敛到稳定点:
\[\mathbb{E}[\|\nabla \mathcal{L}(\mathbf{W}^{(T)})\|^2] \leq \frac{2(\mathcal{L}(\mathbf{W}^{(0)}) - \mathcal{L}^*)}{\eta T} + \frac{\eta L \sigma^2}{b}\]其中 $L$ 是Lipschitz常数,$\sigma^2$ 是梯度方差,$b$ 是批大小。
DST的实际实现细节:
初始化影响收敛速度和最终性能: \(P(\text{connection}_{ij}) = \min(1, \frac{c}{\sqrt{n_i \cdot n_j}})\)
其中 $n_i, n_j$ 是层的宽度,$c$ 是常数。
拓扑演化分析: 定义拓扑稳定性指标: \(\text{Stability}(t) = 1 - \frac{|\mathbf{M}^{(t)} \oplus \mathbf{M}^{(t-\Delta t)}|}{|\mathbf{M}^{(t)}|}\)
其中 $\oplus$ 是异或操作。稳定性接近1表示拓扑已收敛。
浅层:频繁更新,探索特征提取
中层:中等频率,平衡探索与利用
深层:低频更新,保持语义稳定
DST与静态剪枝的性能对比:
实验表明,在相同稀疏度下:
高级DST变体:
Top-KAST(Top-K Adaptive Sparse Training): 自适应调整每层的稀疏度: \(s_l = s_{\text{global}} \cdot \exp\left(-\lambda \cdot \frac{I_l}{\bar{I}}\right)\)
重要层保持更多连接。
GraNet(Gradient Annealing Network): 使用梯度退火控制拓扑变化: \(P(\text{rewire}) = \exp\left(-\frac{t}{T_{\text{anneal}}}\right)\)
随训练进行逐渐固定拓扑。
SNFS(Sparse Networks From Scratch): 从头训练稀疏网络,无需预训练密集模型:
剪枝过程中的学习率调度对最终性能至关重要。不当的学习率会导致剪枝后的网络无法有效恢复或过早收敛到次优解。
分段学习率策略:
自适应学习率调整: 基于剪枝引起的梯度范数变化调整学习率:
\[\eta_{\text{adjusted}} = \eta \cdot \frac{\|\nabla \mathcal{L}(\mathbf{W})\|_2}{\|\nabla \mathcal{L}(\mathbf{W}_{\text{pruned}})\|_2}\]这种调整补偿了剪枝导致的有效学习率变化。
剪枝感知的学习率策略:
层级学习率缩放: 根据每层的剪枝率调整学习率: \(\eta_l = \eta_{\text{base}} \cdot \sqrt{\frac{1}{1-s_l}}\)
这基于有效参数数量减少导致梯度方差增加的理论。
周期性学习率重启: 在每次剪枝后重启学习率: \(\eta(t) = \eta_{\text{max}} \cdot \frac{1}{2}\left(1 + \cos\left(\frac{\pi \cdot t_{\text{cycle}}}{T_{\text{cycle}}}\right)\right)\)
其中 $t_{\text{cycle}}$ 是当前周期内的步数。
温度缩放学习率: 使用温度参数控制学习率衰减速度: \(\eta(t) = \eta_0 \cdot \exp\left(-\frac{t}{\tau(s)}\right)\)
其中 $\tau(s) = \tau_0 \cdot (1-s)^{\alpha}$,稀疏度越高,衰减越慢。
与优化器状态的协调:
对于带动量的优化器,剪枝时需要特别处理:
Adam优化器的特殊处理: \(\begin{aligned} m_{ij} &\leftarrow m_{ij} \cdot M_{ij} \\ v_{ij} &\leftarrow \max(v_{ij} \cdot M_{ij}, \epsilon) \end{aligned}\)
避免二阶动量变为0导致的数值不稳定。
学习率与剪枝频率的关系:
剪枝频率应与学习率衰减同步: \(\Delta t_{\text{prune}} = \frac{C}{\eta(t)}\)
其中 $C$ 是常数,确保在学习率高时频繁剪枝,学习率低时减少干扰。
实验验证的最佳实践:
学习率调度的高级技巧:
剪枝感知的warmup: 在剪枝开始前进行特殊的warmup: \(\eta_{\text{warmup}}(t) = \eta_{\text{base}} \cdot \frac{t}{T_{\text{warmup}}} \cdot (1 + \alpha \cdot s_{\text{target}})\)
提前让网络适应即将到来的稀疏化。
动态批大小调整: 随着稀疏度增加,有效梯度变得更嘈杂,需要增大批大小: \(B_{\text{effective}} = B_{\text{base}} \cdot (1 + \beta \cdot s)\)
或等价地降低学习率。
层级异步学习率: 不同层使用不同的学习率衰减策略:
深层(靠近输出):快速衰减
中层:标准衰减
浅层(靠近输入):缓慢衰减
这反映了不同层的剪枝敏感性差异。
剪枝与正则化的交互:
剪枝本身是一种隐式正则化,需要调整显式正则化强度:
权重衰减调整: \(\lambda_{\text{wd}}(s) = \lambda_0 \cdot (1-s)^{\gamma}\)
稀疏网络需要更少的权重衰减。
Dropout概率调整: \(p_{\text{dropout}}(s) = p_0 \cdot \exp(-\delta \cdot s)\)
高稀疏度时降低dropout,避免过度正则化。
数据增强策略: 稀疏网络容量降低,可能需要:
选择合适的重要性度量是剪枝成功的关键。理想的重要性准则应该准确反映参数对模型性能的贡献,同时计算效率高。本节将从一阶到二阶,从单元素到结构化,系统介绍各种重要性评估方法。
一阶方法基于权重值或梯度信息,计算简单但可能忽略参数间的相互作用。
权重幅度准则: 最简单直观的重要性度量是权重的绝对值:
\[I_{ij}^{\text{magnitude}} = |W_{ij}|\]理论依据:小权重对输出的贡献小。但这忽略了激活值的影响。
改进的权重幅度准则: 考虑权重的相对大小:
\[I_{ij}^{\text{normalized}} = \frac{|W_{ij}|}{\sqrt{\sum_k W_{ik}^2}}\]这种归一化处理了不同层权重尺度差异的问题。
理论分析 - 为什么幅度剪枝有效:
隐式正则化视角: 训练过程中的权重衰减导致不重要权重自然变小: \(\frac{\partial \mathcal{L}_{\text{total}}}{\partial W_{ij}} = \frac{\partial \mathcal{L}}{\partial W_{ij}} + \lambda W_{ij}\)
| 稳定点处:$ | \frac{\partial \mathcal{L}}{\partial W_{ij}} | = \lambda | W_{ij} | $ |
因此小权重对应小梯度,移除影响小。
信息论视角: 权重的信息量可以用其对输出分布的影响衡量: \(I(W_{ij}) \approx |W_{ij}| \cdot H(a_j)\)
其中 $H(a_j)$ 是激活的熵。
鲁棒性视角: 大权重对应网络的”主干道”,小权重是”备用路径”: \(\text{Robustness}(W_{ij}) \propto \frac{|W_{ij}|^2}{\text{Var}(W_{ij})}\)
梯度幅度准则: 考虑权重对损失函数的影响:
\[I_{ij}^{\text{gradient}} = |W_{ij} \cdot \nabla_{W_{ij}} \mathcal{L}|\]这近似于移除权重 $W_{ij}$ 对损失函数的一阶Taylor展开影响。
移动平均梯度准则: 使用历史梯度信息增强稳定性:
\(\bar{g}_{ij}^{(t)} = \beta \bar{g}_{ij}^{(t-1)} + (1-\beta) \nabla_{W_{ij}} \mathcal{L}\) \(I_{ij}^{\text{MA-gradient}} = |W_{ij} \cdot \bar{g}_{ij}|\)
组合准则: 结合权重幅度和梯度信息:
\[I_{ij}^{\text{combined}} = |W_{ij}|^\alpha \cdot |\nabla_{W_{ij}} \mathcal{L}|^\beta\]其中 $\alpha, \beta$ 是超参数,通常 $\alpha + \beta = 1$。常见配置:
激活感知准则: 考虑前向传播中的激活值:
\[I_{ij}^{\text{activation}} = |W_{ij}| \cdot \mathbb{E}_{\mathbf{x}}[|a_j(\mathbf{x})|]\]其中 $a_j(\mathbf{x})$ 是输入 $\mathbf{x}$ 对应的第 $j$ 个激活值。
连接敏感度: 基于连接的输入输出变化:
\[I_{ij}^{\text{sensitivity}} = \mathbb{E}_{\mathbf{x}}\left[\left|\frac{\partial y_i}{\partial x_j}\right|\right] = |W_{ij}| \cdot \mathbb{E}_{\mathbf{x}}[|a_j'(\mathbf{x})|]\]批量梯度统计: 使用多个批次的梯度统计:
\[I_{ij}^{\text{batch}} = \frac{\mathbb{E}_{\mathcal{B}}[|W_{ij} \cdot \nabla_{W_{ij}} \mathcal{L}|]}{\text{Var}_{\mathcal{B}}[W_{ij} \cdot \nabla_{W_{ij}} \mathcal{L}] + \epsilon}\]高比值表示稳定且重要的连接。
高级一阶准则:
动量感知重要性: 利用优化器的动量信息: \(I_{ij}^{\text{momentum}} = |W_{ij}| \cdot (1 + \alpha |m_{ij}|)\)
其中 $m_{ij}$ 是动量项。高动量表示该权重正在快速变化。
历史感知重要性: 考虑权重的历史轨迹: \(I_{ij}^{\text{history}} = \frac{1}{T}\sum_{t=1}^T |W_{ij}^{(t)}| \cdot \exp\left(-\beta \cdot \frac{T-t}{T}\right)\)
近期的权重值权重更高。
相对变化率: \(I_{ij}^{\text{relative}} = \frac{|W_{ij}|}{|W_{ij}^{\text{init}}| + \epsilon} \cdot |\nabla_{W_{ij}} \mathcal{L}|\)
考虑权重相对于初始值的变化。
计算效率优化:
采样近似: 对于大模型,使用子集估计: \(\hat{I}_{ij} = \frac{1}{|\mathcal{S}|}\sum_{s \in \mathcal{S}} |W_{ij} \cdot \nabla_{W_{ij}} \mathcal{L}_s|\)
其中 $\mathcal{S}$ 是数据子集。
将W分成k×k块
对每块并行计算重要性
合并结果
增量更新: \(I_{ij}^{(t)} = \rho I_{ij}^{(t-1)} + (1-\rho) I_{ij}^{\text{new}}\)
避免每次从头计算。
二阶方法考虑了损失函数的曲率信息,能更准确地预测剪枝的影响,但计算成本较高。
Taylor展开分析: 将权重 $W_{ij}$ 设为0后的损失变化可以用Taylor展开近似:
\[\Delta \mathcal{L}_{ij} = -W_{ij} g_{ij} + \frac{1}{2} W_{ij}^2 H_{ij,ij} + O(W_{ij}^3)\]其中 $g_{ij} = \nabla_{W_{ij}} \mathcal{L}$,$H_{ij,ij}$ 是Hessian矩阵的对角元素。
在最优点附近($g_{ij} \approx 0$),二阶项主导: \(\Delta \mathcal{L}_{ij} \approx \frac{1}{2} W_{ij}^2 H_{ij,ij}\)
Fisher信息近似: 直接计算Hessian代价高昂,使用Fisher信息矩阵作为近似:
\[F_{ij,ij} = \mathbb{E}_{\mathbf{x} \sim p_{\text{data}}} \left[ \left(\frac{\partial \log p(\mathbf{y}|\mathbf{x}, \mathbf{W})}{\partial W_{ij}}\right)^2 \right]\]Fisher信息的优势:
重要性得分: \(I_{ij}^{\text{Fisher}} = \frac{1}{2} W_{ij}^2 F_{ij,ij}\)
经验Fisher信息: 使用有限样本估计:
\[\hat{F}_{ij,ij} = \frac{1}{N} \sum_{n=1}^N \left(\frac{\partial \mathcal{L}_n}{\partial W_{ij}}\right)^2\]其中 $\mathcal{L}_n$ 是第 $n$ 个样本的损失。
最优脑损伤(OBD)准则: 假设Hessian矩阵是对角的,重要性为:
\[I_{ij}^{\text{OBD}} = \frac{W_{ij}^2}{2[H^{-1}]_{ij,ij}}\]这考虑了参数的不确定性:Hessian对角元素大表示该参数对损失敏感。
最优脑外科(OBS)准则: 考虑完整的Hessian矩阵,允许其他权重补偿被剪枝权重:
\[\Delta \mathbf{W} = -\frac{W_{ij}}{[H^{-1}]_{ij,ij}} H^{-1}_{\cdot,ij}\]剪枝 $W_{ij}$ 后的损失增加: \(\Delta \mathcal{L} = \frac{W_{ij}^2}{2[H^{-1}]_{ij,ij}}\)
块对角Hessian近似: 为了平衡精度和计算效率,使用块对角近似:
\[\mathbf{H} = \begin{bmatrix} \mathbf{H}_1 & \mathbf{0} & \cdots \\ \mathbf{0} & \mathbf{H}_2 & \cdots \\ \vdots & \vdots & \ddots \end{bmatrix}\]每个块对应一层或一组相关参数。
Kronecker因子化近似(K-FAC): 对于全连接层 $\mathbf{y} = \mathbf{W}\mathbf{x}$,Fisher信息可以近似为:
\[\mathbf{F} \approx \mathbb{E}[\mathbf{x}\mathbf{x}^T] \otimes \mathbb{E}[\mathbf{g}\mathbf{g}^T]\]其中 $\mathbf{g}$ 是输出的梯度,$\otimes$ 是Kronecker积。
Woodbury矩阵恒等式优化: 对于低秩更新的Hessian逆:
\[(\mathbf{H} + \mathbf{U}\mathbf{V}^T)^{-1} = \mathbf{H}^{-1} - \mathbf{H}^{-1}\mathbf{U}(\mathbf{I} + \mathbf{V}^T\mathbf{H}^{-1}\mathbf{U})^{-1}\mathbf{V}^T\mathbf{H}^{-1}\]这允许高效更新剪枝后的Hessian逆。
二阶方法的实践考虑:
方法 | 计算复杂度 | 内存需求 | 精度
----------------|-----------|---------|------
完整Hessian | O(n³) | O(n²) | 最高
对角Hessian | O(n) | O(n) | 低
块对角Hessian | O(kb³) | O(kb²) | 中
K-FAC | O(n^1.5) | O(n) | 中高
自适应Hessian计算: 根据层的重要性分配计算资源: \(\text{BlockSize}_l = \min(n_l, \lfloor B_{\text{base}} \cdot \exp(-\alpha \cdot \text{depth}_l) \rfloor)\)
深层使用更小的块以节省计算。
Hessian的数值稳定性: 添加正则化项确保可逆性: \(\tilde{\mathbf{H}} = \mathbf{H} + \lambda \mathbf{I}\)
其中 $\lambda = \max(\epsilon, \alpha \cdot \text{tr}(\mathbf{H})/n)$。
混合准则策略:
结合一阶和二阶信息: \(I_{ij}^{\text{hybrid}} = \alpha \cdot I_{ij}^{\text{first-order}} + (1-\alpha) \cdot I_{ij}^{\text{second-order}}\)
其中 $\alpha$ 可以根据计算预算动态调整:
对于结构化剪枝,需要评估整个结构单元(如通道、滤波器、注意力头)的重要性。这比单个权重的评估更复杂,需要考虑结构内部的协同作用。
通道重要性聚合: 对于第 $c$ 个通道,聚合所有相关权重的重要性:
\[I_c^{\text{channel}} = \sum_{i,j,k} I_{c,i,j,k}\]更精细的聚合策略:
| L1范数:$I_c = |\mathbf{W}c|_1 = \sum{i,j,k} | W_{c,i,j,k} | $ |
| L∞范数:$I_c = |\mathbf{W}c|\infty = \max_{i,j,k} | W_{c,i,j,k} | $ |
基于特征图的度量: 使用批归一化的缩放因子作为通道重要性指标:
\[I_c^{\text{BN}} = |\gamma_c|\]其中 $\gamma_c$ 是批归一化层的缩放参数。理论依据:
激活统计度量: 基于特征图的统计信息:
\[I_c^{\text{activation}} = \mathbb{E}_{\mathbf{x}} \left[ \|\mathbf{a}_c(\mathbf{x})\|_2 \right]\]扩展的激活度量:
| 稀疏度:$I_c^{\text{sparse}} = 1 - \frac{\mathbb{E}[ | \mathbf{a}_c | ]}{\mathbb{E}[\mathbf{a}_c^2]^{1/2}}$ |
梯度流度量: 考虑反向传播中的梯度流:
\[I_c^{\text{grad-flow}} = \mathbb{E}_{\mathbf{x}} \left[ \left\| \frac{\partial \mathcal{L}}{\partial \mathbf{a}_c} \right\|_2 \right]\]几何中值度量: 对于滤波器剪枝,使用几何中值找到最”冗余”的滤波器:
\[i^* = \arg\min_i \sum_{j \neq i} \|\mathbf{W}_i - \mathbf{W}_j\|_2\]距离其他滤波器最近的被认为是冗余的。
注意力头重要性: 对于Transformer中的多头注意力:
\[I_h^{\text{attention}} = \mathbb{E}_{\mathbf{x}} \left[ \|\text{Attention}_h(\mathbf{Q}, \mathbf{K}, \mathbf{V})\|_F \right]\]考虑注意力模式的多样性: \(I_h^{\text{diversity}} = -\text{tr}(\mathbf{A}_h \log \mathbf{A}_h)\)
其中 $\mathbf{A}_h$ 是第 $h$ 个头的平均注意力矩阵。
层级重要性评估: 对于整层剪枝,需要全局视角:
\[I_l^{\text{layer}} = \frac{\|\mathbf{F}_l - \mathbf{F}_{l-1}\|_F}{\|\mathbf{F}_{l-1}\|_F}\]其中 $\mathbf{F}_l$ 是第 $l$ 层的输出特征。
结构化Taylor展开: 将Taylor展开推广到结构化情况:
\[\Delta \mathcal{L}_{\mathcal{S}} = \sum_{i \in \mathcal{S}} W_i g_i + \frac{1}{2} \sum_{i,j \in \mathcal{S}} W_i H_{ij} W_j\]其中 $\mathcal{S}$ 是被剪枝的结构单元(如一个通道的所有权重)。
组LASSO正则化诱导的重要性: 使用组LASSO训练时自然产生的稀疏性:
\[\mathcal{R}_{\text{group}} = \lambda \sum_{g} \|\mathbf{W}_g\|_2\]训练后,$|\mathbf{W}_g|_2$ 直接反映组的重要性。
高级结构化重要性度量:
互信息准则: 评估通道与输出的互信息: \(I_c^{\text{MI}} = I(\mathbf{a}_c; \mathbf{y}) = \mathbb{E}\left[\log\frac{p(\mathbf{a}_c, \mathbf{y})}{p(\mathbf{a}_c)p(\mathbf{y})}\right]\)
实践中使用MINE (Mutual Information Neural Estimation)近似。
因果重要性: 通过干预实验评估因果效应: \(I_c^{\text{causal}} = \mathbb{E}[\mathcal{L}(\mathbf{y}|\text{do}(\mathbf{a}_c = 0))] - \mathbb{E}[\mathcal{L}(\mathbf{y})]\)
其中 $\text{do}(\cdot)$ 表示因果干预。
Shapley值方法: 基于合作博弈论的公平贡献分配: \(\phi_c = \sum_{S \subseteq N \setminus \{c\}} \frac{|S|!(|N|-|S|-1)!}{|N|!}[v(S \cup \{c\}) - v(S)]\)
其中 $v(S)$ 是子集 $S$ 的模型性能。
特定架构的重要性度量:
注意力熵: \(I_h^{\text{entropy}} = -\sum_{i,j} A_{h,ij} \log A_{h,ij}\)
低熵表示注意力集中,可能更重要。
查询-键相似度分散度: \(I_h^{\text{QK}} = \text{std}(\mathbf{Q}_h \mathbf{K}_h^T)\)
高分散度表示区分能力强。
感受野有效性: \(I_c^{\text{RF}} = \frac{\|\nabla_{\mathbf{x}} \mathbf{a}_c\|_0}{\text{RF}_{\text{theoretical}}}\)
实际使用的感受野比例。
特征图稀疏度: \(I_c^{\text{sparse}} = 1 - \frac{\|\mathbf{a}_c\|_1}{\|\mathbf{a}_c\|_0 \cdot \|\mathbf{a}_c\|_\infty}\)
计算优化技巧:
importance_cache = {}
update_frequency = {
"shallow": 10, # 浅层频繁更新
"middle": 50, # 中层适度更新
"deep": 100 # 深层稀疏更新
}
彩票假设(Lottery Ticket Hypothesis)由Frankle和Carbin在2018年提出,这一发现深刻影响了对神经网络剪枝和稀疏性的理解。
核心假设: 随机初始化的密集网络包含一个子网络(”中奖彩票”),当独立训练时可以达到原网络的精度,甚至更快收敛。
迭代幅度剪枝(IMP)算法:
学习率回退技巧: 对于大规模网络(如ResNet-50、BERT),需要回退到训练早期的权重:
\[\mathbf{W}_{\text{rewind}} = \mathbf{W}_k \odot \mathbf{M}, \quad k \ll T\]通常 $k$ 选择为总训练步数的1-10%。这被称为”晚期重置”(Late Resetting)。
理论解释:
强彩票假设: 不仅存在可以训练到相同精度的稀疏子网络,而且存在无需训练就能达到良好性能的子网络。这导致了”边缘弹出”(Edge Popup)算法:
\[\mathbf{M} = \mathbb{1}[\text{score}(\mathbf{W}_0) > \theta]\]其中score函数可以是权重幅度、梯度等。
彩票假设的变体:
实验发现的规律:
与传统剪枝的区别:
实际应用考虑:
彩票假设的最新进展:
Early-Bird票据: 在训练早期就能识别出中奖彩票: \(\text{EB-Score}(t) = \frac{1}{L}\sum_{l=1}^L \text{Hamming}(\mathbf{M}_l^{(t)}, \mathbf{M}_l^{(t-\Delta t)})\)
当EB-Score低于阈值时,掩码已经稳定。
多任务彩票: 一个彩票可能在多个相关任务上都表现良好: \(\mathbf{M}^* = \arg\min_{\mathbf{M}} \sum_{k=1}^K \alpha_k \mathcal{L}_k(\mathbf{W}_0 \odot \mathbf{M})\)
其中 $\mathcal{L}_k$ 是第 $k$ 个任务的损失。
连续稀疏化: 使用连续松弛替代离散掩码: \(\mathbf{W}_{\text{sparse}} = \mathbf{W} \odot \sigma(\mathbf{S}/\tau)\)
其中 $\mathbf{S}$ 是可学习的分数,$\tau$ 是温度参数。
彩票假设的理论解释新进展:
NTK (Neural Tangent Kernel)视角: 稀疏网络的NTK可能与密集网络相似: \(\mathbf{K}_{\text{sparse}} \approx \mathbf{K}_{\text{dense}}\)
这解释了为什么稀疏网络能达到相似性能。
模式连通性: 好的彩票位于损失景观的同一盆地: \(\exists \gamma: [0,1] \rightarrow \Theta, \mathcal{L}(\gamma(t)) \leq \max\{\mathcal{L}(\gamma(0)), \mathcal{L}(\gamma(1))\} + \epsilon\)
信息瓶颈理论: 剪枝过程是一种信息压缩: \(I(X; T) - \beta I(T; Y)\)
其中 $T$ 是稀疏表示,平衡压缩和预测性能。
实用彩票搜索算法:
初始化:dense_model, sparsity_targets = [0.2, 0.4, 0.6, 0.8]
对每个sparsity in sparsity_targets:
训练当前模型
识别重要权重
创建掩码
如果性能下降 > 阈值:
回退到上一个sparsity
使用更保守的剪枝
并行彩票搜索: 同时探索多个剪枝路径: \(\{\mathbf{M}_1, \mathbf{M}_2, ..., \mathbf{M}_k\} = \text{ParallelSearch}(\mathbf{W}_0)\)
选择验证性能最好的路径。
元学习彩票: 学习如何为新任务快速找到彩票: \(\mathbf{M}_{\text{new}} = f_\theta(\mathcal{D}_{\text{task}}, \mathbf{W}_0)\)
其中 $f_\theta$ 是元学习的剪枝策略。
剪枝后的微调是恢复和提升模型性能的关键步骤。不当的微调策略可能导致剪枝的努力白费,而精心设计的微调方案能够让稀疏模型达到甚至超越原始密集模型的性能。
剪枝后的微调需要特别的学习率策略,因为网络的有效容量和梯度流都发生了变化。
学习率回退(Learning Rate Rewinding): 将学习率重置到训练过程中的某个早期状态:
\[\eta_{\text{rewind}} = \eta(t_{\text{rewind}})\]其中 $t_{\text{rewind}}$ 通常选择为原始训练的10-20%位置。
回退策略的选择:
理论基础: 学习率回退的有效性可以从优化景观角度理解:
损失景观变化: 剪枝改变了损失景观的几何结构: \(\mathcal{L}_{\text{pruned}}(\mathbf{W}) = \mathcal{L}(\mathbf{W} \odot \mathbf{M})\)
新景观可能有不同的曲率和局部最小值分布。
有效学习率理论: 剪枝后的有效学习率需要考虑参数减少: \(\eta_{\text{effective}} = \eta \cdot \frac{\|\nabla_{\mathbf{W}} \mathcal{L}\|_2}{\|\nabla_{\mathbf{W} \odot \mathbf{M}} \mathcal{L}\|_2}\)
通常需要提高学习率以补偿梯度稀疏性。
临界学习率: 稳定训练的最大学习率: \(\eta_{\text{critical}} = \frac{2}{\lambda_{\text{max}}(\mathbf{H}_{\text{pruned}})}\)
其中 $\lambda_{\text{max}}$ 是剪枝后Hessian的最大特征值。
分层学习率策略: 对于不同稀疏度的层使用不同的学习率:
\[\eta_l = \eta_{\text{base}} \cdot (1 - s_l)^\alpha\]其中 $s_l$ 是第 $l$ 层的稀疏度,$\alpha > 0$ 是缩放因子。
理论依据:
循环学习率策略: 使用周期性学习率帮助逃离次优局部最小值:
\[\eta(t) = \eta_{\text{min}} + \frac{\eta_{\text{max}} - \eta_{\text{min}}}{2} \left(1 + \cos\left(\frac{\pi t}{T_{\text{cycle}}}\right)\right)\]每个周期开始时的高学习率有助于探索新的参数空间。
梯度掩码技术: 确保被剪枝的权重在微调过程中保持为零:
\[\mathbf{W}^{(t+1)} = \mathbf{W}^{(t)} - \eta \cdot (\nabla_{\mathbf{W}} \mathcal{L} \odot \mathbf{M})\]扩展的梯度处理:
微调阶段设计:
早停与检查点策略:
高级微调技巧:
梯度手术(Gradient Surgery): 修正剪枝引起的梯度冲突: \(\tilde{g}_i = g_i - \frac{g_i^T g_j}{\|g_j\|^2} g_j\)
当层间梯度冲突时,投影到正交空间。
弹性权重巩固(EWC): 保护重要权重不被过度更新: \(\mathcal{L}_{\text{EWC}} = \mathcal{L} + \frac{\lambda}{2} \sum_i F_i (W_i - W_i^*)^2\)
其中 $F_i$ 是Fisher信息矩阵对角元素。
路径积分正则化: 保持剪枝前后的函数行为相似: \(\mathcal{L}_{\text{path}} = \mathbb{E}_{\mathbf{x}} \left[\|\mathbf{f}_{\text{pruned}}(\mathbf{x}) - \mathbf{f}_{\text{dense}}(\mathbf{x})\|^2\right]\)
微调阶段的数据策略:
硬样本挖掘: 重点微调在剪枝后性能下降最大的样本: \(\mathcal{D}_{\text{hard}} = \{(\mathbf{x}, y) : \Delta\mathcal{L}(\mathbf{x}, y) > \theta\}\)
课程学习: 从简单样本逐渐过渡到困难样本: \(p_t(\mathbf{x}) \propto \exp(-\lambda_t \cdot \text{difficulty}(\mathbf{x}))\)
其中 $\lambda_t$ 随时间递减。
数据增强调整:
剪枝初期:减少增强强度,帮助稳定
剪枝中期:恢复正常增强
剪枝后期:增加增强强度,提升泛化
使用原始密集模型作为教师模型,指导剪枝模型的微调,这种方法能够有效传递密集模型的”暗知识”(dark knowledge)到稀疏模型。
蒸馏损失函数: \(\mathcal{L}_{\text{distill}} = (1-\lambda) \mathcal{L}_{\text{task}} + \lambda \mathcal{L}_{\text{KD}}\)
其中知识蒸馏损失为:
\[\mathcal{L}_{\text{KD}} = \tau^2 \cdot \text{KL}(p_{\text{student}}(\mathbf{y}/\tau | \mathbf{x}) \| p_{\text{teacher}}(\mathbf{y}/\tau | \mathbf{x}))\]$\tau$ 是温度参数,通常设为3-5。高温度使得软标签更平滑,传递更多信息。
温度调度策略: 动态调整温度参数以优化知识传递:
\[\tau(t) = \tau_{\text{max}} - (\tau_{\text{max}} - \tau_{\text{min}}) \cdot \frac{t}{T}\]早期使用高温度传递全局知识,后期降低温度关注硬预测。
特征蒸馏: 除了输出层的蒸馏,还可以对中间层特征进行蒸馏:
\[\mathcal{L}_{\text{feature}} = \sum_{l \in \mathcal{L}_{\text{distill}}} \|\mathbf{F}_l^{\text{student}} - \mathbf{F}_l^{\text{teacher}}\|_2^2\]注意力蒸馏: 对于Transformer模型,蒸馏注意力图:
\[\mathcal{L}_{\text{attention}} = \sum_{h=1}^H \text{MSE}(\mathbf{A}_h^{\text{student}}, \mathbf{A}_h^{\text{teacher}})\]其中 $\mathbf{A}_h$ 是第 $h$ 个注意力头的注意力矩阵。
自适应蒸馏权重: 根据剪枝程度动态调整蒸馏权重:
\[\lambda_l = \lambda_0 \cdot \exp(k \cdot s_l)\]其中 $k > 0$ 控制随稀疏度增加的程度。稀疏度越高的层需要更多的指导。
渐进式蒸馏: 分阶段调整蒸馏目标:
初始阶段:完全模仿教师 \(\mathcal{L} = \mathcal{L}_{\text{KD}}\)
过渡阶段:平衡任务损失和蒸馏损失 \(\mathcal{L} = 0.5\mathcal{L}_{\text{task}} + 0.5\mathcal{L}_{\text{KD}}\)
最终阶段:主要优化任务性能 \(\mathcal{L} = 0.9\mathcal{L}_{\text{task}} + 0.1\mathcal{L}_{\text{KD}}\)
对比蒸馏: 使用对比学习增强特征对齐:
\[\mathcal{L}_{\text{contrast}} = -\log \frac{\exp(\text{sim}(f_s, f_t)/\tau)}{\sum_{i=1}^N \exp(\text{sim}(f_s, f_i)/\tau)}\]其中 $f_s, f_t$ 分别是学生和教师的特征表示。
蒸馏与剪枝的协同优化: 同时进行剪枝和蒸馏:
\[\mathcal{L}_{\text{total}} = \mathcal{L}_{\text{distill}} + \beta \mathcal{R}_{\text{sparsity}}\]其中 $\mathcal{R}_{\text{sparsity}}$ 是促进稀疏的正则项。
高级蒸馏技术:
关系知识蒸馏(RKD): 不仅蒸馏个体输出,还蒸馏样本间的关系: \(\mathcal{L}_{\text{RKD}} = \|\mathbf{R}^{\text{student}} - \mathbf{R}^{\text{teacher}}\|_F^2\)
其中 $R_{ij} = \frac{\langle f_i, f_j \rangle}{|f_i| |f_j|}$ 是特征间的余弦相似度。
流形蒸馏: 保持数据在特征空间的流形结构: \(\mathcal{L}_{\text{manifold}} = \sum_{i,j} w_{ij} \|d_{ij}^{\text{student}} - d_{ij}^{\text{teacher}}\|^2\)
其中 $d_{ij}$ 是特征空间中的距离。
不确定性感知蒸馏: 根据教师模型的不确定性调整蒸馏权重: \(w(\mathbf{x}) = \exp(-\alpha \cdot H(p_{\text{teacher}}(\mathbf{y}|\mathbf{x})))\)
高熵(不确定)的预测获得较低权重。
层间蒸馏策略:
深度匹配: 选择性地匹配不同深度的层: \(\mathcal{L}_{\text{depth}} = \sum_{(i,j) \in \mathcal{P}} \|\mathbf{F}_i^{\text{student}} - \phi(\mathbf{F}_j^{\text{teacher}})\|^2\)
其中 $\mathcal{P}$ 是层对匹配,$\phi$ 是适配函数。
注意力转移: 专门针对注意力机制的蒸馏: \(\mathcal{L}_{\text{attention}} = \sum_h \text{KL}(A_h^{\text{student}} \| A_h^{\text{teacher}})\)
梯度匹配: 匹配关于输入的梯度: \(\mathcal{L}_{\text{gradient}} = \|\nabla_{\mathbf{x}} f^{\text{student}} - \nabla_{\mathbf{x}} f^{\text{teacher}}\|^2\)
剪枝感知训练(Pruning-Aware Training)在训练过程中就考虑剪枝的影响。
软剪枝方法: 使用可学习的掩码参数:
\[\mathbf{W}_{\text{effective}} = \mathbf{W} \odot \sigma(\mathbf{S})\]其中 $\mathbf{S}$ 是可学习的得分矩阵,$\sigma$ 是sigmoid函数。
直通估计器(STE): 在前向传播时使用硬阈值,反向传播时使用软阈值:
前向: \(\mathbf{M} = \mathbb{1}[\sigma(\mathbf{S}) > 0.5]\)
反向: \(\frac{\partial \mathcal{L}}{\partial \mathbf{S}} = \frac{\partial \mathcal{L}}{\partial \mathbf{W}_{\text{effective}}} \odot \mathbf{W} \odot \sigma'(\mathbf{S})\)
稀疏正则化: 添加促进稀疏的正则项:
\[\mathcal{L}_{\text{sparse}} = \beta \sum_{i,j} \sigma(S_{ij})(1 - \sigma(S_{ij}))\]这个正则项在 $\sigma(S_{ij}) = 0.5$ 时达到最大值,推动参数向0或1移动。
对于大规模语言模型,可以采用渐进式的知识转移策略。
层级蒸馏策略:
块级别剪枝与恢复: 对于Transformer模型,以块为单位进行剪枝:
\[\text{Block}_i^{\text{pruned}} = \text{Prune}(\text{Block}_i^{\text{dense}}, s_i)\]每个块的微调目标:
\[\min_{\theta_i^{\text{pruned}}} \|\text{Block}_i^{\text{pruned}}(\mathbf{X}) - \text{Block}_i^{\text{dense}}(\mathbf{X})\|_F^2\]动态容量分配: 根据层的重要性动态分配剪枝率:
\[s_l = s_{\text{avg}} + \alpha \cdot \frac{I_l - \bar{I}}{\text{std}(I)}\]其中 $I_l$ 是第 $l$ 层的重要性得分。
大模型剪枝的特殊考虑:
记忆保护机制: LLM中某些权重编码了重要的事实知识: \(\mathcal{L}_{\text{memory}} = \sum_{(\mathbf{x}, y) \in \mathcal{D}_{\text{facts}}} \mathcal{L}(f(\mathbf{x}), y)\)
其中 $\mathcal{D}_{\text{facts}}$ 是关键事实数据集。
语言理解能力:保守剪枝
推理能力:中等剪枝
创造性能力:可激进剪枝
for epoch in range(num_epochs):
if epoch % checkpoint_freq == 0:
保存当前模型
评估各项能力指标
if 性能下降超过阈值:
回滚到上一检查点
调整剪枝策略
混合精度剪枝:
结合剪枝和量化,不同重要性的层使用不同精度:
\[\text{Precision}_l = \begin{cases} \text{FP16} & \text{if } I_l > \theta_{\text{high}} \\ \text{INT8} & \text{if } \theta_{\text{low}} < I_l \leq \theta_{\text{high}} \\ \text{INT4} & \text{if } I_l \leq \theta_{\text{low}} \end{cases}\]端到端优化流程:
while not converged:
# 剪枝步骤
更新重要性得分
执行剪枝
# 恢复步骤
知识蒸馏微调
评估性能指标
# 调整步骤
if 精度损失 > 容忍度:
降低剪枝率
if 加速比 < 目标:
增加剪枝率
本章深入探讨了模型剪枝的核心技术和实践方法:
关键公式回顾:
稀疏度计算 给定一个 $4 \times 4$ 的权重矩阵,其中有6个元素被剪枝为0。计算该矩阵的稀疏度。
Hint: 稀疏度是零元素占总元素的比例。
结构化剪枝影响 一个卷积层的权重形状为 $(64, 128, 3, 3)$(输出通道,输入通道,核高,核宽)。如果剪枝50%的输出通道,剪枝后的参数量是原来的多少?
Hint: 考虑剪枝如何改变权重张量的形状。
渐进剪枝计算 使用渐进幅度剪枝公式,计算当 $s_0 = 0$, $s_f = 0.9$, $t_0 = 1000$, $t_f = 10000$ 时,在 $t = 5500$ 步的目标稀疏度。
Hint: 直接代入公式 $s_t = s_f + (s_0 - s_f)(1 - \frac{t-t_0}{t_f-t_0})^3$。
2:4稀疏模式 对于向量 $[0.1, -0.5, 0.3, -0.2]$,找出满足2:4稀疏模式且使得剩余元素的L2范数最大的剪枝方案。
Hint: 2:4模式要求每4个元素中保留2个,选择绝对值最大的。
最优剪枝阈值 证明对于权重服从正态分布 $\mathcal{N}(0, \sigma^2)$ 的情况,要达到稀疏度 $s$,最优的幅度剪枝阈值为 $\theta = \sigma \cdot \Phi^{-1}((1+s)/2)$,其中 $\Phi^{-1}$ 是标准正态分布的逆累积分布函数。
Hint: 利用正态分布的对称性和累积分布函数的性质。
Hessian对角近似误差 考虑二次损失函数 $\mathcal{L}(\mathbf{w}) = \frac{1}{2}\mathbf{w}^T\mathbf{H}\mathbf{w}$,其中 $\mathbf{H}$ 是对称正定矩阵。分析当使用对角近似 $\mathbf{H}_{\text{diag}} = \text{diag}(\mathbf{H})$ 时,剪枝决策的误差界。
Hint: 考虑非对角元素对重要性评估的影响。
动态稀疏训练收敛性 设计一个动态稀疏训练的更新规则,使得稀疏模式的Hamming距离 $d_H(\mathbf{M}^{(t)}, \mathbf{M}^{(t+1)})$ 随训练进行单调递减。讨论这种策略的优缺点。
Hint: 考虑基于动量的权重重要性评估。
多目标剪枝优化 提出一个同时优化模型精度、推理延迟和能耗的剪枝框架。定义合适的多目标优化问题,并讨论如何找到Pareto最优解。
Hint: 考虑使用加权和方法或ε-约束方法处理多目标。