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

摘要

作者提出了一种只使用整数运算的quantization方式,比起float point运算效率更高。同时提出了一种相应的训练方式来保证quantization之后的准确率。这篇文章的方法提升了accuracy和on-device latency之间的trade off,并且可以在MobileNets上使用。

1 introduction

作者总结了目前有效将庞大的神经网络应用在资源更为有限的移动端设备上的两种主流方式:1.神经全新的体量更小的神经网络,eg:MobileNets,SquueezeNet,ShuffleNet和DenseNet等等;2.将32-bit或64-bit的weights或activations缩小到精度更小的bit单元上,eg:8-bit。

在这篇文章当中,作者主要通过提升了在MobileNets上的accuracy和on-device latency之间的tradeoff来解决这个问题。作者主要采用的方法如下:

1. quantization scheme:将wights和activations全部quantize到8-bit,以及将部分的参数保留在32-bit,例如:bias vector;

2. quantized inference framework:可以在只能进行整数运算的硬件上高效运行,eg:Qualcomm Hexagon;

3.quantized training framework:和quantized inference framework相辅相成,减少quantization带来的accuracy loss;

4.提升了MobileNets在ARM CPUs上的accuracy和ond-device之间的tradeoff。

2 quantized inference

2.1 quantization scheme

quantization scheme就如同是从整数q到实数r的仿射变化: 

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

其中S和Z被称为quantization parameters。并且,同一个weights、activations array中的值使用相同的quantization parameters,不同的array中使用不同的quantization parameters,可以用下面的C++语法来表达:

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

常数S代表scale,是一个任意的正实数。

常数Z代表zero-point,和q的类型是一样的。这是为了能够精准的使用quantized value来表示0值,因为高效的神经网络通常会使用zero-padding。(我也不知道为什么不能直接设置为0,求解答)

2.2 integer-arithmetic-only matrix multiplication

考虑两个N×N的矩阵的乘法,将式(1)代入可以得到:

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

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

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

上式中只有multiplier M是非正数,其他的均是整数,由于S都是常数,可以实现计算好。之后作者empirically发现M都是(0, 1)之间的数,所以可以进一步的优化为:

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

其中M0是一个[0.5, 1)之间的数,n是非负整数。这样normalized parameter就可以很好的用固定位数来进行表达(eg:int16和int32),由于M0≥0.5,所以如果是int32的话,至少会使用30位的信息。剩下的2^-n可以直接使用位移运算进行操作。

2.3 有效处理zero-points

为了避免处理2N^3次减法和使用int16来处理矩阵乘法,首先将式(4)展开为:

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

这样可以将一部分的乘法转换为加法进行处理,可以高效的将zero-points进行处理。

2.4 implementation of a typical fused layer

现在需要将上一个section讨论的矩阵乘法和bias vector以及activation functions结合起来。

bias vector的quantization scheme为:1. Z=0;2. S=S1*S2。

bias vector尽管仍然保持32-bit,但是由于其在神经网络中的占比非常少,所以开销不会很大,并且bias bector在一定程度上可以用来平衡整个quantization带来的误差。

现在将weights以及上一层的output相乘累加之后和bias vector相加得到一个int32的表示,之后在通过multiplier M进行down scaling变成quantized 8-bit即可。

总体的流程如下图所示。

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

3 training with simulated quantization

作者提到一个常见的训练quantized network的方式是,使用fp进行训练,然后把结果(weights)直接quantize(有的时候会增加额外的fine-tune)。这种方式用在大型的模型上效果非常的出色,但是对于小型的模型,accuracy的loss就会非常的大。

作者使用了一个叫做simulated quantization的training method,即:在forward pass中使用quantization,但是在bp的时候照常按照全精度的浮点进行。具体策略如下:

1. weights在和input卷积之前就进行quantization。如果使用了batch normalization,那么bn的参数会放入weights当中;

2. activations将在他们在inference即将被使用的时候进行quantization,eg:在使用了activation function之后。

对于每一层,quantization都是由quantization level和clamping range决定的:

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

其中r是需要quantized的值,[a, b]是quantization range,n是quantization level(如果是8-bit,则n=2^8=256)。

3.1 learning quantization ranges

weights和activations的quantization的处理方式是不同的。

wights:a,b分别是W中最小和最大的数。使用了一个小小的trick,使得如果quantized到8-bit,那么范围是[-127, 127],而不会取到-128,作者说明这是存在优化的机会。

activations:range取决与input,为了估计range,只用了exponential moving averages(EMA)。同时在训练的开始阶段,range变化非常的快,此时完全关停activations的quantization,等到稳定之后再此开启。

具体步骤如下图所示:

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

3.2 batch normalization folding

略。

4 experiments

8-bit和32-bit的矩阵乘法使用的库为:gemmlowp library和Eigen library。

4.1 quantized training of large networks

使用ResNety和InceptionV3用于ImageNet的训练进行测试,这些测试没有在移动端做。

4.1.1 ResNets

对比了8-bit和fp的网络的accuracy,以及和其他的quantization方式相比的优势。

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

4.1.2 Inception V3 on ImageNet

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

4.2 quantization of MobileNets

4.2.1 ImageNet

使用了3种不同的Qualcomm core代表3种不同的体系结构:1)Snapdragon 835 LITTLE core;2)Snapdragon 835 big core;3)Snapdragon 821 big core。

实验结果发现,给定相同的inference时间,integer-only quantized MobileNets的accuracy更高。但是这一点在Snapdragon 821上不够明显,一个可能的原因是浮点计算在其上的优化做的更好。

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

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