模型压缩是一种优化技术,目标是在尽量保留模型性能的前提下,减少模型的体积、计算成本和内存占用。特别适合模型部署在边缘设备、移动端、嵌入式系统等资源受限环境中。
其中,"剪枝(Pruning)、量化(Quantization)和知识蒸馏(Knowledge Distillation)"是最常用且研究最深入的三种方法。
一、剪枝(Pruning)
原理:
剪枝的核心思想是去掉对模型输出影响较小的参数或结构,使得模型更加稀疏或紧凑。
类型:
-
非结构化剪枝(Unstructured Pruning):
-
精确到单个权重级别;
-
比如将小于某阈值的权重置为 0;
-
会产生稀疏矩阵,需要专门的硬件或库支持加速。
-
-
结构化剪枝(Structured Pruning):
-
删除整个神经元、通道(channel)、卷积核或 transformer 中的 attention head;
-
对硬件更友好,能获得实际的加速效果。
-
-
动态剪枝:
-
运行时根据输入动态决定哪些结构被跳过;
-
典型例子如动态卷积、Early Exit 网络等。
-
一般流程:
训练完整模型 → 剪除低贡献参数 → 微调恢复性能
二、量化(Quantization)
原理:
量化是将模型参数和计算从高精度(如 FP32)转换为低精度(如 INT8、FP16),以减少模型大小、内存访问量和计算需求。
类型:
-
后训练量化(Post-Training Quantization, PTQ):
-
不需要重新训练;
-
简单高效,但可能引入较大精度损失;
-
如 PyTorch 中
torch.quantization.quantize_dynamic()
。
-
-
量化感知训练(Quantization-Aware Training, QAT):
-
在训练中加入量化模拟;
-
准确率更高,但训练成本略高。
-
-
静态 vs 动态量化:
-
静态量化会量化权重和激活;
-
动态量化只量化权重,激活在运行时动态计算。
-
优势:
-
精度损失可控(尤其是 QAT);
-
模型大小缩小约 4 倍;
-
推理速度明显加快(特别在支持低精度硬件上);
三、知识蒸馏(Knowledge Distillation)
原理:
将一个大模型(teacher)的知识迁移给一个小模型(student)。student 模型不仅学习真实标签,还学习 teacher 输出的"软标签"(概率分布)。
优势:
-
学习到类与类之间的相对关系(从 softmax 输出中学习);
-
student 模型可以比单独训练更轻量、更有效;
-
常用于压缩 BERT、GPT 等大型模型,如:DistilBERT、TinyBERT、MiniLM。
蒸馏方式:
-
logits 蒸馏:使用 teacher 输出的 softmax 概率作为目标;
-
中间层蒸馏:对比 student 和 teacher 的隐层输出;
-
多任务蒸馏:同时结合标签监督和模型蒸馏。
四、其他压缩技术(补充)
1. 参数共享(Weight Sharing)
-
用哈希函数或其它规则让多个参数共享同一值;
-
应用于 BERT-of-Theseus、ALBERT 等。
2. 低秩分解(Low-rank Factorization)
-
将大的矩阵表示分解成多个小矩阵的乘积;
-
常见如 SVD 分解,用于减少全连接层、注意力矩阵的计算。
3. 神经架构搜索(NAS)
-
自动搜索性能与效率兼顾的模型结构;
-
如 MobileNet、EfficientNet、FBNet 等都是通过 NAS 获得的紧凑模型。
4. 混合精度训练(Mixed Precision Training)
-
训练时同时使用 FP16 和 FP32;
-
可减少显存占用、提高训练速度,同时保持数值稳定性。
五、总结对比
方法 | 是否需再训练 | 压缩目标 | 精度影响 | 实际部署效率 | 应用场景 |
---|---|---|---|---|---|
剪枝 | 是(微调) | 参数/结构 | 可控 | 中~高 | CNN、Transformer |
量化 | 选配(PTQ/QAT) | 位宽/存储 | 可控~小 | 高 | 移动端、边缘设备 |
蒸馏 | 是 | 模型结构 | 小~可提高 | 中 | 教学模型、小模型 |
参数共享 | 是 | 参数冗余 | 可控 | 中 | 多层结构模型 |
低秩分解 | 是 | 大矩阵 | 中 | 中 | 全连接/注意力模块 |
NAS | 是 | 模型结构 | 不确定 | 高 | 自动模型压缩 |