训练后量化 (PTQ) 提供了一种优化预训练LLM的有效方法。其主要优势在于效率:与量化感知训练 (QAT) 不同,PTQ在训练完成后对模型进行修改,避免了使用量化模拟进行再训练或微调所带来的高昂计算成本和复杂性。这使得PTQ的应用速度明显加快,有助于快速部署和迭代。然而,这种便利也伴随着挑战。由于PTQ在操作时没有通过训练调整模型权重,因此更容易出现精度下降,特别是在量化到更低位深(如INT8或INT4)时。LLM由于其规模庞大且激活模式敏感,经常包含离群值,这些离群值会对简单的量化方法产生不成比例的影响。因此,采用先进的PTQ方法对于在获得模型尺寸减小和推理速度提升的好处的同时,最大限度地减少这种精度下降是很有帮助的。PTQ的核心工作流程是在代表性数据集上校准模型,以确定权重和激活的合适量化参数(比例因子和零点),然后应用这些参数将模型的浮点值转换为低精度整数。先进的PTQ致力于改进这一过程的每个步骤。先进的校准策略简单的校准方法,例如使用校准数据中观察到的绝对最小值和最大值来定义量化范围,对于LLM来说通常是不够的。一个大的离群值会大幅度扩展所需的范围,导致绝大多数接近零的值的精度很差。更复杂的校准策略旨在找到能够更好地保留原始分布或最小化量化误差的量化参数。最小化量化误差: 这些方法不只是使用最小值/最大值,而是寻找能最小化量化引入的误差的比例因子 ($s$) 和零点 ($z$),这种误差通常通过原始浮点张量 $X$ 与其量化-反量化版本 $X_q = s \cdot (\text{截断}(\text{四舍五入}(X/s) + z))$ 之间的均方误差 (MSE) 来衡量。通过搜索潜在范围(通常通过测试不同的饱和阈值或百分位数),可以选取在此校准数据集上最小化此误差指标的参数。分布匹配(基于熵的方法): 如库尔巴克-莱布勒 (KL) 散度最小化这样的方法旨在使量化值的概率分布与原始浮点分布尽可能地匹配。其理念是,对于模型精度而言,保持整体分布形状比最小化特定离群值的误差更重要。这通常涉及迭代地改进量化范围(例如,通过调整裁剪阈值),并计算原始激活分布(离散化为bin)与量化后分布之间的KL散度,最终选择产生最小散度的范围。校准数据集的选择和大小也同样重要。它必须足够大且具有代表性,能够准确捕捉模型在推理过程中遇到的典型激活分布。几百到几千个样本是常见的数量,这些样本需要经过精心选择以覆盖各种不同的输入。处理LLM中的离群值离群值在LLM激活中尤其成问题。注意力机制或前馈网络中可能会出现大值,而简单的量化方法很难使用单一比例因子同时以足够的精度表示这些离群值和更常见的小值。先进的PTQ采用多种策略来缓解此问题:裁剪: 校准方法通常通过选择小于绝对最小值/最大值的范围来隐式执行裁剪。显式裁剪涉及在计算比例因子和零点之前设置饱和阈值(例如,裁剪超出99.9%分位数的值)。这牺牲了极端离群值的表示精度,但显著提高了分布主体部分的精度。{"layout": {"title": "裁剪对量化粒度的影响", "xaxis": {"title": "原始值范围"}, "yaxis": {"title": "量化表示"}}, "data": [{"type": "scatter", "x": [-10, -5, -1, 0, 1, 5, 10, 50], "y": [0, 1, 2, 2, 3, 4, 4, 4], "mode": "lines+markers", "name": "带裁剪(范围 [-10, 10])"}, {"type": "scatter", "x": [-10, -5, -1, 0, 1, 5, 10, 50], "y": [1, 1, 2, 2, 2, 2, 3, 4], "mode": "lines+markers", "name": "不带裁剪(范围 [-10, 50])"}]}裁剪量化范围可以提高裁剪范围内值的精度,但代价是离群值会饱和。粒度调整(逐通道/组/Token): 与为整个张量使用一个比例因子/零点对(逐张量量化)不同,使用更细的粒度有助于隔离离群值。逐通道量化: 常用于卷积权重,也可应用于LLM中的线性层权重,为每个输出通道计算单独的参数。逐组量化: 将权重矩阵内的列或行分组,独立量化每个组。这在逐张量和逐通道量化之间提供了一种平衡。逐Token量化: 对于激活,量化参数有时可以为序列中的每个Token动态计算,适应该Token特定的激活模式。这增加了运行时开销,但能显著提高精度。精度保持策略有几种方法可以在量化 之前(但仍是训练后)对模型进行略微调整,使其更适合量化或纠正量化引入的误差。偏置校正: 量化权重会改变它们的有效值,这会系统地改变层的平均输出。偏置校正可以补偿这种偏移。在权重量化后,使用校准数据计算层输出的预期差异: $$ \Delta b = E[W_{\text{fp}} x] - E[W_{\text{q}} x] $$ 然后将此差异 $\Delta b$ 添加到层的原始偏置项 $b$ 中,以创建校正后的偏置 $b' = b + \Delta b$。这个简单的步骤通常可以恢复显著的精度,特别是在只量化权重时。权重均衡与平滑: 如跨层均衡 (CLE) 或 SmoothQuant 这样的方法旨在在量化 之前 调整权重和激活分布。CLE: 平衡连续层之间的权重范围。如果一个层有大权重而下一个层有小权重,CLE会缩小第一层权重并放大第二层权重(并相应调整偏置/激活),使它们的范围更相似,从而使两者更容易精确量化。SmoothQuant: 专门解决由于离群值导致LLM激活量化困难的问题。它引入了一种数学上等效的变换,通过按比例缩小激活并放大权重来平滑激活,有效地将量化难度从激活(更难量化)转移到权重(更容易量化)。这是逐通道进行的,使用平滑因子 $s_j$: $$ \hat{X} = X \cdot \text{diag}(s)^{-1} $$ $$ \hat{W} = \text{diag}(s) \cdot W $$ 关键在于输出保持不变:$Y = XW = (X \text{diag}(s)^{-1})(\text{diag}(s) W) = \hat{X} \hat{W}$。平滑后的激活 $\hat{X}$ 减少了离群值,更容易量化,而对权重 $\hat{W}$ 的影响更容易管理。AdaRound: 一种更精妙的方法,优化量化过程中的舍入策略。AdaRound不使用简单的四舍五入,而是学习一个逐层的舍入掩码,利用少量校准数据和基于梯度的优化,最小化由量化引起的任务损失失真。它调整单个权重值是应该向上舍入还是向下舍入,以更好地保留层输出。应用这些先进的PTQ方法需要仔细的实施和评估。虽然它们与基本的PTQ相比增加了复杂性,但对于将LLM量化到INT8、INT4甚至更低位宽,而不在困惑度或下游任务性能方面造成不可接受的损失来说,它们通常很重要。接下来的章节将介绍QAT(将量化集成到训练过程中),以及将位宽降至4比特以下的极端量化方法。