关于大型语言模型的结构修剪
本文介绍了一种名为 **LLM-Pruner** 的方法,用于对大型语言模型(LLMs)进行结构化剪枝,以减少模型大小和计算需求,同时保留其多任务解决和语言生成能力。LLM-Pruner 通过依赖检测和重要性估计实现高效剪枝,并结合低秩近似(LoRA)快速恢复模型性能。以下是文章的核心公式及其解释:
---
### 1. **依赖关系的定义**
文章定义了模型中结构之间的依赖关系,用于确定哪些结构需要同时剪枝。依赖关系的定义如下:
- **公式 (1)**:
\[
N_j \in \text{Out}(N_i) \land \text{Deg}^-(N_j) = 1 \Rightarrow N_j \text{ 依赖于 } N_i
\]
其中,\(N_i\) 和 \(N_j\) 是模型中的两个神经元,\(\text{Out}(N_i)\) 表示指向 \(N_i\) 的神经元集合,\(\text{Deg}^-(N_j)\) 表示 \(N_j\) 的入度。如果 \(N_j\) 的入度为1且唯一依赖于 \(N_i\),则 \(N_j\) 依赖于 \(N_i\)。
- **公式 (2)**:
\[
N_i \in \text{In}(N_j) \land \text{Deg}^+(N_i) = 1 \Rightarrow N_i \text{ 依赖于 } N_j
\]
其中,\(\text{In}(N_j)\) 表示从 \(N_j\) 指向的神经元集合,\(\text{Deg}^+(N_i)\) 表示 \(N_i\) 的出度。如果 \(N_i\) 的出度为1且唯一指向 \(N_j\),则 \(N_i\) 依赖于 \(N_j\)。
**作用**:这些公式用于自动检测模型中耦合的结构,确保剪枝时不会破坏模型的依赖关系。
---
### 2. **重要性估计**
为了决定哪些结构可以被剪枝,文章提出了基于梯度和近似 Hessian 矩阵的重要性估计方法。
- **公式 (3)**:向量级重要性估计
\[
I_{W_i} = |\Delta L(D)| = |L_{W_i}(D) - L_{W_i=0}(D)| = \left|\frac{\partial L(D)}{\partial W_i} W_i - \frac{1}{2} W_i^\top H W_i + O(\|W_i\|^3)\right|
\]
其中,\(L\) 是模型的损失函数,\(D\) 是用于估计重要性的数据集,\(H\) 是 Hessian 矩阵。公式中忽略了 Hessian 矩阵的高阶项,因为计算复杂度较高。
- **公式 (4)**:元素级重要性估计
\[
I_{W_k^i} = |\Delta L(D)| = |L_{W_k^i}(D) - L_{W_k^i=0}(D)| = \left|\frac{\partial L(D)}{\partial W_k^i} W_k^i - \frac{1}{2} W_k^i H_{kk} W_k^i + O(\|W_k^i\|^3)\right|
\]
其中,\(k\) 表示权重矩阵 \(W_i\) 中的第 \(k\) 个元素,\(H_{kk}\) 是 Hessian 矩阵的对角线元素,可以用 Fisher 信息矩阵近似。
- **公式 (5)**:近似 Hessian 矩阵
\[
I_{W_k^i} \approx |L_{W_k^i}(D) - L_{W_k^i=0}(D)| \approx \left|\frac{\partial L(D)}{\partial W_k^i} W_k^i - \frac{1}{2} \sum_{j=1}^N \left(\frac{\partial L(D_j)}{\partial W_k^i} W_k^i\right)^2 + O(\|W_k^i\|^3)\right|
\]
其中,\(N\) 是数据集 \(D\) 的样本数量。
**作用**:这些公式用于评估每个结构或参数对模型性能的影响,帮助选择剪枝的目标。
---
### 3. **组重要性聚合**
文章提出了多种聚合方法来评估整个结构组的重要性:
- **求和(Summation)**:
\[
I_G = \sum_{i=1}^M I_{W_i} \quad \text{或} \quad I_G = \sum_{i=1}^M \sum_k I_{W_k^i}
\]
- **求积(Product)**:
\[
I_G = \prod_{i=1}^M I_{W_i} \quad \text{或} \quad I_G = \prod_{i=1}^M \prod_k I_{W_k^i}
\]
- **取最大值(Max)**:
\[
I_G = \max_{i=1}^M I_{W_i} \quad \text{或} \quad I_G = \max_{i=1}^M \max_k I_{W_k^i}
\]
- **仅最后执行的结构(Last-Only)**:
\[
I_G = I_{W_l} \quad \text{或} \quad I_G = \sum_k I_{W_k^l}
\]
其中,\(l\) 是组中最后执行的结构。
**作用**:这些聚合方法用于将单个结构或参数的重要性汇总为组的重要性,以便决定哪些组可以被剪枝。
---
### 4. **快速恢复阶段**
为了快速恢复剪枝后的模型性能,文章使用了低秩近似(LoRA)方法。具体公式如下:
- **公式 (6)**:LoRA 更新
\[
\Delta W = PQ \quad \text{其中} \quad P \in \mathbb{R}^{d^- \times d}, \quad Q \in \mathbb{R}^{d \times d^+}
\]
\[
f(x) = (W + \Delta W)X + b = (WX + b) + (PQ)X
\]
其中,\(W\) 是模型的权重矩阵,\(\Delta W\) 是更新值,\(P\) 和 \(Q\) 是低秩矩阵,\(d\) 是低秩维度。
**作用**:LoRA 通过分解权重矩阵的更新值为两个低秩矩阵的乘积,减少了优化参数的数量,从而加速模型的恢复过程。
---
### 5. **实验结果**
文章在多个大型语言模型(如 LLaMA、Vicuna 和 ChatGLM)上验证了 LLM-Pruner 的效果。实验结果表明:
- 在 20% 的剪枝率下,模型保留了 94.97% 的原始性能。
- 使用 LoRA 恢复后,模型的性能进一步提升,且仅需 3 小时的调优时间。
- 剪枝后的模型在零样本分类和生成任务中表现出色,且计算效率显著提高。
---
### 总结
LLM-Pruner 通过依赖关系检测和重要性估计实现了对大型语言模型的高效结构化剪枝,并结合 LoRA 快速恢复模型性能。这种方法在减少模型大小和计算需求的同时,保留了模型的多任务能力和语言生成能力。