本站内容由 AI 生成,可能存在错误。如发现问题,欢迎到 GitHub Issues 反馈。

量化感知训练 (QAT)

量化感知训练 (QAT)

更新于 2026-04-05

核心问题:为什么 Post-Training Quantization 不够?

Quantization Fundamentals 中我们学习了 PTQ (Post-Training Quantization) 的基本原理:训练完成后直接对权重进行量化映射。这种方法简单高效,但在极低比特场景(≤4 bit)会遇到精度灾难性下降:

  • 量化噪声累积:每层的量化误差会在深层网络中累积放大
  • 激活分布不匹配:模型训练时假设 FP32 精度,量化后激活值分布偏移
  • 梯度消失:round() 操作导数恒为 0,无法通过微调恢复精度

Quantization-Aware Training (QAT) 的核心思想是在训练过程中模拟量化噪声,让模型学会适应低精度表示,从而在极低比特下也能保持精度。

QAT 核心机制:Fake Quantization + Straight-Through Estimator

QAT 的训练流程引入了两个关键技术:

  1. Fake Quantization (伪量化):前向传播时插入量化-反量化操作,模拟推理时的精度损失
  2. Straight-Through Estimator (STE):反向传播时让梯度”穿过”不可导的 round() 操作
1. FP32 Master Weight
FP32 Master WeightW = [0.347, -0.892, ...]全精度 32-bit训练开始时初始化为全精度权重整个训练过程始终保持 FP32 精度

数学表达

标准量化函数(不可导):

Q(x)=round(xs)sQ(x) = \text{round}\left(\frac{x}{s}\right) \cdot s

STE 近似梯度(Bengio et al. 2013):

