Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决! 原创

自动驾驶之心
发布于 2022-12-13 08:01
浏览
0收藏

摘要

性能和推理速度之间的权衡对于实际应用至关重要。架构重参化获得了更好的权衡,它正在成为现代卷积神经网络中越来越流行的成分。尽管如此,当需要INT8推理时,其量化性能通常太差,无法部署(例如ImageNet上的top-1精度下降超过20%)。本文深入探讨了这种失败的潜在机制,其中原始设计不可避免地扩大了量化误差。因此提出了一种简单、鲁棒和有效的补救方法,以具有量化友好的结构,该结构也享有重参化的好处。论文的方法大大弥补了RepVGG的INT8和FP32精度之间的差距。没有任何trick,通过标准训练后量化,ImageNet上top-1的准确率下降控制了2%以内。

欢迎关注国内首个以自动驾驶技术栈为主线的交流学习社区!
原文出处:微信公众号【自动驾驶之心】

介绍

尽管深度神经网络在视觉[4,12,17,19,35],语言[6,40]和语音[13]方面取得了巨大成功,但模型压缩已经变得非常必要,特别是考虑到数据中心功耗的巨大增长,以及全球资源受限的边缘设备的大量分布。网络量化[14,15]是最熟练的方法之一,因为它具有较低的内存成本和固有的整数计算优势。

然而,神经网络设计中的量化意识并不是优先考虑的问题,因此在很大程度上被忽视了。然而,如果量化是最终部署的强制操作,则可能会变得有害。例如,许多众所周知的架构都存在量化崩溃问题,如MobileNet[20,21,36]和EfficientNet[38],这分别需要补救设计或先进的量化方案,如[26,37,45]和[2,16]。

最近,神经网络设计中最有影响力的方向之一是重参化[8,11,46]。其中,RepVGG[11]在训练期间将标准Conv-BN-ReLU转换为其相同的多分支对应,这带来了强大的性能提升,同时不会增加额外的推理成本。由于其简单性和推理优势,因此受到最近许多视觉任务的青睐[10,22,28,39,41,44]。然而,基于重参化的模型面临众所周知的量化困难,这是阻碍行业应用的内在缺陷。事实证明,使这种结构舒适地量化是非常重要的。标准的训练后量化方案将RepVGGA0的精度从72.4%大幅降低到52.2%。同时,应用量化感知训练并不简单[7]。

本文特别关注RepVGG的量化难度[11]。为了解决这个问题,论文探索了指导深入分析基于重参化的典型架构的基本量化原则。也就是说,为了使网络具有更好的量化性能,权重的分布以及任意分布的处理数据应该是量化友好的。两者对于确保更好的量化性能至关重要。更重要的是,这些原则将论文引向一种全新的设计,称之为QARepVGG(Quantization Aware RepVGG的缩写),它不会遭受实质性的量化崩溃,其构建块如图1所示。其量化性能得到了很大改善。

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

总结来说,本文的贡献如下:

  • 揭示基于重参化的架构(如RepVGG[11])量化中性能崩溃的根本原因;
  • 设计RepVGG的量化友好替换(即QARepVGG),该替换在权重和激活分布方面保持基本差异,同时保留了突出的速度和性能权衡的优势;
  • 论文提出的方法在不同的模型尺度和不同的视觉任务上得到了很好的推广,实现了可以部署的出色的后量化性能。此外,模型在FP32精度方面与RepVGG相当。

预计,本文的方法将极大地提高量化性能,而无需额外的推理成本,从而弥补重新部署网络过程中最后一公里的差距。代码将会公开。

相关工作

重参化架构设计:RepVGG[11]在训练阶段利用多个分支形式的过度参数化网络,并在推理过程中将分支完全融合为一个,这就是所谓的重参化。后续工作DBBNet[9]和MobileOne[39]通过引入多样化的组成来扩展这一设计,增强了性能和耗时之间的权衡。这种重参化趋势也适用于最近的目标检测方法,如PPYOLOE[44]、YOLOv6[28]和YOLOv7[41]。

