本节的内容大概有:
- 回顾各种数据类型及表示方法
- 量化基本概念
- 量化的两种方法(K-means 和 linear)
- 后训练量化
- 量化感知训练
- 二值和三值量化
- 混合精度量化
1. 数据类型和表示方法
- 整数:
- 无符号整数:范围 [0, 2ⁿ-1]
- 有符号整数:
- 符号表示法:范围 [-2ⁿ-1 + 1, 2ⁿ-1 - 1] (其中0...00和1…00都表示0)
- 补码表示法:范围 [-2ⁿ-1, 2ⁿ-1 - 1]
- 浮点数:
- 浮动点数的表示方式为:(以32位为例子)
- 在接近0的时候,为了表示0以及很小的数,Fraction不会加1,Exponent会变成1
- 正负无穷和NaN:指数位全部为1

- 不同类型的浮点数:

- INT4 和 FP4

2. 量化的基本概念
- 定义:将连续的数值范围约束为离散的集合。
- 量化误差:输入值与量化后的值之间的差异。
3. 量化的两种方法
3.1. K-means
将权重聚类为几个簇,每个簇由其质心表示。质心用一个codebook来维护。

更新的方法:

注意到,这种方法仅仅只能减少存储的消耗,但是并不能减少计算量。
3.1. Linear
将实数映射为整数,使用一个缩放因子和零点。
仿射映射:
r = S(q - Z)
,其中:r
为实数。
q
为量化后的整数。
S
为缩放因子。
Z
为零点。

- Scale (S):
- Zero Point (Z):
量化可以有效减少计算量(详细推导看ppt)

4. 后训练量化(Post-Training Quantization,PTQ)
- PTQ方法是在训练完成后,量化神经网络的浮动点权重。它包括三个核心技术:
- 量化粒度(Quantization Granularity):
- Per-Tensor Quantization:整个张量共享一个缩放因子。
- Per-Channel Quantization:每个输出通道使用不同的缩放因子。
- Group Quantization:将多个通道的权重聚集成组,共享同一缩放因子。
- 动态范围裁剪(Dynamic Range Clipping):通过限制权重值的范围来优化量化。
- 四舍五入(Rounding):传统的四舍五入方法可能不是最优的,研究者提出了自适应四舍五入(AdaRound),它通过学习方法优化量化结果。


5. 量化感知训练(Quantization-Aware Training,QAT)
- 量化感知训练通过在训练期间模拟量化过程,以此来优化模型,避免因量化带来的精度损失。
- 在QAT中,训练过程中会维护一份全精度的权重副本,以此来精确地计算梯度。
- 模型的训练过程通过模拟量化来精细调整权重,使其适应低精度计算:
- 假量化(Simulated Quantization):对权重和激活进行“假量化”,模拟推理时的量化效果。
- 使用直通估算器(STE)来处理量化操作的梯度,避免量化操作的梯度为零,从而使模型能够有效训练。

6. 二值和三值量化(Binary and Ternary Quantization)
- 二值量化(Binary Quantization):将权重和激活限制为+1和-1,极大地减少存储和计算成本。
- 三值量化(Ternary Quantization):将权重限制为+1、0和-1,进一步提升了精度和硬件效率的平衡。
- 二值化方法如XNOR-Net通过使用XNOR操作和popcount计算,大幅减少了计算量和内存需求。
7. 混合精度量化(Mixed-Precision Quantization)
- 在混合精度量化中,不同层的权重和激活可以采用不同的位宽。例如,某些层可能使用4位精度,而其他层则使用8位精度。
- 硬件感知量化(Hardware-Aware Quantization,HAQ):自动化地调整量化策略,优化硬件资源使用,支持多个目标,如延迟、能量消耗等。