在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄像头、机器人等资源受限的设备上。
于是我们就想出了一个办法:给模型“瘦身”,让它又快又轻,还能保持不错的准确率。
这就是——模型压缩!
模型压缩有三种最常用的方法:
模型剪枝
模型量化
知识蒸馏
下面我们分别来通俗地讲讲它们是什么、怎么做的、为什么有用。
模型剪枝是指通过移除神经网络中“不重要”的权重连接或通道,从而减少模型大小和计算量的方法。想象你有一台超级豪华的电脑,里面有很多复杂的部件。有些零件非常重要(比如 CPU 和显卡),有些其实可有可无(比如多余的风扇、装饰灯)。模型剪枝就像是在做“减法”——把那些不太重要的部分删掉,让整台电脑更轻便,性能也差不多。
核心原理:
你有一个 YOLOv8s 模型,它本来有 100 层。经过分析发现其中有 10 层几乎没用,那我们就直接删掉这 10 层,剩下的 90 层再训练(微调)一下,就能得到一个更快、更小的模型!
模型量化是将模型中的浮点数(FP32)转换为低精度表示(如 INT8、FP16)的过程,从而减少模型大小并提升推理速度。你在学校考试时,满分是 100 分,但有时候老师会说:“60 分以上就算及格”。也就是说,你并不需要精确到每个分数,只要知道大致等级就可以了。
模型量化也是类似的思想:我们不需要用“32位浮点数”这么高精度的数字来表示神经网络中的参数,可以用“8位整数”代替,这样计算更快、占用空间更小。
一句话总结:模型量化 = 用更小的数字类型表达原来的模型,减少存储和计算量。
一个 FP32 的数字占用 4 字节,而一个 INT8 的数字只占 1 字节。如果你把整个模型从 FP32 转成 INT8,那模型体积就缩小了 4 倍,推理速度也提升了 2~3 倍!
一般的操作方式如下:
# 示例:使用 TorchVision 导出 ResNet 为 ONNX 并量化
import torch
from torchvision import models
model = models.resnet18(pretrained=True)
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(model, dummy_input, "resnet18.onnx")
# 使用 ONNX Runtime 进行量化
from onnxruntime.quantization import quantize_dynamic, QuantType
quantize_dynamic(
model_input="resnet18.onnx",
model_output="resnet18_quantized.onnx",
weight_type=QuantType.QInt8
)
知识蒸馏是一种模型压缩技术,其核心思想是让一个小模型(学生模型)模仿一个大模型(教师模型)的行为,从而获得更优的性能。你是一个小学生,正在学数学题。你可以自己慢慢摸索,也可以找一个成绩很好的同学当老师,他怎么做题你就跟着学。这样你就能快速学会解题技巧,虽然你不如老师厉害,但能做得还不错。
知识蒸馏就是这个道理:我们用一个小模型去模仿一个大模型的行为,从而提升小模型的能力。
一句话总结:知识蒸馏 = 让小模型模仿大模型的行为,从而获得更好的性能。
L t o t a l = α ⋅ L h a r d + ( 1 − α ) ⋅ T 2 ⋅ L s o f t \mathcal{L}_{total} = \alpha \cdot \mathcal{L}_{hard} + (1 - \alpha) \cdot T^2 \cdot \mathcal{L}_{soft} Ltotal=α⋅Lhard+(1−α)⋅T2⋅Lsoft
其中 T 是温度系数, α \alpha α控制 hard label 的权重。
你想做一个能在手机上运行的目标检测模型,但是手机算力有限。你可以先训练一个大模型(如 YOLOv8l),然后让学生模型(如 YOLOv8n)去模仿它。这样即使学生模型很小,也能做出不错的结果。
维度 | 模型剪枝 | 模型量化 | 知识蒸馏 |
---|---|---|---|
目的 | 减少参数数量 | 减少计算精度 | 提升小模型性能 |
核心操作 | 删除冗余权重或通道 | 将 FP32 → INT8/FP16 | 小模型模仿大模型 |
是否改变结构 | ✅(剪枝可能删除层) | ❌ | ❌ |
是否需要微调 | ✅ | ✅ | ✅ |
是否依赖教师模型 | ❌ | ❌ | ✅ |
部署友好度 | ✅(结构化剪枝) | ✅(INT8 加速明显) | ✅(蒸馏后模型可进一步压缩) |
效果:相比原模型,推理速度提升 2x,模型大小缩小 4x,精度下降 < 1%。
效果:Transformer 模型在移动端部署不再是难题。
效果:从 177M 参数 → 1.2M 参数,推理速度从 10 FPS → 60 FPS。
[大模型]
↓(剪枝)
[轻量模型]
↓(量化)
[INT8/FP16 模型]
↓(蒸馏)
[高性能小模型]
↓(部署)
[ONNX / TensorRT / CoreML]
在实际工程中,我们往往不会只使用一种压缩技术,而是多种方法协同使用,例如: