Make RepVGG Greater Again | 中文翻译

news2024/11/16 16:24:59

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


1、简介

尽管深度神经网络在视觉、语言和语音方面取得了巨大成功,但模型压缩已变得非常必要,特别是考虑到数据中心功耗的巨大增长,以及全球范围内资源受限的边缘设备的大量分布。网络量化作为最成熟的方法之一,它具有较低的内存成本和固有的整数计算优势,因此研究模型的量化性能也是必不可少的操作。

然而,神经架构设计中的量化意识并不是优先考虑的问题,因此在很大程度上被忽视了。然而,如果量化是最终部署的强制操作,则可能会变得有害。例如,许多众所周知的体系结构都存在量化崩溃问题,如MobileNet和EfficientNet,这需要补救设计或高级量化方案。

最近,神经架构设计中最有影响力的方向之一是重参化。其中,RepVGG在训练期间将标准的Conv-BN-ReLU改造为其相同的多分支对应,这带来了强大的性能改进,同时不会增加额外的推理成本。由于其简单性和推理优势,它受到最近许多视觉任务的青睐。然而,基于重参化的模型面临众所周知的量化困难,这是阻碍行业应用的内在缺陷。事实证明,使这种结构顺利地量化是非常重要的。标准的训练后量化方案极大地降低了RepVGG-A0的精度,从72.4%降至52.2%。同时,应用量化感知训练并不简单。

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

本文的贡献有3点:

  1. 揭示了基于重参化的架构(如RepVGG)量化中性能崩溃的根本原因。

  2. 设计了RepVGG的量化友好模块(即QARepVGG),该模块在权重和激活分布方面保持基本差异,同时保持突出速度和性能权衡的优势。

  3. 本文提出的方法在不同的模型尺度和不同的视觉任务上得到了很好的推广,实现了可以部署的出色的后量化性能。此外,提出的模型在FP32精度方面与RepVGG相当。

2、相关方法

2.1、Reparameterization Architecture Design

RepVGG在训练阶段以多个分支的形式进行的,并在推理过程中将多个分支融合成一个分支,这个融合的过程被称为重参化。后续的工作DBBNet和MobileOne通过引入多样化的组合来扩展了这种设计,增强了性能和延迟之间的权衡。这种重参化的趋势也适用于最近的目标检测方法,如PPYOLO-E、YOLOv6和YOLOv7。

2.2、Quantization

量化是一种有效的模型压缩方法,它将网络权重和输入数据映射到较低精度(通常为8位)以进行快速计算,这大大降低了模型大小和计算成本。在不影响性能的情况下,在部署之前,大多采用量化来提高速度,这是工业生产中的事实标准。

训练后量化(PTQ)是最常见的方案,因为它只需要几批图像来校准量化参数,并且不需要额外的训练。还提出了量化感知训练(QAT)方法来提高量化精度,例如仅整数算术量化、无数据量化、硬件感知量化、混合精度量化以及零样本量化。由于QAT通常涉及到对训练代码的开发,并且需要额外的成本,因此仅当训练代码在手边并且PTQ不能产生令人满意的结果时才使用QAT。为了最好地展示所提出的量化感知架构,作者主要使用PTQ评估量化精度。同时,还通过实验证明了它对QAT也是有益的。

2.3、Quantization-aware architecture design

在《A quantization-friendly separable convolution for mobilenets》中提出了一种量化友好的可分离卷积替换方法,其中定义了一种称为信噪比(SQNR)的度量来诊断网络各组成部分的量化损失。它还认为,权重应服从均匀分布,以促进量化。

众所周知,Swish-like激活会带来量化崩溃,这要么是需要一个精细的可学习的量化方案来恢复,要么是被RELU-6取代,就像EffificientNet-Lite一样。

BatchQuant利用一次性神经结构搜索鲁棒混合精度模型,无需再训练。

2.4、Quantization for Reparameterization Network

基于重参化的架构由于其固有的多分支设计而增加了动态数值范围,因此存在量化困难。通过PTQ使重参化模型的精度下降是不可接受的。由于部署模式下的重参化网络缺乏BN层,因此使用QAT难以提高量化精度。

据作者描述,RepOpt-VGG是唯一一个通过构建一个两阶段的优化管道来努力解决这个量化问题的相关工作。RepOpt-VGG认为量化困难是由于fused kernels的量化参数分布造成的。

