神经网络由于参数量大,运算量大,往往在部署到IOT设备时会碰到储存空间不够,运算时长过长或者量化精度不够的问题。
针对这些问题,本文介绍了神经网络模型在轻量级设备的部署技巧,具体内容包括神经网络模型量化的基本原理和主要方法,以及部分低功耗IOT设备上模型部署的实例与技巧。
量化基本原理
量化本质上是数值范围的一种调整,目前主流的神经网络的量化主要是将fp32的一组数据映射到int8的范围内(也有研究int6 int4甚至int2的 本文不做讨论),(如下图数据所示)。且由下表格可知,int8的表示范围和步长均不如fp32,会造成精度损失,而如何降低精度损失,正是本文想要说明的主要问题之一。
其次我们需要了解的是为什么要进行量化,它的优势是什么。
由于神经网络对于噪声是不敏感的,因此可以对其进行量化,好的量化并不会造成精度的损失,而且可以实现相比于浮点模型大约1/4的内存占用。此外,由于量化后的模型大部分是整数类型的,在使用NPU进行推理的时候往往会比浮点类型快很多。此外,相较于浮点运算,定点int8每次计算的能量消耗少很多,而这对于低功耗嵌入式设备来说是非常关键的。
量化原理可以分为两大类,分别是非均匀量化和均匀量化,非均匀量化主要指的是,量化的步长不是均匀的,而均匀量化指的是量化的步长是均匀的。两种量化对比如下图所示。
对于均匀量化,主要可以用以下的公式1来表示。式中x表示浮点的输入, x_int表示量化的输出,可以看到对于的每个输入,我们需要一组参数s与z来表示量化之后的数值。由于取整操作的存在,量化之后的数值与量化之前的数值会有误差(如公式2),因此如何根据实际情况选取s与z就至关重要。公式3表示的是将公式1代入公式2得到的量化反量化公式,在量化后训练中会经常用到。
非均匀量化目前主流的有两类,一类是VPU和DSP中经常使用的,将FP32转成FP16进行计算的量化,另一类就是指数量化。
这一类VPU和DSP中经常使用的,将FP32转成FP16进行计算的量化方式,可以表示的精度和范围,优点是可以表示的精度和范围比int8要大。然而