量化:网络量化是一种有效的模型压缩方法,它将网络权重和输入数据映射到较低精度(通常为8位)以进行快速计算,这大大降低了模型大小和计算成本。在不影响性能的情况下,在部署之前,大多采用量化来提高速度,这是工业生产中的事实标准。训练后量化(PTQ)是最常见的方案,因为它只需要几批图像来校准量化参数,并且不需要额外的训练。还提出了量化感知训练(QAT)方法来提高量化精度,例如仅整数算术量化[24]、无数据量化[32]、硬件感知量化[42]、混合精度量化[43]、零样本量化[3]。由于QAT通常涉及到对训练代码的干涉,并且需要额外的成本,因此仅当训练代码在手边并且PTQ不能产生令人满意的结果时才使用QAT。为了最好地展示所提出的量化感知架构,论文主要使用PTQ评估量化精度。同时,论文还通过实验证明了它对QAT也是有益的。

量化感知架构设计:[37]中提出了可分离卷积的量化友好替换,其中定义了一个称为信噪比(SQNR)的度量,以诊断网络每个组件的量化损失。也有人认为,权重应服从均匀分布,以便于量化[37]。众所周知,类似Swish的激活具有量化崩溃,这要么需要一个精细的可学习量化方案来恢复[2],要么像EfficientNet-Lite中那样被RELU6取代[30]。BatchQuant[1]利用单次神经结构搜索,无需再训练即可获得稳健的混合精度模型。

重参化网络的量化:众所周知,基于重参化的架构由于其固有的多分支设计而增加了动态数值范围,因此具有量化困难[7]。通过PTQ重参化模型的精度下降是不可接受的。由于部署模式下的重参化网络缺少BN层,因此很难使用QAT来提高量化精度[7]。据论文所知,RepOpt VGG[7]是唯一一项通过构建两阶段优化管道来解决量化问题的相关工作。RepOpt VGG声称量化困难是由融合kernel的量化不友好参数分布造成的。论文重新研究了这个问题,发现它要复杂得多,而巨大的量化误差是权重和激活协同作用的结果。

使重参化量化友好

几种来源可能会在标准量化管道中引入误差[37]。论文选择均方误差(MSE)作为[16]之后的度量,以测量张量的量化误差:

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

具体的量化误差由张量分布的几个因素决定,包括最大值和最小值、标准差和钳位阈值等。不幸的是,论文无法给出具体的解决方案,因为无法假设网络中张量的任何分布。在实践中,论文认为量化友好型分布是指具有相对较小的数值范围和较小的标准偏差的分布。

对于基于重参化的架构,有两个主要组件,权重和激活,需要量化,并可能导致精度下降。激活也作为下一层的输入,因此错误会逐层递增。因此,神经网络的良好量化性能主要需要两个基本条件:

  • C1权重分布对于量化是有利的;
  • C2激活分布(即模型如何响应输入特征)可用于量化。
    根据经验,违反其中任何一项都将导致较差的量化性能。论文使用RepVGGA0作为示例来研究为什么基于重参化的结构的量化是困难的。

深入理解重参化结构的量化失败

论文首先用正式发布的代码[7]再现了RepVGG-A0的性能,如表1所示。基于此可以进一步严格控制实验设置。论文使用PTQ的标准设置对RepVGG-A0进行量化,并评估INT8的准确性,其从72.2%降至50.3%。请注意,论文在融合多个分支后使用部署的模型,因为未融合的模型将导致额外的量化误差。这种技巧在流行的量化框架中被广泛使用。

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