本文作者重新研究了这个问题,发现它要复杂得多,而且巨大的量化误差是权重和激活的协同效应的结果。

3、本文方法

一些源可能会在标准量化管道QAT中引入误差。作者选择均方误差(MSE)作为Hptq之后的度量来度量一个张量的量化误差,
MSE ⁡ ( Q ( w , t , n b ) , w ) = 1 n ∑ i ( Q ( w i , t , n b ) − w ) 2 \operatorname{MSE}\left(Q\left(\mathbf{w}, t, n_{b}\right), \mathbf{w}\right)=\frac{1}{n} \sum_{i}\left(Q\left(\mathbf{w}_{i}, t, n_{b}\right)-\mathbf{w}\right)^{2} MSE(Q(w,t,nb),w)=n1i(Q(wi,t,nb)w)2
其中Q为量化过程, w ∈ R n w\in R^n wRn为n个通道的权值,一个阶段阈值 t t t n b n_b nb为位宽。具体的量化误差由张量分布的几个因素决定,包括最大值和最小值、标准偏差、阶段阈值等。不幸的是,作者也不能给出一个具体的解,因为不能假设网络中张量的任何分布。在实践中认为一个量化友好的分布是一个具有相对较小的数值范围和一个较小的标准偏差的分布。

对于基于重参化的体系结构,有两个主要组件,权重和激活,它们需要量化,并可能导致精度下降。激活也可以作为下一层的输入,误差会逐步增加累积。因此,神经网络良好的量化性能主要需要两个基本条件:

  • C1:权重分布有利于量化

  • C2:激活分布(即模型如何响应输入特征)易于量化

根据经验,违反其中任何一种都会导致较低的量化性能。以RepVGG-A0为例,研究了为什么基于重参化的结构的量化是困难的。

3.1、深入探讨重参化结构的量化失效问题

作者首先用RepOpt的代码再现了RepVGG-A0的性能,如表1所示。在此基础上可以进一步控制实验设置。作者用PTQ的标准设置对RepVGG-A0进行量化,并评估INT8的准确性,从72.2%下降到了50.3%。

请注意,在融合多分支后使用已部署的模型,因为未融合的模型会导致额外的量化误差。这个Trick在流行的量化框架中被广泛使用。

在图2和图14a(附录)中说明了RepVGG-A0的权重分布。观察到权值在0附近分布得很好,并且不存在特定的离群值,因此它满足C1。这导致我们验证c2,如果它是激活,极大地恶化了量化。

不幸的是,激活是输入依赖的,并通过卷积与学习到的权值相结合。从理论上讲,通过假设输入和权重的任何分布来得出一些结论是很重要的。相反,可以相对地分析每个分支的标准差。

为了更好地理解,作者保持了与RepVGG相同的命名。具体来说,使用 W ( k ) ∈ R C 2 × C 1 × k × k W_{(k)}\in R^{C_2×C_1×k×k} W(k)RC2×C1×k×k来表示 k × k k×k k×k卷积的kernel,其中 C 1 C_1 C1 C 2 C_2 C2分别是输入和输出通道的数量。注意, k ∈ { 1 , 3 } k\in\{1,3\} k{1,3}为RepVGG的配置。对于 k × k k×k k×k卷积后的批归一化(BN)层,使用 μ ( k ) ∈ R C 2 \mu_{(k)}\in R^{C_2} μ(k)RC2 σ ( k ) ∈ R C 2 \sigma_{(k)}\in R^{C_2} σ(k)RC2 γ ( k ) ∈ R C 2 \gamma_{(k)}\in R^{C_2} γ(k)RC2 β ( k ) ∈ R C 2 \beta_{(k)}\in R^{C_2} β(k)RC2作为平均值、标准差、比例因子和偏差。对于恒分式分支中的BN,使用 μ ( 0 ) \mu_{(0)} μ(0) σ ( 0 ) \sigma_{(0)} σ(0) γ ( 0 ) \gamma_{(0)} γ(0) β ( 0 ) \beta_{(0)} β(0)

M ( 1 ) ∈ R N × C 1 × H 1 × W 1 M_{(1)}\in R^{N×C_1×H_1×W_1} M(1)RN×C1×H1×W1 M ( 2 ) ∈ R N × C 2 × H 2 × W 2 M_{(2)}\in R^{N×C_2×H_2×W_2} M(2)RN×C2×H2×W2分别为输入和输出,“∗”为卷积运算符。设 Y ( 0 ) Y_{(0)} Y(0) Y ( 1 ) Y_{(1)} Y(1) Y ( 3 ) Y_{(3)} Y(3)为Idnetity、1×1和3×3分支的输出。不失一般性,假设 C 1 = C 2 C_1 = C_2 C1=C2 H 1 = H 2 H_1 = H_2 H1=H2 W 1 = W 2 W_1 = W_2 W1=W2。然后可以将输出值 M ( 2 ) M_{(2)} M(2)写成:
M ( 2 ) = Y ( 3 ) + Y ( 1 ) + Y ( 0 ) = B N ( M ( 1 ) ∗   W ( 3 ) , μ ( 3 ) , σ ( 3 ) , γ ( 3 ) , β ( 3 ) ) + B N ( M ( 1 ) ∗   W ( 1 ) , μ ( 1 ) , σ ( 1 ) , γ ( 1 ) , β ( 1 ) ) + BN ⁡ ( M ( 1 ) , μ ( 0 ) , σ ( 0 ) , γ ( 0 ) , β ( 0 ) ) \begin{aligned} \mathrm{M}_{(2)}= & \mathrm{Y}_{(3)}+\mathrm{Y}_{(1)}+\mathrm{Y}_{(0)} \\ = & \mathrm{BN}\left(\mathrm{M}_{(1)} * \mathrm{~W}_{(3)}, \boldsymbol{\mu}_{(3)}, \boldsymbol{\sigma}_{(3)}, \boldsymbol{\gamma}_{(3)}, \boldsymbol{\beta}_{(3)}\right) \\ & +\mathrm{BN}\left(\mathrm{M}_{(1)} * \mathrm{~W}_{(1)}, \boldsymbol{\mu}_{(1)}, \boldsymbol{\sigma}_{(1)}, \boldsymbol{\gamma}_{(1)}, \boldsymbol{\beta}_{(1)}\right) \\ & +\operatorname{BN}\left(\mathrm{M}_{(1)}, \boldsymbol{\mu}_{(0)}, \boldsymbol{\sigma}_{(0)}, \boldsymbol{\gamma}_{(0)}, \boldsymbol{\beta}_{(0)}\right) \end{aligned} M(2)==Y(3)+Y(1)+Y(0)BN(M(1) W(3),μ(3),σ(3),γ(3),β(3))+BN(M(1) W(1),μ(1),σ(1),γ(1),β(1))+BN(M(1),μ(0),σ(0),γ(0),β(0))
3×3分支的批处理规范化操作可以写为:
Y ( 3 ) = γ ( 3 ) ⊙ M ( 1 ) ∗   W ( 3 ) − μ ( 3 ) ϵ + σ ( 3 ) ⊙ σ ( 3 ) + β ( 3 ) , \mathrm{Y}_{(3)}=\gamma_{(3)} \odot \frac{\mathrm{M}_{(1)} * \mathrm{~W}_{(3)}-\boldsymbol{\mu}_{(3)}}{\sqrt{\epsilon+\boldsymbol{\sigma}_{(3)} \odot \boldsymbol{\sigma}_{(3)}}}+\boldsymbol{\beta}_{(3)}, Y(3)=γ(3)ϵ+σ(3)σ(3) M(1) W(3)μ(3)+β(3),
其中 ⊙ \odot 是元素级乘法,是一个小数值(默认为 1 0 − 5 10^{−5} 105),以获得数值稳定性。这意味着BN发挥了改变其输入的统计量(平均值和方差) w ( w ) w_{(w)} w(w)的作用。请注意, μ \mu μ的变化并不一定会影响量化误差,因为它会将平均值推至零。然而,方差的变化直接影响了量化的精度。从概率的角度来看,给定一个随机变量X和一个标量 λ \lambda λ D ( λ X ) D(\lambda X) D(λX)的方差等于 λ 2 D ( X ) \lambda ^2D(X) λ2D(X)。设 X ( 3 ) = M ( 1 ) W ( 3 ) X_{(3)}= M^{(1)}W_{(3)} X(3)=M(1)W(3),那么就有:
D ( Y ( 3 ) ) = γ ( 3 ) ⊙ γ ( 3 ) ϵ + σ ( 3 ) ⊙ σ ( 3 ) ⊙ D ( X ( 3 ) ) D\left(\mathrm{Y}_{(3)}\right)=\frac{\boldsymbol{\gamma}_{(3)} \odot \boldsymbol{\gamma}_{(3)}}{\epsilon+\boldsymbol{\sigma}_{(3)} \odot \boldsymbol{\sigma}_{(3)}} \odot D\left(X_{(3)}\right) D(Y(3))=ϵ+σ(3)σ(3)γ(3)γ(3)D(X(3))

