问题背景
高通的模型量化工具SNPE提供一种成熟的压缩算法Data-Free Quantization,同时高通发表论文介绍该压缩算法。这个算法主要应用于小模型量化,后来也适用于大模型量化。
Weight Equalization
Weight Equalization即权重均衡。高通量化MobileNetV2网络时发现per-layer精度下降严重,但另一个小模型Nasne下降很小。分析原因: MobileNetV2使用大量depthwise conv(可分离卷积),depthwise conv的每个output channel只有一个conv kernel,即不同channel之间数值相互独立。而depthwise conv的weight数值按channel维度,分布差异很大。
由于weight沿着channel维度分布差异大,per-layer量化会导致精度问题(大范围数值会占主导,小范围分布数值会被压缩为0)。
Bias Correction
使用N个样本,偏移误差(biased error):
统计结果如下,理想状态是偏移误差在0附近。
技术原理
Weight Equalization
Positive scaling equivariance(伸缩等价性)
使用指标均衡系数
优化函数:
论文推导出缩放系数s的最优解:
Bias Correction
量化会破坏模型的数值分布,使得输出结果产生偏移,可以纠正这个偏移提高量化精度,即bias correction
工程方式:N个样本,跑一遍全精度模型和量化模型推理,对每层输出计算出偏移后,从对应层bias上减掉偏移即可。
论文推导公式:
var_raws += std::pow(raw_datas[data_index] - average_raws, 2);
var_dequants += std::pow(dequant_datas[data_index] - average_dequants, 2);
varCorr = var_raws / var_dequants;
meanCorr = average_raws - average_dequants * varCorr
性能
Cross-layer equalization
在 MobilenetV2 这个网络上,weight equalize 和 per-channel 量化效果相当。
Bias correction
Clip:把卷积kernel中,数值range的直接截断到[-15,15]。
Bias Corrd对未weight equalize的精度提升比较明显。
Bias Corr对weight equalize作用不太明显,对Clip+ pre-layer量化收益比较明显。
应用生态
高通模型量化工具SNPE支持 weight equalize、bias corr。
mindspore lite模型压缩支持 weight equalize。