量化精度损失影响因素
我们都知道,量化实际上就是一个从浮点分布到定点分布的过程,大致过程如下:
如果有对这个过程不是很了解的,可以去参考我之前写的另外一篇文章,
那么这样一个过程我们就可以看出来,我们肯定是尽可能希望所有浮点数都相对集中在一起,这样可以尽可能保证大部分点的精度,比如自然界最常见的高斯分布(当然相信之前看过一些文章同学都知道,一个训练均衡的网络的权重分布也是比较接近高斯分布的)。
但是这个定理一定是绝对的吗?让我们以一个比较典型的网络来做实验
实验初始条件
我们在实际量化过程中发现densenet121量化成8bit会精度掉点严重,通过排查发现是一个conv的影响很大.
conv的weights如下:
bias如下:
我们可以看到这里面的数据分布差异是很大的,所以初步猜测是由于在不考虑ft输出情况下weights和bias数据分布差异过大导致的。
那么这时候熟悉量化的同学肯定知道一个解决方法,就是weights的per channel打开,通道之间互相不影响,后续我们同样会做对比实验。
实验开始
由于weights 和bias都存在分布不均,且值比较小的通道并不相同,因此无法做到将两个一起都balance到一个比较好的分布,因此我们采用三种方案 1. 以weights 为准, 2. 以bias为准,3. weights 与 bias 均衡 scale
如果实现数据的均衡,本实验采用的方法是,首先给每一个weights乘一个系数,然后conv后面跟一个scale算子,把这个系数除回来,这样前后是不影响的,后续我们量化时不量化后面scale算子,只量化均衡后的conv算子,
示意图如下
可以明显看到,weights都已经到了同一个数量级,后面跟了一个scale保证前后的值相同
但与此同时,由于bias分布不均的通道和4.7这个通道并不一致,导致还是有些不均,
但是精度表现呢
我们发现当bias均衡后精度会有所提高,而weights并不会,这说明在量化过程中,bias的精度对于整体的量化精度提高有着至关重要的作用,当然如果没有bias,那就是weights了记住这里我们只量化conv算子,对于其他算子均是浮点