γ ( 3 ) ⊙ γ ( 3 ) ϵ + σ ( 3 ) ⊙ γ ( 3 ) ⊙ D ( X ( 3 ) ) \frac{\gamma_{(3)}\odot \gamma_{(3)}}{\epsilon + \sigma_{(3)} \odot \gamma_{(3)}}\odot D(X_{(3)}) ϵ+σ(3)γ(3)γ(3)γ(3)D(X(3))的值控制了 X ( 3 ) X_{(3)} X(3)方差的缩小或扩大,进而导致量化性能的好或差。对于1个1×1分支和Idnetity分支,可以得出类似的结论。

基于上述分析,深入研究了RepVGG的细节。有一个关键但很容易被忽视的组件,它是一种特殊的权重衰减设计,称为 c u s t o m   L 2 custom\ L_2 custom L2。结果表明,该组件提高了精度,便于量化。具体的实现情况见算法1。

这种特殊的设计正则化多分支权值,就好像它正则化其等效融合kernel一样。很可能使融合权重具有量化友好的分布,可通过图14a进行验证。这个 l 2 _ l o s s _ e q _ k e r n e l l2\_loss\_ eq\_kernel l2_loss_eq_kernel是,
L 2 custom  = ∣ W e q ∣ 2 2 ∣ γ ( 3 ) ϵ + σ ( 3 ) ⊙ σ ( 3 ) ∣ 2 2 + ∣ γ ( 1 ) ϵ + σ ( 1 ) ⊙ σ ( 1 ) ∣ 2 2 . L_{2_{\text {custom }}}=\frac{\left|\mathrm{W}_{e q}\right|_{2}^{2}}{\left|\frac{\gamma_{(3)}}{\sqrt{\epsilon+\sigma_{(3)} \odot \sigma_{(3)}}}\right|_{2}^{2}+\left|\frac{\gamma_{(1)}}{\sqrt{\epsilon+\sigma_{(1)} \odot \boldsymbol{\sigma}_{(1)}}}\right|_{2}^{2}} . L2custom = ϵ+σ(3)σ(3) γ(3) 22+ ϵ+σ(1)σ(1) γ(1) 22Weq22.

值得注意的是,优化器被鼓励扩大分母,以最小化这种损失,从而放大了激活的方差,并带来了量化困难。

除了理论分析,作者提供了一个简单的消融,通过去除Eq 5中的分母,
L 2 custom  ′ = ∣ W eq  ∣ 2 2 L_{2_{\text {custom }}}^{\prime}=\left|\mathrm{W}_{\text {eq }}\right|_{2}^{2} L2custom =Weq 22
在表2中报告了结果。在没有分母项时,FP32的准确率为71.5%,比基线值低0.7%。然而,令人惊讶的是,量化性能大大提高到61.2%。虽然在实践中仍然不可接受,但本实验表明自定义权重衰减策略 L 2 L_2 L2有助于建立一个更强的FP32模型,具有良好的权重分布,但同时扩大了激活的方差,产生量化崩溃。这促使作者放弃这个设计,继续改进。

3.2、量化友好的重参化

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

1、S1——Normal L 2 L_2 L2

基于以上的讨论放弃了 c u s t o m   L 2 custom\ L_2 custom L2策略,代之以标准的权重衰减策略。作者称这个设置为S1。仅通过此修改,将在表3中显示结果。虽然FP32的准确率比基线低0.5%,但其INT8的准确率比基线高11.3%。

但是,此设计也不满足应用程序的要求。由于没有显式的正则化器来扩大激活方差,因此可以直接检查权值的分布,如图3和图13所示。第5层和第6层的融合权值分布具有较大的标准方差(分别为2.4和5.1),比其他层大约两个数量级。

具体来说,来自第5层和第6层的融合权值的最大值分别为692.1107和1477.3740。这就解释了为什么量化性能不好。由于权重的量化过程与输入或激活无关,违反C1会导致不可修复的误差。作者重复实验了三次,这种现象均出现。

考虑到每个分支的卷积都施加了正常的 L 2 L_2 L2权值衰减,为什么一些融合的核权值有如此大的离群值呢?根据方程2和公式3,将这些方程改写为:
M ( 2 ) = M ( 1 ) ∗ [ ∑ k ∈ { 0 , 1 , 3 } Reshape ⁡ ( γ ( k ) ϵ + σ ( k ) ⊙ σ ( k ) ) ⊙ W ( k ) ] + ∑ k ∈ { 0 , 1 , 3 } [ β ( k ) − γ ( k ) ⊙ μ ( k ) ϵ + σ ( k ) ⊙ σ ( k ) ] \begin{aligned} \mathrm{M}_{(2)}= & \mathrm{M}_{(1)} *\left[\sum_{k \in\{0,1,3\}} \operatorname{Reshape}\left(\frac{\gamma_{(k)}}{\sqrt{\epsilon+\boldsymbol{\sigma}_{(k)} \odot \boldsymbol{\sigma}_{(k)}}}\right)\right. \\ & \left.\odot \mathrm{W}_{(k)}\right]+\sum_{k \in\{0,1,3\}}\left[\boldsymbol{\beta}_{(k)}-\frac{\gamma_{(k)} \odot \boldsymbol{\mu}_{(\mathrm{k})}}{\sqrt{\epsilon+\boldsymbol{\sigma}_{(k)} \odot \boldsymbol{\sigma}_{(k)}}}\right] \end{aligned} M(2)=M(1) k{0,1,3}Reshape(ϵ+σ(k)σ(k) γ(k))W(k)]+k{0,1,3}[β(k)ϵ+σ(k)σ(k) γ(k)μ(k)]
其中,调整 R e s h a p e ( ) Reshape() Reshape()用于匹配计算维度。 W 0 W_0 W0是Identity分支中的一个单位矩阵,在训练过程中是固定的,不衰减。BN的可学习参数 ( β , γ ) (\beta,\gamma) (β,γ)通常被排除在衰减。因此,当从 W 0 W_0 W0乘以1.0时,如果 γ ϵ + σ 2 \frac{\gamma}{\sqrt{\epsilon+\sigma^2}} ϵ+σ2 γ本身很大,则 γ ϵ + σ 2 \frac{\gamma}{\sqrt{\epsilon+\sigma^2}} ϵ+σ2 γ的值将对融合后的等效kernel贡献一个较大的值。

为了验证这一点,在图4中说明了3个分支的 γ ϵ + σ 2 \frac{\gamma}{\sqrt{\epsilon+\sigma^2}} ϵ+σ2 γ。来自第5层和第6层Identity分支的 γ ϵ + σ 2 \frac{\gamma}{\sqrt{\epsilon+\sigma^2}} ϵ+σ2 γ的最大值分别为692.1107和1477.3732。有趣的是,来自第4层的3×3和1×1分支的权值也有一些较大的值,但它们的融合权值不再包含这些值。

2、S2(无BN)

解决S1满足C1问题的一个简单方法是从Identity分支1中删除BN分支。作者将此设置命名为S2,并在表3中显示了结果。

对权重量化的误差分析(见图9)表明,该设计确实符合C1的要求。该模型的FP32的精度为70.7%,INT8的精度为62.5%,这仍然是不可行的。这促使作者去验证它是否违反了C2。

由于权值是通过最小化整个训练集的损失函数来获得的,因此合理地推导出它们对偏差的贡献是很重要的。把3个分支的统计数据的期望写成,
E ( Y ( 3 ) ) = β ( 3 ) , E ( Y ( 1 ) ) = β ( 1 ) \mathrm{E}\left(\mathbf{Y}_{(3)}\right)=\boldsymbol{\beta}_{(3)}, \mathrm{E}\left(\mathbf{Y}_{(1)}\right)=\boldsymbol{\beta}_{(1)} E(Y(3))=β(3),E(Y(1))=β(1)
如果 β ( 3 ) = β ( 1 ) = β \beta_{(3)} = \beta_{(1)} = \beta β(3)=β(1)=β,则这两个输出可以很好地对齐,它们的求和有机会扩大方差。

β \beta β远离 Y ( 0 ) Y_{(0)} Y(0)时,方差增大的概率就越高。接下来,证明 β ( 3 ) = β ( 1 ) \beta_{(3)} = \beta_{(1)} β(3)=β(1)<如引理3.1。

引理3.1。使用损失函数 l ( W , γ , β ) l(W,\gamma,\beta) l(W,γ,β)在n次迭代中使用设置S2来训练一个神经网络,对于任何给定的层, β ( 3 ) n = β ( 1 ) n β_{(3)}^n = β_{(1)}^n β(3)n=β(1)n

证明:

ReLU 是RepVGG中的激活函数。一方面,如果大多数输入低于零(dead ReLU),它是有害的。另一方面,如果由于失去非线性,所有的输入都高于零,它也不受青睐。根据经验,许多具有BN的现代高性能CNN模型在ReLU之前的均值通常为零。如果采用这个假设,将让 E ( M ( 2 ) ) = E ( Y ( 1 ) + Y ( 3 ) + Y ( 0 ) ) = 0 E(M_{(2)})= E(Y_{(1)} + Y_{(3)} + Y_{(0)})=0 E(M(2))=E(Y(1)+Y(3)+Y(0))=0。基于引理3.1,得到了 β ( 3 ) = β ( 1 ) = − E ( Y ( 0 ) ) 2 \beta_{(3)} = \beta_{(1)}=-\frac{E(Y_{(0)})}{2} β(3)=β(1)=2E(Y(0))

E ( Y ( 0 ) ) ≥ 0 E(Y_{(0)})≥0 E(Y(0))0,增加3个分支通常会增大方差(图5)。

S3(No BN for Identity and 1×1)

如果3×3和1×1具有相同的平均值,则它们的求和容易扩大方差。为了更好地控制方差,作者进一步删除了1×1分支中的BN。将此设置命名为S3,并在表3中显示了结果。

该设计在ImageNet上实现了70.1%的top-1 FP32精度和69.5%的INT 8精度,大大提高了量化性能。然而,FP32的精度仍然很低。

S4(Post BN on S3)

由于3个分支的添加引入了协变量移位问题,在添加3个分支后添加了额外的BN以稳定训练过程,并将此设置命名为S4(下图)。

Post BN不会影响用于部署的等效kernel融合。这进一步提高了A0模型的FP32精度,从在ImageNet上的70.1%提高到72.2%。此外,其INT8的准确率提高到70.4%。到目前为止,已经大大解决了量化失败的问题,并将S4下的网络称为QARepVGG。

4、实验

4.1、消融实验

1、变体结构设计

作者研究了不同设计的量化性能,并将结果显示在表5中。注意,当完全去除BN时,模型无法收敛。尽管后置BN的设置仅具有71.1%的INT8 top 1精度,但其FP32精度也比较低。量化间隙随着模型容量的增长(从A0到B0)而增大。

2、与RepOpt-VGG比较

RepOpt-VGG采用了梯度重参的方法,它包括两个阶段:搜索量化表和使用所获得的量化表进行训练。RepOpt的量化精度取决于Scale的搜索质量。

由于只发布了少数预训练的模型,按照RepOpt重新训练RepOpt-VGG-A0/B0模型。也就是说,在CIFAR-100上运行了240个Epoch的超参数搜索,并在ImageNet上运行完整的120个Epoch。可以用正式发布的量化表来复制RepOpt-VGG-B1的结果。然而,很难找到A0/B0具有可比性能的良好scale。

如表6所示,RepOpt-VGG-A0在ImageNet上达到了70.3%,比RepVGG低2.1%。虽然比RepVGG好得多,但它们的PTQ精度仍然太低。相比之下,本文的方法在明显的边缘上优于RepOpt。此外,本文方法没有敏感的超参数或额外的训练成本。

3、 误差分析

为了了解量化误差是如何传播的,作者对图6中的RepVGG-A0和QARepVGG-A0进行了每层MSE分析。RepVGGA0对量化更为敏感,随着累积误差变得无法忍受,就会出现崩溃。

考虑到RepVGG-A0满足C1,作者对一批图像进行采样,以描述图7中两者对C2的差异。本文的方法产生了更小的标准方差和最小/最大值的更好的激活分布,从而确保了更好的量化性能。

4、QARepVGG的QAT

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

4.2、目标检测

为了进一步验证QARepVGG的通用性,在YOLOv6等目标检测器上测试了本文方法。尽管YOLOv6通过使用RepOpt VGG缓解了这个问题,但该方法是不稳定的,需要仔细的超参数调整。