论文在图2和图14a(附录)中说明了本文复现的模型RepVGG-A0的权重分布。观察到权重很好地分布在零附近,并且不存在特定的离群值,它满足C1。这导致验证C2是否是激活导致量化严重恶化。不幸的是,激活依赖于输入,并通过卷积与学习到的权重相耦合。通过假设输入和权重的任何分布,从理论上得出一些结论是非常重要的。相反,我们可以相对地分析每个分支的标准差。

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

在继续之前,论文在一个典型的RepVGG块中制定计算操作。本文保持与[11]相同的命名约定,以便更好地理解。$W_{(k)}$表示卷积核,$C_1$和$C_2$表示输入和输出通道。$\mu_{(k)}$、$\sigma_{(k)}$、$\gamma_{(k)}$、$\beta_{(k)}$分别表示均值、标准差、缩放因子和偏置。BN的k=0。$M_{(1)}$和$M_{(2)}$分别表示输入和输出。*表示卷积操作。$Y_{(0)}$、$Y_{(1)}$、$Y_{(1)}$表示Identity、1x1、3x3。不失一般性,假设$C_1=C_2,H_1=H_2,W_1=W_2$。输出$M_{(2)}$写作:

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

用于3x3分支的BN操作可以写成:

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

这意味着BN在改变其输入的统计(均值和方差)方面发挥作用。注意,$\mu$的变化不一定会影响量化误差,因为它将平均值推到零。然而,变化的方差直接影响量化精度。从概率角度来看,给定随机变量X和标量$\lambda$,$D(\lambda X)$的方差等于$\lambda ^2 D(X)$。设$X_{(3)}=M^{(1)}W_{(3)}$,则有:

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

上式可以控制$X_{(3)}$方差的缩放。这又分别导致更好或更差的量化性能。对于1x1和本征映射,我们可以得出类似的结论。

基于以上分析,论文深入研究RepVGG的细节。有一个关键但容易被忽略的分量,它是一种特殊的权重衰减设计,称为自定义$L-2$。据指出,该分量提高了精度并有助于量化[11]。算法1(附录)中显示了详细的实现。

这种特殊的设计正则化了多分支权重,就好像它正则化了它的等价融合kernel一样。这可能会使融合权重具有量化友好的分布,这可以通过图14a(附录)进行验证。该损失l2_loss_eq_kernel本质上是:

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

值得注意的是,优化器被鼓励放大分母以最小化这种损失,这会放大激活的方差并带来量化困难。除了理论分析之外,论文通过从方程5中去除分母:

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

论文在表2中报告了结果。如果没有分母项,FP32的准确率为71.5%,比基线低0.7%。然而,令人惊讶的是,量化性能大大提高到61.2%。虽然这在实践中仍然是不可接受的,但该实验表明,自定义权重衰减策略$L_2$有助于构建具有适当权重分布的更强的FP32模型,但同时它会放大激活的方差,从而产生量化崩溃。这促使论文放弃这种设计,继续前进。

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

量化友好重参化

这里,论文回顾了多个设置(S1-S4),以逐步解决量化崩溃。

**S1(Normal L2):**基于以上讨论,论文丢弃了自定义的L2策略,并用标准权重衰减替换它。论文将此设置称为S1。仅通过此修改,结果显示在表3中。

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

虽然FP32的准确度比基线低0.5%,但其INT8的准确度却比基线高11.3%。然而,这种设计也不能满足应用的要求。考虑到没有显式正则化器来放大激活方差,可以直接检查权重的分布,如图3和图13所示(附录)。具体而言,来自第5层和第6层的融合权重的最大值为692.1107和1477.3740。这解释了量化性能不佳的原因。由于权重的量化过程与输入或激活无关,违反C1会导致不可弥补的错误。论文重复实验三次,这种现象再次出现。

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

假设每个分支中的卷积都施加了正常的L2权重衰减,为什么某些融合kernel权重会有如此大的异常值?根据公式2和3,论文将公式改写为:

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

