上一篇文章介绍了矩阵量化的基本原理,并推广到卷积网络中。JermmyXu:神经网络量化入门--基本原理zhuanlan.zhihu.com
介绍了矩阵量化的基本原理,并推广到卷积网络中。这一章开始,我会逐步深入到卷积网络的量化细节中,并用 pytorch 从零搭建一个量化模型,帮助读者实际感受量化的具体流程。
本章中,我们来具体学习最简单的量化方法——后训练量化「post training quantization」
由于本人接触量化不久,如表述有错,欢迎指正。
卷积层量化
卷积网络最核心的要素是卷积,前文虽然有提及卷积运算的量化,但省略了很多细节,本文继续深入卷积层的量化。
这里我们继续沿用之前的公式,用
、
表示 scale 和 zero point,
表示浮点实数,
表示定点整数。
假设卷积的权重 weight 为
,bias 为
,输入为
,输出的激活值为
。由于卷积本质上就是矩阵运算,因此可以表示成:
由此得到量化的公式:
这里面非整数的部分就只有
、
,因此接下来就是把这部分也变成定点运算。
对于 bias,由于
的结果通常会用 int32 的整数存储,因此 bias 通常也量化到 int32。这里我们可以直接用
来代替
,由于
、
都是对应 8 个 bit 的缩放比例,因此
最多就放缩到 16 个 bit,用 32bit 来存放 bias 绰绰有余,而
则直接记为 0。
因此,公式 (3) 再次调整为:
其中,
。
根据上一篇文章的介绍,
可以通过一个定点小数加上 bit shift 来实现,因此公式 (4) 完全可以通过定点运算进行计算。由于
、
、
、
都是可以事先计算的,因此
、
也可以事先计算好,实际 inference 的时候,只需要计算
和
即可。
卷积网络量化流程
了解完整个卷积层的量化,现在我们再来完整过一遍卷积网络的量化流程。
我们继续沿用前文的小网络:
其中,
、
表示输入和输出,
、
是网络中间的 feature map,
表示
量化后的定点数,
等同理。
在后训练量化中,我们需要一些样本来统计
、
、
以及
的数值范围「即 min, max」,再根据量化的位数以及量化方法来计算 scale 和 zero point。
本文中,我们先采用最简单的量化方式,即统计 min、max 后,按照线性量化公式: