模型压缩
常见的模型压缩技术包括剪枝、知识蒸馏、量化(PTQ、QAT)等。
PTQ量化
PTQ (Post-Training Quantization),训练后量化,这是工业界应用最广、效率最高的手段。它的核心是不动模型参数,只找“缩放比例”。
典型代表:TensorRT, OpenVINO, TFLite
- 权重转换: 权重(Weights)是静态的,直接统计每层的最大最小值,计算缩放因子 \(S\),把浮点转成整数。
- 激活值校准(Calibration): 激活值(Activations)是动态的,取决于输入什么数据。因此需要拿一小拨(通常 100~500 张)真实数据跑一下模型,统计每一层输出的分布情况,定下激活值的量化范围。
常见手段:
- 简单截断(Min-Max): 直接找最大最小值,但容易被离群值(Outliers)带偏。
- KL 散度(Entropy): 寻找一个截断点,使得量化前后的信息熵损失最小(NVIDIA TensorRT 常用)。
优缺点:
- 优点: 只要几分钟就能搞定;不需要训练代码,只需要推理框架;不需要标签。
- 缺点: 遇到 MobileNet (深度可分离卷积)或 Transformer 这种对数值分布极其敏感的模型,精度会掉得惨不忍睹。
QAT量化
当 PTQ 搞不定精度时,就必须祭出 QAT。它是将量化模拟带入训练环节。
典型代表:PyTorch QAT, TensorFlow QAT
核心流程:
- 插入伪量化节点(Fake Quant): 在训练图中,给每一个卷积层或全连接层的前后插入“模拟器”。
- 前向传播(模拟失真): 权重和激活值在运算前,先被模拟量化成 INT8,再立刻转回 FP32。这样模型在训练时看到的数值,就是带有“锯齿感”和“截断感”的。
- 反向传播(直通估计器 STE): 这是一个技术难点。因为量化函数(阶梯状)是不可导的,导数为 0。我们使用 STE (Straight-Through Estimator) ,直接忽略量化带来的导数阻碍,让梯度跳过量化层,直接更新原始的 FP32 权重。
优缺点:
- 优点: 精度天花板 。通过训练,模型学会了如何绕过量化带来的误差,甚至能达到与 FP32 几乎一致的准确率。
- 缺点: 成本高。你需要完整的训练环境、带标签的数据集,以及数倍于 PTQ 的计算时间。