本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1. 背景与介绍
随着今年深度学习的发展,基于神经网络的模型在许多任务上取得了比传统方法高很多的准确率指标。但是随之而来的问题是模型越来越庞大,这给它们部署在移动端平台(例如手机、AR/VR)上带来了诸多不便。因此,如何减小模型大小和提高推理速度,成为了一个新的热门研究方向。
目前的模型压缩方法主要分为两大类:1. 设计更高效的网络结构;2.将网络的权重和激活函数从float32量化成更低的bit。
之前的研究有两个问题:
- 缺乏一个准确的基线。以往的研究都是采用AlexNet、VGG、GoogleNet之类的模型作为对比基线,但是这些模型在结构上本身就是存在设计冗余的,因此难以评价一个模型压缩方法的有效程度。本文采用的基线是MobileNet。
- 很多量化方法部署到实际的硬件平台上可能没法真正加快推理速度。例如,有的方法只对权重进行量化,激活函数还是浮点,所以只能减少存储空间,没法显著减少计算量。有的方法,比如三元/二元量化,采用位移来代替乘法运算。但是在有些硬件上位移并不一定比乘法加法快,而且只有当位数较大时乘加运算的开销才较大。当权重和激活函数量化后,位数较少了,减少乘加运算的需求也没那么旺盛了。有些1-bit的方法,还可能导致准确率显著下降。
2. 量化方案介绍
2.1. 量化参数介绍
所谓量化,就是在原始的浮点数r和量化后的整数q之间寻找一个仿射变换,使得:, 其中S和Z是参数。对于每一层权重(weights)和对应激活函数(activation),S和Z是相同的。q的bit数常见的有8,4,2,1等,我们常说的8bit量化就是指q的bit数为8,其他bit数类似。bias一般量化为32bit整数。 S称为放缩因子(scale),Z称为零点(zero-point)。Z的存在很有必要,这样能保证浮点数中的零能跟一个量化后的整数对应上。在神经网络中,经常有用零进行padding的情况,因此如果找不到一个整数对应的话会大大损失量化后的精度。
2.2. 量化后的全整数矩阵乘法
考虑两个均为的方阵和,我们需要通过它们的矩阵乘法获得方阵。用表示第个矩阵的第行第列的元素。的表示方法类似。则有:
进而得到$$ q_3^{(i,k)}=Z_3+M\sum_{j=1}^{N}(q_1^{(i,j)}-Z_1)(q_2^{(j,k)}-Z_2)\tag{1-2}
M=2^{-n}M_0\tag{1-3}
q_3^{(i,k)}=Z_3+M\left( NZ_1Z_2-Z_1a_2^{(k)}-Z_2a_1^{(i)}+\sum_{j=1}^Nq_1^{(i,j)}q_2^{(j,k)}\right)\tag{1-4}