模型落地困难?看看这个如何解决PTQ的振荡问题(一)

简介: 模型落地困难?看看这个如何解决PTQ的振荡问题(一)

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

作者在本文中主动探索并提出了一个理论证明,来解释为什么这样的问题在PTQ中是常见的。然后,作者试图通过引入一个原则性的、广义的理论框架来解决这个问题。

首先公式化了PTQ中的振荡,并证明了问题是由模块容量的差异引起的。为此定义了数据依赖和无数据情况下的模块容量(ModCap),其中相邻模块之间的差异用于测量振荡程度。然后通过选择Top-k差分来解决该问题,其中相应的模块被联合优化和量化。

大量实验表明,本文的方法成功地降低了性能下降,并推广到不同的神经网络和PTQ方法。例如,对于2/4位ResNet-50量化,本文的方法比以前最先进的方法高出1.9%。它在小模型量化上变得更重要,例如在MobileNetV2×0.5上比BRECQ方法高出6.61%。 Github:https://github.com/bytedance/MRECG


1、简介


深度神经网络(DNN)近年来迅速成为研究热点,在实践中被应用于各种场景。然而,随着DNN的发展,更好的模型性能通常与更深更宽网络的巨大资源消耗有关。与此同时,旨在在资源受限的场景中部署模型的神经网络压缩和加速研究领域正逐渐受到越来越多的关注,包括但不限于神经架构搜索、网络剪枝和量化。在这些方法中,量化提出了将浮点网络激活和权重转换为低位定点,这能够在几乎没有性能退化的情况下加速推理或训练速度。

通常,量化方法分为量化感知训练(QAT)和训练后量化(PTQ)。前者通过量化微调来减少量化误差。尽管取得了显著的成果,但海量的数据需求和高昂的计算成本阻碍了DNN的普遍部署,尤其是在资源受限的设备上。

因此,提出了PTQ来解决上述问题,该问题只需要少量或零校准数据来进行模型重建。由于没有量化训练的迭代过程,PTQ算法非常高效,通常在几分钟内即可获得和部署量化模型。然而,这种效率往往是以牺牲准确性为代价的。PTQ通常在没有量化训练的情况下比全精度模型表现更差,尤其是在低位紧凑模型量化中。

最近的一些算法试图解决这个问题。例如,Nagel等人通过量化前后损失函数的二阶泰勒展开构建了新的优化函数,该函数引入了具有可学习参数的软量化,以实现自适应权重舍入。Li等人逐层改变为逐块重建,并使用对角Fisher矩阵来近似Hessian矩阵以保留更多信息。Wei等人发现,随机禁用激活量化的一些元素可以平滑量化权重的损失。

image.png

然而,作者观察到,在重建过程中,随着层或块的加深,上述所有方法都表现出不同程度的振荡,如图1左侧子图所示。作者认为,这个问题是至关重要的,并且在以前的PTQ方法中被忽视了。在本文中通过严格的数学定义和证明,回答了关于振荡问题的3个问题,如下所示:

  1. 为什么PTQ会出现振荡?为了回答这个问题,首先定义了模拓扑同构,它在一定程度上放宽了模等价的限制。然后,给出了在模块拓扑同构条件下模块容量的定义。在这种情况下可以证明,当后期模块的容量足够大时,重建损失将突破量化误差累积的影响并降低。相反,如果后面模块的容量小于前面模块的容量,则由于放大的量化误差累积效应,重建损失急剧增加。总体而言,证明了PTQ过程中的振荡是由模块容量的差异引起的;
  2. 振荡将如何影响最终性能?通过随机采样大量混合重建粒度方案,观察到最终的重建误差与之前所有模块中最大的重建误差高度相关。换句话说,当振荡发生时,先前的模块显然具有较大的重建误差,从而导致PTQ的精度较差;
  3. 如何解决PTQ中的振荡问题?由于振荡是由前后模块的不同容量引起的,提出了混合重构粒度(MRECG)方法,该方法可以联合优化发生振荡的模块。此外,本文的方法适用于无数据和依赖数据的场景,也兼容不同的PTQ方法。

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

  1. 首次揭示了PTQ中的振荡问题,这在以前的算法中被忽略了。然而,作者发现在PTQ的优化中,消除这种振荡是至关重要的。
  2. 从理论上表明,这种振荡是由相邻模块的能力差异引起的。小的模块能力会加剧量化误差的累积效应,使损耗迅速增加,而大的模块能力则会减少累积量化误差,使损耗减少。
  3. 为了解决振荡问题,作者提出了一种新的混合重构粒度(MRECG)方法,该方法利用损失度量和模块容量来优化数据依赖和无数据场景下的混合重构细粒度。前者以适度较高的开销找到全局最优,因此具有最佳性能。后者更有效,性能略有下降。
  4. 在ImageNet中的各种压缩任务上验证了所提出的方法的有效性。特别是在具有2/4位的MobileNetV2中实现了58.49%的Top-1准确率,这大大超过了当前的SOTA方法。此外,还证实了本文的算法确实消除了重建损失在不同模型上的振荡,使重建过程更加稳定。

