Introduction
Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference 是 google 关于 模型压缩的一篇文章,该文章不仅仅是一篇研究工作,而且已经应用到Tensorflow Lite中。论文内容非常丰富,主要涉及了 Uniform affine qunantizier(核心quantization公式), matrix multiplication(如何用quantization后的matix 去表征real value 的matix multiplication) , Efficient handling of zero-points(针对matix multiplication 提出的性能优化), Implementation of a typical fused layer(介绍了fake quantization,bias 和activation 如何加入卷积网络)以及在train的过程中具体如何操作。
Quantization Scheme
Uniform affine qunantizier
核心公式:
对于该公式,https://blog.csdn.net/qq_19784349/article/details/82883271给出了解释:
这个量化公式是在inference时用的,在train的时候用下面的公式:
r代表real value; a代表min( r) ,b代表max( r),n代表quantizi的层级,与数据类型相关,如果是int8的话,就是256;【】代表取整
分析下这两个量化公式有什么区别。最大的区别就是第一个量化方法使得两个矩阵的乘法失去了量化前两个矩阵乘法的意义。这也就是为什么要设计下面一章的矩阵乘法算法;而第二种只是将一个实数量化到最接近他的整数,量化后乘法仍然有意义,所以可以用于网络训练。
matrix multiplication
这部分是研究如何用quantization 之后的matix 去估算real value 矩阵的乘积。在介绍机制之前,首先讲下为什么需要做这件事。当我们把conv层的weight和activation矩阵全部quantizi 之后,在计算weight*activation时,直接把quantizi 之后的矩阵相乘不就可以了嘛,为什么要研究乘法机制?
关键原因在于,weight和activation的分布不一样。就是上文公式中的ab不一样。那么quantizi之后,同样一个整数代表的实数会存在非常大的差别。因此这个量化只对原矩阵有意义,两个量化矩阵之间做运算是没有实际含义的。
那么是如何用量化矩阵去估计实数矩阵乘积的呢?
这里M是浮点数。如何讲M用整数表示呢?作者提出了下面的做法
M可以通过两个整数进行记录,一个是右移位数,一个是非常接近2^30次方的一个大整数(用来保持精度)。
Efficient handling of zero-points
这部分讲了如何优化公式(4),降低运算复杂度。核心思想是讲矩阵维度的减法拆分出来,降低复杂度。
我没有弄清楚为什么这样就可以降低复杂度,不过做法还是比较好懂。。。。
Implementation of a typical fused layer
这部分讲了如何引入bias和activation的quantization。