Q(x)x{1if x<clip_range0otherwise\frac{\partial Q(x)}{\partial x} \approx \begin{cases} 1 & \text{if } |x| < \text{clip\_range} \\ 0 & \text{otherwise} \end{cases}

训练时保持 FP32 Master Weight WW,前向传播使用 Q(W)Q(W),反向传播梯度直接更新 WW

Wt+1=WtηLQ(W)(梯度近似为LW)W_{t+1} = W_t - \eta \cdot \frac{\partial L}{\partial Q(W)} \quad (\text{梯度近似为} \frac{\partial L}{\partial W})
STE 梯度流QAT 训练:Fake Quantization + STE 梯度流前向传播W (FP32)Master WeightFake QuantQ(W) = round(W/s)·sQ(W)伪量化权重MatMulQ(W) · xLossL反向传播 (STE)∂L/∂W ≈ ∂L/∂Q(W)STE:梯度穿过 round(),视为恒等round() 不可导关键:FP32 Master Weight 全程保持,只在前向时量化

LoRA-QAT vs QLoRA:量化 + 微调的两条路线

在 LLM 时代,QAT 与 LoRA (Low-Rank Adaptation) 结合产生了两种不同的技术路线:

QLoRA vs LoRA-QATQLoRA先量化,后微调预训练模型 (FP32)PTQ 量化 → 4-bit 基座FP16 LoRA Adapter微调 (只更新 LoRA)基座冻结 4-bit → 无法适应量化噪声vsLoRA-QAT训练时感知量化预训练模型 (FP32)Fake Quant + LoRASTE 梯度更新基座+Adapter量化部署 (基座已适应)基座通过 STE 学习 → 最终精度更高

路线 1: QLoRA (先量化后微调)

QLoRA (Dettmers et al. 2023) 采用 PTQ 量化预训练模型,然后在 FP16 LoRA adapters 上微调:

# QLoRA 流程 (简化示例)
base_model = quantize_to_4bit(pretrained_model)  # PTQ 量化基座
lora_adapter = LoRA(rank=16, dtype=fp16)         # FP16 低秩适配器

for batch in dataloader:
    out = base_model(batch) + lora_adapter(batch)  # 量化权重 + FP16 adapter
    loss.backward()  # 只更新 LoRA 参数

优势:内存高效(4-bit 基座 + 小 adapter),无需重新训练基座
劣势:基座权重已量化为 4-bit,无法通过训练适应量化噪声

路线 2: LoRA-QAT (训练时量化感知)

LQ-LoRA (Han et al. 2023) 在 LoRA 微调时对基座权重应用 Fake Quantization:

# LoRA-QAT 流程 (简化示例)
base_model = pretrained_model  # 保持 FP32
lora_adapter = LoRA(rank=16, dtype=fp16)

for batch in dataloader:
    W_q = fake_quantize(base_model.weight, bits=4)  # 伪量化
    out = matmul(W_q, batch) + lora_adapter(batch)
    loss.backward()  # 通过 STE 更新基座和 adapter

优势:基座权重在训练时感知量化噪声,最终精度更高
劣势:需在微调阶段插入 Fake Quant 节点,训练成本略高

极限案例:BitNet 的 1.58-bit QAT

BitNet (Wang et al. 2023) 通过 QAT 将 Transformer 权重量化为 1 三值,实现极致压缩:

三值量化的计算优势

传统 FP16 vs BitNet 三值计算对比传统 FP16 (2×2 × 2×2)A =0.8 -1.20.5 0.9B =0.6 0.3-0.4 1.1Cell (0,0) 计算路径0.8 × 0.6 = 0.48+ (-1.2) × (-0.4) = 0.48= 0.962 次乘法1 次加法总计: 4 次乘法 + 2 次加法= 6 FLOPsBitNet 三值 (2×2 × 2×2)A =+1 -1+1 +1B =+1 0-1 +1Cell (0,0) 计算路径(+1)×(+1) → add X(-1)×(-1) → add X= +2 (0 次乘法)0 次乘法2 次加法总计: 0 次乘法 + 2 次加减+ 2 次跳过 (W=0)关键优势:BitNet 完全消除乘法运算{-1, 0, +1} 只需加法器和符号位,无需浮点乘法单元点击计算路径框查看详细步骤

BitNet 的核心是 absmean quantization

Wternary=sign(W)1W>αmean(W)W_{\text{ternary}} = \text{sign}(W) \cdot \mathbb{1}_{|W| > \alpha \cdot \text{mean}(|W|)}

其中 α0.5\alpha \approx 0.5 是阈值超参数,控制稀疏度。

训练策略

  1. 直接训练三值权重(非 PTQ):初始化为 FP32,每步前向前量化为 1
  2. 使用 STE 梯度sign(x)x1x1\frac{\partial \text{sign}(x)}{\partial x} \approx \mathbb{1}_{|x| \leq 1}
  3. 激活保持 8-bit:权重 1.58-bit + 激活 8-bit 平衡精度与效率

实验结果(LLaMA 架构):

  • 3B 模型:BitNet 与 FP16 perplexity 差距 <3%
  • 内存 & 能耗:推理能耗降低 71%,吞吐提升 2.7×

QAT vs PTQ 的精度边界

QAT vs PTQ 精度边界:Perplexity 增长曲线010203040123468Bit Width (位宽)Perplexity 增长 (%)交叉点~3 bitPTQ (Post-Training)QAT (Quantization-Aware)极低比特区域 (≤3 bit)QAT 显著优于 PTQPTQ 精度快速崩溃需训练时量化感知

实验数据来自 Jacob et al. (2018) 在 ResNet-50/ImageNet 上的对比:

Bit WidthPTQ Top-1 AccQAT Top-1 AccGap
8-bit76.1%76.5%+0.4%
4-bit68.3%74.8%+6.5%
3-bit42.1%71.2%+29.1%
2-bit12.5%65.4%+52.9%

关键结论

  • ≥4 bit:PTQ 已足够,QAT 收益递减
  • ≤3 bit:PTQ 精度崩溃,QAT 成为刚需
  • 工程权衡:QAT 需重新训练,但在极低比特场景下是唯一可行方案

延伸阅读