2、相关工作


2.1、Quantization

量化可以分为两类:

  • 量化感知训练(QAT)
  • 训练后量化(PTQ)

QAT使用整个训练数据集进行量化训练,并通过网络的反向传播来更新梯度以消除量化误差。尽管QAT集成了各种训练方法以实现更高的准确性,但在某些数据隐私场景中,这一过程往往是资源密集型的,并且受到限制。

近年来,由于高效的模型部署和低数据依赖性的优势,PTQ越来越受到关注。由于不包括量化训练,PTQ算法通常使用小的校准数据集进行重建,通过优化任务损失的二阶泰勒展开项的近似值来获得更好的量化模型。

2.2、Module Capacity

一些常见的参数会影响模块容量,例如滤波器的大小、权重参数的位宽和卷积组的数量。此外,一些研究表明,Stride和残差链接也会影响模块容量。

Kong等人表明,stride为2的卷积可以等效地被Stride为1的卷积所取代。同时,替换卷积的滤波器大小大于原始卷积的滤波器尺寸,这意味着模块容量的增加。

MobileNetV2包含深度卷积,它不包含通道之间的信息交换,因此它在某种程度上损害了模型性能。Liu等人认为,全精度残差链接的输入增加了量化模块的表示能力。


3、本文方法


在本节中首先通过一个定理和推论证明了PTQ的振荡问题与模块容量高度相关。其次,构造了容量差异优化问题,并分别在依赖数据和无数据的情况下给出了两种解决方案。最后,分析了扩大校准数据的批量大小以减少期望近似误差,这表明边际效用有递减的趋势。

3.1、PTQ振荡问题

在不失一般性的情况下,使用模块作为分析的基本单元。特别是,与BRECQ不同,本文中的模块粒度更灵活,它表示Layer、Block甚至Stage的粒度。形式上,将设置为包含个卷积层的神经网络的第个()模块。在模块粒度框架下提出了一种更普遍的重建损失,如下所示,

image.png

其中、分别是第个模块的权重和输入。是相应的量化版本。当只包含一个卷积层时,方程1退化为AdaRound中的优化函数。当包含第个块内的所有卷积层时,方程1退化为BRECQ中的优化函数。

image.png

注意,这里忽略了AdaRound中的正则化项,这有助于收敛,因为它在每个模块优化后收敛到0。此外,为了简单起见,还省略了BRECQ中的平方梯度尺度。

如果2个模块具有相同数量的卷积层,并且所有相关联的卷积层具有相同的超参数,则它们被称为等效的(包括但不限于额外的残差输入、kernel-size、通道、组和stride)。

量化中存在量化误差的累积效应,表现为网络中量化误差受前一层量化影响的增加趋势。由于PTQ不包含量化训练,这种累积效应在重建损失中更为明显。作者提出以下定理来证明PTQ中量化误差的累积效应会导致增量损失。

理论1:给定预训练的模型和输入数据。如果两个相邻的模块是等效的,

image.png

补充材料中提供了详细的证明。定理1说明,在两个相邻模块相等的情况下,量化误差的累积导致损失的增加

然而,由于一个或多个卷积超参数(额外的残差输入、kernel-size、通道、组、stride等)的差异,上述定理中的相邻模等价条件在实际场景中很难得到满足。非等效模块将不可避免地导致模块容量的差异。

众所周知,模块的参数数量和位宽会影响模块容量,其中这些超参数对模块容量的影响很容易量化。此外,在第2节中介绍了残差输入、卷积类型和卷积超参数都会影响模块容量,这些影响很难量化。因此,将模块拓扑同构的概念定义如下,这在一定程度上放宽了对模块等价的限制,同时使比较不同模块之间的容量成为可能。

定义1:模块拓扑同质性

假设2个模块具有相同数量的卷积层。如果2个模块的相应卷积层的超参数除了kernel-size和通道之外是相同的,那么这两个模块在拓扑上是同构的。

从定义1中,放松了模块等价对模块拓扑同构中kernel-size和通道相等的限制,这只会导致模块参数数量的差异。换句话说,消除了诸如残差输入和组之类的超参数的影响使得模块容量难以量化的问题。

具体而言,如果包含个卷积层的模块权重为,是模块中第个卷积层权重,则模块容量(ModCap)定义为以下等式:

其中是一个计算参数数量的函数,是第个卷积层的位宽,α用于使具有不同stride的卷积层具有可比性。

具体来说,不同stride的卷积层通过一些变换来等同,并伴随着参数数量的变化。因此,通过乘以缩放参数α,将网络中的stride=2层转换为隐式stride=1层。在这种转换下,网络的所有层都满足拓扑同构的定义,因此彼此是可比较的。理论上,根据[Take it in your stride]文章中的分析,α可以设置为1.6,这在本文的不同网络中得到了推广。

然后,导出定理1的一个推论来解释为什么PTQ中会出现振荡?

推论1

假设两个相邻的模在拓扑上是同构的。如果后面模块的模块容量足够大,则损耗将减小。相反,如果后一模块容量小于前一模块容量,则量化误差的累积效应会加剧。

补充材料中提供了详细的证明。根据推论1可以得出结论,PTQ在各种模型上的振荡问题是由相邻模块的容量差异过大引起的。

论文的逻辑/相关链:振荡性∞最大误差∞最终误差∞准确度。

「振荡∞最大误差」:从图6和补充材料中的类似图来看,不同算法对应的损失分布振荡越严重,损失峰值就越大。也就是说,振荡的程度与最大误差呈正相关。

image.png

「最大误差∞最终误差」:此外,在图3中的观察结果表明,对于不同的模型,在不同的算法上,最大误差与最终误差呈正相关。

「最终误差∞精度」:理论上,通过根据BRECQ和Adaround对精度损失函数进行泰勒展开,可以得出与性能高度相关的最终重建误差。

从经验上讲,上述论文中进行的大量实验也证明了这一说法。总之,误差的振荡程度与精度呈正相关。论文中的图1也表明,降低振荡程度有利于精度。

3.2、混合重建粒度

第3.1节中分析的振荡问题表明,由于模块容量的差异导致的信息丢失最终会影响PTQ的性能。由于PTQ中没有量化训练过程,即使增加后续模块的模型容量,也无法恢复这种信息损失。因此,通过联合优化具有大容量差异的模块来平滑损失振荡,从而降低最终重建损失。

从定理1和推论1可以清楚地看出,后面模块的小容量将加剧量化误差的累积效应,从而急剧增加重建损失。相反,后面模块的大容量将减少损失,并增加后面模块中信息丢失的概率。因此,希望两个相邻模块的容量尽可能接近。基于容量度量(CM)为包含L个模块的模型构造容量差优化问题,如下所示:

image.png

其中是一个二进制掩码向量。当时,这意味着对第个和第个模块执行联合优化。是一个所有元素都为1的向量。是控制联合优化模块数量的超参数。λ控制正则化项和容量差平方优化目标的重要性比。

计算所有L−1种相邻模块的容量差的平方进行排名,并选择前个相邻模块进行联合优化。在无数据和依赖数据的情况下,分别使用ModCap和重建损失作为容量指标。

image.png

具体如图2所示。根据ModCap度量获得的混合重建粒度方案在计算上是有效的,因为它不涉及重建。然而,一旦组合了一对相邻的模块,这个组合的模块就无法比较ModCap进行进一步的组合,因为它与相邻的模块在拓扑上不同构。因此,该优化方案只能获得混合重建粒度的局部最优解。

另一方面,根据推论1,ModCap差异与重建损失的差异呈正相关,可以将重建损失本身视为容量度量。该方案可以得到全局最优解,但需要进行PTQ重建才能获得重建损失,效率相对较低。

校准数据的批量大小

PTQ需要数据集的一小部分来进行量化参数的校准和模型重建。作者注意到,方程1包含平方Frobenius范数的期望。期望值表示随机变量的平均值,取采样批次的平均值来近似重建过程中的期望值。大数定律证明了当样本大小N趋于无穷大时。例如,

实验表明,扩大校准数据的批量可以提高PTQ的准确性。这一趋势显示出边际效用的递减。具体而言,随着批量大小的增加,PTQ精度的提高速度减慢。

相关文章
|
存储 SQL 关系型数据库
如何设计可落地的重构技术方案——理论篇
如何设计可落地的重构技术方案——理论篇
300 0
|
1月前
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
3天前
补齐Transformer规划短板又不放弃快速思考,田渊栋团队的Dualformer融合System 1和2双重优势
田渊栋团队提出的Dualformer是一种创新的Transformer模型,能同时进行快速和深度推理。通过随机化推理轨迹数据训练,Dualformer可在不同模式下高效解决问题,如迷宫导航,且在准确率和效率上超越现有模型。该模型有望提升大型语言模型在数学等复杂任务上的表现,但也面临训练资源需求高和自动模式需进一步优化的挑战。
9 3
|
3月前
|
敏捷开发 监控
敏捷开发的全过程问题之快速建立迭代机制并进行规模化的推广和度量的问题如何解决
敏捷开发的全过程问题之快速建立迭代机制并进行规模化的推广和度量的问题如何解决
|
3月前
|
测试技术 UED
质量标准化实践问题之测试策略的本质如何解决
质量标准化实践问题之测试策略的本质如何解决
21 2
|
3月前
|
机器学习/深度学习 人工智能 算法
就AI 基础设施的演进与挑战问题之大模型训练过程中的问题如何解决
就AI 基础设施的演进与挑战问题之大模型训练过程中的问题如何解决
|
3月前
|
人工智能 分布式计算 自然语言处理
ChatGPT 等相关大模型问题之建设一个prompt平台来提升业务效率如何解决
ChatGPT 等相关大模型问题之建设一个prompt平台来提升业务效率如何解决
|
4月前
业务系统架构实践问题之领域设计的重要性如何解决
业务系统架构实践问题之领域设计的重要性如何解决
|
4月前
|
运维 监控 IDE
通用研发提效问题之在软件研发的各个阶段,提升效率的工具和方法,如何解决
通用研发提效问题之在软件研发的各个阶段,提升效率的工具和方法,如何解决
|
4月前
|
人工智能 领域建模
应用工程化架构问题之AI计算机中的大模型评估体系发生变化如何解决
应用工程化架构问题之AI计算机中的大模型评估体系发生变化如何解决