Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference

原文链接:https://arxiv.org/abs/1712.05877    发表:CVPR2018

代码:https://github.com/jameszampa/ECE-570-Implementation

编辑:Daniel

1.推理阶段


其中r为要量化的实数,S为浮点数,q为量化后的无符号8位整数,Z为量化后零点,无符号8位整数。

weight和activation的量化都是以矩阵为单位,同一矩阵共享一组S和Z。

矩阵中的单个元素的量化

在卷积操作中所涉及的矩阵乘法·,有如下公式

将上式展开并移项得到

(4)中唯一的浮点型变量为M,为了便于implementation,对M作如下操作

M为可预先计算的浮点数,且在(0,1)区间内,M0为[0.5,1)区间的数,个人理解是用类似定点数的方式来表示M0,其中32位均为小数部分,乘以2的-n次方可以理解为移位操作,这样既可以将M表示为两个整数相乘,同时也可增加精度。


这个地方说更有效地执行(4)可以避免2N^3次减法和将乘法扩展到16位。避免减法操作可以理解,但是不用扩展乘法这个操作不太懂,因为展开成(7)后里面的乘法操作还是8位乘8位,还是需要扩展到16位的。


若对(4)直接计算,需要进行2N^3次减法(文中的2N^2和2N^3应指的是在完整的矩阵运算中的计算量,而不是仅仅公式中的计算量),而将(4)展开为(7)后,只需要进行2N^2次减法,这样做可以有效地减少计算量。

(9)中的两个unit8的乘法之所以用int32进行储存,是因为虽然两个unit8相乘可以用unit16存储,但是(9)后续还需要与M相乘,还需要与bias相加,而M占的位数较多并且bias量化后会产生负值,如果只用16位进行储存,后续可能会产生溢出。

对偏置进行量化

对偏置进行32比特量化是因为偏置是基于零点进行量化的,所以量化值有正负之分。另外,作者认为bias的值在整个网络中只占一小部分,并且一个bias的值会加到很多个输出值上,所以一个bias值的误差会造成整个卷积核的整体偏差,所以bias的精度需要更高。

2.模拟量化训练



伪量化

在训练过程中,作者采用伪量化的方式,即将weight量化后再还原,这样在训练过程中引入了量化误差,模拟了推理过程中产生的量化损失。


对于weight,量化区间由weight中的最大值和最小值组成;对于activations,量化区间在训练一段时间后由EMA计算得到。EMA即滑动平均,其计算公式如下:


本文中将β设为接近1的值,在训练几千步之后会发现activations的取值范围逐渐平滑,并以此来确定activations的量化范围,由于在刚开始训练时activations的范围变化较大,所以在训练初期不会对activations的值进行量化,而是在训练一段时间后在进行量化。

确定weight和activations的量化范围后,不含BN层的模拟量化训练过程具体过程如下图所示。


对于有BN层的结构,由于BN层在推理过程中一般会将参数融合到卷积计算中,所以在模拟量化训练时也需要将BN层参数融合到卷积过程中。其融合过程如下图所示:


BN层的计算过程如下:

一般将BN层参数融合于卷积运算过程如下:

融合推出来的公式贴在上边

融合BN层参数后的训练过程如下:


图中应该是缺少了对于偏置bias的变换。

3.实验结果待补充

你可能感兴趣的:(Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference)