LLM系列:模型量化-BiasCorrection

393 阅读2分钟

问题背景

高通的模型量化工具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维度,分布差异很大。 image.png

由于weight沿着channel维度分布差异大,per-layer量化会导致精度问题(大范围数值会占主导,小范围分布数值会被压缩为0)。

Bias Correction

使用N个样本,偏移误差(biased error):

统计结果如下,理想状态是偏移误差在0附近。 image.png

技术原理

Weight Equalization

Positive scaling equivariance(伸缩等价性) f(sx)=sf(x)f(sx)=sf(x)

使用指标均衡系数 pi(1)=ri(1)R1p_i^{(1)}=\frac{r_i^{(1)}}{R^{1}}

优化函数:

image.png

论文推导出缩放系数s的最优解:

image.png

Bias Correction

量化会破坏模型的数值分布,使得输出结果产生偏移,可以纠正这个偏移提高量化精度,即bias correction

工程方式:N个样本,跑一遍全精度模型和量化模型推理,对每层输出计算出偏移后,从对应层bias上减掉偏移即可。

image.png

论文推导公式:

image.png

image.png

real=varCorr(qzp)scale+meanCorrreal = varCorr * (q-zp) * scale + meanCorr

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 量化效果相当。

image.png

Bias correction

Clip:把卷积kernel中,数值range的直接截断到[-15,15]。

image.png

Bias Corrd对未weight equalize的精度提升比较明显。
Bias Corr对weight equalize作用不太明显,对Clip+ pre-layer量化收益比较明显。

应用生态

高通模型量化工具SNPE支持 weight equalize、bias corr。
mindspore lite模型压缩支持 weight equalize。

参考:
arxiv.org/abs/1906.04…
www.cnblogs.com/jermmyhsu/p…