量化带来的好处有很多,首先,由于训练好的神经网络对数据精度以及噪声的不敏感,通过量化将参数从4byte float转换为1byte,从而减少了数据量,进而可以使用容量更小的存储设备,节省了成本;其次,量化带来计算效率的提升,单位时间,单位能效内的计算成果多了,或者说,同样的算力需求的模型,所消费的时间和能量少了,结果就是又快又省电,现在的移动终端都是用电池供电的,也就意味着更久的续航和更好的体验。经过量化的模型变小,这样也便于在线升级模型和算法,量化的好处很多很多,后面有时间再补充。
量化虽好,但也不是没有缺点,首先是相对于float32,量化类型(int8/int16/uint8)的精度和动态范围要小很多,精度会掉,如下图:
再一个缺点就是量化操作实现复杂不好理解,尤其是结合复杂的网络拓扑结构之后,更是千头万绪难以把握,经过多日的思考,自感小有收获,权且记录在此,至于对错,我一直认为只要是自己下功夫思考得出的结论,正确推理无疑是第一位的,但错误反而更能促使我们对问题多角度的深入思考,敏锐我们的神经,下次再面对的时候,它将会保护我们不会被误导。很多时候,我们都是从错误中学习不是么?所以,以下内容,期待被打脸~
一个典型的神经网络拓扑结构如下,这是一个典型的全连接:
为了方便分析,将上图抽象一下,摘取和量化相关的主要部分,整理出来在NPU中运行时的模型为:
:第l-1层输出量化值,Scale和Zero Point.
:第l层输入量化值,Scale和Zero Point.并且:
: 第l层权重量化值,Scale和Zero Point.
: 第l层偏置量化值,Scale和Zero Point.
:第l层输出量化值,Scale和Zero Point.
:第l+1层输入量化值,Scale和Zero Point.并且:
注意图中的没有画出,通过这种输入和输出直接对接,不同层之间无缝连接再一起。
下面推导量化公式,看再NPU中,执行的运算是什么样子,下面的公式每个符号都表示矩阵或者向量,并非是scaler.
所以:
所以:
继续化简(其实是化繁,为了得到适合MAC计算的形式):
得到:
最终,得到公式: