性能与推理速度间的均衡在实际应用中非常重要,而结构重参数机制是达成该均衡的一种非常有效的模块。但是,因结构重参数训练得到的模型在面临量化时却出现了严重的性能下降(比如RepVGG-A0经PTQ量化,指标从72.4%下降到了52.2%)。
本文旨在挖掘产生该现象的根本原因,提出了一种简单、鲁棒且有效的补救措施,在享有重参数的优势同时具有量化友好特性。所提方案大幅缩小了RepVGG在INT8与FP32之间性能差距。无需任何技巧,采用标准PTQ,RepVGG在ImageNet上的精度下降保持在2%以内。
本文方案
在标准量化流程中,有多个地方会引入误差。作者采用MSE进行量化误差度量:
注:Q表示量化过程,表示权值的第n通道,t表示截断阈值,表示量化比特数。量化误差由张量分布因子(包含最大值、最小值、标准差以及阶段阈值)决定。不幸的是,由于我们不能对网络内部张量做任何假设,导致我们无法得到一个具体的解决方案。实际上,我们认为一个量化友好的分布应当具有较小的数值范围、较小的标准差。
对于重参数类架构而言,它有两个主要成分(权值、激活张量)需要进行量化且均可能导致性能退化,激活张量同时还将作为下一层的输入,因此误差会逐层累积 。因此,具有好的量化性能的网络需要满足两个基本条件:
- C1:权值分布有利于量化;
- C2:激活张量分布易于进行量化。
Diving into the Quantization Failure of Reparameterizaton Structure
首先,我们采用官方Code复现RepVGG-A0性能,见上表。这里,我们采用标准PTQ对RepVGG-A0进行量化并评估INT8精度。
上图给出了复现模型的权值分布,可以看到: 权值很好的分布在零附近,没有特别的异常值存在,即满足上述C1条件。这就是促使我们对C2进行验证是否激活张量导致的量化性能极具恶化。不幸的是,激活张量具有输入依赖性且与权值相耦合,无法通过对输入分布进行假设并得出具体结论。相反,我们对每个分支的标准差进行分析。
该损失将通过增大分母来减小损失,而这则会放大激活张量的方差,为量化带来难度。为此,作者通过提出分母提出了一个简单的替代方案:
下表给出了此时的结果,移除分母项后,FP32模型的精度下降了0.7%,但量化精度提升到了61.2%。尽管该精度在实际场景仍无法接受,但该实验表明:常规L2权值衰减策略通过重分配权值分布构建了一个更强的FP32模型,但同时增大的激活张量的方差,导致了量化崩塌。
Quantization-friendly Reparameterization
接下来,作者提供了多个配置(S1-S4)逐步解决量化崩塌问题,核心结果见下表。
- S1(Normal L2):即前述customL2到标准weight decay的替换,我们诚挚为S1。结果见上表,可以看到:尽管FP32精度下降0.5%,但INT8精度提升11.3%。此时,模型精度仍无法满足实际应用需求。那么是什么原因导致的呢?从下图可以看到:第5与6层权值具有较大的标准差(2.4, 5.1)和最大值(692.1107, 14477.3740),这就解释了为何量化性能不够好。
既然NormalL2已经对每个分支的卷积添加了约束,为何融合后的权值出现了如此大的异常值呢?基于公式2和3,作者重写公式如下:
经分析,在进行权值融合后,有可能导致极大权值。下图给出了佐证,有意思的是:Layer4在1和3分支的权值同样大异常值,但融合后并未出现。
- S2(Identiy w/o BN) 一种解决S问题且满足C1条件的简单方案是:从Identity分支移除BN层,称之为S2。此时,FP32模型精度退化到70.7%,但INT8精度提升到了62.5%,这仍无法接受。这就促使我们进一步验证是否违背了C2。该部分建议查看原文,公式太多了......
- S3(No BN for Identity and ) 如果分支有相同的均值,那么相加会导致方差变大。为更好控制方差,作者进一步移除了分支的BN,该配置称之为S3。此时,FP32模型精度为70.1%,INT8精度达到了69.5%,极大的改善了量化性能。但是,FP32的精度仍然有些低。
- S4(Post BN on S3) 由于三分支相加会引入协方差漂移问题,作者在三分支相加之后引入了一个额外的BN层以稳定训练,该配置称之为S4。此时,FP32模型精度提升到了72.2%,INT8精度提升到了70.4%。到此为止,我们成功解决了RepVGG的量化损失问题,并将所得模型称之为QARepVGG。
本文实验
本文主要聚焦ImageNet分类任务,同时采用YOLOv6验证所提方案的泛化性。关于PTQ,我们采用Nvidia开源的Pytorch量化工具,所有卷积与全连接层均被量化为8bit,量化机制为symmetric uniform。
上表给出了ImageNet分类任务上的性能对比,可以看到:
- 在FP32方面,所提方案取得了与RepVGG相当的精度;
- 在INT8方面,RepVGG存在严重的量化性能退化,如RepVGG-B0精度从75.1%下降到40.2%;所提方案量化精度损失在2%以内。
- 当带有组卷积时,RepVGG性能退化进一步加速,如RepVGG-B2g4指标从78.5%下降到了13.7%;而QARepVGG-B2g4仅损失0.7%。
上表给出了YOLOv6使用所提方案后的性能对比,从中可以看到:
- YOLOv6s-RepVGG存在严重的性能退化问题,PTQ量化导致性能退化7.4%mAP;YOLOv6t-RepVGG稍好,但仍退化3%mAP。这个程度的性能退化在实际部署中是不可接受的。
- 在FP32模型方面,YOLOv6s/t-QARepVGG具有与RepVGG版相当的精度,而INT8量化版精度损失在1.3%mAP以内,甚至优于YOLOv6-RepOpt-VGG。此外,RepOpt-VGG对于搜索超参非常敏感。
来源:AIWalker
作者: Happy
推荐阅读
- 刷新多个low-level任务指标,性能超SwinIR与Uformer等
- 超简Transformer风格ConvNet,比ConvNeXt还秀,媲美VAN
- 端侧高效骨干RepGhost | 重参数赋能GhostNet,达成端侧超高效骨干
- PP-YOLOE-R | 手把手教你将PP-YOLOE用于旋转目标检测,顺带达成SOTA性能!
- 重磅干货|低光图像处理方案
本文章著作权归作者所有,任何形式的转载都请注明出处。更多动态滤波,图像质量,超分辨相关请关注我的专栏AIWalker。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。