如果$\frac{\gamma}{\sqrt{\epsilon+\sigma^2}}$本身较大,则$\frac{\gamma}{\sqrt{\epsilon+\sigma^2}}$的值将对融合后的等效kernel贡献较大的值。为了验证,论文展示了三个分支的$\frac{\gamma}{\sqrt{\epsilon+\sigma^2}}$,如图4所示:

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

来自第5层和第6层的identity分支的最大值为692.1107和1477.3732。有趣的是,来自第4层的3x3分支和1x的权重也有一些较大的值,但它们的融合权重不再包含这些值。

**S2 (Identity w/o BN):**解决S1满足C1的问题的一个简单方法是从identity分支中删除BN分支。论文将此设置命名为S2,并将结果显示在表3中。对权重量化的误差分析(参见附录中的图9)表明,此设计确实满足C1的要求。此模型提供了较低的FP32精度70.7%和INT8精度62.5%,这仍然不可行。这促使论文验证它是否违反C2。

由于权重是通过最小化整个训练集上的损失函数获得的,因此合理推导它们对偏差的贡献是非常重要的[18]。论文将三个分支中统计数据的期望值写成:

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

如果$\beta_{(3)}=\beta_{(1)}=\beta$,这两个输出可以很好地对齐,它们的总和有机会扩大方差。如果$\beta$远离$Y_{(0)}$,则扩大方差的概率变高。接下来,论文证明$\beta_{(3)}=\beta_{(1)}$,如引理3.1所示。

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

证明:论文使用数学归纳法。在不失一般性的情况下,使用SGD优化器。检查使用其他优化器(如Adam[25])的有效性并不困难。

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

ReLU[33]是RepVGG中的激活函数。一方面,如果大多数输入低于零(dead ReLU),这是有害的[31]。另一方面,由于失去非线性,如果所有输入都在零以上,也不受欢迎。根据经验,许多具有BN的现代高性能CNN模型在ReLU之前通常具有零均值。基于此假设,添加三个分支通常会扩大方差(图5)。

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

**S3 (No BN for Identity and 1x1):**如果3x3和1x1具有相同的均值,则它们的总和容易扩大方差。为了更好地控制方差,论文进一步去除了1x1分支中的BN。我们将此设置命名为S3,并将结果显示在表3中。此设计在ImageNet上实现了70.1%的top-1 FP32精度和69.5%的INT 8精度,这大大提高了量化性能。然而,FP32的精度仍然很低。

**S4 (Post BN on S3):**由于三个分支的添加引入了协变移位问题[23],论文在添加三个分支后附加了一个额外的批量归一化,以稳定训练过程,并将此设置命名为S4(图1右侧)。Post BN不影响用于部署的等效kenel融合。这进一步提高了论文A0模型在ImageNet上的FP32精度,从70.1%提高到72.2%。此外,其INT8精度提高到70.4%。到目前为止,本文已经基本上解决了量化失败,并将S4下的网络称为QARepVGG。

实验

设置

论文主要将实验集中在ImageNet数据集[5]上。基于最近流行的检测器YOLOv6[28]验证了方法的通用性,该检测器广泛采用了重参化设计。至于PTQ,论文使用Pytorch量化工具包[34],该工具包广泛用于NVIDIA GPU上的部署。权重、卷积层和全连接层的输入都被量化为8位,包括第一层和最后一层。遵循Pytorch量化工具包的默认设置,量化方案设置为对称均匀。论文对所有量化结果使用相同的设置和校准数据集,但官方报告的结果除外。

ImageNet分类

结果如表4所示。论文的模型实现了与RepVGG相当的FP32精度。值得注意的是,RepVGG严重受到量化的影响,其INT8精度大大落后于FP32。例如,RepVGG-B0的top-1精度从75.1%降至40.2%。相比之下,本文的方法表现出很强的INT8性能,精度下降在2%以内。

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

