一、摘要
我们提出了一种使用标准反向传播和梯度下降的均匀对称量化器训练量化阈值(TQT)的方法。与先前的工作相反,我们表明,对阈值梯度的直通估计器的仔细分析允许自然的范围-精度权衡,导致更好的优化。我们提出了对我们方法的一般稳健性的分析支持,并在ImageNet分类的各种CNN上对其进行了经验验证。我们能够在传统的困难网络(如MobileNets)上实现ear-floating-point的准确度,而量化(8位)的再训练不到5个epochs。最后,我们提出了Graffitist,一个能够对TQT的TensorFlow图进行自动量化的框架。
三、方法
虽然仿射量化器可以将浮点值直接映射到整数上(不需要lookuptables),但是由于要对零点和实值标度因子进行特殊处理,所以会增加成本,如附录A所示。为了实现高效的定点运算,我们将量化方案限制为使用
1、量化器限制
- Symmetric
设置z=0对称量化 - Per-tensor scaling
一个给定的权重或激活张量中的所有元素都用一个标度因子进行量化。 虽然对具有深度对话的网络(如MobileNets)使用每通道缩放是常见的做法,但我们发现每张量缩放与8位TQT相结合是足够的。 - Power-of-2 scaling
缩放因子被限制在2-f的形式(其中f是一个整数,表示小数长度;f可以是正数或负数)。
2、线性量化器 --- 前向
张量x的量化函数q(x;s)仅由它的标度因子确定,它取决于张量2的阈值和位宽。q(x;s)通过应用四个明智的点操作(按顺序)来执行量化:缩放、圆整、饱和和去量化。
- Scale
张量元素被缩放,使大于原始阈值的最低2次方(即2dlog2(t)e,其中edenotes ceil3)被映射到量化域中支持的最大值(即2b-1,如果有符号,或2b,如果无符号)。 - Round
使用庄家四舍五入(四舍五入到偶数),将缩放的张量元素四舍五入到最接近的整数,用b.e表示。 - Saturate
一旦经过缩放和四舍五入,张量中超过量化道主的最大支持值的元素将被剪除:clip(x;n,p) =min(max(x,n),p)。由于我们将剪裁应用于缩放的张量,剪裁限制(n,p)与实际界限无关。有符号张量被剪切到(-2b-1,2b-1-1),无符号张量被剪切到(0,2b-1)。 -
De-quant
最后一步是撤销缩放步骤。因此,我们模拟了量化的效果,同时保留了输入张量的原始尺度。
image.png
3、线性量化器 --- 后向
为了用梯度下降法训练量化网工作的权重和阈值,我们得出量化器q(x;s)相对于输入x和标度因子的局部梯度。
- 我们小心翼翼地使用STE将round/ceil的梯度近似为1,而不是在后向传递中将round/ceil近似为身份。
-
相对于scale factor的梯度为
image.png
4、梯度的解释
为了定性地理解阈值梯度∇(log2t)q(x;s)和输入梯度∇xq(x;s)在反向传播过程中的作用,让我们考虑以下玩具问题:一个使用最小平方误差损失L=(q(x;s)-x)2/2优化的单一量化器。
image.png
图1显示了我们量化器的前向和后向传递曲线。如前所述,实域的精确剪切阈值为xn=s-(n-0.5)和xp=s-(p+ 0.5)
- 阈值梯度
从图2中∇(log2t)Lvs.x的图中可以看出,阈值梯度对于在削波阈值(xn,xp)内的x是正的,否则是负的。 当大部分输入分布4落在(xn,xp)内时,累积阈值梯度是正的,导致log2t下降5。 换句话说,lim-its(xn,xp)被拉向内侧,有利于更大的精度。
同样,当大部分输入分布落在(xn,xp)之外时,累积阈值梯度为负,log2增加,极限(xn,xp)被向外推,有利于更大的动态范围。 这种技术通过基于梯度的优化实现范围与精度的权衡,对具有长尾的分布或异常值具有天然的稳健性。 - 输入梯度
使用类似于阈值梯度的分析,我们看到输入梯度∇xL对于落在(xn,xp)之外的x值是零的,偏向于防止它们被剪掉。这促使权重和激活分布更加紧密。
总而言之,阈值梯度有助于训练最佳阈值,以剪切权重和激活,而输入梯度则将权重和激活推向更严格的界限。通过反向传播同时训练剪切阈值和量化网络的权重,我们采用联合(相互)优化全局损失
5、与剪切的阈值梯度的比较
相比之下,某些量化器的实现通过简单地剪切饱和阈值的上游梯度来定义阈值-年龄梯度。 例如,TensorFlow的FakeQuant(用于QAT)将阈值的梯度定义为一个剪辑函数
在前向传递中,FakeQuant操作(TensorFlow,2016a)在数学上等同于我们的表述(除零点外),定义为
image.png
然而,在后向传递中,他们将(11)中的圆形函数视为同一性,将(11)还原为具有剪切梯度的剪切函数。 也就是说,相对于阈值(n,p)的梯度在(n,p)内的x被琐碎地剪切为零,正如图3中FakeQuant的转移曲线和它的内核定义(TensorFlow, 2016b)所见。因此,整体梯度只向外推动极限(n,p),训练到输入分布的最小/最大,并且严格偏向于范围而不是精度。我们相信这种行为可以被纠正,以允许有效的范围-精度权衡,如图2中的玩具L2模型,通过仔细使用STE,使∂xbxe=1,但bxe6=xin的后向通道。虽然实际的损失情况并不复杂,但我们在第 5.3 节中观察到与我们的玩具 L2 模型类似的定性行为。
另一个流行的剪切阈值方法(适用于ReLU激活)是PACT,它的行为与TensorFlow的FakeQuant相似。从(1)中可以看出,相对于剪切阈值α的梯度取值为0或1,取决于量化器输入x是在α的左边还是右边。这就导致了α倾向于训练到x分布的最大极限。为了消除这种趋势,在损失函数中应用了一个关于α的大小的正则器。 然而,这需要一个额外的参数λα来手动调整,并且对损失景观或量化位宽没有认识。
四、TQT的形式化表述
我们发布了Graffitist6,这是一个建立在TensorFlow之上的端到端软件栈,使用TQT对深度神经网络(DNN)进行量化和再训练,以便在定点硬件上进行精确和高效的推断。从根本上说,Graffitist是一个灵活的、可扩展的框架,用于处理DNN的低级图形描述,包括一个(不断增长的)变换库,以实现各种神经网络的优化。每个图形变换由独特的模式匹配和操作算法组成,当顺序运行时产生一个优化的输出图形。它仍然处于实验阶段,我们将继续增加对更多操作类型、层拓扑结构、网络风格、图形优化和压缩技术的支持。Graffitist站在巨人的肩膀上,其界面的灵感部分来自TensorFlow的早期工具。
1、图优化
Graffitist在量化之前对输入图进行了若干优化。例如,将批量归一化层折叠到前面的卷积或全连接或深度卷积层的权重中。我们采用(Jacob等人,2017;Krish-namoorthi,2018;TensorFlow,2017a)的以下最佳做法。 (a) 确保训练和推理图中的折叠批次规范在数学上是等同的(即。训练期间看到的分布与推理期间的分布相匹配);(b)应用批量规范修正,在批量和移动平均统计之间切换,以减少因批量更新不稳定而导致的训练折叠权重的抖动;(c)在收敛后冻结批量规范移动平均和变量更新以提高准确性。 其他优化包括将concat层的并集折叠成单一的并集,将不涉及控制边的身份节点进行拼接,将平均池层转化为以reciprocal7multiplier为权重的纵深conv层,以及明确合并输入规模以进行规模保护操作,如concat、bias-add、eltwise-add和maximum(用于leakyrelu)。
2、量化模式
Graffitist允许在静态或再训练模式下进行量化。
- 静态模式
量化阈值(因此是比例因子)是根据来自校准数据集的权重和激活的统计数据来确定的。具体来说,权重阈值(每个张量)被设置为最大的绝对值(表2),激活阈值(每个张量)被选择为使每个量化层的对称Kullback-Leibler-J距离最小(D'Alberto & Dasdan, 2009)。这是按严格的拓扑顺序进行的,以确保在量化当前层之前,对某一层的输入进行量化(和固定)。 整个优化和校准过程是自动化的,只需要对Graffitist进行一次API调用。 - 重训练模式
量化阈值和权重是根据全局损失同时训练的。在TQT重新训练的5个 epochs内实现恢复。这需要对Graffitist进行两个独立的API调用--首先是生成一个量化训练图,可以在GPU上用本地TensorFlow进行训练;其次是生成一个等效的量化推理图,准确模拟目标定点实现。硬件精确推理图的好处是双重的。(i)在部署之前,我们就可以用CPU/GPU快速验证量化网络工作的推理准确性;(ii)TQT的比例因子和量化权重可以直接移植到所选择的目标上。在对几个网络的测试中,我们发现我们在CPU上运行的推理图与我们在FPGA上的固定点实现的推理图一样,都是位数准确的。
3、层精确度
虽然Graffitist支持可配置位宽的权重和激活,但在本文的范围内,我们使用两种模式。 选择4/8而不是4/4主要是考虑到4x8乘法器的可用性;即使没有这个,INT4模式仍然可以实现50%的权重压缩(每字节双倍打包权重),并减少获取权重的内存足迹。不同的层拓扑结构的内部精度定义如下。标记为q′的量化层表示它们的标度因子是隐式合并/共享的。为了避免重复量化,除了明确量化的主要输入(占位符)外,输入张量被假定为已经被前一层量化了。
-
Compute layers (e.g., conv, matmul, depthwise conv)
image.png -
Eltwise-add layer is quantized as
a
a
-
Leaky ReLU is quantized as:
image.png
4、used Kernel Implementation
如图4所示,(4)和(6)中定义的量化层可以使用本地TensorFlow操作和tf.stopgradient来实现。然而,这种低级别的实现在训练期间有很大的内存占用,因为需要在后向通道中存储梯度计算的中间张量。 这影响了单个GPU所能容纳的最大批量大小。为了克服这个问题,Graffitist将融合的量化计算内核打包,这些内核是为CPU/GPU预先编译的。融合的实现方式是高效的,有助于避免内存开销,并且与当时的实现方式相比,允许使用更大的批处理规模进行训练。
网友评论