0


QARepVGG:让RepVGG再次强大:一种量化感知的方法

性能和推理速度之间的权衡对于实际应用至关重要。而重参化可以让模型获得了更好的性能平衡,这也促使它正在成为现代卷积神经网络中越来越流行的架构。尽管如此,当需要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)=n1​i∑​(Q(wi​,t,nb​)−w)2

其中Q为量化过程,

    w
   
   
    ∈
   
   
    
     R
    
    
     n
    
   
  
  
   w\in R^n
  
 
w∈Rn为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}
  
 
10−5),以获得数值稳定性。这意味着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)​​​22​∣Weq​∣22​​.

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

除了理论分析,作者提供了一个简单的消融,通过去除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大大简化了最终部署的量化过程。作者强调,架构设计中的量化感知应引起更多的重视。


本文转载自: https://blog.csdn.net/weixin_43694096/article/details/128611217
版权归原作者 迪菲赫尔曼 所有, 如有侵权,请联系我们删除。

“QARepVGG:让RepVGG再次强大:一种量化感知的方法”的评论:

还没有评论