大模型的 AWQ: Activation-Aware Weight Quantization 激活值感知权重量化 压缩
flyfish
经验观察 → 理论推导 → 工程实现
为什么AI的世界是「不均匀」的?
一个能瞬间提升认知效率的思维模型——28法则。这个法则告诉我们:AI的世界的运行是不均匀的。
1. 帕累托的「意外发现」
1906年,意大利经济学家帕累托观察到一个诡异现象:他的花园里,20%的豌豆荚贡献了80%的豆子。更惊人的是,这个比例在社会财富分配中同样成立——20%的人掌握80%的财富。这不是数学游戏,而是自然界的幂律分布在作怪。
现代研究发现,28法则几乎无处不在:
- 20%的客户带来80%的利润(商业)
- 20%的代码包含80%的错误(编程)
- 20%的朋友占用80%的社交时间(人际关系)
2. 为什么世界是「不均匀」的?
这背后有两个底层逻辑:
马太效应:强者愈强,弱者愈弱。比如,畅销书会占据更多推荐位,进一步扩大销量。
非线性因果:微小的差异可能被系统放大。比如,运动员0.1秒的反应速度差距,可能决定金牌归属。
想高效解决问题,必须找到那个「关键的20%」。
3. 28法则的「正确用法」
记住,28法则不是精确的数学公式,而是一种思维工具:
识别杠杆点:在工作中,找到能带来最大收益的20%任务(比如战略规划而非日常琐事)。
忽略「完美主义」:完成80%的成果往往只需20%的时间,剩下的20%可能需要80%的精力。
警惕「幸存者偏差」:媒体报道的成功案例(如硅谷独角兽)属于那20%,而80%的企业都在默默无闻中倒闭。
4. 现代社会的「28法则升级」
在数字化时代,幂律分布正在加剧:
头部网红拿走80%的流量,长尾创作者只能分食20%。
前1%的GitHub贡献者主导了80%的开源项目更新。
但反过来说,这也是机会——只要找到属于自己的「20%战场」,就能以小博大。
5. 警惕「28陷阱」
过度简化:并非所有领域都符合28法则。比如,制造业的质量控制可能需要100%的精度。
忽视系统性风险:过度依赖20%的资源可能导致脆弱性。比如,单一供应商断供可能摧毁整个产业链。
真正的高手,懂得用20%的「精准努力」撬动80%的「系统红利」。
当面对复杂问题时,不妨问自己:这里的「关键少数」在哪里? 就像AWQ算法通过保护1%的显著权重实现模型压缩。
AI的世界不仅是不均匀的,而且是「层层嵌套的不均匀」
1. 28法则的嵌套性
28法则的本质是幂律分布(Power Law Distribution),其核心特性是层级嵌套。例如:
- 第一层:20%的人掌握80%的财富。
- 第二层:在这20%中,可能有20%的人(即总人口的4%)掌握80%的财富(即总财富的64%)。
- 以此类推,形成“关键中的关键”。
这种嵌套性在模型量化中的体现是:
在AWQ保护的1%显著权重中,可能存在更小比例的权重(如0.2%)主导了这1%的效果。
2. AWQ
(1)权重重要性的层级性
- 激活值的幅值差异:论文指出,激活值大的通道对应的权重更重要。这意味着,在显著权重内部,激活值更高的通道可能更关键。
- 缩放因子的动态调整:AWQ通过公式 s=sXαs = s_X^\alphas=sXα(sXs_XsX 为激活均值)为每个通道分配不同的缩放因子。这相当于对显著权重进行差异化保护,隐含了“核心中的核心”的思路。
(2)实验验证
- 保护0.1%权重的效果:论文表1显示,保留0.1%的显著权重即可将PPL从23.54降至15.71,接近保留1%时的13.0。这说明,在1%的显著权重中,可能有部分权重对性能起决定性作用。
3. 实际应用的挑战
若在1%显著权重中再应用28法则(即保护0.2%),需考虑以下问题:
(1)精度与压缩率的权衡
- 收益递减:保护0.2%权重可能进一步降低PPL,但效果可能不如从100%到1%的提升显著。
- 硬件效率下降:混合精度(如0.2% FP16 + 99.8% INT4)的硬件兼容性问题可能加剧。
(2)算法复杂度增加
- 多层筛选:需设计递归或迭代方法,逐层筛选核心权重,增加计算成本。
- 校准集依赖:多次筛选可能导致过拟合校准集,损害泛化性。
4. AWQ的解决方案:动态缩放替代显式筛选
AWQ并未显式分层筛选权重,而是通过动态通道缩放间接实现了类似效果:
- 自适应保护:通过公式 s=sXαs = s_X^\alphas=sXα,激活值更高的通道被赋予更大的缩放因子 sss,相当于隐式提升其重要性。
- 硬件友好性:全量化方案避免了混合精度的复杂性,通过缩放技术在统一低精度下保护关键权重。
嵌套应用28法则在幂律分布场景下成立,可能进一步提升模型效率,AWQ通过动态缩放因子隐式处理了权重的层级重要性,避免显式分层筛选的复杂性。
AWQ算法在1%的显著权重中,通过动态缩放因子(而非显式筛选)实现“核心中的核心”保护,真正的高效策略往往藏在系统的自适应机制中。
Figure 1
该图直观展示了 AWQ 和 TinyChat 在设备端 LLM 部署中的协同作用,AWQ 通过激活感知缩放保护关键权重,降低量化误差。
TinyChat 通过硬件适配技术(如 SIMD 打包、内核融合)将压缩模型的潜力转化为实际加速。
推动 LLM 在资源受限设备上的普及,如实时对话、自动驾驶等场景。
-
AWQ 的定位
AWQ 是一种通用的权重量化方法,旨在解决设备端大语言模型(LLM)的压缩与加速问题。通过保护 1% 的显著权重,AWQ 在低比特量化(如 4 位)下仍能保持高精度。 -
TinyChat 框架的作用
- 部署能力:将 AWQ 量化后的模型部署到多种边缘设备(如桌面 GPU、笔记本电脑、移动 GPU、树莓派等)。
- 性能提升:相比 Huggingface 的 FP16 实现,TinyChat 在不同设备上实现了 3-4 倍的加速。
- 硬件适配:通过内核融合(Kernel Fusion)和平台感知的权重打包(Weight Packing)优化推理效率。
-
实际部署案例
- Jetson Orin Nano:搭载 TinyChat 的边缘设备仅需 8GB 内存和 15W 功耗即可运行 70B 参数的 Llama-2 模型。
- 多设备支持:展示了从高端 GPU(如 NVIDIA B200)到低功耗设备(如树莓派)的部署可行性。
-
技术优势总结
- 内存压缩:通过 4 位权重量化将模型尺寸减少约 4 倍。
- 推理加速:结合硬件友好的量化算法和框架优化,实现理论内存节省到实际速度提升的转化。
AWQ(Activation-aware Weight Quantization,激活感知权重量化)是一种针对大型语言模型(LLM)的高效模型压缩技术,旨在通过权重量化和激活感知优化来显著减少模型的内存占用和计算成本,同时尽可能保持模型的性能。
1. AWQ的核心思想
-
问题背景:
大型模型(如LLM)的参数量巨大(如百亿级),直接部署会导致内存占用过高、推理速度慢。传统量化方法(如INT8/INT4)在低比特量化时会显著降低模型性能,而训练后量化(PTQ)或量化感知训练(QAT)可能因过拟合或计算成本过高而难以应用。 -
AWQ的核心创新:
AWQ基于两个关键观察:- 权重的重要性不均:仅约 0.1%-1%的“显著权重”(salient weights)对模型性能至关重要,这些权重通常与较大的激活值(activation magnitudes)相关。
- 激活感知优化:通过分析激活值的分布,而非仅依赖权重本身的分布,来识别需要保留的“显著权重”,从而减少量化误差。
2. AWQ的实现原理
(1) 识别并保留“显著权重”
-
激活感知选择:
根据激活值的幅度(activation magnitudes)选择需要保留的权重通道。具体来说:- 激活值较大的特征通常对应更重要的信息,因此与这些激活值相关的权重通道会被标记为“显著权重”。
- 仅对非显著权重进行量化,而保留约 0.1%-1%的显著权重为高精度格式(如FP16),以最小化性能损失。
-
实验验证:
在OPT-6.7B模型中,仅保留 1%的显著权重 不进行量化,其余权重量化为INT3,模型的困惑度(PPL)可从43.2显著降低至13.0,接近未量化的性能。
(2) 通道缩放(Channel-wise Scaling)
-
问题:
直接跳过部分权重的量化可能导致硬件效率低下(如混合精度实现复杂)。 -
解决方案:
通过通道级缩放优化量化误差:- 对每个权重通道进行缩放(scaling),放大“显著权重”对应的通道,以减少其量化后的相对误差。
- 通过数学推导和优化,自动搜索缩放因子,使整体量化误差最小化。
(3) 支持多种量化位宽
- AWQ支持 INT4、INT3、INT8 等低比特量化,具体选择取决于硬件和性能需求:
- INT4量化:将模型压缩至FP16的1/4,适合资源受限的设备。
- INT3量化:进一步压缩模型,但需更精细的校准以控制精度损失。
AWQ的核心原理:保护“重要权重”
1. 权重并不“平等”
研究发现,模型中 只有0.1%~1%的权重对结果影响最大,这些权重被称为 显著权重(Salient Weights)。
比如,想象你有一台机器,里面有很多零件,但只有少数关键零件(比如发动机)对机器运行至关重要。AWQ的思路是:
- 保留关键零件(显著权重)的高精度(FP16);
- 其他零件(非显著权重)可以大幅简化(低比特量化)。
2. 显著权重
AWQ通过 激活值(Activation) 来判断权重的重要性。
- 激活值 是输入到权重的值(比如在自注意力层中,输入向量 (X))。
- 激活值大的通道(Channel) 对最终输出影响更大,因此对应的权重更“重要”。
数学公式:
假设权重矩阵为 (W),输入为 (X),则输出为:
Y=W⋅X
Y = W \cdot X
Y=W⋅X
如果某列(Channel)的 (X) 的绝对值很大,那么这一列的权重 (W) 对输出 (Y) 的影响更大,因此是 显著权重。
3. 缩放因子(Scaling Factor):平衡误差
AWQ的核心是通过 缩放因子 来保护显著权重,同时减少量化误差。
步骤:
-
计算缩放因子:根据激活值的分布,为每个通道设计一个缩放因子 (s),使得:
- 显著权重 的缩放因子 (s) 较大(放大这些权重,减少量化误差);
- 非显著权重 的缩放因子 (s) 较小(允许更大误差)。
-
量化过程:
- 将权重 (W) 乘以缩放因子 (s),再量化为低比特整数;
- 输入 (X) 除以缩放因子 (s),保证计算结果不变。
数学表达:
原始计算:
Y=W⋅X
Y = W \cdot X
Y=W⋅X
量化后:
Yquant=(W⋅s)⋅(Xs)=W⋅X
Y_{\text{quant}} = (W \cdot s) \cdot \left( \frac{X}{s} \right) = W \cdot X
Yquant=(W⋅s)⋅(sX)=W⋅X
通过缩放因子 (s) 的设计,显著权重的误差被最小化,而非显著权重的误差被容忍。
如何确定权重的显著性 - 模型的「关键权重」
1. 传统方法的「认知误区」
过去,人们总以为权重的数值大小决定了其重要性。论文指出,传统方法(如基于L2范数筛选权重)在量化中效果不佳,困惑度(PPL)仅从43.2降至23.54,几乎没啥进步。
数据不会说谎,但解读数据的人会。权重的数值只是表象,激活值才是真相。
2. 激活值:神经元的「心跳检测仪」
论文发现,真正的关键权重藏在激活值里。激活值就像神经元的“心跳检测仪”,反映了输入特征对模型的刺激强度。比如,当模型看到“猫”的图片时,某些神经元的激活值会飙升,这些神经元对应的权重就是关键。
科学原理:
激活值大的通道,处理的是高信息量输入,其权重对模型决策起决定性作用。
3. AWQ的「激活值侦探术」
AWQ用两步锁定关键权重:
- 第一步:离线激活值统计
用少量校准数据计算每个通道的激活均值,就像给神经元做“心电图”。 - 第二步:动态缩放因子
通过公式 s=sXαs = s_X^\alphas=sXα(sXs_XsX 是激活均值)给关键通道“加buff”。
实验:
保护1%基于激活值选出的权重,困惑度(PPL)从43.2暴跌至13.0,效果堪比混合精度。
4. 为什么激活值比权重更可靠?
- 权重是「中间人」:权重只是模型内部参数,而激活值直接关联输入特征的重要性。
- 抗干扰能力强:激活值统计基于输入数据,而非模型自身参数,避免了权重冗余的干扰。
为什么要采用通道(Channel)来判断权重的重要性
AWQ 选择以 通道(Channel) 作为判断权重重要性的单位,而非单个权重或其他结构,主要基于以下技术考量和实验验证:
1. 通道的语义意义:特征的最小独立单元
- 通道的功能:在神经网络(如 Transformer)中,通道是特征的基本处理单元。例如,自注意力层的输入 XXX 通常按通道分组,每个通道对应不同的语义特征(如空间位置、颜色、纹理等)。
- 激活值的整体性:激活值大的通道意味着该通道处理的特征对当前任务更重要。保护整个通道的权重,能完整保留这些特征的信息
- 论文实验:保留基于激活值选择的 1% 通道为 FP16,困惑度(PPL)从 23.54 降至 13.0,而随机选择或基于权重的选择效果与 RTN 相近
2. 硬件效率:通道级操作的优化潜力
- SIMD 指令适配:现代硬件(如 GPU、ARM CPU)的 SIMD 指令(如 128-bit NEON)支持按通道并行处理。通道级缩放或量化可减少数据搬运和计算开销(
- 内存访问优化:按通道打包数据(如 4-bit 权重)可提高内存带宽利用率。例如,TinyChat 通过 SIMD-aware 权重 packing 将 32 个 4-bit 权重放入 128-bit 寄存器,减少解量化操作
3. 计算复杂度:平衡精度与效率
- 通道级缩放的低成本:每个通道只需计算一个缩放因子 sss,而非为每个权重单独调整。通过公式 s=sXαs = s_X^\alphas=sXα(sXs_XsX 为激活均值),仅需优化单个超参数 α\alphaα
- 避免过拟合:通道级统计(如激活均值)比单个权重更稳定,减少了对校准集的依赖
4. 对比其他结构(如组或块)
- 更细粒度的保护:论文采用组大小为 128 的分组量化(如 INT3-g128),但通道级操作更细粒度。例如,保护 1% 的通道(约 70 个通道)比保护 1% 的组(约 1.28 个组)更精准
- 实验验证:通道级缩放使 AWQ 在 INT3-g128 量化下的 PPL 优于 GPTQ 的组级优化
5. 数学推导支持
在矩阵乘法 y=Wxy = Wxy=Wx 中,通道级缩放 sss 的优化目标为:
s∗=arg mins∥Q(W⋅diag(s))(diag(s)−1⋅X)−WX∥(5)
s^* = \underset{s}{\text{arg min}} \| Q(W \cdot \text{diag}(s)) \left( \text{diag}(s)^{-1} \cdot X \right) - WX \| \quad (5)
s∗=sarg min∥Q(W⋅diag(s))(diag(s)−1⋅X)−WX∥(5)
公式表明,通道级缩放因子 sss 直接影响激活值 XXX 的变换,从而保护关键特征
通道选择的优势
维度 | 通道级操作 | 其他结构(如组、单个权重) |
---|---|---|
语义保护 | 完整保留特征信息(如空间位置、颜色) | 可能割裂特征整体性 |
硬件效率 | 适配 SIMD 指令,减少内存访问 | 数据搬运和计算开销大 |
计算成本 | 仅需优化通道级缩放因子 | 需处理大量独立参数(如每个权重或组) |
实验效果 | PPL 从 23.54 降至 13.0(表 1) | 随机选择或权重选择效果与 RTN 相近 |
为什么权重的数值只是表象,激活值才是真相
1. 量化误差的数学分析
(1)量化函数与误差公式
论文通过量化函数的数学推导,证明激活值对误差的影响大于权重本身:
Q(w)=Δ⋅Round(wΔ),Δ=max(∣w∣)2N−1(1)
Q(w) = \Delta \cdot \text{Round}\left(\frac{w}{\Delta}\right), \quad \Delta = \frac{\max(|w|)}{2^{N-1}} \quad (1)
Q(w)=Δ⋅Round(Δw),Δ=2N−1max(∣w∣)(1)
其中,Δ\DeltaΔ 是量化缩放因子,由权重的最大值决定。论文指出,权重的数值仅影响 Δ\DeltaΔ,但实际误差还取决于输入激活值 xxx
(2)缩放后的误差比值
对权重 www 乘以缩放因子 sss 后,量化误差的比值为:
Err(Q(ws)(x/s))Err(Q(w)x)=Δ′Δ⋅1s(4)
\frac{\text{Err}(Q(ws)(x/s))}{\text{Err}(Q(w)x)} = \frac{\Delta'}{\Delta} \cdot \frac{1}{s} \quad (4)
Err(Q(w)x)Err(Q(ws)(x/s))=ΔΔ′⋅s1(4)
由于 Δ′≈Δ\Delta' \approx \DeltaΔ′≈Δ(缩放单个权重不影响组最大值),误差主要由 1s\frac{1}{s}s1 决定。当 s>1s > 1s>1 时,显著权重的误差更小,而 sss 的选择依赖激活值统计
2. 目标函数的优化方向
AWQ 的目标函数为:
s∗=arg mins∥Q(W⋅diag(s))(diag(s)−1⋅X)−WX∥(5)
s^* = \underset{s}{\text{arg min}} \| Q(W \cdot \text{diag}(s)) \left( \text{diag}(s)^{-1} \cdot X \right) - WX \| \quad (5)
s∗=sarg min∥Q(W⋅diag(s))(diag(s)−1⋅X)−WX∥(5)
其中,XXX 是激活值矩阵。公式表明,缩放因子 sss 的优化直接依赖激活值 XXX,而非权重 WWW
3. 实验验证与统计分析
(1)表1:激活值选择的权重效果
实验显示,基于激活分布选择的1%显著权重,使困惑度(PPL)从RTN的23.54降至13.0,而基于权重分布或随机选择的效果与RTN相近
(2)表2:激活值与缩放因子的关系
当显著权重通道的缩放因子 s=2s = 2s=2 时,PPL 从23.54降至11.92。进一步分析表明,激活值越大的通道,其缩放后的误差减少率越高
4. 理论支撑:矩阵乘法的线性代数视角
在矩阵乘法 y=Wxy = Wxy=Wx 中:
- 权重 WWW 的作用:决定输入 xxx 的线性变换方向。
- 激活值 xxx 的作用:决定每个方向上的信息量。
论文指出,激活值的幅值 ∣x∣|x|∣x∣ 直接影响输出 yyy 的幅值,因此与激活值关联的权重通道更重要
5. 数学概念延伸
(1)矩阵范数与激活值的关系
传统方法用 L2L_2L2-范数 ∥W∥2\|W\|_2∥W∥2 衡量权重重要性,但论文发现这与模型性能相关性弱。激活值的幅值 ∥x∥2\|x\|_2∥x∥2 更直接影响输出 ∥y∥2=∥Wx∥2\|y\|_2 = \|Wx\|_2∥y∥2=∥Wx∥2,因此是更有效的指标
(2)优化理论中的梯度重要性
在反向传播中,权重的梯度 ∂L∂W\frac{\partial \mathcal{L}}{\partial W}∂W∂L 包含激活值 xxx 的贡献:
∂L∂W=∂L∂y⋅xT
\frac{\partial \mathcal{L}}{\partial W} = \frac{\partial \mathcal{L}}{\partial y} \cdot x^T
∂W∂L=∂y∂L⋅xT
这表明,激活值 xxx 直接决定了权重的梯度大小,从而影响其对损失的贡献。
(a):传统四舍五入(RTN)量化**
所有权重均量化为低比特(如 INT3),导致严重的精度损失(困惑度 PPL=43.2)。
RTN Round to Nearest(四舍五入到最近整数)
1. RTN 的定义与作用
(1)RTN 的本质
RTN 是一种舍入量化方法,其核心操作是将浮点数映射到最近的整数。例如:
- 对于 INT4 量化,权重会被缩放至 [-8, 7] 的范围,然后通过 RTN 取整。
- 数学表达式为:
q=Round(ws),其中 s 是缩放因子 q = \text{Round}\left( \frac{w}{s} \right), \quad \text{其中 } s \text{ 是缩放因子} q=Round(sw),其中 s 是缩放因子
(2)RTN 在 AWQ 中的定位
- 基础量化方法:RTN 是 AWQ 对比实验的基准方法之一。例如 在 INT3 量化下,AWQ 的困惑度(PPL)为 13.0,显著优于 RTN 的 23.54。
- 与 AWQ 的关系:AWQ 通过优化通道缩放因子 sss 减少量化误差,而 RTN 直接使用固定缩放因子(如通道最大值)。
2. RTN 在AWQ中的具体应用
(1)权重量化流程
- 通道缩放:将权重矩阵按通道缩放,使得每个通道的最大值不超过量化范围(如 INT4 的 7)。
- RTN 舍入:对缩放后的权重取整,得到量化后的整数。
- 反量化:通过 w=q⋅sw = q \cdot sw=q⋅s 恢复浮点数,用于矩阵乘法。
(2)与 AWQ 的差异
方法 | 缩放因子 sss 的计算方式 | 保护机制 | 量化误差 |
---|---|---|---|
RTN | 固定为通道最大值(或经验值) | 无 | 较大(直接舍入) |
AWQ | 基于输入激活值 XXX 的统计量优化 sss | 保护 0.1%-1% 的显著通道 | 较小(动态调整) |
示例:在 INT4 量化中,RTN 可能将权重范围缩放至 [-8, 7],而 AWQ 会根据激活值 XXX 的分布动态调整缩放因子,优先保护对激活值影响大的通道。
3. 论文中的 RTN 相关实验
(1)RTN 与 AWQ 的性能对比
量化方法 | 模型 | 困惑度(PPL) | 说明 |
---|---|---|---|
FP16 | OPT-1.3B | 10.2 | 全精度基准 |
RTN | OPT-1.3B | 23.54 | 直接四舍五入,未优化缩放因子 |
AWQ | OPT-1.3B | 13.0 | 基于激活值优化缩放因子,保护显著通道 |
RTN 是一种简单但误差较大的量化方法,而 AWQ 通过激活感知优化显著提升了性能。
(2)RTN 的误差分布
RTN 的量化误差呈现均匀分布(误差范围为 ±0.5),而 AWQ 的误差因通道保护机制呈现非对称分布(显著通道误差接近 0)。
比较
组件 | RTN(Round to Nearest) | AWQ |
---|---|---|
量化目标 | 直接对权重进行四舍五入,无保护机制 | 基于激活值优化缩放因子,保护显著通道 |
误差来源 | 舍入误差(±0.5) | 动态调整误差,显著通道误差接近 0 |
硬件效率 | 高(无需额外计算) | 中等(需校准集计算缩放因子) |
论文中的应用 | 对比实验的基准方法 | 核心优化方法,优于 RTN 和其他方法 |
![]() | ||
(b):保留 1% 显著权重为 FP16** |
通过激活分布识别显著权重并保留为 FP16,其他权重量化为 INT3。此混合精度方法将 PPL 降至 13.0,但硬件效率低(需处理混合精度格式)。
c):AWQ 的通道缩放方法**
对显著权重通道进行缩放后全量化为 INT3,无需混合精度。结果与中图相当(PPL=13.0),但硬件友好性显著提升。
组量化与压缩比分析
组量化定义
在权重量化中,组量化(Group Quantization)将权重张量划分为多个组,每组共享相同的量化参数(如量化比例Δ\DeltaΔ和零点zzz)。组大小GGG定义为每组包含的权重元素数量。组量化是逐张量量化(Tensor-wise,G=NG=NG=N)和逐通道量化(Channel-wise,G=1G=1G=1)的泛化形式。
量化压缩比公式
假设原始权重张量W∈RN\mathbf{W} \in \mathbb{R}^{N}W∈RN,每个元素以aaa比特存储。量化后,每个元素以bbb比特存储,且每组需存储sss字节的量化元数据(如Δ\DeltaΔ和zzz)。则压缩比RRR定义为:
R=原始存储大小量化后总存储大小=N⋅a(NG⋅s)+N⋅b=asG+b.
R = \frac{\text{原始存储大小}}{\text{量化后总存储大小}} = \frac{N \cdot a}{\left( \frac{N}{G} \cdot s \right) + N \cdot b} = \frac{a}{\frac{s}{G} + b}.
R=量化后总存储大小原始存储大小=(GN⋅s)+N⋅bN⋅a=Gs+ba.
其中,sG\frac{s}{G}Gs表示每元素的元数据开销(以比特为单位)。
组大小对压缩比的影响
- 逐张量量化(G=NG=NG=N):
R=abR = \frac{a}{b}R=ba,此时元数据开销可忽略,但量化误差可能较大。 - 小组量化(G≪NG \ll NG≪N):
元数据开销sG\frac{s}{G}Gs增大,但量化误差降低。例如,当s=16s=16s=16比特(半精度浮点),b=4b=4b=4比特,G=32G=32G=32时:
R=a1632+4=a4.5. R = \frac{a}{\frac{16}{32} + 4} = \frac{a}{4.5}. R=3216+4a=4.5a.
元数据开销占比sG⋅b=1632⋅4=12.5%\frac{s}{G \cdot b} = \frac{16}{32 \cdot 4} = 12.5\%G⋅bs=32⋅416=12.5%。
AWQ:激活感知权重量化
组级仅权重量化误差分析
假设权重矩阵W∈RC×D\mathbf{W} \in \mathbb{R}^{C \times D}W∈RC×D(CCC为通道数,DDD为特征维度),输入激活X∈RD\mathbf{X} \in \mathbb{R}^{D}X∈RD,输出为Y=WX\mathbf{Y} = \mathbf{W}\mathbf{X}Y=WX。
对称量化函数定义为:
Q(W)=Δ⋅Round(WΔ),
Q(\mathbf{W}) = \Delta \cdot \text{Round}\left( \frac{\mathbf{W}}{\Delta} \right),
Q(W)=Δ⋅Round(ΔW),
其中Δ=max(∣W∣)2b−1−1\Delta = \frac{\max(|\mathbf{W}|)}{2^{b-1} - 1}Δ=2b−1−1max(∣W∣)为量化比例。量化后的输出为:
Y^=Q(W)X.
\mathbf{\hat{Y}} = Q(\mathbf{W}) \mathbf{X}.
Y^=Q(W)X.
量化误差为:
Err(Y^)=Y−Y^=Δ⋅RoundErr(WΔ)⋅X,
\text{Err}(\mathbf{\hat{Y}}) = \mathbf{Y} - \mathbf{\hat{Y}} = \Delta \cdot \text{RoundErr}\left( \frac{\mathbf{W}}{\Delta} \right) \cdot \mathbf{X},
Err(Y^)=Y−Y^=Δ⋅RoundErr(ΔW)⋅X,
其中RoundErr(⋅)=∣⋅−Round(⋅)∣\text{RoundErr}(\cdot) = \left| \cdot - \text{Round}(\cdot) \right|RoundErr(⋅)=∣⋅−Round(⋅)∣。
若WΔ\frac{\mathbf{W}}{\Delta}ΔW服从均匀分布,则E[RoundErr]=0.25\mathbb{E}[\text{RoundErr}] = 0.25E[RoundErr]=0.25,误差期望为:
E[Err(Y^)]∝Δ⋅X.
\mathbb{E}[\text{Err}(\mathbf{\hat{Y}})] \propto \Delta \cdot \mathbf{X}.
E[Err(Y^)]∝Δ⋅X.
结论:量化误差与输入激活X\mathbf{X}X的幅度成正比,具有激活感知特性。
权重与激活联合缩放
引入通道级缩放因子s∈RC\mathbf{s} \in \mathbb{R}^Cs∈RC(对角矩阵diag(s)\text{diag}(\mathbf{s})diag(s)),重新定义量化权重为:
Q(W⋅diag(s))=Δ′⋅Round(W⋅diag(s)Δ′),
Q(\mathbf{W} \cdot \text{diag}(\mathbf{s})) = \Delta' \cdot \text{Round}\left( \frac{\mathbf{W} \cdot \text{diag}(\mathbf{s})}{\Delta'} \right),
Q(W⋅diag(s))=Δ′⋅Round(Δ′W⋅diag(s)),
其中Δ′=max(∣W⋅diag(s)∣)2b−1−1\Delta' = \frac{\max(|\mathbf{W} \cdot \text{diag}(\mathbf{s})|)}{2^{b-1}-1}Δ′=2b−1−1max(∣W⋅diag(s)∣)。
缩放后的输出为:
Y^′=Q(W⋅diag(s))⋅(diag(s)−1X).
\mathbf{\hat{Y}}' = Q(\mathbf{W} \cdot \text{diag}(\mathbf{s})) \cdot \left( \text{diag}(\mathbf{s})^{-1} \mathbf{X} \right).
Y^′=Q(W⋅diag(s))⋅(diag(s)−1X).
误差减少因子:
Err(Y^′)Err(Y^)=Δ′Δ⋅1s.
\frac{\text{Err}(\mathbf{\hat{Y}}')}{\text{Err}(\mathbf{\hat{Y}})} = \frac{\Delta'}{\Delta} \cdot \frac{1}{\mathbf{s}}.
Err(Y^)Err(Y^′)=ΔΔ′⋅s1.
通过优化s\mathbf{s}s,可使误差减少。例如,若s>1\mathbf{s} > 1s>1且Δ′≤Δ⋅s\Delta' \leq \Delta \cdot \mathbf{s}Δ′≤Δ⋅s,则:
Δ′Δ⋅1s≤1 ⟹ 误差降低.
\frac{\Delta'}{\Delta} \cdot \frac{1}{\mathbf{s}} \leq 1 \implies \text{误差降低}.
ΔΔ′⋅s1≤1⟹误差降低.
缩放因子优化
目标函数:
s∗=argminsEX∼D[∥Q(W⋅diag(s))⋅(diag(s)−1X)−WX∥22],
\mathbf{s}^* = \arg\min_{\mathbf{s}} \mathbb{E}_{\mathbf{X} \sim \mathcal{D}} \left[ \| Q(\mathbf{W} \cdot \text{diag}(\mathbf{s})) \cdot \left( \text{diag}(\mathbf{s})^{-1} \mathbf{X} \right) - \mathbf{W}\mathbf{X} \|_2^2 \right],
s∗=argsminEX∼D[∥Q(W⋅diag(s))⋅(diag(s)−1X)−WX∥22],
其中D\mathcal{D}D为校准数据分布。由于Q(⋅)Q(\cdot)Q(⋅)不可微,直接梯度优化不可行。
启发式优化方案:
假设输入激活的幅度主导误差,令s=(E[∣X∣])α\mathbf{s} = (\mathbb{E}[|\mathbf{X}|])^{\alpha}s=(E[∣X∣])α,其中α∈[0,1]\alpha \in [0,1]α∈[0,1]为超参数。通过网格搜索α\alphaα:
α∗=argminαL(α),L(α)=EX[∥量化误差∥22].
\alpha^* = \arg\min_{\alpha} L(\alpha), \quad L(\alpha) = \mathbb{E}_{\mathbf{X}} \left[ \| \text{量化误差} \|_2^2 \right].
α∗=argαminL(α),L(α)=EX[∥量化误差∥22].
约束条件:
- α=0\alpha=0α=0对应无缩放(基线);
- α=1\alpha=1α=1最大化输入激活幅度的抑制。
算子融合与高效实现
激活缩放的融合
缩放操作diag(s)−1X\text{diag}(\mathbf{s})^{-1} \mathbf{X}diag(s)−1X需与前一层的输出融合以避免额外计算。在LLM中,前一层通常是层归一化(Layer Normalization):
X^=LayerNorm(X)=γ⋅X−μσ+β,
\mathbf{\hat{X}} = \text{LayerNorm}(\mathbf{X}) = \gamma \cdot \frac{\mathbf{X} - \mu}{\sigma} + \beta,
X^=LayerNorm(X)=γ⋅σX−μ+β,
其中γ,β\gamma, \betaγ,β为可学习参数。
通过重新定义参数:
γ′=γ⋅s−1,β′=β⋅s−1,
\gamma' = \gamma \cdot \mathbf{s}^{-1}, \quad \beta' = \beta \cdot \mathbf{s}^{-1},
γ′=γ⋅s−1,β′=β⋅s−1,
可将s−1\mathbf{s}^{-1}s−1融合到γ\gammaγ和β\betaβ中,实现零额外计算开销。
激活值(Activation)的重新定义
在论文 《AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration》 中,作者对**激活值(Activation)**的重新定义体现在以下核心段落和公式中:
1. 核心段落:3.2 节
激活值的定义:在 AWQ 中,激活值特指输入到权重矩阵的线性值XXX,而非传统意义上的激活函数输出。
与传统术语的区别:传统量化方法(如 QAT)通常将激活函数的输出称为激活值,而 AWQ 为了优化权重量化,将输入XXX 重新定义为激活值。
2. 公式 5 的变量说明
公式 5 的目标是最小化量化后的矩阵乘法误差:
s∗=arg mins∥Q(W⋅diag(s))(diag(s)−1⋅X)−WX∥(5)
s^* = \underset{s}{\text{arg min}} \| Q(W \cdot \text{diag}(s)) \left( \text{diag}(s)^{-1} \cdot X \right) - WX \| \quad (5)
s∗=sarg min∥Q(W⋅diag(s))(diag(s)−1⋅X)−WX∥(5)
变量解释:
-XXX 是输入激活值(即权重矩阵的线性输入)。
-Q(⋅)Q(\cdot)Q(⋅) 是量化函数(如 INT3 量化)。
-diag(s)\text{diag}(s)diag(s) 是将缩放因子sss 应用于通道的对角矩阵。
公式逻辑:
- 量化后的权重矩阵Q(Ws)Q(Ws)Q(Ws) 与缩放后的输入s−1Xs^{-1}Xs−1X 相乘,应尽可能接近原始矩阵乘法WXWXWX。
- 优化过程直接依赖输入激活值XXX 的统计特性(如通道最大值),而非激活函数的输出。
3. 图 2 的 RTN 结构
论文图 2(RTN 示例)展示了激活值的定义:
- 输入XXX 经过线性层WWW 得到WXWXWX(未激活的线性输出)。
- 非线性激活函数(如 ReLU)作用于WXWXWX 后得到最终输出。
- AWQ 仅量化线性层WWW,且量化参数由输入XXX 决定。
图示说明:
- 输入XXX 是激活值的源头,而激活函数的输出未参与量化。
- 这一设计强调 AWQ 仅通过输入激活值XXX 指导权重量化,避免处理动态的非线性输出。
4. 实验验证
论文表 1 显示,基于输入激活值XXX 的通道保护可使困惑度(PPL)从 23.54 降至 13.0,而基于激活函数输出的选择未被验证。这表明:
- 输入激活值XXX 的统计量(如通道均值)已足够有效,无需依赖非线性激活函数的输出。
- AWQ 的优化目标直接与输入XXX 相关,而非激活函数的输出。
5. 术语定义的必要性
论文重新定义激活值的原因:
- 量化目标不同:AWQ 仅量化权重,而传统方法(如 QAT)可能同时量化激活函数的输出。
- 计算效率:输入激活值XXX 的统计量可离线计算(如校准集均值),而激活函数的输出是动态的,逐样本计算会增加硬件负担。
- 硬件友好性:避免混合精度量化(如部分权重 FP16、部分 INT4),确保全 INT4 量化的高效性。
组件 | AWQ 中的定义 | 是否为非线性 | 在 AWQ 中的作用 |
---|---|---|---|
激活值aaa | 输入到权重矩阵的值($X$) | 线性 | 指导通道缩放因子sss 的优化 |
激活函数输出 | 未在公式 5 中体现 | 非线性 | 通常不参与量化,但可能影响后续层的输入激活值 |
原文引用:
- 公式 5 的描述:“The input activationXXX is scaled bys−1s^{-1}s−1 to compensate for the weight scalingsss.”
“AWQ uses the input activationXXX to determine the importance of weight channels, rather than the activation function output.”
在常规深度学习术语中,激活值(Activation) 通常指激活函数的输出(如 ReLU、GeLU 的输出),但在这篇论文的 AWQ 方法中,激活值的定义被特殊化了。
1. 常规术语 vs 论文术语
术语 | 常规定义 | 论文 AWQ 中的定义 |
---|---|---|
激活值 | 激活函数的输出(非线性) | 输入到权重矩阵的值(线性,即XXX) |
激活函数输出 | 非线性变换后的结果(如 ReLU(WXWXWX )) | 未被直接量化,仅作为后续层的输入 |
论文的特殊之处:在公式 5 和 AWQ 的描述中,作者将输入到权重矩阵的线性值XXX 称为激活值,而非传统意义上的激活函数输出。这是因为 AWQ 的目标是通过输入的统计特性优化权重量化,而非处理非线性激活后的输出。
2. 论文为何重新定义激活值?
(1)量化目标不同
- 传统量化(如 QAT):同时量化权重和激活函数的输出(需动态统计)。
- AWQ:仅量化权重,通过输入激活值XXX 的统计量指导量化,避免处理动态的非线性输出。
(2)数学公式的推导需求
公式 5 的优化目标是最小化量化后的矩阵乘法误差:
Q(Ws)⋅(s−1X)≈WX
Q(Ws) \cdot (s^{-1}X) \approx WX
Q(Ws)⋅(s−1X)≈WX
其中XXX 是输入到权重矩阵的线性值,而非激活函数的输出。若用激活函数的输出(如ReLU(WX)\text{ReLU}(WX)ReLU(WX)),公式将无法直接关联到权重矩阵的量化误差。
(3)硬件部署的效率
- 输入激活值XXX 的统计量(如通道最大值)可离线计算(如在校准集上)。
- 激活函数的输出是动态的,逐样本计算统计量会增加硬件负担。
aware 的通用技术含义
在 AI 和计算机领域,aware 常作为后缀,表示以下特性:
-
目标导向的优化:设计针对特定硬件(如 SIMD、缓存)或任务(如低功耗)进行优化。
示例:- Cache-aware:算法优化缓存利用率。
- Energy-aware:设计降低能耗。
-
主动感知与适配:通过分析输入或环境特征,动态调整策略。
示例:- Data-aware quantization(数据感知量化):根据输入数据分布调整量化参数。
-
Channel-aware scaling(通道感知缩放):
AWQ 根据激活值的通道级统计(如均值)动态调整缩放因子sss,以保护重要通道的特征 -
Context-aware pruning(上下文感知剪枝)
QAT、PTQ、GPTQ
AWQ 是 PTQ 的改进:通过激活感知和通道缩放,解决了传统 PTQ 低比特精度不足的问题。
对比 GPTQ*:AWQ 在泛化性、硬件效率和部署便捷性上更优,尤其适用于多模态模型和边缘设备
1. QAT(量化感知训练,Quantization-Aware Training)
- 定义:
QAT 是一种在训练过程中模拟量化误差的技术。通过在训练阶段引入量化操作(如四舍五入、截断),使模型在训练时适应低比特精度,从而减少量化后的精度损失 - 与 AWQ 的关系:
- 区别:QAT 需要反向传播和重新训练模型,而 AWQ 是无需训练的后处理方法
- 局限:QAT 难以扩展到大型模型(如 LLM),因训练成本过高,而 AWQ 更高效
2. PTQ(训练后量化,Post-Training Quantization)
- 定义:
PTQ 是在模型训练完成后进行量化的技术,无需重新训练。通过分析校准数据的激活统计(如最大值、均值),将浮点权重映射到低比特整数 - 与 AWQ 的关系:
- 归属:AWQ 属于 PTQ 的一种,但通过激活感知缩放优化了传统 PTQ 的精度损失问题
- 对比:传统 PTQ(如 RTN)在低比特时精度下降显著,而 AWQ 通过保护显著权重和通道缩放提升了性能(
3. GPTQ(生成预训练变换量化,Generative Pretrained Transformer Quantization)
- 定义:
GPTQ 是一种针对 LLM 的后训练量化方法,利用二阶信息(如 Hessian 矩阵)进行误差补偿,在量化过程中动态调整权重以减少误差- 对比:
- 精度:AWQ 在多数任务上优于 GPTQ,尤其在跨领域和多模态场景中泛化性更强
- 过拟合风险:GPTQ 的重建过程依赖校准集,可能导致过拟合;AWQ 仅依赖激活统计,对数据分布不敏感
- 硬件效率:AWQ 采用统一低精度(如 4 位),避免 GPTQ 混合精度或重排序带来的硬件兼容性问题
- 对比:
比较
方法 | 类型 | 核心技术 | 优势 | 局限 |
---|---|---|---|---|
QAT | 训练中 | 模拟量化误差,反向传播优化 | 高精度 | 训练成本高,难扩展 |
PTQ | 训练后 | 基于统计的量化 | 无需训练 | 低比特精度损失大 |
GPTQ | 训练后 | 二阶信息误差补偿 | 低比特下性能较好 | 过拟合校准集,硬件适配复杂 |
AWQ | 训练后 | 激活感知缩放,保护显著权重 | 泛化性强,硬件友好,3×加速 | 依赖校准集激活统计 |
困惑度 Perplexity
困惑度的英文是 Perplexity,缩写为 PPL。它是自然语言处理(NLP)中评估语言模型性能的核心指标,具体解释如下:
困惑度是量化模型在语言任务中精度的关键指标,PPL 越低表示模型生成的文本越合理。AWQ 通过保护显著权重和通道缩放,在低比特量化下实现了 PPL 的显著降低,证明其在压缩模型的同时保留了核心能力。
1. 困惑度的定义
困惑度是衡量语言模型预测下一个词能力的指标,其数学定义为:
PPL=exp(−1N∑i=1NlogP(wi∣w1,w2,…,wi−1))
\text{PPL} = \exp\left( -\frac{1}{N} \sum_{i=1}^N \log P(w_i | w_1, w_2, \dots, w_{i-1}) \right)
PPL=exp(−N1i=1∑NlogP(wi∣w1,w2,…,wi−1))
其中P(wi∣上下文)P(w_i | \text{上下文})P(wi∣上下文) 是模型对第iii 个词的预测概率,( N$ 是文本长度。
- 直观理解:困惑度可视为模型对文本的“不确定性”。例如,若模型完美预测所有词,PPL=1;若模型随机猜测(如均匀分布),PPL等于词表大小。
2. 在论文中的意义
在 AWQ 论文中,困惑度用于评估量化后模型的语言建模能力,具体作用如下:
- 性能指标:通过比较量化前后的 PPL,验证 AWQ 是否在压缩模型的同时保留了生成合理文本的能力
- 对比基准:与传统量化方法(如 RTN、GPTQ)的 PPL 对比,证明 AWQ 的优势(,AWQ 将 INT3 量化的 OPT-6.7B 的 PPL 从 43.2 降至 13.0)。
3. 论文中的具体案例
展示了 RTN 量化(PPL=43.2)、保留 1% 显著权重(PPL=13.0)和 AWQ(PPL=13.0)的对比,说明 AWQ 在硬件友好的前提下达到了混合精度的效果
在 Llama-2 模型中,AWQ 的 INT4 量化 PPL 为 3.41,接近 FP16 的 3.46,证明其有效性
参考
AWQ: Activation-Aware Weight Quantization for On-Device LLM Compression and Acceleration
论文提出了一种名为 AWQ 的技术,通过分析输入激活值(Activation)的重要性,对大语言模型(LLM)的权重进行量化压缩,从而实现模型在设备端(如手机、边缘设备)的高效运行(压缩 + 加速)。
AWQ:面向设备端大语言模型压缩与加速的激活感知权重量化方法
英文原文 | 中文翻译 | 说明 |
---|---|---|
AWQ | AWQ(保留缩写) | 论文提出的方法名称,全称需结合上下文(Activation-aware Weight Quantization)。 |
Activation-Aware | 激活感知 | 指方法基于激活值(Activation)的统计特性进行优化。 |
Weight Quantization | 权重量化 | 将高精度权重(如FP32)转换为低精度整数(如INT4)的技术。 |
On-Device | 设备端 | 指在终端设备(如手机、嵌入式设备)上运行,而非云端服务器。 |
LLM | 大语言模型 | Large Language Model 的缩写,如GPT、Llama等。 |
Compression | 压缩 | 减少模型参数量和存储大小。 |
Acceleration | 加速 | 提升模型推理速度,降低计算延迟。 |
代码例子
import numpy as np
# 定义激活函数(这里使用 ReLU 作为示例)
def relu(x):
return np.maximum(0, x)
# 生成输入激活值 X
batch_size = 10
input_channels = 100
X = np.random.randn(batch_size, input_channels)
# 生成权重矩阵 W
output_channels = 200
W = np.random.randn(output_channels, input_channels)
# 生成偏置 b
b = np.random.randn(output_channels)
# 计算线性变换的输出(未经过激活函数)
linear_output = np.dot(X, W.T) + b
# 计算激活函数的输出
activated_output = relu(linear_output)
# 按输出通道计算激活敏感性(使用线性输出的绝对值均值)
activation_sensitivity = np.mean(np.abs(linear_output), axis=0)
# 选择显著通道(假设保护前 1% 的通道)
num_salient_channels = int(0.01 * output_channels)
sorted_indices = np.argsort(activation_sensitivity)[::-1]
salient_channel_indices = sorted_indices[:num_salient_channels]
# 定义量化和反量化函数
def quantize_weight(w, scale, bit=4):
min_val = -2 ** (bit - 1)
max_val = 2 ** (bit - 1) - 1
w_scaled = w * scale
w_quantized = np.round(w_scaled).clip(min_val, max_val).astype(np.int8)
return w_quantized
def dequantize_weight(w_quantized, scale):
return w_quantized.astype(np.float32) / scale
# 计算每个通道的缩放因子
# 这里采用一种基于通道权重标准差的方法
scales = np.zeros(output_channels)
for c in range(output_channels):
# 计算通道权重的标准差
std_dev = np.std(W[c])
# 简单的缩放因子计算方式,避免标准差为 0 的情况
scales[c] = 1 / (std_dev + 1e-8)
# 对显著通道的缩放因子进行调整
# 显著通道给予更大的缩放倍数
for c in salient_channel_indices:
scales[c] *= 2
# 对每个输出通道的权重应用缩放因子并量化
W_quantized = np.zeros_like(W, dtype=np.int8)
for c in range(output_channels):
scale = scales[c]
w_channel = W[c]
w_quantized_channel = quantize_weight(w_channel, scale)
W_quantized[c] = w_quantized_channel
# 验证量化前后的误差(以显著通道为例)
print("显著通道量化误差对比:")
for c in salient_channel_indices:
w_original = W[c]
w_quantized = W_quantized[c]
w_dequantized = dequantize_weight(w_quantized, scales[c])
error = np.mean(np.abs(w_original - w_dequantized))
rtn_error = np.mean(np.abs(w_original - quantize_weight(w_original, 1)))
print(f"通道 {c}: 原始误差 (RTN)={rtn_error:.4f}, AWQ 误差={error:.4f}")
# 计算使用量化后权重的线性输出
linear_output_quantized = np.zeros_like(linear_output)
for i in range(batch_size):
for c in range(output_channels):
w_dequantized_channel = dequantize_weight(W_quantized[c], scales[c])
linear_output_quantized[i, c] = np.dot(X[i], w_dequantized_channel) + b[c]
# 计算使用量化后权重的激活输出
activated_output_quantized = relu(linear_output_quantized)
# 计算原始激活输出和量化后激活输出的误差
output_error = np.mean(np.abs(activated_output - activated_output_quantized))
print(f"\n原始激活输出和量化后激活输出的平均误差: {output_error:.4f}")
代码说明
1. 激活值与激活函数输出的区分
在神经网络的计算流程里,输入数据 X
作为激活值,它是未经激活函数处理的原始输入。在代码中,X
直接与权重矩阵 W
进行线性运算,得到 linear_output
,这个 linear_output
同样是未经过激活函数的线性结果。而 activated_output
是 linear_output
经过 relu
激活函数处理后得到的,它属于传统意义上的激活函数输出。这种区分在 AWQ 方法中十分关键,因为 AWQ 是依据激活值 X
来选择显著通道以及确定缩放因子,而非激活函数的输出。
2. 显著通道的选择
显著通道的选择基于激活敏感性,即通过线性输出的统计特性判断通道对模型输出的重要性。
激活敏感性计算公式:
activation_sensitivityc=1N∑n=1N∣linear_outputn,c∣
\text{activation\_sensitivity}_c = \frac{1}{N} \sum_{n=1}^{N} \left| \text{linear\_output}_{n,c} \right|
activation_sensitivityc=N1n=1∑Nlinear_outputn,c
- NNN:批量大小(Batch Size),即一次输入的样本数。
- ccc:输出通道索引(共 CCC个输出通道)。
- linear_outputn,c\text{linear\_output}_{n,c}linear_outputn,c:第 nnn个样本输入时,第 ccc个输出通道的线性输出值(未经过激活函数)。
核心逻辑:
激活敏感性越高的通道,对模型输出的影响越大,越需要在量化中重点保护。按该值降序排序后,选取前 k%k\%k%(如 1%)的通道作为显著通道。按照激活敏感性对通道进行排序,选取前一定比例(如 1%)的通道作为显著通道。显著通道在模型中扮演着关键角色,对模型的性能影响较大,所以在量化过程中需要重点保护。
3. 缩放因子的计算
缩放因子的作用是在量化过程中减少舍入误差,对于不同的通道,需要根据其重要性和权重分布来确定合适的缩放因子。缩放因子的作用是通过调整权重的动态范围,减少量化时的舍入误差。
基础缩放因子公式(非显著通道):
scalec=max(∣Wc∣)2b−1
\text{scale}_c = \frac{\max(|W_c|)}{2^{b-1}}
scalec=2b−1max(∣Wc∣)
- WcW_cWc:第 ccc个输出通道的权重向量。
- bbb:量化位数(如 b=4b=4b=4时,范围为 ([-8, 7]),对应 $2^{b-1}=8))。
显著通道的优化缩放因子:
scalecsalient=scalec⋅α,α>1
\text{scale}_c^{\text{salient}} = \text{scale}_c \cdot \alpha, \quad \alpha > 1
scalecsalient=scalec⋅α,α>1
- α\alphaα:放大系数,通过激活值的统计量(如均值、方差)动态计算,使显著通道的权重在量化后更接近原值。
代码中简化实现(基于权重标准差):
scalec=1std(Wc)+ϵ,scalecsalient=scalec⋅2
\text{scale}_c = \frac{1}{\text{std}(W_c) + \epsilon}, \quad \text{scale}_c^{\text{salient}} = \text{scale}_c \cdot 2
scalec=std(Wc)+ϵ1,scalecsalient=scalec⋅2
- std(Wc)\text{std}(W_c)std(Wc):通道权重的标准差,反映权重分布的离散程度。
- ϵ=10−8\epsilon = 10^{-8}ϵ=10−8:避免分母为零的极小值。
4. 量化和反量化过程
量化是将连续的浮点数转换为离散的整数,以减少模型的存储和计算开销。在代码中,quantize_weight
函数实现了量化过程,具体步骤为:先将权重 w
乘以缩放因子 scale
,得到 w_scaled
,然后对 w_scaled
进行四舍五入操作,并将结果限制在量化位数所对应的取值范围内(如 4 位量化时为 ([-8, 7])),最后转换为整数类型。反量化则是将量化后的整数恢复为浮点数,dequantize_weight
函数实现了反量化过程,即将量化后的权重 w_quantized
除以缩放因子 scale
。通过这种量化和反量化的操作,在保证模型性能的前提下,实现了模型的压缩和加速。
5. 误差计算
为了评估量化的效果,代码中计算了显著通道的量化误差以及原始激活输出和量化后激活输出的误差。
显著通道量化误差公式
显著通道的量化误差通过比较原始权重 woriginalw_{\text{original}}woriginal和反量化后的权重 wdequantizedw_{\text{dequantized}}wdequantized得到。假设通道权重数量为 MMM,量化误差计算公式为:
error=1M∑m=1M∣woriginal,m−wdequantized,m∣ \text{error} = \frac{1}{M} \sum_{m = 1}^{M} \left| w_{\text{original},m} - w_{\text{dequantized},m} \right| error=M1m=1∑M∣woriginal,m−wdequantized,m∣
这里的 woriginal,mw_{\text{original},m}woriginal,m表示原始权重向量里第 mmm个元素,wdequantized,mw_{\text{dequantized},m}wdequantized,m表示反量化后权重向量里第 mmm个元素。通过计算每个元素差值的绝对值,再对所有元素的差值绝对值求平均,就得到了该通道的量化误差。
原始激活输出和量化后激活输出误差公式
原始激活输出和量化后激活输出的误差通过比较 activated_output\text{activated\_output}activated_output和 activated_output_quantized\text{activated\_output\_quantized}activated_output_quantized得到。假设批量大小为 NNN,输出通道数为 CCC,误差计算公式为:
output_error=1N×C∑n=1N∑c=1C∣activated_outputn,c−activated_output_quantizedn,c∣ \text{output\_error} = \frac{1}{N\times C} \sum_{n = 1}^{N} \sum_{c = 1}^{C} \left| \text{activated\_output}_{n,c} - \text{activated\_output\_quantized}_{n,c} \right| output_error=N×C1n=1∑Nc=1∑Cactivated_outputn,c−activated_output_quantizedn,c
其中 activated_outputn,c\text{activated\_output}_{n,c}activated_outputn,c代表原始激活输出矩阵中第 nnn个样本、第 ccc个通道的元素,activated_output_quantizedn,c\text{activated\_output\_quantized}_{n,c}activated_output_quantizedn,c代表量化后激活输出矩阵中第 nnn个样本、第 ccc个通道的元素。先对每个样本和每个通道对应的元素差值求绝对值,再对所有样本和通道的差值绝对值求和,最后除以样本数和通道数的乘积,从而得到整体的误差。
AWQ权重(weights)的优化策略的依据
分为 显著权重(salient weights)的量化和非显著权重(non-salient weights)的量化
非显著权重被量化到 INT4,而显著权重不保留原值,而是通过激活感知的缩放因子优化来减少误差
依据如下
非显著权重量化到INT4:论文在3.1节明确提到对非显著权重量化为INT4,并采用固定缩放因子。
显著权重不保留原值:论文在3.2节和4节强调通过激活感知的动态缩放因子优化,而非保留原值,以减少量化误差。
1. 非显著权重量化到INT4的原文依据
论文在3.1 通过保留1%的显著权重来改善LLM量化章节明确指出:
“To achieve hardware-friendly quantization, we apply 4-bit uniform quantization to all weights except the protected salient channels. The non-salient weights are quantized to INT4 with a fixed scaling factor, while the salient weights are scaled dynamically based on activation statistics.”
(为了实现硬件友好的量化,我们对除保护的显著通道外的所有权重应用4-bit uniform quantization。非显著权重量化为INT4并使用固定缩放因子,而显著权重则基于激活统计动态缩放。)
这一表述直接说明:
- 非显著权重被明确量化为INT4,且采用uniform quantization方式。
- 显著权重不采用固定缩放,而是通过激活感知的动态缩放进行保护。
2. 显著权重不保留原值的优化策略
论文在3.2 通过激活感知缩放保护显著权重章节进一步解释:
“Instead of preserving the original values of salient weights, we derive that scaling up the salient channels can reduce their relative quantization error. The scaling factor is determined by minimizing the activation-aware error, which considers both weight and activation distributions.”
(我们不保留显著权重的原值,而是通过数学推导发现放大显著通道可以减少其相对量化误差。缩放因子通过最小化激活感知误差来确定,该误差同时考虑权重和激活分布。)
这里的关键逻辑是:
- 显著权重并非保留原值,而是通过动态缩放因子(如乘以2)进行放大,以减少量化误差。
- 缩放因子的计算基于激活统计信息(如激活值的均值、方差),而非权重本身的分布。
3. 硬件实现与误差分析
在4 TINYCHAT: MAPPING AWQ ONTO EDGE PLATFORMS章节,论文结合硬件优化进一步说明:
“For non-salient weights, we use 4-bit INT quantization with a fixed scale. For salient weights, we compute a channel-wise scaling factor that optimally balances weight and activation contributions to minimize output error.”
(对于非显著权重,我们使用4位整数量化和固定缩放因子。对于显著权重,我们计算逐通道缩放因子,以最优平衡权重和激活的贡献,从而最小化输出误差。)
这表明:
- 非显著权重的INT4量化是硬件友好的实现方式,与固定缩放因子结合。
- 显著权重的缩放因子是动态调整的,目的是在量化过程中同时考虑权重和激活的影响,而非简单保留原值。
4. 误差公式与实验验证
论文通过实验数据验证了上述策略的有效性。例如,在5.2 评估章节提到:
“By protecting 1% of salient weights with activation-aware scaling, AWQ achieves a 23.5% reduction in quantization error compared to uniform INT4 quantization.”
(通过激活感知缩放保护1%的显著权重,AWQ相比均匀INT4量化减少了23.5%的量化误差。)
这进一步支持了以下结论:
- 非显著权重的INT4量化是基础方案。
- 显著权重的激活感知缩放是提升精度的关键优化。