Solving Oscillation Problem in Post-Training Quantization Through a Theoretical Perspective

Solving Oscillation Problem in Post-Training Quantization Through a Theoretical Perspective

论文地址:https://arxiv.org/pdf/2303.11906.pdf
项目地址:https://github.com/bytedance/MRECG


前言

训练后量化(PTQ)由于其数据隐私性和低计算成本,被广泛认为是实际中最有效的压缩方法之一

作者认为振荡问题在PTQ方法中是被忽视的

作者在本文中主动探索并提出了一个理论证明,来解释为什么这样的问题在PTQ中是常见的

然后,作者试图通过引入一个原则性的、广义的理论框架来解决这个问题

首先公式化了PTQ中的振荡,并证明了问题是由模块容量的差异引起的

为此定义了数据依赖和无数据情况下的模块容量(ModCap),其中相邻模块之间的差异用于测量振荡程度

然后通过选择Top-k差分来解决该问题,其中相应的模块被联合优化和量化

大量实验表明,本文的方法成功地降低了性能下降,并推广到不同的神经网络和PTQ方法

对于2/4位ResNet-50量化,本文的方法比以前最先进的方法高出1.9%

在小模型量化上变得更重要,例如在MobileNetV2×0.5上比BRECQ方法高出6.61%


简介

深度神经网络(DNN)近年来迅速成为研究热点,在实践中被应用于各种场景

然而,随着DNN的发展,更好的模型性能通常与更深更宽网络的巨大资源消耗有关

与此同时,旨在在资源受限的场景中部署模型的神经网络压缩和加速研究领域正逐渐受到越来越多的关注

包括但不限于神经架构搜索、网络剪枝和量化

在这些方法中,量化提出了将浮点网络激活和权重转换为低位定点,这能够在几乎没有性能退化的情况下加速推理或训练速度

通常,量化方法分为量化感知训练(QAT)和训练后量化(PTQ)

前者通过量化微调来减少量化误差

尽管取得了显著的成果,但海量的数据需求和高昂的计算成本阻碍了DNN的普遍部署,尤其是在资源受限的设备上

因此,提出了PTQ来解决上述问题,该问题只需要少量或零校准数据来进行模型重建

由于没有量化训练的迭代过程,PTQ算法非常高效,通常在几分钟内即可获得和部署量化模型

然而,这种效率往往是以牺牲准确性为代价的

PTQ通常在没有量化训练的情况下比全精度模型表现更差,尤其是在低位紧凑模型量化中

Nagel等人通过量化前后损失函数的二阶泰勒展开构建了新的优化函数,该函数引入了具有可学习参数的软量化,以实现自适应权重舍入

Li等人逐层改变为逐块重建,并使用对角Fisher矩阵来近似Hessian矩阵以保留更多信息

Wei等人发现,随机禁用激活量化的一些元素可以平滑量化权重的损失

在这里插入图片描述
在重建过程中, 作者观察到,随着层或块的加深,上述所有方法都表现出不同程度的振荡

作者认为,这个问题是至关重要的,并且在以前的PTQ方法中被忽视了

在本文中通过严格的数学定义和证明,回答了关于振荡问题的3个问题

  1. 为什么PTQ会出现振荡?
  2. 振荡将如何影响最终性能?
  3. 如何解决PTQ中的振荡问题?

本文的贡献如下:

首次揭示了PTQ中的振荡问题,这在以前的算法中被忽略了。并发现在PTQ的优化中,消除这种振荡是至关重要的。

从理论上表明,这种振荡是由相邻模块的能力差异引起的。小的模块能力会加剧量化误差的累积效应,使损耗迅速增加,而大的模块能力则会减少累积量化误差,使损耗减少。

提出了一种新的混合重构粒度(MRECG)方法,该方法利用损失度量和模块容量来优化数据依赖和无数据场景下的混合重构细粒度。前者以适度较高的开销找到全局最优,因此具有最佳性能。后者更有效,性能略有下降。

在ImageNet中的各种压缩任务上验证了所提出的方法的有效性。特别是在具有2/4位的MobileNetV2中实现了58.49%的Top-1准确率,这大大超过了当前的SOTA方法。此外,还证实了本文的算法确实消除了重建损失在不同模型上的振荡,使重建过程更加稳定。


相关工作

Module Capacity

一些常见的参数会影响模块容量,例如滤波器的大小、权重参数的位宽和卷积组的数量

研究表明,Stride和残差链接也会影响模块容量

Kong等人表明,stride为2的卷积可以等效地被Stride为1的卷积所取代

同时,替换卷积的滤波器大小大于原始卷积的滤波器尺寸,这意味着模块容量的增加

MobileNetV2包含深度卷积,它不包含通道之间的信息交换,因此它在某种程度上损害了模型性能

Liu等人认为,全精度残差链接的输入增加了量化模块的表示能力


本文方法

通过一个定理和推论证明了PTQ的振荡问题与模块容量高度相关

其次,构造了容量差异优化问题,并分别在依赖数据和无数据的情况下给出了两种解决方案

最后,分析了扩大校准数据的批量大小以减少期望近似误差,这表明边际效用有递减的趋势

PTQ的振荡问题

在不失一般性的情况下,使用模块作为分析的基本单元

特别是,与BRECQ不同,本文中的模块粒度更灵活,它表示Layer、Block甚至Stage的粒度

在模块粒度框架下提出了一种更普遍的重建损失,如下

在这里插入图片描述
其中:

  • f为包含n个卷积层的神经网络的第i个模块
  • w和x分别是第i个模块的权重和输入
  • dw和dx是相应的量化版本

当f只包含一个卷积层的时候,方程退化为AdaRound中的优化函数

当f包含第i个模块的所有卷积层的时候,方程退化为BRECQ中的优化函数

如果两个模块具有相同数量的卷积层,并且所有相关联的卷积层具有相同的超参数,则它们被称为等效的

量化中存在量化误差的累积效应,表现为网络中量化误差受到前一层量化影响的增加趋势

由于PTQ不包含量化训练,这里累积效应在重建损失中更为明显

文中解释了:PTQ中量化误差的累积效应会导致增量损失

作者提出,如果两个相邻模块相等的条件下,量化误差的累积会导致损失的增加,但是这种情况很难满足

其次,如果两个相邻的模块的拓扑是同结构的,如果后面的模块容量足够大,则产生的损耗将减小,反之会加剧

文中又解释了:PTQ中为什么会出现振荡

在这里插入图片描述

作者用上图进行解释:不同算法对应的损失分布振荡越严重,损失峰值就越大

也就是说,振荡的程度与最大误差呈现正相关

在这里插入图片描述
并通过上图解释,对于不同的模型,在不同的算法上,最大误差与最终误差呈正相关

同时,作者根据BRECQ和Adaround对精度损失函数进行了泰勒展开,可以得出最终误差会影响模型的精度

总之,大量的实验证明:误差的振荡程度与精度呈负相关,即振荡层度越低,精度越高


解决办法

通过振荡问题,表明模块结构和容量的差异(PTQ量化)导致信息丢失会影响模型的精度

由于PTQ中没有训练过程,即使增加后续模块的容量,也无法恢复这种信息损失

因此,通过联合优化具有大容量差异的模块来平滑损失振荡,从而降低精度损失

简单的讲,如果两个模块有相同的拓扑结构,但后者的容量过大,那么就采用下面的这个公式

将两个模块的容量尽可能的接近,从而减少误差

在这里插入图片描述
其中

  • m是一个二进制掩码向量,当m=1时,意味着第i个和第i+1个模块执行联合优化
  • 1表示的是元素全为1的向量
  • k是控制联合优化模块数量的超参
  • λ是控制正则项和容量差平方优化目标的重要指标

计算流程如下:
请添加图片描述


实验

请添加图片描述


参考文献

  • https://arxiv.org/pdf/2303.11906.pdf

猜你喜欢

转载自blog.csdn.net/qq_38973721/article/details/130258885