量化背景资料(chaos)#
模型量化本质上是一种压缩模型大小和减少运算量的技术,其基本原理是将模型中的浮点数参数和激活值转换成定点数或者低于浮点数的数据表示形式,从而大大减少存储空间和计算复杂度。数学上,模型量化可以理解为将高维空间中的浮点数数据表示映射到低维空间中的整数数据表示。
一般来说,模型量化可以分为 线性量化 和 非线性量化 两种方式。
- 线性量化
将数据按照固定的间隔进行量化,如将数轴等分成
个小区间,将数据映射到对应的整数区间中。如果某个数据不恰好落在某个整数间隔的中点,就要接近距离它最近的整数。线性量化适用于数据分布比较均匀的情况。- 非线性量化
根据数据的实际分布,将其映射到低维整数空间中。比如,如果数据主要集中在某个区域,就可以将该区域分成更多的小间隔,将数据映射到这些小区间内,以提高数据表达的精度。
总之,模型量化是通过牺牲精度来换取更高的运行效率和更小的模型尺寸。量化的难点在于,在牺牲精度的同时,如何最大程度地保留模型的特征和语义信息。因此,在进行模型量化时需要选择合适的量化策略和参数,以达到最优的压缩效果和准确度。
量化是什么?#
参考:quantization-and-resolution
备注
量化 是一种实现信号调制的方法,通过将输入值从无限长的连续值集合映射到更小的有限值集合。量化是有损压缩算法,它将给定的模拟信号表示为数字信号。换句话说,这些算法构成了模数转换器(analog-to-digital converter)的基础。处理量化算法的设备称为 量化器 (quantizer)。这些设备有助于对输入函数(即量化值)的误差进行四舍五入(近似)。
量化器#
量化器 是一种负责将采样的输入信号改变为具有某些预定电压水平的信号的装置。量化器执行的量化级别取决于编码器的比特值。
优点
使用量化器,信号表示所需的比特数大大减少。
量化器降低了比特率(bitrate),进而降低了带宽需求。
然而,量化器可能导致某些缺点,如在近似或四舍五入期间在原始信号中引入某些误差,称为 量化噪声。
在数字电子学和电子仪器中,测量波形中两点之间的振幅距离称为 分辨率。分辨率主要与数模转换器有关。一般在测量信号的最大值与可解析部分之间。分辨率是指仪器在理论上检测变化的能力,用比特数表示。
线性量化#
假设深度学习模型中的权重
通过这种方式进行均匀量化,我们可以将
这里的
备注
- 量化水平
量化过程中使用的量化级别数。在深度学习中,一般使用的量化级别数为
,其中 通常是 8、16 或 32。量化水平(Quantization level)决定了权重或激活值被量化成多少个值,也就是量化级别的数量。在量化领域,较低的量化水平会导致精度损失,较高的量化水平需要更大的存储空间和计算能力,因此需要在实践中根据不同的应用和具体条件进行合适的调整。
当一个权重被量化为
其中
备注
峰值信噪比 (Peak Signal-to-Noise Ratio,PSNR) 是一种用于衡量图像或视频质量的指标,通常用于比较原始图像或视频与经过压缩或其他处理后的图像或视频之间的质量差异。其计算公式如下:
其中 MAXI 是图像或视频像素的最大值,MSE 是均方误差。MSE 表示被检测图像或视频与参考图像或视频之间的差异度,计算方式为:
其中,I 和 K 分别是被检测图像或视频和参考图像或视频,M 和 N 分别是它们的高度和宽度。
PSNR 可以测量输入图像与参考图像之间的信噪比,也就是图像或视频质量的差异程度。通常情况下,PSNR 越高,表示图像或视频的质量越高,差异越小。由于它依赖于图像或视频像素的最大值,因此 PSNR 的值通常会在实际应用中取
PSNR 被广泛应用于视频编码、图像处理等领域,它可以帮助评估压缩算法、降噪算法等的性能。但是,PSNR 并不总是适用于衡量人类观感上的图像质量,因为人类对于图像质量的评价是主观的,对于不同的应用和场景,可能需要使用其他指标进行评估。
中平量化器#
- 中平量化器
(midtread)对权重值进行量化时,将零点作为量化级别的下限,然后根据每个级别之间的距离对权重值进行四舍五入,使其落在量化级别上。
具体来说,考虑将
对于一个给定的权重值
最后,我们可以将其减去偏移量
中升量化器#
- 中升量化器
(midrise) 另一种常见的均匀量化方法,它也是按照量化级别之间的间隔对权重值进行四舍五入,但不同的是其将零点作为量化级别的中间值,即在量化级别的中央设置零点,并利用量化级别间隔的一半来构造量化级别。
具体来说,考虑将
每个量化级别的宽度为
最终,量化后的值即为
量化类型(chaos)#
模拟信号量化#
在量化过程中,量化器将给定模拟波形的幅值的最大值表示为离散形式的类似波形。这个过程也取决于编码器的比特级别。然后量化器将信号转换为量化信号,最好称为 信号调制。量化器所开发的量化信号的主要缺点是它所遵循的近似。例如,如果采样输出的值为
量化分辨率#
模数转换器(analog-to-digital converter)的分辨率(resolution)通常定义为输入模拟信号的微小变化,它使输出数字信号改变单元计数。分辨率是模数转换器的主要参数,它与传递函数有关,传递函数的特征是阶梯波形。波形的步长数等于波形的分辨率。然而,当信号的比特数较大时,传递函数显示出与输入信号相当大的偏差,并导致较大的量化噪声。
量化过程(chaos)#
定义缩放函数(scaling function)
其中
总是假设
Quantized Neural Networks: Training Neural Networks with Low Precision Weights and Activations 中定义了各种规格的缩放函数,在本文中,将使用线性缩放
其中
这样,量化函数为
举例说明:
import numpy as np
v = np.array([3.3, 4.6, 6.7, 7.9], dtype="float32")
beta = v.min()
alpha = v.max() - v.min()
alpha, beta
(4.6000004, 3.3)
def sc(v, alpha, beta):
v = v - beta
return v/alpha
借助缩放函数将值域归约到
vs = sc(v, alpha, beta)
vs
array([0. , 0.28260866, 0.7391303 , 1. ], dtype=float32)
注意
这个公式的问题是对整个向量使用了相同的缩放因子,它的维数可能很大。量级(Magnitude)不平衡可能导致精度的显著损失,其中缩放向量的大多数元素被推为零。
分桶
为了避免这种情况,我们将使用 bucketing,例如 [HWZ+16] 分别对具有一定固定大小的连续值的桶应用缩放函数。这里的权衡是,为每个桶获得了更好的量化精度,但必须为每个桶存储两个浮点缩放因子。下面考虑量化点的均匀和非均匀放置。
均匀量化
固定参数
形式上,定义具有
其中
对于确定版本,定义
对于随机版本设置
备注
假设需要量化到 4 比特位,一共有 16(
def Qz(v, s):
k = s * v - np.floor(v * s)
o = k > 0.5
return o.astype("int")
def Q(v, s):
x = np.floor(v * s) + Qz(v, s)
return x/s
# 原空间的值为 3.3, 4.6, 6.7, 7.9
qv = Q(v, s=2**4)
qv
小技巧
量化的本质其实就是将
非均匀量化
非均匀量化以一组
随机量化相当于添加高斯噪声#
显然,随机均匀量化是其输入的无偏估计
其中
这意味着量化权重相当于在每一层(激活函数之前)的输出中增加一个渐近正态分布的零均值误差项。误差项的方差取决于
微分量化#
利用非均匀量化点的 placement,引入微分量化作为提高量化神经网络精度的通用方法。实验上,发现在这种情况下,随机量化和确定性量化之间的差别很小,因此将关注更简单的确定性量化函数。
令
量化神经网络的主要问题是,决定哪个
这里,假设使用分桶方案,
因此,可以使用训练原始模型时使用的相同损失函数,通过式 (6) 和通常的反向传播算法,计算其相对于量化点
反量化#
通常将一张 uint8 类型、数值范围在
通常将网络输出的范围在
这里 float32空间
特指
小技巧
可以前往 谷歌量化白皮书 了解更多量化知识。
量化常用术语#
常规精度一般使用 FP32(32位浮点,单精度)存储模型权重;低精度(Low precision)则表示 FP16(半精度浮点),INT8(8 位的定点整数)等数值格式。不过目前低精度往往指代 INT8。混合精度(Mixed precision)在模型中使用 FP32 和 FP16 。FP16 减少了一半的内存大小,但有些参数或操作符必须采用 FP32 格式才能保持准确度。
量化一般指 INT8。不过,根据存储权重元素所需的位数,还可以包括:
二值神经网络([CHS+16]):在运行时权重和激活只取两种值(例如 +1,-1)的神经网络,以及在训练时计算参数的梯度。
三元权重网络([LZL16]):权重约束为 +1,0 和 -1 的神经网络。
XNOR 网络([RORF16]):过滤器和卷积层的输入是二进制的。XNOR 网络主要使用二进制运算来近似卷积。
[HMD15] 更关注如何压缩整个模型而非存储一个元素的位数。作者将剪枝、量化和编码等技术结合起来,在不显著影响准确性的前提下,将存储需求减少 35x(AlexNet)至 49x(VGG-19)。该论文还表明量化卷积层需要 8 位以避免显着的精度损失,而全连接只需要 4 位。
[CWZZ17] 关于模型压缩的调查列出了许多工作,并将它们分类为参数剪枝和共享,低秩分解和稀疏性,传递/紧凑卷积滤波器和知识蒸馏等。
工业界最终选择了 INT8 量化:FP32 在推理(inference)期间被 INT8 取代,而训练(training)仍然是 FP32。
通常,可以根据 FP32 和 INT8 的变换机制对解决方案进行分类。一些框架简单地引入了 Quantize
和 Dequantize
层,当从卷积或全链接层送入或取出时,它将 FP32 转换为 INT8 或相反。在这种情况下,模型本身和输入/输出采用 FP32 格式。深度学习框架加载模型,重写网络以插入Quantize
和 Dequantize
层,并将权重转换为 INT8 格式。
量化的简单分类#
将 float 32 (全精度)数据类型映射到 Int 数据类型:
量化映射方法
按照每个间隔是相等的还是不相等的,划分为 均匀量化(uniform quantization,或 线性量化)和 非均匀量化 (non-uniform quantization,或 非线性量化)。
量化的对称性
按照映射到整数的数值范围划分为 对称量化 (有正负数)和 非对称量化 (全是正数)。非对称量化有 zero-point
(主要作用是用于避免 padding 出现误差)。
量化级
二值网络(1-bit)、三值网络(2-bit)、3-bit、4-bit、5-bit、6-bit、7-bit、8-bit。
量化误差来源#
从 float-32 到 Int 数据类型的
round
运算误差;激活函数的截断;
数值溢出误差。
量化中可能出现的问题#
weight 和 activation 的数据分布呈现出类拉普拉斯分布或者类高斯分布,数据分布是钟型分布,大部分数据集中在中间,两头的数据比较少。采用非均匀量化提高来量化的分辨率。
动态值域问题(dynamic range):每一层的数值范围不一定都相同,activation在不同层的数值范围会不一样。采用截断的方式提高来量化的分辨率。
round
误差。采用随机舍入 (Stochastic rounding,简写 SR)([CFH+22])方法。量化感知训练,量化运算的导数为
,在 backwards 的时候,梯度在后向传播中传不到后面。STE(Straight-Through Estimator),直通估算器,即将量化运算的梯度设置为
,那么梯度就可以传递下去。设计光滑可导且导数不为
的量化,比如 Lq-Net 和 DSQ(Differentiable Soft Quantization)。