在机器学习模型压缩的讨论中,量化(Quantization)已经成为一个绕不开的话题。市面上大多数教程直接面向深度学习场景,从权重精度削减讲起,却忽略了一个根本事实:量化并非深度学习的独创,它首先是信号处理中基础得不能再基础的概念。从信号处理的视角理解量化,能够帮助工程师建立更扎实的直觉,避免在工程实现中踩坑。本文将从信号处理的基本原理出发,系统讲解量化的本质数学机制,并提供可直接落地的工程实现路径。
信号处理中的量化:从连续到离散的第一步
量化是将连续幅值映射为有限离散集合的过程,这一过程发生在模拟信号转换为数字信号的关键环节。当我们使用模数转换器(ADC)对真实世界的物理信号进行数字化时,必须经历两个核心步骤:采样与量化。采样解决的是时间维度上的离散化问题,按照奈奎斯特准则以至少两倍于信号最高频率的速率进行采样;量化则解决幅值维度上的离散化问题,将每个采样点的连续幅值映射到最近的离散电平。两者缺一不可,没有量化就不存在真正的数字信号。
量化的核心术语与指标直接决定了工程实践中的参数选择。比特深度(Bit Depth)决定了离散电平的数量,对于 N 比特量化,可用的离散级别为 2 的 N 次方。量化步长(Step Size)或称为最小有效位(LSB),等于量化器的满量程范围除以离散级别数量。例如,一个 12 位 ADC 在 0 到 5 伏的满量程范围内,其量化步长约为 1.22 毫伏。值得注意的是,任何量化操作都会引入量化误差(Quantization Error),即原始采样值与映射后的离散值之间的差值。在理想均匀量化条件下,这一误差通常被建模为分布在负二分之一个 LSB 到正二分之一个 LSB 之间的均匀随机变量。
量化信噪比(SQNR)是评估量化质量的核心指标。对于满量程正弦波输入,理想均匀量化的 SQNR 近似等于 6.02 乘以比特深度再加上 1.76 分贝。这意味着每增加一个比特,量化噪声底理论上降低约 6 分贝。这一经验公式为工程实践提供了直观指导:在选择量化精度时,可以先估算所需的 SQNR,再反推所需比特数。举例而言,若希望量化误差对信号的影响低于 60 分贝,则至少需要 10 比特的精度。
深度学习中的量化:同一原理的不同应用场景
将视线从传统信号处理转向深度学习,会发现量化的本质原理完全一致,只是应用场景和约束条件发生了变化。在神经网络中,权重和激活值本质上是高精度的浮点数(通常为 32 位单精度),这些数值占用大量存储空间和计算资源。量化的目标,就是将这些高精度数值映射到低精度的整数表示(通常是 8 位),从而实现模型体积的压缩和推理速度的提升。从数学形式上看,神经网络量化与 ADC 量化都遵循同一条核心公式:q equals clamp of round of x over scale plus zero point,clamped to the valid integer range。
然而,深度学习场景也带来了独特的工程挑战。传统 ADC 处理的是一维连续信号,而神经网络处理的是高维张量,激活值的动态范围在不同层、不同通道之间可能差异巨大。ImageNet 上预训练的 ResNet 模型中,某些层的激活值范围可能集中在零点附近,而某些层则可能出现大幅度的激活峰值。这种不均匀的分布特性,使得简单的全局量化策略往往效果不佳,工程中需要更精细的粒度控制。此外,神经网络的量化还需要考虑推理框架的支持程度、硬件 accelerators 的运算能力以及量化后模型精度的保持程度,这些因素在传统信号处理中几乎不存在。
理解这一层的区别,有助于工程师在面对量化精度选择问题时做出更明智的决策。很多初学者会陷入 “越低越好” 的误区,实际上 4 比特量化在某些硬件上可能根本无法获得加速效果,因为这些设备的计算单元只对 8 比特或 16 比特有优化的指令集。量化精度必须在模型精度、推理速度、硬件支持三者之间取得平衡。
工程实现路径:从理论公式到可运行代码
在明确了基本原理之后,接下来关注工程实现的具体路径。深度学习框架中的量化实现通常分为两大类:训练后量化(Post-Training Quantization,简称 PTQ)和量化感知训练(Quantization-Aware Training,简称 PTQ)。PTQ 是指在模型训练完成后直接进行量化,实现成本最低,但可能导致精度损失;QAT 则在训练过程中模拟量化效果,让模型在训练阶段就适应低精度表示,精度保持更好但训练成本更高。对于工程落地而言,PTQ 是首选路径,因为它不需要额外的训练资源,只有在 PTQ 无法满足精度要求时才考虑 QAT。
校准(Calibration)是 PTQ 中最为关键的步骤,其本质是收集足够统计量以确定量化参数。典型的校准流程是:将一组具有代表性的输入数据(通常称为校准集)通过模型,收集每个张量的最小值和最大值,进而计算出缩放因子(Scale)和零点(Zero-Point)。校准集的选择直接影响量化质量,一个好的校准集应当能够覆盖模型在实际部署中可能遇到的大多数输入模式。对于分类模型,通常使用训练集的一个子集(几百到几千个样本)即可;对于检测模型,可能需要更精心设计的场景覆盖。
量化粒度(Granularity)是另一个需要仔细考虑的工程参数。常见的粒度选项包括:逐张量(Per-Tensor),即整个张量共享一组量化参数,实现最简单但精度可能最差;逐通道(Per-Channel),即每个输出通道独立拥有一组量化参数,精度更好但参数存储开销增加;逐组(Per-Group),即按照参数块进行更细粒度的控制。实践经验表明,对于卷积神经网络的权重量化,逐通道方案通常能获得更好的精度保持效果,因为不同通道的权重分布差异往往很大;而对于激活值的量化,逐张量方案在多数情况下已经足够。
具体的量化参数计算公式如下:对于给定的浮点数范围从最小值到最大值,缩放因子等于最大值减最小值除以量化级的数量减一,零点等于量化最小值减去最小值除以缩放因子并取整。对于对称量化,零点被强制为零,此时只需存储缩放因子即可。工程实现时还需要注意累加器的位宽问题:8 位整数的矩阵乘法结果可能超出 8 位范围,通常需要 32 位整数累加器后再进行缩放回算。
工程参数选择清单与落地建议
基于上述原理,以下提供一个可直接参考的工程参数选择清单,供实践时快速查阅。精度选择方面,8 位整数量化是最成熟、硬件支持最广泛的选择,应作为工程落地的默认起点;4 位及以下的极端量化需要特殊处理,如使用混合精度或依赖专用的量化推理引擎。粒度选择方面,权重推荐使用逐通道量化,激活值使用逐张量量化即可满足大多数场景需求。量化类型方面,除非激活值分布明显偏离零点,否则对称量化实现更简单、开销更低。
校准集的规模通常不需要太大,几百个样本即可,但必须具有代表性。在实际操作中,建议先使用一个较小的校准集快速迭代,确定基本可行后再扩大校准集进行精调。量化后必须进行精度验证,将量化模型的准确率或其他业务指标与全精度基准模型进行对比,常见的可接受精度损失阈值为百分之一到百分之二。如果精度损失超出阈值,首先考虑增加校准集规模或改进校准集代表性,其次尝试切换到逐通道量化,最后才考虑回退到更高精度或使用 QAT。
部署环节需要特别关注目标硬件的量化支持情况。主流的服务器 GPU(如 NVIDIA 的 TensorRT)以及移动端 NPU(如苹果的 Neural Engine、高通的 Hexagon)都对 8 位整数运算有良好的支持,但具体的量化模式(对称与非对称、逐通道与逐张量)支持程度可能各有差异。工程团队应当提前确认目标硬件的量化规范,并在开发初期进行兼容性验证,避免到集成阶段才发现无法部署的尴尬处境。
小结
量化并非深不可测的黑魔法,它的本质是将连续数值映射到有限离散集合的过程,这一原理在信号处理中已经被研究了近百年。从信号处理的视角出发,工程师可以获得更直观的理解:比特深度决定精度,量化步长决定分辨率,量化误差是不可避免的代价。在深度学习场景中,工程实现的重点转向了如何控制这种代价 —— 通过合理的校准策略、恰当的粒度选择以及与硬件能力匹配的精度规划,完全可以在模型体积缩小四倍的同时,将精度损失控制在可接受范围内。掌握这些基本原理和工程路径,是每一位从事模型压缩与部署的工程师应当具备的核心能力。
资料来源:本文量化信噪比公式与比特深度关系参考自维基百科量化条目1;工程实现路径参考 BigScience 与 DeepLearning.AI 的量化实践指南2。