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

作者先惯例说了一堆网络压缩的必要性,然后简单介绍了目前比较流行的两派:轻型网络设计和量化。随后他提出了这些方法的两个问题:一是用来做对比的网络都是参数过大的网络,这使得结果不具有完美的说服力,我们应该与已有的优秀的轻型网络如mobilenet对比;二是这些算法并不能很好地给硬件带来提升,这些方法往往利用位运算来减少运算消耗,但在量化之后,实际上采用位运算还是传统的加乘法已经没什么区别了。虽然有一些很好的实时量化方法,但它们将权重和激活层量化到了1bit,这会大大限制网络的表达能力。

于是作者提出了以下量化模型,它在训练和推断时有不同的表现:
在这里插入图片描述
量化的函数是:
在这里插入图片描述
其中,r是real number,q是quantized number,S和Z是每个激活层和权重值分别独立的值。其中,S(Scale)是一个任意的正的浮点数据;Z(Zero-point)和q的数据类型一致,相当于是q的0值(我对它的用处的理解是,数据的分布并不一定是关于0对称,但为了用同样的位数表示尽可能多的数字,就需要一个Z值来使得实际上并不对称的数据能够用对称的形式来表示。另外有的好处可能是,这样就不用提出一位来表示正负和零)。作者说它的用处是这样就可以用一个量化的值来表示真实的0,准确地量化0是很重要的,因为我们往往要使用0来对边界进行填充。

建立两个NxN的方阵r1和r2,及它们的积r3。用
在这里插入图片描述
来表示,对应的量化变量为
在这里插入图片描述
在这里插入图片描述
则一式变为:
在这里插入图片描述
于是有:
在这里插入图片描述

在这里插入图片描述
这里的M由于是由超参数的运算得出,因此可以在线下获得。且通过经验得知,它总是落入(0,1),因此可以用以下的形式表示:
在这里插入图片描述
这里M0是[0.5,1),n是一个非负值。当使用int32时,M0的整数表示就非常接近在这里插入图片描述
又M0≥0.5,因此它至少是在这里插入图片描述
于是至少有30位的精度。简单来说,就是M0本来是个[0.5,1)的浮点数,但当它用整型来表示时,因为整型数据是没有小数点的,所以它就会变成[2的30次方,2的31次方
)(如果用int32表示的一个整型,后续再通过2的-n次方这样的移位操作来将它快速地还原。这个想法很巧妙。

因此乘以M0就是一个定点的乘法,而在这里插入图片描述
又可以表示为高效的移位运算,这样就将一个复杂的浮点乘法转换为两个相对简单的定点乘法(因为除了M,其它都是整数)和移位运算。

接着对公式4进行处理:
在这里插入图片描述
在这里插入图片描述每个需要N次加法,因此共需要2N²,因此在这里插入图片描述为2N³,于是式7就通过分解出在这里插入图片描述
来使得能够使用任意的Z(这里的最小值应该指的是0,这样的话就会利用不到a1和a2.但不清楚为什么不直接说不能用0)来降低计算消耗。

接着作者用一个int32来表示两个uint8(权重和激活值)的乘积
在这里插入图片描述
uint8之间的乘积的值域是int32的非负区间,所以这里采取这种方法。

为了能将偏置加入,作者将其量化为int32类型,其S和Z为:
在这里插入图片描述
虽然这样做会提高计算的消耗,但因为偏置只占参数的一小部分,但它却会影响到很多激活值,因此用更高的精度来表示它是值得的。

接下来要做的就是降采样到uint8,最后激活。降采样方法如同在这里插入图片描述
,通过这种方法将其clamp到[0,255]。由于激活函数ReLU的作用是将值clamp到一个范围内,但在实践中作者发现量化训练中,全部范围的量化值都会被使用,所以就不进行激活。

由于之前所有的量化训练方法都存在两个问题:1、与实际值的偏差较大;2、异常值的出现降低了所有其它权重的准确度。

于是作者提出了新的量化方法:模拟量化。在训练时保存权重和激活值的浮点值,但前向传播时将其量化后再传播,后向传播就按浮点型正常进行。量化方法为:
在这里插入图片描述
至于a、b的选择,对权重,作者选择了[-127,127],放弃了-128是因为这样能够更好地进行优化(没看懂)。激活值则选用EMA(exponential moving averages)计算得到。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值