当前位置: 首页 > 科技观察

性能不打折,内存占用降低90%,Facebook提出了模型压缩方法Quant-Noise

时间:2023-03-15 19:59:03 科技观察

对于数百兆字节大小的神经网络,模型压缩可以减少其内存使用、通信带宽和计算复杂度。为了更好的应用程序部署。近日,FacebookAI的研究人员提出了一种新的模型量化压缩技术Quant-Noise,可以让神经网络在不降低性能的情况下减少90%以上的内存使用。我们都知道,对于神经网络来说,参数越多,层数越多,输出的结果就越精细。当然,这也意味着很多性能优越的神经网络在规模上会非常庞大??。比如目前标准的机器翻译架构Transformer,一个层可能包含数百万个参数。甚至一些针对性能和参数效率优化的模型(例如EfficientNet)仍然需要数十至数百MB。这将它们的使用限制在机器人或虚拟助手等领域。那么在我们部署应用之前,我们必须面对一个问题:如何压缩模型?剪枝和蒸馏是模型压缩中常用的两种方法,通过减少网络权重的数量来剪枝参数。另一种方法是“量化”,不同之处在于它通过减少每个权重的比特数来压缩原始网络。流行的后处理量化方法(如标量量化)允许训练网络的浮点权重由低精度表示表示,如固定宽度的整数。这些后处理量化方法的好处是压缩效率高,并且能够在支持的硬件上加速推理。不过,缺点是这些近似值的误差会在前向传播计算期间累积,最终导致性能显着下降。现在,Facebook的研究人员提出了一种新的模型量化压缩技术Quant-Noise,可以在实际应用部署过程中,在保持高性能的同时,对模型进行极度压缩。论文地址:https://arxiv.org/abs/2004.07320项目地址:https://github.com/pytorch/fairseq/tree/master/examples/quant_noise在这项研究中,研究人员提出了一种仅量化的压缩方案对于权重的子集而不是整个网络。每次前向传播时只有网络的随机部分被量化,并且大多数权重使用无偏梯度进行更新。这种方法可以在训练时采用更简单的量化方案,这对于具有可训练参数的量化模块非常有用,例如ProductQuantizer(PQ)算法。总体而言,该方法的亮点在于:将称为“Quant-Noise”的量化噪声应用于权重的随机子集,以学习更适合各种量化方法(如int4、int8和PQ算法)的网络;在PQ算法中加入Quant-Noise,在精度和模型大小上达到SOTA水平。使用这种方法进行压缩后,在自然语言处理方面,RoBERTa在压缩到14MB的前提下,在MNLI上的准确率达到了82.5%;在计算机视觉方面,EfficientNet-B3被压缩到3.3MB。在ImageNet上达到了80.0%的top-1准确率。使用Quant-Noise训练的网络,通过结合PQ算法和int8对网络的权值和激活进行量化,得到固定精度计算条件下的极限压缩效果,准确率达到79.8%top-1在ImageNet数据集和WikiText上实现。-103数据集上的21.1困惑度。此外,使用Quant-Noise压缩后的模型性能与原始模型几乎相同,同时内存占用减少了原始模型的十分之一甚至二十分之一。这大大超过了PyTorch和Tensorflow中使用的int8的4倍压缩。目前,相关代码也已经开源。原理:量化神经网络在本章中,研究人员介绍了量化的原理以及几种标准的量化方法,并详细解释了如何结合标量量化和乘积量化。需要注意的是,为了定义的清晰,研究者主要以固定实数矩阵(fixedrealmatrix)W∈R^n×p为例,并假设这个矩阵被拆分成m×q块(b_kl):这些block的属性由量化方式决定,codebook是一组K个向量,即C={c[1],...,c[K]}。这种量化方法通过为每个块b_kl分配一个指向码本C中的“码字c”的索引来压缩矩??阵W,同时存储码本C和结果索引(作为索引矩阵I的条目I_kl),而不是使用实际重量。在推理期间,该方法重建原始矩阵W的近似值,使得b_kl=c[I_kl]。研究人员将标量量化(如int8,即每个块b_kl由一个权重组成)与矢量量化(多个权重一起量化)区分开来。上图显示了研究人员如何在训练期间将量化噪声应用于权重子集以提高量化模型的性能(完整视频请参见链接)。定点标量量化定点(Fixed-point)标量量化方法用低精度的定点表示代替了浮点表示。通过在兼容硬件上使用定点运算,减少模型内存占用并加快推理速度。Quant-Noise的具体实现方式深度网络训练过程不会暴露在量化漂移引起的噪声中,导致性能不佳。如何使网络对量化具有一定的鲁棒性?解决方案是在训练过程中引入量化噪声。量化感知训练(QAT)通过在前向传递期间量化权重来实现这一点。这种转换是不可微分的,并使用直通估计器(STE)来近似梯度。STE在梯度中引入了一个偏差,该偏差取决于权重的量化级别,因此也取决于压缩率。因此,研究人员提出了一种简单的修改方法Quant-Noise,通过随机改进QAT来控制这种偏差。这个想法是量化权重的随机部分,而不是像QAT那样量化整个网络,以便未量化的权重使用无偏梯度。该方法的一般形式可以模拟训练过程中量化和剪枝的效果。使用Quant-Noise训练网络仍然以实矩阵W为例。在训练时,Quant-Noise方法的操作如下:首先,计算与目标量化方法相关联的块b_kl;然后在每次前向传递期间,随机选择这些块的一个子集并添加一些失真;在向下传播的过程中,使用STE来逼近扭曲的权重,然后计算所有权重的梯度值。换句话说,给定一个索引元组J?{(k,l)},其中1≤k≤m,1≤l≤q,同时对块应用失真或噪声函数?,研究人员定义算子ψ(·|J),对每个块b_kl应用以下转换:Quant-Noise的效果如何?Quant-Noise对不同量化方式的影响如下表1所示。研究人员首先展示了Quant-Noise对int4、int8和iPQ三种不同量化方案对语言建模和图像分类任务的影响。结果表明,Quant-Noise对于iPQ等高性能量化方案显示出非常好的结果,而QAT通常会导致性能下降,即使与量化作为后处理步骤的情况相比也是如此。表1:三种量化方案int4、int8和iPQ在QAT和Quant-Noise两种设置下对语言建模和图像分类任务的量化结果对比。对于语言建模任务,研究人员在Wikitext-103benchmark上训练Transformer,得到测试困惑度(PPL);针对图像分类任务,研究人员在ImageNet-1kbenchmark上训练了EfficientNet-B3,得到了验证的Top-1准确率。研究人员分析,Quant-Noise可以与剪枝和权重共享方法兼容和互补。如下表2所示,研究人员展示了在WikiText-103上进行语言建模、在MNLI上预训练句子表示以及在ImageNet-1k上进行目标分类的结果。这些结果在不同的任务和基准测试中高度一致:与强大的iPQ基线方法相比,Quant-Noise实现了显着的性能提升。表2:几种不同的压缩方法(权重共享、剪枝和量化噪声)对未量化和量化模型在语言建模、句子表示和图像分类任务上的性能的影响。与SOTA方法的比较研究人员在同一任务上将Quant-Noise与当前的SOTA方法进行了比较。他们在竞争模型上应用了最佳量化设置,结合权重共享和剪枝方法,将这些模型的内存占用缩小到1/94-1/20,从而为高性能模型提供了极致的性能。压缩。如下图2所示,研究人员在语言建模、MNLI和ImageNet上得出了性能和模型大小之间的权衡。图2:模型性能作为模型大小的函数。控制变量测试如下表3所示。研究人员在不使用Quant-Noise训练、使用Quant-Noise微调和使用Quant-Noise训练的三种不同设置下展示了AdaptiveInput架构的复杂性和RoBERTa的准确性。率变化。可以看出直接使用Quant-Noise训练可以达到最低的perplexity和最高的accuracy。表3:在没有Quant-Noise训练、有Quant-Noise微调和有Quant-Noise训练的三种不同设置下的困惑度和准确度比较。如下图3所示,不同Quant-Noise取值对语言建模模型Transformer性能的影响。对于iPQ,高噪声值对模型性能影响较大;而对于int8量化及其噪声函数,较高的噪声值对模型性能有轻微的负面影响,但没有那么大。图3:量化参数的影响。