论文观察到具有GN的RepVGG表现得更差。PTQ后RepVGG-B2g4的准确率从78.5%降至13.7%(下降64.8%)。然而,论文的QARepVGG-B2g4仅损失0.7%的准确性,表明其对其他尺度和变体的鲁棒性。

消融实验

变体架构设计:论文研究了不同设计的量化性能,并将结果显示在表5中。注意,当完全去除BN时,模型无法收敛。尽管post BN的设置仅具有71.1%的INT8 top-1精度,但其FP32精度较低。量化差距随着模型容量的增长(从A0到B0)而增大。

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

与RepOpt-VGG对比:RepOpt VGG[7]使用梯度重参化,它包含两个阶段:搜索scale和使用获得的scale进行训练。量化精度可能非常敏感,这取决于scale的搜索质量[7]。

由于只发布了一些预训练的模型,论文按照[7]重新训练了RepOpt-VGG-A0/B0模型。也就是说在CIFAR-100[27]上运行240个epoch的超参数搜索,并在ImageNet上训练完整的120个epoch。论文可以用正式发布的scale再现RepOpt-VGG-B1的结果。然而,很难找到A0/B0具有可比性能的良好尺度。如表6所示,RepOpt-VGG-A0在ImageNet上达到70.3%,比RepVGG低2.1%。尽管比RepVGG好得多,但它们的PTQ精度仍然太低。相比之下,论文的方法以明显的优势优于RepOpt。此外,本文没有敏感的超参数或额外的训练成本。

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

误差分析:为了了解量化误差是如何传播的,论文对图6中的RepVGG-A0和QARepVGG-A0进行了逐层MSE分析。RepVGG-A0对量化更敏感,并且随着累积误差变得无法容忍而崩溃。假设RepVGG-A0满足C1,论文对一批图像进行采样,以描述两者之间关于C2的差异,如图7所示。论文的方法产生了更小标准方差和最小/最大值的更好的激活分布,从而确保了更好的量化性能。

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

QARepVGG的QAT:量化感知训练通常用于进一步提高性能。然而,将QAT应用于RepVGG[7]并不简单。相比之下,在QARepVGG上应用它很简单,因为它的post BN可以保留以方便训练。表7中所示的所有模型都训练了10个epoch(前三个阶段用于warm-up),初始学习率为0.01。QARepVGG的量化差距在0.3%以内。

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

目标检测

为了进一步验证本文QARepVGG的通用性,论文在YOLOv6[28]等目标检测器上测试了它。它广泛使用RepVGG,并严重受到量化问题的困扰。尽管YOLOv6通过使用RepOpt-VGG[7]缓解了这一问题,但该方法不稳定,需要仔细的超参数调整。实验结果如表8所示:

Make RepVGG Greater Again!揭示重参化量化崩溃根因并解决!-鸿蒙开发者社区

值得注意的是,YOLOv6s-RepVGG通过PTQ遭受了约7.4%mAP的巨大量化退化。YOLOv6t-RepVGG稍好一些,但在实际部署中,3%mAP的减少是不可接受的。相反,YOLOv6s/t-QARepVGG的FP32精度与RepVGG相似,而INT8精度下降限制在1.3%mAP以内。YOLOv6-RepOpt VGG也可以提供比YOLOv6-RepVGG更好的PTQ精度。然而,这需要双倍的成本。论文还发现,RepOpt-VGG的最终精度对搜索到的超参数非常敏感,这些超参数无法鲁棒地获得。

结论

通过理论和定量分析,论文剖析了著名的基于重参化结构RepVGG的量化失败。它的结构缺陷不可避免地放大了量化误差并累积产生了较差的结果。因此本文重新设计了QARepVGG,它生成有利于量化的权重和激活分布。QARepVGG大大简化了最终部署的量化过程。论文强调,结构设计中的量化意识应该得到更多的关注。

参考

[1] Make RepVGG Greater Again: A Quantization-aware Approach

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2022-12-13 08:01:57修改
2
收藏
回复
举报
回复
    相关推荐