A White Paper on Neural Network Quantization
15 Jun 2021
https://arxiv.org/abs/2106.08295
作者:Markus Nagel, Marios Fournarakis, Rana Ali Amjad, Yelysei Bondarenko, Mart van Baalen, Tijmen Blankevoort
虽然神经网络在许多应用中都取得了进展,但它们通常具有较高的计算成本。如果我们想要将现代网络集成到具有严格功率和计算要求的边缘设备中,降低神经网络推理的功率和延迟是关键。神经网络量化是实现这些节省的最有效方法之一,但它所引起的额外噪声可能导致精度下降。在本白皮书中,我们介绍了最先进的算法,用于减轻量化噪声对网络性能的影响,同时保持较低的比特权重和激活。我们从硬件驱动的量化介绍开始,然后考虑两类主要的算法:训练后量化(PTQ)和量化感知训练(QAT)。PTQ不需要重新训练或标记数据,因此是一种轻量级的量化按钮方法。在大多数情况下,PTQ足以实现接近浮点精度的8位量化。QAT需要微调和访问标记的训练数据,但实现具有竞争结果的较低比特量化。对于这两种解决方案,我们基于现有文献和广泛的实验提供了经过测试的管道,从而为常见的深度学习模型和任务提供了最先进的性能。
1导言
随着深度学习作为一种将智能注入电子设备的通用工具的普及,对小型、低延迟和节能的神经网络解决方案的需求增加。今天,神经网络可以在许多电子设备和服务中找到,从智能手机、智能眼镜和家用电器,到无人机、机器人和自动驾驶汽车。这些设备通常受到神经网络执行的严格时间限制或长持续时间性能的严格功率要求。
减少神经网络计算时间和能量消耗的最有效方法之一是量化。在神经网络量化中,权重和激活张量的存储精度低于通常训练的16或32位精度。当从32位移动到8位时,存储张量的内存开销减少了4倍,而矩阵乘法的计算成本以二次方式减少了16倍。已证明神经网络对量化具有鲁棒性,这意味着它们可以量化为较低的位宽,对网络精度的影响相对较小。此外,神经网络量化通常可以与其他常用的神经网络优化方法一起应用,如神经结构搜索、压缩和修剪。对于深度学习的任何实际用例,这是模型效率管道中的一个重要步骤。然而,神经网络量化不是免费的。低比特宽度量化将噪声引入网络,这可能导致精度下降。虽然一些网络对这种噪声是鲁棒的,但其他网络需要额外的工作来利用量化的好处。
在本白皮书中,我们介绍了神经网络量化的最新进展。我们首先介绍量化,并讨论硬件和实际考虑。然后我们考虑两种不同的量化神经网络:训练后量化(PTQ)和量化感知训练(QAT)。第3节中讨论的PTQ方法采用经过训练的网络,用很少或没有数据对其进行量化,需要最小的超参数调整,无需端到端训练。这使得它们成为量化神经网络的一种按钮式方法,具有较低的工程工作量和计算成本。相比之下,第4节中讨论的QAT依赖于在训练管道中使用模拟量化重新训练神经网络。虽然这需要在训练和潜在的超参数调整方面付出更多努力,但与低比特量化的PTQ相比,它通常进一步缩小了与全精度精度精度的差距。对于这两种模式,我们基于现有文献和广泛的实验引入了标准管道,从而为常见的计算机视觉和自然语言处理模型带来了最先进的性能。我们还提出了一个调试工作流,以识别和解决量化新模型时的常见问题。
2量化基础
在本节中,我们将介绍神经网络量化的基本原理和量化网络运行的定点加速器。我们从硬件动机开始,然后介绍标准量化方案及其特性。稍后,我们将讨论与现代神经网络中常见的层相关的实际考虑因素及其对定点加速器的影响。
2.1硬件背景
在深入技术细节之前,我们首先探讨量化的硬件背景,以及它如何在设备上实现高效推理。图1提供了如何在神经网络(NN)加速器中计算矩阵向量乘法y=Wx+b的示意图。这是神经网络中较大矩阵乘法和卷积的基础。这种硬件块旨在通过并行执行尽可能多的计算来提高神经网络推理的效率。该神经网络加速器的两个基本部件是处理元件Cn、m和累加器An。图1中的玩具示例有16个处理元素,它们排列成正方形网格和4个累加器。计算开始于用偏置值bn加载累加器。然后,我们将权重值Wn,m和输入值xm加载到数组中,并在单个循环中计算它们在相应处理元素Cn,m=Wn,mXm中的乘积。然后将其结果添加到累加器中:
上述操作也被称为乘法累加(MAC)。对于较大的矩阵向量乘法,此步骤重复多次。一旦所有循环完成,累加器中的值将被移回存储器,用于下一个神经网络层。神经网络通常使用FP32权重和激活进行训练。如果我们要在FP32中执行推理,处理元件和累加器将必须支持浮点逻辑,并且我们需要将32位数据从内存传输到处理单元。MAC操作和数据传输消耗了神经网络推理期间花费的大量能量。因此,通过使用这些量的低位定点或量化表示,可以实现显著的好处。低位定点表示,如INT8,不仅减少了数据传输量,还减少了MAC操作的大小和能耗(Horowitz,2014)。这是因为数字算术的成本通常与所使用的位数成线性或二次比例,并且因为定点加法比浮点加法更有效(Horowitz,2014)。
为了从浮点运算转移到高效的定点运算,我们需要一种将浮点向量转换为整数的方案。浮点向量x可以近似表示为标量乘以整数值向量:
其中,sx是浮点比例因子,xint是整数向量,例如INT8。我们将向量的量化版本表示为xb。通过量化权重和激活,我们可以写出累加方程的量化版本:
请注意,我们对权重、sw和激活sx使用了单独的比例因子。这提供了灵活性并减少了量化误差(详见第2.2节)。由于每个比例因子应用于整个张量,因此该方案允许我们将比例因子从等式(3)中的求和中排除,并以定点格式执行MAC操作。我们现在有意忽略偏差量化,因为偏差通常存储在较高的比特宽度(32比特)中,其比例因子取决于权重和激活的比例因子(Jacob等人,2018)。
图2显示了当我们引入量化时神经网络加速器的变化。在我们的示例中,我们使用INT8算术,但为了便于讨论,这可以是任何量化格式。重要的是保持累加器的较高比特宽度,典型的32比特宽。否则,由于计算过程中累积了更多产品,我们有可能因溢出而遭受损失。
存储在32位累加器中的激活需要写入存储器,然后才能由下一层使用。为了减少数据传输和下一层操作的复杂性,这些激活被量化回INT8。这需要一个重新量化步骤,如图2所示。
2.2均匀仿射量化
在本节中,我们定义了我们将在本文中使用的量化方案。这种方案被称为均匀量化,它是最常用的量化方案,因为它允许有效实现定点算法
均匀仿射量化,也称为非对称量化,由三个量化参数定义:比例因子s、零点z和比特宽度b。比例因子和零点用于将浮点值映射到整数网格,其大小取决于比特宽度。比例因子通常表示为浮点数,并指定量化器的步长。零点是一个整数,确保实零被量化而没有误差。这对于确保诸如零填充或ReLU之类的常见操作不会引起量化误差非常重要。
一旦定义了三个量化参数,我们就可以继续量化操作。从实值向量x开始,我们首先将其映射到无符号整数网格{0,…,2b− 1}:
其中,b·e是最近操作员的四舍五入,夹紧定义为:
为了近似实值输入x,我们执行反量化步骤:
结合上述两个步骤,我们可以提供量化函数q(·)的一般定义,如下:
通过反量化步骤,我们还可以定义量化网格限制(qmin,qmax),其中qmin=−sz和qmax=s(2b− 1.− z) 。位于该范围之外的任何x值都将被剪裁到其限制,从而导致剪裁错误。如果我们想要减少削波误差,我们可以通过增加比例因子来扩展量化范围。但是,增加比例因子会导致舍入误差增加,因为舍入误差在范围内− 在第3.1节中,我们将更详细地探讨如何选择量化参数,以实现削波和舍入误差之间的正确权衡。
2.2.1对称均匀量化
对称量化是一般非对称情况的简化形式。对称量化器将零点限制为0。这减少了等式(3)中累加操作期间处理零点偏移的计算开销。但是缺少偏移限制了整数域和浮点域之间的映射。因此,选择有符号或无符号整数网格很重要:
无符号对称量化非常适合单尾分布,如ReLU激活(见图3)。另一方面,可以选择符号对称量化用于关于零大致对称的分布。
2.2.2两个量化器的功率
二次方量化是对称量化的一种特殊情况,其中比例因子被限制为二次方,s=2−这种选择可以带来硬件效率,因为用s缩放对应于简单的位移位。然而,比例因子的有限表达可能会使舍入和限幅误差之间的权衡复杂化。
2.2.3量化粒度
到目前为止,我们已经为每个张量定义了一组量化参数(量化器),一个用于权重,一个用于激活,如等式(3)所示。这称为每张量量化。我们还可以为张量的各个段(例如,权重张量的输出通道)定义单独的量化器,从而增加量化粒度。在神经网络量化中,每张量量化是最常见的粒度选择,因为其硬件实现更简单:等式(3)中的所有累加器使用相同的比例因子swsx。然而,我们可以使用更精细的粒度来进一步提高性能。例如,对于权重张量,我们可以为每个输出通道指定不同的量化器。这称为按通道量化,其含义将在第2.4.2节中详细讨论。
其他工作超出了每通道量化参数,并对每组权重或激活应用单独的量化器(Rouhani等人,2020年;Stock等人,2019年;Nascimento等人2019年)。增加组的粒度通常以一些额外开销为代价来提高准确性。开销与累加器处理具有不同比例因子的值之和有关。大多数现有的定点加速器目前不支持这种逻辑,因此,我们将不在本工作中考虑它们。然而,随着这一领域的研究的增长,预计未来会有更多的硬件支持这些方法。
2.3量化模拟
为了测试神经网络在量化设备上的运行情况,我们通常在用于训练神经网络的通用硬件上模拟量化行为。这称为量化模拟。我们的目标是使用浮点硬件近似定点运算。与在实际量化硬件上运行实验或使用量化内核相比,这种模拟更容易实现。它们允许用户有效地测试各种量化选项,并使GPU加速进行量化感知训练,如第4节所述。在本节中,我们首先解释模拟过程的基本原理,然后讨论有助于减少模拟和实际设备性能之间差异的技术。
之前,我们了解了如何在专用定点硬件中计算矩阵向量乘法。在图4a中,我们将这个过程推广到卷积层,但我们还包括了一个激活函数,使其更为现实。在设备推断过程中,硬件的所有输入(偏差、权重和输入激活)均采用定点格式。然而,当我们使用通用深度学习框架和通用硬件模拟量化时,这些量是浮点的。这就是为什么我们在计算图中引入量化器块以产生量化效果。
图4b显示了如何在深度学习框架中建模相同的卷积层。量化器块被添加到权重和卷积之间以模拟权重量化,并且在激活函数之后以模拟激活量化。偏差通常不被量化,因为它以更高的精度存储。在第2.3.2节中,我们将更详细地讨论在非线性之后定位量化器的合适时间。量化器块实现等式(7)的量化函数,并且每个量化器由一组量化参数(比例因子、零点、比特宽度)定义。量化器的输入和输出均为浮点格式,但输出位于量化网格上。
2.3.1批量归一化折叠
批量归一化(Ioffe&Szegedy,2015)是现代卷积网络的标准组件。批量归一化在缩放和添加偏移之前对线性层的输出进行归一化(见等式9)。对于设备上推理,这些操作在称为批量归一化折叠的步骤中被折叠到前一个或下一个线性层中(Krishnamoorthi,2018;Jacob等人,2018)。这将从网络中完全删除批量归一化操作,因为计算被吸收到相邻的线性层中。除了减少额外缩放和偏移的计算开销之外,这还防止了额外的数据移动和层输出的量化。更正式地说,在推理期间,批量归一化被定义为输出x的仿射映射:
其中,µ和σ是训练期间计算的平均值和方差,作为批量统计的指数移动平均值,γ和β是每个通道的学习仿射超参数。如果在线性层y=BatchNorm(Wx)之后立即应用批量归一化,则我们可以重写这些项,以便批量归一化操作与线性层本身融合。假设权重矩阵W∈ 对于k={1,…,n},我们对每个输出yk应用批量归一化:
2.3.2激活功能融合
在第2.1节中介绍的朴素量化加速器中,我们看到激活的再量化发生在矩阵乘法或卷积输出值计算之后。然而,在实践中,我们通常在线性操作之后直接具有非线性。将线性层的激活写入内存,然后将其加载回计算核心以应用非线性,这将是浪费的。因此,许多硬件解决方案都带有一个硬件单元,在再量化步骤之前应用非线性。如果是这种情况,我们只需模拟非线性之后发生的再量化。例如,ReLU非线性很容易通过重新量化块建模,因为您可以将激活量化的最小可表示值设置为0。
其他更复杂的激活功能,如sigmoid或Swish(Ramachandran等人,2017年),需要更多的专用支持。如果此支持不可用,我们需要在图中非线性前后添加量化步长。这会对量化模型的准确性产生很大影响。尽管较新的激活(如Swish函数)可以提高浮点精度,但量化后这些激活可能会消失,或者在定点硬件上部署时效率较低。
2.3.3其他层和量化
神经网络中使用了许多其他类型的层。如何对这些进行建模在很大程度上取决于具体的硬件实现。有时,模拟量化和目标性能之间的不匹配是由于层没有被正确量化。这里,我们提供了一些关于如何模拟一些常用层的量化的指导:
最大池
不需要激活量化,因为输入和输出值位于同一量化网格上。
平均池
整数的平均值不一定是整数。因此,在平均池化之后需要量化步骤。然而,我们对输入和输出使用相同的量化器,因为量化范围没有显著变化。
逐元素加法
尽管其性质简单,但这种操作难以精确模拟。在加法期间,两个输入的量化范围必须精确匹配。如果这些范围不匹配,则需要格外小心,以使加法按预期工作。对此没有单一的可接受的解决方案,但添加再量化步骤可以粗略模拟添加的噪声。另一种方法是通过绑定输入的量化网格来优化网络。这将阻止再量化步骤,但可能需要微调。
拼接
被级联的两个分支通常不共享相同的量化参数。这意味着它们的量化网格可能不重叠,从而需要重新量化步骤。与按元素添加一样,可以优化网络,以便为连接的分支共享量化参数。
2.4实际考虑
当量化多层神经网络时,我们面临大量量化选择,包括量化方案、粒度和比特宽度。在本节中,我们将探讨有助于减少搜索空间的一些实际注意事项。
请注意,在本白皮书中,我们仅考虑均匀位宽。这意味着为权重或激活选择的比特宽度在所有层上保持不变。硬件更普遍地支持均匀位宽,但最近的一些工作也探索了异质位宽或混合精度的实现(van Baalen等人,2020;Dong等人,2019;Uhlich等人,2020)。
2.4.1对称与非对称量化
对于每个权重和激活量化,我们必须选择量化方案。一方面,非对称量化更具表现力,因为存在额外的偏移参数,但另一方面,存在可能的计算开销。要了解为什么会出现这种情况,请考虑当不对称权重Wc=sw(Wint−zw)乘以不对称激活xb=sx(xint− zx):
第一项是如果两个操作都是对称格式,我们会得到什么。第三项和第四项仅取决于预先已知的比例、偏移和权重值。因此,这两个项可以预先计算并添加到层的偏置项,几乎没有成本。然而,第二项取决于输入数据x。这意味着,对于每批数据,我们需要在推理期间计算一个附加项。这可能导致延迟和功率方面的显著开销,因为这相当于添加额外的通道。
因此,使用非对称激活量化和对称权重量化是一种常见的方法,以避免附加的数据相关项。
2.4.2每个张量和每个通道量化
在第2.2.3节中,我们讨论了不同级别的量化粒度。权重和激活的每张量量化已经成为标准,因为它受到所有定点加速器的支持。然而,权重的每通道量化可以提高精度,特别是当权重的分布在通道之间显著变化时。回顾等式(3)中的量化MAC操作,我们可以看到,通过应用单独的每通道权重比例因子,可以在加速器中实现每通道权重量化,而不需要重新缩放。激活的每通道量化更难实现,因为我们无法将比例因子从总和中去除,因此需要重新调整每个输入通道的累加器。尽管每通道权重量化越来越普遍,但并非所有商用硬件都支持它。因此,重要的是要检查在预期目标设备中是否可行。
3.训练后量化
训练后量化(PTQ)算法采用预训练的FP32网络,并将其直接转换为定点网络,而不需要原始训练流水线。这些方法可以是无数据的,或者可能需要小的校准集,这通常是容易获得的。此外,几乎没有超参数调整,使得它们可以通过单个API调用作为黑盒方法,以计算效率的方式量化预训练的神经网络。这使神经网络设计者不必成为量化方面的专家,从而允许神经网络量化的更广泛应用。
PTQ过程中的基本步骤是为每个量化器找到良好的量化范围。我们在第2.2节中简要讨论了量化范围的选择如何影响量化误差。在本节中,我们首先讨论在实践中用于找到良好量化参数的各种常用方法。然后,我们探讨了PTQ期间观察到的常见问题,并介绍了克服这些问题的最成功的技术。使用这些技术,我们提出了一个标准的训练后量化流水线,我们发现它在最常见的场景中工作得最好,最后,我们介绍了一组调试步骤,以提高量化模型的性能。
3.1量化范围设置
量化范围设置是指确定量化网格qmin和qmax的限幅阈值的方法(参见等式7)。范围设置中的关键权衡是第2.2节所述的削波和舍入误差,以及它们对配置的每个量化器的最终任务损失的影响。这里描述的每种方法都在两个数量之间提供了不同的权衡。这些方法通常优化局部成本函数,而不是任务损失。这是因为在PTQ中,我们的目标是计算快速的方法,而不需要端到端的训练。
权重通常可以量化而不需要任何校准数据。然而,确定激活量化的参数通常需要几批校准数据。
最小最大
为了覆盖张量的整个动态范围,我们可以定义量化参数如下
其中V表示要量化的张量。这不会导致剪切错误。然而,这种方法对异常值敏感,因为强异常值可能会导致过度舍入误差。
均方误差(MSE)
缓解大异常值问题的一种方法是使用基于MSE的范围设置。在该范围设置方法中,我们发现qmin和qmax使原始张量和量化张量之间的均方误差最小:
其中Vˆ(qmin,qmax)表示V的量化版本,k·kF是Frobenius范数。优化问题通常使用网格搜索、黄金分割法或具有封闭形式解的解析近似法来解决(Banner等人,2019)。文献中存在这种范围设置方法的几种变体,但它们在目标函数和优化方面都非常相似
交叉熵
对于某些层,被量化的张量中的所有值可能并不同等重要。一个这样的场景是分类网络最后一层中的Logit的量化,其中重要的是保持量化后最大值的顺序。MSE可能不是一个合适的度量标准,因为它对张量中的所有值进行相等的加权,而不管它们的顺序如何。对于大量的类,我们通常有大量对预测精度不重要的小的或负的logit,并且很少有大的值。在这种情况下,MSE将对几个较大的重要Logit产生较大的量化误差,同时试图减少人口较多的较小Logit的量化误差。在这种特定情况下,使以下交叉熵损失函数最小化是有益的
其中H(·,·)表示交叉熵函数,ψ是软最大函数,v是logits向量。
基于BN的范围设置
激活量化器的范围设置通常需要一些校准数据。如果层具有批量归一化激活,则激活的每通道平均值和标准偏差分别等于学习的批量归一化偏移和比例参数。然后可以使用这些参数来找到激活量化器的合适参数,如下所示(Nagel等人,2019):
其中,β和γ是每个通道学习的位移和标度参数的向量,α>0。Nagel等人(2019)使用α=6,因此仅限大的异常值。
比较
在表1中,我们比较了权重量化的范围设置方法。对于高比特宽度,MSE和最小-最大方法基本相同。然而,在较低比特宽度下,MSE方法明显优于最小-最大。在表2中,我们给出了激活量化的类似比较。我们注意到,最后一层的MSE结合交叉熵(表示为MSE+Xent)优于其他方法,尤其是在较低的比特宽度下。该表还清楚地证明了在最后一层使用交叉熵而不是MSE目标的好处。
3.2跨层均衡
量化误差的一个常见问题是相同张量中的元素可能具有显著不同的大小。如前一节所述,量化网格的范围设置试图在削波和舍入误差之间找到良好的折衷。不幸的是,在某些情况下,它们之间的幅度差异如此之大,以至于即使对于中等量化(例如,INT8),我们也无法找到合适的折衷。Nagel等人(2019年)表明,这在深度方向的可分离层中尤其普遍,因为每个输出特征只有少数权重,这可能导致权重的更高可变性。此外,他们指出,批量归一化折叠增加了这种效果,并可能导致连接到不同输出通道的权重之间的严重不平衡(见图5)。虽然后者对于更细粒度的量化粒度(例如,每通道量化)来说不是问题,但对于更广泛使用的pertensor量化来说,这仍然是一个大问题。一些论文(Krishnamoorthi,2018;Nagel等人,2019;Sheng等人,2018b)指出,具有深度可分离卷积的有效模型,如MobileNet V1(Howard等人,2017)和MobileNetV2(Sandler等人,2018),显示PTQ显著下降,甚至导致随机性能。
Nagel等人(2019)提出了一种解决方案,以克服这种不平衡,而无需使用每通道量化。Meller等人(2019)在并行工作中引入了类似的方法。在这两篇论文中,作者观察到,对于许多常见的激活函数(如ReLU、PreLU),正标度等效变量成立:
对于任何非负实数s,该等变量适用于任何一次齐次函数,并可通过缩放其参数化(例如ReLU6)扩展到适用于任何分段线性函数。我们可以在神经网络的连续层中利用这种正尺度等变。给定两层,h=f(W(1)x+b(1))和y=f(W(2)h+b(2)),通过标度等变,我们得到:
其中S=diag(S)是一个对角矩阵,值Sii表示神经元i的比例因子si。这允许我们用Wf(2)=W(2)S,Wf(1)=S重新参数化我们的模型−1W(1)和be(1)=S−1b(1)。在CNN的情况下,缩放将为每个通道,并相应地在空间维度上广播。我们在图6中说明了这种重新缩放过程。为了使模型对量化更具鲁棒性,我们可以找到一个缩放因子si,以使重新缩放层中的量化噪声最小。跨层均衡(CLE)程序(Nagel等人,2019)通过均衡连续层的动态范围来实现这一点。它们证明了通过设置S实现最佳权重均衡,使得:
其中,r(j)i是加权张量j的通道i的动态范围。Meller等人(2019)的算法引入了类似的比例因子,也考虑了中间激活张量。然而,他们没有这种方法的最佳性证明。
吸收高偏置
Nagel等人(2019年)进一步注意到,在某些情况下,特别是在CLE之后,高偏置可能导致激活动态范围的差异。因此,他们提出了一种程序,如果可能的话,将高偏置吸收到下一层。为了将c从第一层(随后是ReLU激活函数f)吸收到第二层,我们可以进行以下重新参数化:
其中be(2)=W(2)c+b(2),he=h− c、 且be(1)=b(1)− c、 在第二步中,我们使用这样一个事实:对于具有ReLU函数f的层,存在一个非负向量c,使得r(Wx+b− c) =r(Wx+b)− c、 平凡解c=0适用于所有x。然而,取决于x的分布以及W和b的值,可能存在一些值ci>0,该等式适用于经验分布中的(几乎)所有x。该值等于
其中在小校准数据集上评估minx。为了消除对数据的依赖性,作者建议通过批量归一化层的移位和尺度参数估计(24)的右侧,这导致ci=max(0,βi− γi)。
实验
在表3中,我们演示了CLE和偏置吸收对将MobileNetV2量化为8位的影响。由于跳跃连接打破了层之间的等效差异,我们仅对每个剩余块内的层应用跨层均衡。类似于Krishnamoorthi(2018),我们观察到,当将MobileNetV2量化为INT8时,模型性能接近随机。应用CLE使我们回到FP32性能的2%以内,接近每通道量化的性能。我们注意到,吸收高偏置会导致FP32性能的小幅下降,因为这是一个近似值,但由于更精确的激活量化,它将量化性能提高了1%。CLE和偏置吸收加上每张量量化产生比每通道量化更好的结果。
3.3偏差校正
另一个常见的问题是量化误差通常是有偏差的。这意味着原始和量化层或网络的预期输出被移位(E[Wx]6=E h Wx c i)。这种错误在每个输出通道只有几个元素的深度可分离层中更为明显(对于3×3内核通常为9)。这种错误的主要原因通常是剪裁错误,因为一些强烈剪裁的异常值可能会导致预期分布的变化。
一些论文(Nagel等人,2019年;Meller等人,2018年;Finkelstein等人,2019年)指出了这一问题,并介绍了纠正分布预期变化的方法。对于具有量化误差的量化层Wc:∆W=Wc− W、 预期产出分布为:
因此,偏置误差由E给出[∆Wx]。自从∆W是常数,我们有[∆Wx]=∆我们[x]。万一∆如果WE[x]为非零,则输出分布发生偏移。为了抵消这种变化,我们可以从输出中减去它:
注意,该校正项是具有与偏置相同形状的向量,因此可以吸收到偏置中,而无需在推断时的任何额外开销。有几种计算偏差校正项的方法,其中最常见的两种是经验偏差校正和分析偏差校正。
经验偏差校正
如果我们可以访问校准数据集,则可以通过比较量化和全精度模型的激活来简单地计算偏差校正项。实际上,这可以通过计算逐层完成
分析偏差校正
Nagel等人(2019)介绍了一种分析计算偏差误差的方法,无需数据。对于具有批量归一化和ReLU函数的公共网络,它们使用前一层的BN统计,以计算预期输入分布E[x]。BN参数γ和β对应于BN层输出的平均值和标准差。假设输入值是正态分布的,可以使用截取正态分布来模拟ReLU对分布的影响。他们表明
其中x pre是预激活输出,假设其正态分布,具有过扫描平均值β和每通道标准偏差γ,Φ(·)是标准正态CDF,符号N(x)用于表示标准正态PDF。注意,所有向量操作都是元素(每个通道)操作。在计算输入分布E[x]之后,可以通过将其与加权量化误差相乘来简单地导出校正项∆W
实验
在表4中,我们演示了将MobileNetV2量化为8位的偏置校正效果。应用分析偏差校正将量化模型性能从随机提高到50%以上,这表明量化引入的偏差误差显著损害模型性能。当将偏差校正与CLE相结合时,我们发现这两种技术是互补的。它们一起实现了接近FP32的性能,而无需使用任何数据。
3.4 AdaRound
神经网络权重通常通过将每个FP32值投影到最近的量化网格点来量化,如等式(4)中的b·e所示,用于均匀量化网格。我们将这种量化策略称为舍入到最近值。舍入到最近策略的动机是,对于固定量化网格,它在浮点和量化权重之间产生最小均方误差。然而,Nagel等人(2020年)表明,在训练后制度中量化权重时,四舍五入到最近值并不是最佳的任务损失。为了说明这一点,作者使用100个不同的随机舍入样本(Gupta等人,2015)将ResNet18的第一层的权重量化为4比特,并评估了每个舍入选择的网络性能。其中最好的四舍五入选择比最接近的四舍四入高出10%以上。图7通过在y轴上绘制这些舍入选项的性能来说明这一点。在本节中,我们描述了AdaRound(Nagel等人,2020),这是一种为PTQ寻找良好权重舍入选择的系统方法。AdaRound是一种理论基础良好、计算效率高的方法,在实践中表现出显著的性能改进。
由于主要目标是将量化对最终任务损失的影响降至最低,因此我们首先根据此损失制定优化问题
哪里∆w表示由于量化引起的扰动,并且可以为每个权重取两个可能的值,一个通过向上舍入权重,另一个通过向下舍入权重。我们希望有效地解决这个二元优化问题。作为第一步,我们使用二阶泰勒级数展开来近似成本函数。这减轻了在优化期间对每个新舍入选择进行性能评估的需要。我们进一步假设模型已经收敛,这意味着可以忽略近似中梯度项的贡献,并且Hessian是块对角的,忽略了跨层相关性。这导致了以下基于Hessian的二次无约束二元优化(QUBO)问题:
图7中等式(30)的验证精度和目标之间的明确相关性表明,后者可以很好地代表任务损失(等式29),即使是4位权重量化。尽管性能有所提高(见表5),但等式(30)不能广泛应用于重量四舍五入,主要原因有两个:
•计算Hessian的内存和计算复杂性对于一般用例来说是不切实际的
•等式(30)的QUBO问题是NP难问题。
为了解决第一个问题,作者引入了额外的适当假设,允许将等式(30)的目标简化为以下局部优化问题,该问题最小化了层输出激活的MSE
等式(31)既不需要计算Hessian,也不需要来自后续层的任何其他反向或正向传播信息。注意,用于将等式(30)的QUBO问题与等式(31)的局部优化问题联系起来的近似和分析独立于舍入问题。因此,该分析也有利于其他问题的算法设计,包括模型压缩和NAS(Moons等人,2020)。
(31)的优化仍然是一个NP难优化问题。为了找到具有合理计算复杂度的良好近似解,作者将优化问题放松为以下连续优化问题
其中k·k2,F表示Frobenius范数,Wf是软量化权重,定义如下:
我们使用n和p表示整数网格限制,n=qmin/s和p=qmax/s。Vi,j是我们优化的连续变量,h可以是值在0和1之间的任何单调函数,即h(Vi,j)∈ [0, 1]. 在Nagel等人(2020)中,作者使用校正的S形线作为h。第(32)项的目标还引入了正则化项,该正则化项鼓励连续优化变量h(Vi,j)收敛到0或1,因此它们是(31)中离散优化的有效解。Nagel等人(2020)中使用的正则化子为:
其中,在优化过程中对β进行退火,最初允许h(Vi,j)自由移动,随后迫使它们收敛到0或1。为了避免神经网络各层之间的误差累积,并考虑非线性,作者提出以下最终优化问题:
其中ˆx是层的输入,所有前面的层都被量化,fa是激活函数。可以使用随机梯度下降有效地优化(35)的目标。这种优化权重舍入的方法称为AdaRound。
总之,在量化操作期间,我们对权重进行舍入的方式对网络的性能有显著影响。AdaRound提供了一种理论上可靠、计算速度快的权重舍入方法。它只需要少量未标记的数据样本,不需要超参数调整或端到端微调,并且可以应用于任何神经网络的完全连接和卷积层。
3.5标准PTQ管道
在本节中,我们基于相关文献和大量实验,提出了PTQ的最佳实践管道。我们在图8中说明了推荐的管道。该管道为许多计算机视觉以及自然语言处理模型和任务实现了具有竞争力的PTQ结果。根据模型,可能不需要某些步骤,或者其他选择可能导致相同或更好的性能。
跨层均衡
首先,我们应用跨层均衡(CLE),这是全精度模型的预处理步骤,以使其更便于量化。CLE对于具有深度可分离层的模型和每张量量化特别重要,但它通常也显示了对其他层和量化选择的改进。
添加量化器
接下来,我们选择量化器并在网络中添加量化操作,如第2.3节所述。量化器的选择可能取决于特定的目标HW;对于常见的人工智能加速器,我们建议使用对称量化器进行加权,使用不对称量化器进行激活。如果由HW/SW堆栈支持,则对于权重使用每通道量化是有利的。
重量范围设置
为了设置所有权重张量的量化参数,我们建议使用基于分层MSE的标准。在每通道量化的特定情况下,在某些情况下,使用最小-最大方法可能是有利的。
AdaRound
如果我们有一个小的校准数据集4可用,我们接下来应用AdaRound以优化权重的舍入。该步骤对于在PTQ中实现低比特权重量化(例如4比特)是至关重要的。
偏差校正
如果我们没有这样的校准数据集,并且网络使用批量归一化,我们可以使用分析偏差校正。
激活范围设置
作为最后一步,我们确定网络中所有数据相关张量的量化范围(即激活)。我们对大多数层使用基于MSE的标准,这需要一个小的校准集来找到最小MSE损失。或者,我们可以使用基于BN的范围设置来实现完全无数据的管道
3.6实验
我们现在评估上述PTQ流水线在普通计算机视觉和自然语言理解应用中的性能。我们的结果总结在表6中。对于语义分割任务,我们在Pascal VOC上评估了DeepLabV3(具有MobileNetV2主干)(Chen等人,2017年),在COCO 2017上评估了目标检测和EfficientDet(Tan等人,2020年)。其他计算机视觉模型在ImageNet分类基准上评估。对于自然语言理解,我们基于GLUE基准评估了BERT(Wang等人,2018)。
在所有情况下,我们观察到,与所有模型的浮点相比,权重和激活的8位量化(W8A8)仅导致边际精度损失(0.7%以内)。对于W8A8量化,我们还看到使用每通道量化没有显著的增益。然而,当权重被量化为4比特(W4A8)时,图像改变。对于ResNet18/50和InceptionV3,每张量和每通道量化的精度下降仍然在浮点的1%以内。然而,对于更高效的网络,如MobileNet V2和EfficientNet lite,每张量量化的下降分别增加到2.5%和4.2%。这可能是由于深度方向可分离卷积的量化。这里,每通道量化可以显示出显著的优势,例如,在EfficientNet lite中,与每张量量化相比,每通道的量化将精度提高2.8%,使其在全精度精度的1.4%以内。我们在EfficientDet-D1和DeeplabV3中看到了类似的效果,它们都在主干中使用深度方向可分离卷积。
对于BERT基,我们观察到一些激活张量在其动态范围中存在极大差异。为了使PTQ仍然工作,我们使用第3.7节中概述的调试过程确定了这些层,并将它们保持在16位。除此之外,BERT base与大多数其他模型的趋势相似,我们的PTQ流水线允许4位权重量化,在GLUE分数下降1.5%以内。
3.7调试
我们表明,标准PTQ管道可以在广泛的模型和网络中实现竞争结果。然而,如果在遵循管道步骤后,模型的性能仍然不令人满意,我们建议采用一组诊断步骤来识别瓶颈并提高性能。虽然这不是严格意义上的算法,但这些调试步骤可以提供量化模型性能不佳的原因,并有助于解决潜在问题。这些步骤如图9中的流程图所示,并在下面进行更详细的描述:
FP32健康检查
一个重要的初始调试步骤是确保浮点和量化模型在前向通道中表现相似,特别是在使用自定义量化管道时。对于权重和激活,将量化模型位宽度设置为32位,或者如果可能,绕过量化操作,并检查精度是否与FP32模型的精度匹配。
权重或激活量化
下一个调试步骤是确定激活或权重量化如何独立影响性能。如果所有权重量化为较高的比特宽度,而激活保持在较低的比特宽度中,或者相反,如果所有激活使用高比特宽度,激活使用低比特宽度,性能会恢复吗?这一步可以显示激活和权重量化对整体性能下降的相对贡献,并为我们找到合适的解决方案。
固定权重量化
如果上一步显示权重量化确实导致显著的精度下降,则有几种解决方案可供尝试:
•如果尚未实施,则应用CLE,特别是对于具有深度可分离卷积的模型。
•尝试每通道量化。这将解决每个通道权重分布不均匀的问题。
•如果校准数据可用,应用偏差校正或AdaRound。
固定激活量化
为了减少激活量化的量化误差,我们还可以尝试使用不同的范围设置方法或调整CLE以将激活量化范围考虑在内,因为香草CLE可能导致不均匀的激活分布。
每层分析
如果全局解没有将精度恢复到可接受的水平,我们将分别考虑每个量化器。我们将每个量化器依次设置为目标比特宽度,同时将网络的其余部分保持为32比特(参见图9中的内部for循环)。
可视化层
如果单个张量的量化导致显著的精度下降,我们建议在不同粒度(如图5所示的每个通道)和维度(如BERT中激活的每个标记或每个嵌入)下可视化张量分布。
固定单个量化器
可视化步骤可以揭示张量对量化的敏感性的来源。一些常见的解决方案涉及此量化器的自定义范围设置,或允许有问题的量化器具有更高的比特宽度,例如,表6中的BERT基数。如果问题得到解决,并且精度恢复,我们将继续下一个量化器。否则,我们可能不得不求助于其他方法,如第4节中讨论的量化感知训练(QAT)。
完成上述步骤后,最后一步是将完整模型量化为所需的比特宽度。如果精度可以接受,我们就可以使用最终的量化模型。否则,我们可以考虑更高的比特宽度和更小的粒度,或者恢复到更强大的量化方法,如量化感知训练。
4量化感知训练
上一节中描述的训练后量化技术是我们量化工具包中的第一个工具。它们非常有效且实现快速,因为它们不需要使用标记数据重新训练网络。然而,它们有局限性,特别是当目标是激活的低比特量化时,如4比特及以下。后训练技术可能不足以减轻由低比特量化引起的大量化误差。在这些情况下,我们采用量化感知训练(QAT)。QAT对训练期间的量化噪声源(见第2.3节)进行建模。这允许模型找到比训练后量化更多的最优解。然而,更高的精度伴随着神经网络训练的通常成本,即更长的训练时间、需要标记数据和超参数搜索。
在本节中,我们将探讨反向传播如何在模拟量化的网络中工作,并为有效使用QAT的训练模型提供标准管道。我们还将讨论QAT中的批量归一化折叠和每通道量化的含义,并为广泛的任务和模型提供结果。
4.1模拟后向路径的量化
在第2.3节中,我们了解了如何在深度学习框架中使用浮点来模拟量化。然而,如果我们查看图4的计算图,为了训练这样的网络,我们需要通过模拟量化器块反向传播。这引起了一个问题,因为等式(4)中最接近运算的圆的梯度在任何地方都是零或未定义的,这使得基于梯度的训练不可能。一种方法是使用直通估计器近似梯度(STE,Bengio等人,2013),该估计器将舍入算子的梯度近似为1:
使用该近似,我们现在可以从等式(7)计算量化操作的梯度。为了清楚起见,我们假设对称量化,即z=0,但由于零点是常数,因此同样的结果适用于非对称量化。我们使用n和p来定义整数网格限制,例如n=qmin/s和p=qmax/s。方程(7)w.r.t的梯度及其输入xi由以下公式得出:
使用这个梯度定义,我们现在可以通过量化块反向传播。图10显示了量化感知训练中使用的前向和后向通道的简单计算图。前向通道与图4相同,但在后向通道中,由于STE假设,我们有效地跳过了量化器块。在早期的QAT工作中,量化范围
对于权重和激活,在每次迭代中更新,最常用的是使用最小-最大范围(Krishnamoorthi,2018)。在后来的工作中(Esser等人,2020;Jain等人,2019;Bhalgat等人,2020),使用STE计算梯度w.r.t。量化参数z和s。使用链式规则和STE,我们首先计算梯度w.r.t.比例因子:
最初,我们将零点限制为整数。为了使零点可学习,我们将其转换为实数并应用舍入运算符。修改的量化函数定义为:
通过再次将STE应用于舍入算子来计算从w.r.t到z的梯度:
4.2批量归一化、折叠和QAT
在第2.3.1节中,我们引入了批量归一化折叠,它吸收了线性层中的缩放和添加,以允许更有效的推断。在量化感知训练过程中,我们希望密切模拟推理行为,这就是为什么我们必须在训练过程中考虑BN折叠。注意,在一些QAT文献中,BN折叠效应被忽略。当我们采用每通道量化时,这是很好的(本节将在下文中详细介绍),保持每张量量化的BN展开将导致以下两种情况之一:
1.BN层在推断期间应用每通道重缩放。在这种情况下,我们最好首先使用每通道量化。
2.我们在部署期间将BN折叠到权重张量中,并且在我们训练网络以适应不同的量化噪声时导致潜在的显著精度下降。
在QAT中建模BN折叠的一种简单但有效的方法是静态地将BN尺度和偏移折叠成线性层的权重和偏移,如我们在等式(11)和(12)中看到的。这对应于权重的重新参数化,并有效地从网络中完全去除批量归一化操作。当从收敛的预训练模型开始时,静态折叠非常有效,如表7的结果所示。
Jacob等人(2018)提出的另一种方法更新了QAT期间的运行统计数据,并使用校正应用BN折叠。这种方法更麻烦,计算成本更高,因为它涉及双前向传递:一个用于批量统计,另一个用于量化线性运算。然而,根据我们的实验(见表7),静态折叠性能相当或更好,尽管其简单。
每通道量化
在第2.4.2节中,我们提到,当硬件支持时,加权的每通道量化可以提高精度。静态折叠重新参数化对于每个通道量化也是有效的。然而,每通道量化提供了额外的灵活性,因为它允许我们将批量归一化缩放操作吸收到每通道缩放因子中。让我们通过重温第2.3.1节中的BN折叠方程来了解这是如何可能的,但这次引入了权重的每通道量化,使得Wck,:=q(Wk,:;sw,k)=sw,kWint k,:。通过对类似于方程(10)的线性层的输出应用批量归一化,我们得到:
我们可以看到,现在可以将批量归一化缩放参数吸收到每通道缩放因子中。对于QAT,这意味着我们可以在训练期间保持BN层的完整性,然后将BN缩放因子合并到每个通道量化参数中。在实践中,与静态折叠相比,这种建模方法与每通道量化相当或更好,正如我们从表7的最后两行中看到的。
4.3 QAT的初始化
在本节中,我们将探讨初始化对QAT的影响。文献中的常见做法是从预训练的FP32模型开始(Esser等人,2020年;Krishnamoorthi,2018年;Jacob等人,2018年,Jain等人,2019年)。显然,从FP32模型开始是有益的,但量化初始化对最终QAT结果的影响研究较少。在这里,我们探讨了在进行QAT之前使用几种PTQ技术作为初始步骤的效果。
距离估计的影响
为了评估初始范围设置(见第3.1节)对权重和激活的影响,我们进行了两组实验,如表8所示。在第一个实验中,我们将权重量化为4位,并将激活保持在8位。对于权重量化范围,我们将最小-最大初始化与基于MSE的初始化进行比较。虽然MSE初始化模型具有显著更高的启动精度,但在20个周期的训练后,差距缩小。
为了探索激活量化的相同效果,我们进行了类似的实验,现在将激活量化为4位,并将最小-最大初始化与基于MSE的初始化进行比较。重量范围初始化的观察结果也适用于此。在图11中,我们显示了本实验的完整训练曲线。在前几个阶段,使用MSE初始化具有显著的优势,这在训练的后期几乎消失。总之,更好的初始化可以导致更好的QAT结果,但增益通常很小,并且随着训练时间的延长而消失
CLE效应
在表9中,我们比较了其他PTQ改进的效果,如CLE和偏差校正。而对于ResNet18,我们没有看到最终QAT性能的显著差异,对于MobileNetV2,我们观察到没有CLE,它无法训练。这可能是由于每张量量化导致的灾难性性能下降,我们在第3.2节中讨论了这一点。总之,对于具有普通PTQ严重问题的模型,我们可能需要高级PTQ技术,如CLE来初始化QAT。在大多数其他情况下,改进的PTQ初始化仅导致最终QAT性能的微小改进。
4.4标准QAT管道
在本节中,我们基于相关文献和大量实验,提出了QAT的最佳实践管道。我们在图12中说明了推荐的流水线。该流水线在各种计算机视觉和自然语言处理模型和任务上产生了良好的QAT结果,可以被视为实现低比特量化性能的工具。如前几节所述,我们总是从预训练的模型开始,并遵循一些PTQ步骤,以便更快地收敛和更高的精度。
跨层均衡
与PTQ类似,我们首先将CLE应用于全精度模型。正如我们在表9中看到的,这一步骤对于遭受不平衡权重分布的模型(如MobileNet架构)是必要的。对于其他网络或在过扫描量化的情况下,该步骤可以是可选的。
添加量化器
接下来,如第2.3节所述,我们选择量化器并在网络中添加量化操作。量化器的选择可能取决于特定的目标HW。对于常见的AI加速器,我们建议使用对称量化器进行权重,使用不对称量化器进行激活。如果由HW/SW堆栈支持,则对于权重使用每通道量化是有利的。在这一阶段,我们还将注意批量归一化的模拟是否正确,如第4.2节所述。
距离估计
在训练之前,我们必须初始化所有量化参数。更好的初始化将有助于更快的训练,并可能提高最终精度,但通常改进很小(见表8)。通常,我们建议使用基于分层MSE的标准设置所有量化参数。在每通道量化的特定情况下,使用最小-最大设置有时是有利的。
可学习量化参数
我们建议使量化器参数可学习,如第4.1节所述。直接学习量化参数,而不是在每个历元更新它们,会导致更高的性能,尤其是在处理低比特量化时。然而,在为任务设置优化器时,使用可学习量化器需要特别小心。当使用SGD型优化器时,与其他网络参数相比,量化参数的学习速率需要降低。如果我们使用具有自适应学习率的优化器,如Adam或RMSProp,则可以避免学习率调整。
4.5实验
使用我们的QAT流水线,我们量化和评估了我们在第3.6节中用于PTQ的相同模型。对于不同的比特宽度和量化粒度,我们的结果如表10所示。DeepLabV3在Pascal VOC上训练80个周期;COCO 2017上20个epoch的有效性测试;所有其他视觉模型在ImageNet上训练20个时期。根据任务和量化粒度,在每个相应的粘合任务上训练3到12个周期的BERT基。我们对所有模型使用Adam优化器。我们以每个量化配置的最佳学习速率呈现结果,并且不执行进一步的超参数调整。
我们观察到,对于没有深度可分离卷积的网络(表10的前3行),W8A8和W4A8量化在某些情况下与浮点模型相当,甚至优于浮点模型。这可能是由于量化噪声训练的正则化效应或由于QAT期间的额外微调。对于更积极的W4A4情况,我们注意到一个小的下降,但仍然在浮点精度的1%以内。
量化具有深度可分离层的网络(MobileNet v2、EfficientNet-lite、DeeplabV3、EffcientDet-D1)更具挑战性;我们还从第3.6节的PTQ结果中观察到了一种趋势,并在文献中进行了讨论(Chin等人,2020;Sheng等人,2018a)。虽然8位量化几乎不会导致精度下降,但将权重量化为4位会导致更大的下降,例如,对于每张量量化的EfficientNet lite,大约下降4%。每通道量化可以显著提高性能,使DeepLabV3达到浮点精度,并将MobileNet v2和EfficientNet lite之间的差距缩小到1.5%以下。对这种网络来说,将权重和激活量化为4比特仍然是一个挑战,即使采用每通道量化,也可能导致下降高达5%。EfficientDet-D1仍然比该组中的其他网络更难以量化。
对于BERT基础,我们观察到具有范围学习的QAT可以有效地处理高动态范围,允许将所有激活保持在8位(与PTQ不同)。W4A8保持在原始GLUE分数的1%以内,表明低比特权重量化对于变压器模型不是问题。我们只注意到当将其与低比特激活量化(W4A4)相结合时性能显著下降。
5.总结和结论
深度学习已成为许多机器学习应用程序的组成部分,现在可以在无数电子设备和服务中找到,从智能手机和家用电器到无人机、机器人和自动驾驶汽车。随着深度学习在日常生活中的普及和普及,对快速高效的神经网络推理的需求也在增加。神经网络量化是减少推理过程中神经网络能量和延迟需求的最有效方法之一。
量化允许我们从浮点表示移到定点格式,并与利用高效定点运算的专用硬件相结合,有可能实现显著的功率增益和加速推理。然而,为了利用这些节省,我们需要稳健的量化方法,可以保持高精度,同时减少权重和激活的比特宽度。为此,我们考虑两类主要的量化算法:训练后量化(PTQ)和量化感知训练(QAT)。
训练后量化技术采用预训练的FP32网络,并将其转换为不需要原始训练流水线的定点网络。这使得它们成为一种轻量级的按钮式量化方法,具有较低的工程工作量和计算成本。我们描述了PTQ的一系列最新进展,并介绍了一种PTQ管道,该管道可在广泛的模型和机器学习任务中获得接近浮点精度的结果。特别是,使用所提出的流水线,我们可以在所有网络的浮点精度仅为1%的范围内实现权重和激活的8位量化。我们进一步表明,许多网络甚至可以量化为4比特权重,而性能只会有很小的额外下降。此外,我们引入了一个调试工作流,以有效地识别和修复量化新网络时可能出现的问题。
量化感知训练通过模拟量化操作对训练期间的量化噪声建模。该训练过程允许与PTQ相比找到更好的解决方案,同时实现更有效和更积极的激活量化。与PTQ类似,我们引入了一个标准的训练管道,利用该领域的最新算法。我们还特别关注QAT期间的批量归一化折叠,并表明简单静态折叠优于其他计算成本更高的方法。我们证明,使用我们的QAT流水线,我们可以实现4位权重量化,对于某些模型,甚至是4位激活,与浮点相比,精度只有很小的下降。
PTQ和QAT之间的选择取决于应用的精度和功率要求。这两种方法都是任何模型效率工具包的重要组成部分,我们希望我们提出的管道将帮助工程师以更少的时间和精力部署高性能量化模型。