量化
量化就是将神经网络的浮点算法转换为定点。
量化有若干相似的术语。低精度(Low precision)可能是最通用的概念。常规精度一般使用 FP32(32位浮点,单精度)存储模型权重;低精度则表示 FP16(半精度浮点),INT8(8位的定点整数)等等数值格式。不过目前低精度往往指代 INT8。
量化一般指 INT8 。不过,根据存储一个权重元素所需的位数,还可以包括:
- 二值神经网络:在运行时权重和激活只取两种值(例如 +1,-1)的神经网络,以及在训练时计算参数的梯度。
- 三元权重网络:权重约束为+1,0和-1的神经网络。
- XNOR网络:过滤器和卷积层的输入是二进制的。 XNOR 网络主要使用二进制运算来近似卷积。
量化过程可以分为两部分:将模型从 FP32 转换为 INT8,以及使用 INT8 进行推理。
定点和浮点都是数值的表示(representation),它们区别在于,将整数(integer)部分和小数(fractional)部分分开的点,点在哪里。定点保留特定位数整数和小数,而浮点保留特定位数的有效数字(significand)和指数(exponent)。
量化浮点值可以分为两个步骤:
- 通过在权重张量(Tensor)中找到 min 和 max 值从而确定 和 。
- 将权重张量的每个值从 FP32 转换为 INT8 。
注意,当浮点运算结果不等于整数时,需要额外的舍入步骤。例如将 FP32 值域 [?1,1] 映射到 INT8 值域 [0,255],有 ,而 。
量化过程中存在误差是不可避免的,就像数字信号处理中量化一样。图十显示了数字信号处理的量化和误差。
量化算术部分讨论的两个重要规则:
- 浮点值越接近零,其值密度越高,对实数的刻画也越准确。
- 均一量化方法将具有动态值密度的浮点映射成具有恒定值密度的定点。
结语:您可能会问为什么量化是有效的(具有足够好的预测准确度),尤其是将 FP32 转换为 INT8 时已经丢失了信息?严格来说,目前尚未出现相关的严谨的理论。一个直觉解释是,神经网络被过度参数化,进而包含足够的冗余信息,裁剪这些冗余信息不会导致明显的准确度下降。相关证据是,对于给定的量化方法,FP32 网络和 INT8 网络之间的准确度差距对于大型网络来说较小,因为大型网络过度参数化的程度更高。