趋近智
训练后量化 (quantization)(PTQ)包含基本原则,例如使用有代表性的数据进行校准,以确定合适的缩放因子和零点。这些原则主要应用于大型语言模型架构中占据主导地位的层类型。在典型的基于Transformer的大型语言模型中,计算量最大和内存占用最多的层是线性层(或全连接层)和嵌入 (embedding)层。
线性层执行矩阵乘法,构成Transformer前馈网络(FFN)和注意力机制 (attention mechanism)中计算的主干。线性层计算 ,其中 是输入激活张量, 是权重 (weight)矩阵, 是可选的偏置 (bias)向量 (vector)。
权重量化 (quantization): 权重矩阵 由于其大小,通常是线性层中量化的主要目标。使用校准数据(或有时仅使用权重本身),我们确定 中值的范围。根据此范围以及选择的量化方案(对称或非对称)和目标比特深度(例如,INT8、INT4),我们计算将FP32权重映射到低精度整数格式所需的缩放因子 () 和零点 ()。
这里一个重要的考量是粒度:
偏置项 () 通常保持为FP32,或使用从权重和激活中得出的缩放因子,量化为更高精度的整数格式(如INT32),因为它们占总参数 (parameter)的比例小得多。
激活量化(针对静态PTQ): 在静态PTQ中,输入激活 也被量化。这需要在校准阶段观察激活值的范围。我们将校准数据集通过模型,并记录每个线性层的输入张量 观察到的最小值和最大值。
根据这些观察到的范围,我们计算激活缩放因子 () 和零点 ()。
激活通常逐张量量化,主要是出于性能原因,因为在运行时计算逐通道的缩放因子(或存储逐通道的统计数据)会增加复杂性。然而,如前所述,激活异常值会带来重大挑战,如果处理不当(例如,使用裁剪或第三章中介绍的更高级的PTQ技术),可能导致大的量化误差。
量化后的计算随后使用整数运算近似原始矩阵乘法,通常将结果累积为更高精度的整数格式(例如INT32),然后反量化回FP32(或中间格式):
(注意:具体的实现细节取决于所使用的硬件和库,侧重于高效的整数矩阵乘法。)
线性层 () 的静态量化流程。激活 () 和权重 () 使用校准期间获得的缩放因子和零点进行量化。计算使用整数运算进行,随后进行反量化。
嵌入层将离散输入令牌(由整数ID表示)映射到密集的浮点向量 (vector)。它们本质上是查找表,其中“权重 (weight)”构成嵌入矩阵。对于输入令牌ID序列,该层检索相应的向量。
权重量化 (quantization): 嵌入矩阵本身可能很大,特别是对于具有大词汇量(例如,50,000个或更多令牌)和高嵌入维度(例如,4096)的模型。量化此矩阵会大大减少模型的内存占用。
与线性层类似,我们将量化应用于嵌入表权重。此过程包括确定所有嵌入向量的值范围,并计算缩放因子和零点。
选择取决于压缩、精度和实现复杂性之间的期望权衡。为了节省内存,即使是将嵌入逐张量量化为INT8,也能比FP32提供4倍的缩减。
激活量化: 嵌入层的直接输入是整数令牌ID序列。这些ID通常不以与连续激活值相同的意义进行“量化”。它们作为查找操作的索引。
量化影响与嵌入查找的输出有关。在静态PTQ场景中,如果后续层期望量化输入,那么获取的嵌入向量(如果只量化权重,则原始为FP32,或者从INT8/INT4反量化而来)需要在馈入下一层(例如,第一个注意力层)之前进行量化。此量化步骤将使用根据校准期间观察到的输出嵌入向量范围获得的缩放因子和零点。
然而,通常将PTQ主要集中在嵌入权重上以减少内存。后续层随后根据需要处理其输入(查找后的嵌入)的量化。
应用PTQ并非总是在所有层上都是统一的。
通过将PTQ应用于线性层和嵌入层的权重 (weight)矩阵,我们实现了模型大小的大幅缩减。当使用静态PTQ时,量化激活进一步支持基于整数的计算,可能加速推理 (inference),尽管需要仔细校准来管理精度影响。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•