作者将“tiny”和“small”模型变量作为比较基准。在COCO 2017数据集上训练和评估QARepVGG型YOLOv6,并严格遵循其官方设置。结果如表8所示。RepVGG和QARepVGG版本在8个Tesla-V100 GPU上训练了300个Epoch。RepOpt需要额外的300个Epoch来搜索Scale。

值得注意的是,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的最终精度对搜索到的超参数非常敏感,这些超参数无法鲁棒地获得。

5、总结

通过理论和定量分析,作者分析了著名的基于重参化的结构RepVGG的量化问题。它的结构缺陷不可避免地放大了量化误差,并累积产生了较差的结果。作者将其设计重构为QARepVGG,它可以生成出有利于量化的权重和激活分布。QARepVGG大大简化了最终部署的量化过程。作者强调,架构设计中的量化感知应引起更多的重视。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/150152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL BETWEEN 操作符

BETWEEN 操作符用于选取介于两个值之间的数据范围内的值。 SQL BETWEEN 操作符 BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。 SQL BETWEEN 语法 SELECT column1, column2, ... FROM table_name WHERE column BETWEEN value1 AND va…

力扣714题 买卖股票的最佳时机含手续费

class Solution {public int maxProfit(int[] prices, int fee) {// 买第一天股票所需要的全部费用(买入)int buy prices[0] fee; // 利润总和int sum 0;for(int p:prices){// 如果买后些天的股票所需的全部费用比第一天的少,就买后边这天的(买入)if(p fee < buy){buy …

【Python】python深拷贝和浅拷贝(一)

【Python】python深拷贝和浅拷贝&#xff08;一&#xff09; 定义 直接赋值&#xff1a;其实就是对象的引用。浅拷贝&#xff1a;拷贝父对象&#xff0c;不会拷贝对象的内部的子对象。深拷贝&#xff1a; copy 模块的 deepcopy 方法&#xff0c;完全拷贝了父对象及其子对象。…

SpringBoot过滤器与拦截器

为什么要有过滤器和拦截器&#xff1f; 在实际开发过程中&#xff0c;经常会碰见一些比如系统启动初始化信息、统计在线人数、在线用户数、过滤敏高词汇、访问权限控制(URL级别)等业务需求。这些对于业务来说一般上是无关的&#xff0c;业务方是无需关注的&#xff0c;业务只需…

Ubuntu20.04安装ROS Noetic

一、实验环境准备 1.使用系统:Ubuntu20.04&#xff08;安装不做赘述&#xff0c;可看我另外一篇博客Ubuntu20.04安装&#xff09;&#xff0c;可到Ubuntu官网下载https://ubuntu.com/download/desktop 2.配置网络&#xff0c;使其可通互联网 二、在Ubuntu20.04上搭建ROS机器人…

树上差分-LCA

树上差分算法分析&#xff1a;练习例题差分的基本思想详情见博客&#xff08;一维、二维差分&#xff09;&#xff1a; https://blog.csdn.net/weixin_45629285/article/details/111146240 算法分析&#xff1a; 面向的对象可以是树上的结点&#xff0c;也可以是树上的边 结点…

springmvc 文件上传请求转换为MultipartFile的过程

前言: 最近在研究文件上传的问题,所以就写下这个博客,让大家都知道从流转换为MutipartFile的过程,不然你就知道在方法中使用,而不知道是怎么样处理的,是不行的 从DiaspatherServlet说起: 别问为啥,去了解tomcat和servlet的关系,我后面会 写这篇博客的 servlet的生命周期 ini…

[ 数据结构 ] 查找算法--------线性、二分、插值、斐波那契查找

0 前言 查找算法有4种: 线性查找 二分查找/折半查找 插值查找 斐波那契查找 1 线性查找 思路:线性遍历数组元素,与目标值比较,相同则返回下标 /**** param arr 给定数组* param value 目标元素值* return 返回目标元素的下标,没找到返回-1*/public static int search(…

63.Python 调用类的属性和方法

63.调用类的属性和方法 文章目录63.调用类的属性和方法1. 调用属性的语法2.调用类的方法3.总结1. 调用属性的语法 我们根据类创建了一张奥迪A6的小汽车。根据汽车流水线呢&#xff0c;汽车生产完之后&#xff0c;需要移交给检查部门检查车辆的外观、颜色(属性)等是否与图纸一致…

JavaEE高阶---SpringBoot 统一功能处理

一&#xff1a;什么是SpringBoot 统⼀功能处理 SpringBoot统一功能处理是AOP的实战环节。我们主要学习三方面内容&#xff1a; 统一用户登录权限验证&#xff1b;统一数据格式返回&#xff1b;统一异常处理。 二&#xff1a;统一用户登录权限验证 Spring 中提供了具体的实现…

Scala 集合常用函数

文章目录集合常用函数一、基本属性和常用操作1、常用方法2、案例示例二、衍生集合1、衍生集合常用方法操作2、案例示例三、集合简单计算函数1、常用计算操作2、案例示例四、集合计算高级函数1、语义说明2、案例示例集合常用函数 一、基本属性和常用操作 1、常用方法 (1) 获取…

Release库与Debug库混用导致释放堆内存时产生异常的详细分析

目录 1、问题描述 2、使用Windbg启动Debug版本的exe程序进行分析 3、进一步分析 4、问题复盘 5、为什么Debug库与Release库混用可能会出异常&#xff1f; 6、最后 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#xff09;ht…

DM8:dexpdimp-逻辑导出--逻辑导入

DM8:dexp&dimp-逻辑导出--逻辑导入1 dexp逻辑导出dmp文件1.1 全库导出命令附加的参数信息1.2 导出用户所拥有权限的数据库对象-命令附加的参数信息1.3 导出用户所拥有权限的数据库对象-命令附加的参数信息2 dimp--逻辑导入dmp文件2.1 全库导入dmp数据文件-命令附加的参数信…

人体姿态估计-论文精读--DeepPose: Human Pose Estimation via Deep Neural Networks

图 1. 除了关节的极端变异性外&#xff0c;许多关节几乎不可见。我们能猜测左图中右臂的位置&#xff0c;因为我们看到了姿势的其余部分&#xff0c;并预测了这个人的运动或活动。同样&#xff0c;右边的人的左半身也根本看不见。这些都是需要进行整体推理的例子。我们相信DNNs…

php处理支付宝应用网关给接口发送的post参数

php如何接收支付宝应用网关发送的POST请求方式,参数又是GET请求的数据格式配置支付宝应用网关如何接收支付宝异步通知(应用网关接收请求)将&连接的参数分割成数组实例&#xff1a;难点配置支付宝应用网关 首先要在服务器上写一个接口,然后将接口的访问地址设置在支付宝应用…

手把手教Arthas,不再怕排查线上问题了

Arthas是alibaba开源的java诊断工具&#xff0c;支持jdk6&#xff0c;采用命令行交互模式&#xff0c;可以防败的定位和诊断线上的程序运行问题。官方文档&#xff1a;https://arthas.aliyun.com/doc/一、Arthas使用场景是否有一个全局视角来查看系统的运行状况&#xff1f;为什…

六种方式,教你在SpringBoot初始化时搞点事情!

前言 在实际工作中总是需要在项目启动时做一些初始化的操作&#xff0c;比如初始化线程池、提前加载好加密证书....... 那么经典问题来了&#xff0c;这也是面试官经常会问到的一个问题&#xff1a;有哪些手段在Spring Boot 项目启动的时候做一些事情&#xff1f; 方法有很多…

卷积层里的多输入多输出通道、池化层

多输入多通道每个通道都有一个卷积核&#xff0c;结果是所有通道卷积结果的和。无论有多少输入通道&#xff0c;到目前为止我们只用到单输出通道。可以有多个三维卷积核&#xff0c;每个核生成一个输出通道。输出通道数是卷积层的超参数。每个输入通道有独立的二维卷积核&#…

为什么JavaScript这么难学啊?

前言 觉得Js难其实是很正常的&#xff0c;首先这证明你在某些知识点上没有理解透彻&#xff0c;JS挺多的知识点点其实是比较抽象的&#xff0c;比如闭包、原型和原型链等&#xff0c;其次便是不会变通运用&#xff0c;这主要是敲代码熟练度的问题&#xff0c;所以我针对你这种…

架构运维篇(六):MySQL 8.0启用BinLog 支持

上一篇&#xff1a;架构运维篇&#xff08;五&#xff09;&#xff1a;Centos7/Linux中安装RocketMQ 最新线上的项目终于到多个数据执行的问题&#xff0c;找了团队DBA发现云上的MySQL 默认是没有启用BinLog支持。 小编研究了一下很简单&#xff0c;不过中间也遇到一些坑可以给…