<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>LLM on Lorn</title><link>https://july-h5kf3.github.io/categories/llm/</link><description>Recent content in LLM on Lorn</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 26 Aug 2026 09:00:00 +0800</lastBuildDate><atom:link href="https://july-h5kf3.github.io/categories/llm/index.xml" rel="self" type="application/rss+xml"/><item><title>SOAR: Scale Optimization for Accurate Reconstruction in NVFP4 Quantization</title><link>https://july-h5kf3.github.io/p/soar/</link><pubDate>Wed, 26 Aug 2026 09:00:00 +0800</pubDate><guid>https://july-h5kf3.github.io/p/soar/</guid><description>&lt;p&gt;对于NVFP4量化，我们可以将其量化行为用下述公式描述:&lt;/p&gt;&#10;&lt;p&gt;对于高精度张量X，设$M_{\text{FP4}},M_{\text{FP8}}$分别表示FP4(E2M1)与FP8(E4M3)能够表示的最大值，分别为6和448，$Q_{\text{E4M3}}$表示FP8(E4M3)的量化函数，$\alpha,\Delta_i$分别表示全局scale以及块级scale:&#10;&lt;/p&gt;&#10;$$&#10;\alpha = \frac{\max (\abs{X})}{M_{\text{FP4}}\cdot M_{\text{FP8}}}\\&#10;\Delta_i = Q_{\text{E4M3}}(\frac{\max (\abs{X_i})}{\alpha \cdot M_{\text{FP4}}})\\&#10;\hat X = &#10;\begin{cases}&#10;\frac{1}{2}「\frac{2X}{\alpha \Delta}」\quad \abs{\frac{X}{\alpha \Delta}} &lt; 2\\&#10;「\frac{X}{\alpha \Delta}」 \quad 2\leq\abs{\frac{X}{\alpha \Delta}}\leq 4\\&#10;2「\frac{X}{2\alpha \Delta}」\quad 4\leq\abs{\frac{X}{\alpha \Delta}}\leq 6&#10;\end{cases}&#10;$$&lt;p&gt;&#10;这里之所以$\hat X$是分段函数，是因为在FP4量化中，在数值0-2的区间内，采样点的间隔是0.5（0，0.5，1，1.5），而在2-4内采样点间隔是1，而4-6内为2。&lt;/p&gt;&#10;&lt;p&gt;那么反量化函数可以写作:&#10;&lt;/p&gt;&#10;$$&#10;\hat X = \hat X \cdot(\alpha \Delta)&#10;$$&lt;p&gt;&#10;然而目前的NVFP4量化方法普通通过简单的启发式公式来确定全局scale 和块级scale，例如基于最大值的缩放方法，或仅在有限候选集上进行离散搜索。这写方法往往会导致次优结果。尤其是对于FP32全局scale 而言，如果只将其优化限制在固定规则或粗粒度的离散空间内，就很难准确刻画大语言模型复杂的权重分布。&lt;/p&gt;&#10;&lt;p&gt;位了解决这个问题，作者提出了闭式联合Scale优化方法，即CJSO。简单来说就是直接通过最小化原始权重W和反量化权重$\hat W$之间的重构误差来联合优化全局scale和块级scale:&#10;&lt;/p&gt;&#10;$$&#10;\alpha,\Delta = \arg \min_{\alpha,\Delta}\sum_i ||W_i - Q_i\cdot(\alpha \Delta_i)||_2^2&#10;$$&lt;p&gt;&#10;其中:&#10;&lt;/p&gt;&#10;$$&#10;Q_i = Q_{\text{fp4}}(\frac{W_i}{\alpha \Delta_i})&#10;$$&lt;p&gt;&#10;由于直接最小化这个重构误差是比较困难的，因为$Q_i$是离散的，并且同时依赖于$\alpha,\Delta_i$.不过，在固定$Q_i$的分配结果时，重构目标可以看作是关于缩放因子的二次函数，因此我们可以求解得到:&lt;/p&gt;&#10;&lt;p&gt;全局Scale优化，在给定块级scale$\Delta_i$的情况下， 最优化张量级scale$\alpha^*$可以表示为:&#10;&lt;/p&gt;&#10;$$&#10;\alpha^* = \frac{\sum_{i=1}^N \sum_{j\in \text{block}_i}W_{ij}Q_{ij}\alpha}{\sum_{i=1}^N\sum_{j\in\text{block}_i}Q_{ij}^2 \alpha^2}&#10;$$&lt;p&gt;&#10;块级Scale优化，反过来，在$\alpha$固定的情况下， 每个块级scale $\Delta_i^*$都可以独立优化，以拟合对应块内的局部分布:&#10;&lt;/p&gt;&#10;$$&#10;\Delta_i^* = \frac{\sum_{j\in \text{block}_i} W_{ij}Q_{ij}\alpha}{\sum_{j\in\text{block}_i}Q_{ij}^2 \alpha^2}&#10;$$&lt;p&gt;&#10;那么基于此，可以得到CJSO的量化方案:&lt;/p&gt;&#10;&lt;p&gt;​&#9;首先使用NVFP4中标准的基于最大值的规则来初始化$\alpha,\Delta_i$。随后，用上述公式迭代更新全局scale $\alpha$以及块级scale$\Delta_i$,以及量化矩阵$Q_i$:每次更新后，都会在新的scale下重新执行FP4量化从而重新计算Q&lt;/p&gt;&#10;&lt;p&gt;除此之外，在NVFP4中，块级缩放因子还受限于FP8精度的表示限制，因此它本身也会引入量化误差。这种量化误差会传播到量化以及反量化两个阶段，从而直接影响重构精度。&lt;/p&gt;&#10;&lt;p&gt;因此论文考虑将量化与反量化使用的scale 解耦，具体而言，将原本的单一尺度块级缩放因子解耦为两个独立变量:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;量化尺度$\Delta_i^q$（高精度）:用于确定FP4权重分配，不受硬件精度限制&lt;/li&gt;&#10;&lt;li&gt;反量化尺度$\Delta_i^d$（E4M3）:实际存储的硬件兼容尺度，用于推理时重建&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;那么，我们将NVFP4量化重新表述为:&#10;&lt;/p&gt;&#10;$$&#10;\min_{\Delta_i^q \in \mathbb{R},\Delta_i^d \in \text{FP8}} L = \sum_i||W_i - Q_{\text{FP4}}(\frac{W_i}{\alpha \Delta_i^q})\cdot (\alpha \Delta_i^d)||_2^2&#10;$$&lt;p&gt;&#10;基于上述解耦，我们对两个块scale进行联合优化。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;初始化：使用CJSO结果初始化$\Delta_i^d$,并令$\Delta_i^q = \Delta_i^d$&lt;/li&gt;&#10;&lt;li&gt;构造候选空间:&#10;&lt;ul&gt;&#10;&lt;li&gt;对于$\Delta_i^q$,在$[0.5,1.5]$范围内以步长0.01进行连续乘性扰动(高精度搜索)&lt;/li&gt;&#10;&lt;li&gt;对于$\Delta_i^d$则限制为当前值附近最近两个E4M3表示值&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;对每个候选$(\Delta_i^q,\Delta_i^d)$计算重建误差，选择最优组合&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="439px" data-flex-grow="182" height="586" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://july-h5kf3.github.io/p/soar/SOAR_fig1.png" srcset="https://july-h5kf3.github.io/p/soar/SOAR_fig1_hu_a85b1412f79128bc.png 800w, https://july-h5kf3.github.io/p/soar/SOAR_fig1.png 1072w" width="1072"&gt;&lt;/p&gt;&#10;</description></item><item><title>[2026 ACL] ARCQuant: Boosting NVFP4 Quantization with Augmented Residual Channels for LLMs</title><link>https://july-h5kf3.github.io/p/arcquant/</link><pubDate>Wed, 26 Aug 2026 08:57:00 +0800</pubDate><guid>https://july-h5kf3.github.io/p/arcquant/</guid><description>&lt;p&gt;目前把使用NVFP4对大语言模型进行PTQ有一下难点:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;NVFP4格式与现有的权重-激活值PTQ方法不兼容:&#10;&lt;ol&gt;&#10;&lt;li&gt;旋转类方法，如QuaRot等会把异常值能量扩散到所有块，破坏NVFP4本身块隔离优势，反而放大局部动态范围&lt;/li&gt;&#10;&lt;li&gt;平滑类方法，如Smoothquant等在低比特下几乎失效&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;混合精度方案硬件不兼容，Tensor Core要求数据格式统一，采用混合精度必然导致模型吞吐量下降&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="560px" data-flex-grow="233" height="694" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://july-h5kf3.github.io/p/arcquant/ARCQuant_fig1.png" srcset="https://july-h5kf3.github.io/p/arcquant/ARCQuant_fig1_hu_12eee242b1ba6472.png 800w, https://july-h5kf3.github.io/p/arcquant/ARCQuant_fig1_hu_e473259efb48afdc.png 1600w, https://july-h5kf3.github.io/p/arcquant/ARCQuant_fig1.png 1620w" width="1620"&gt;&lt;/p&gt;&#10;&lt;p&gt;如图所示，虽然基于旋转矩阵的方法可以降低全局峰值，但是会显著增加原本低幅值 block 的局部动态范围。这个影响抵消了细粒度 scaling 原本带来的离群值隔离优势。导致在NVFP4上效果不佳。&lt;/p&gt;&#10;&lt;p&gt;为了解决上述问题，ARCQuant提出了一个“不改动数值格式，不混合精度，不旋转矩阵”的NVFP4量化框架。&lt;/p&gt;&#10;&lt;p&gt;具体实现如下:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;离线选出&amp;quot;必须补偿&amp;quot;的异常通道:用校准集统计每层激活的通道最大值，按绝对值降序重排；以FP8（E5M2）动态范围作为参考，设阈值$\tau = 2^{-3}M$，只取超过该阈值的前S条通道作为&amp;quot;残差通道&amp;quot;。&lt;/li&gt;&#10;&lt;li&gt;对输入X先重拍然后进行量化得到$Q_x$,然后对选出来的残差通道计算残差:$R_o = X_o - s_{X_o}\cdot Q(X_o)$,再把$R_o$用同一NVFP4格式量化为$Q_{R_o}$.最后把$Q_x$和$Q_{R_o}$在通道维度拼接，得到增广激活矩阵:$Q_{Xaug}=[Q_x|Q_{R_o}]\in \mathbb{R}^{N\times (K+S)}$.之后权重侧离线做对称处理:把对应 S 条权重复制一份，拼接成 $Q_{Waug}=[Q_W∣Q_{Wo}]$。&lt;/li&gt;&#10;&lt;li&gt;最后矩阵乘法格式与NVFP4 Tensor Core所需格式完全相同:$Y = s_{Xaug} \cdot Q_{Xaug}\cdot(s_{Waug}\cdot Q_{Waug})^\top$。全程保持数据格式一致，可直接调用 CUTLASS/cuBLAS，无需改内核循环。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="784px" data-flex-grow="326" height="486" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://july-h5kf3.github.io/p/arcquant/ARCQuant_fig2.png" srcset="https://july-h5kf3.github.io/p/arcquant/ARCQuant_fig2_hu_1aa65e2f8423e208.png 800w, https://july-h5kf3.github.io/p/arcquant/ARCQuant_fig2.png 1588w" width="1588"&gt;&lt;/p&gt;&#10;</description></item><item><title>[2026 ICML] ReSpinQuant: Efficient Layer-Wise LLM Quantization via Subspace Residual Rotation Approximation</title><link>https://july-h5kf3.github.io/p/respinquant/</link><pubDate>Wed, 26 Aug 2026 08:48:00 +0800</pubDate><guid>https://july-h5kf3.github.io/p/respinquant/</guid><description>&lt;p&gt;在LLM的权重-激活值量化中，目前的主流是基于旋转的方法，总体而言可以分为两类，一种是以SpinQuant，QuaRot为代表的全局旋转方法，另一种是以FlatQuant，OSTQuant为代表的layer-wise 变换方法。&lt;/p&gt;&#10;&lt;p&gt;二者的区别在于前者全局共享旋转矩阵，可以实现激活旋转与权重的离线融合，这种方式推理时无额外开销，效率高，但是表达能力有限；而Layer-Wise变换方法为每层分配独特的旋转矩阵，可以通过局部适应实现更优的异常值抑制，但是会产生额外的推理开销，因为这个旋转矩阵在激活侧无法融合进前一层的权重层。&lt;/p&gt;&#10;&lt;p&gt;ReSpinQuant克服了这一限制。实现了可融合的Layer-Wise Rotation base PTQ。&lt;/p&gt;&#10;&lt;p&gt;具体方法如下:&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="574px" data-flex-grow="239" height="532" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://july-h5kf3.github.io/p/respinquant/respinquant_fig1.png" srcset="https://july-h5kf3.github.io/p/respinquant/respinquant_fig1_hu_7e937c24278a1b65.png 800w, https://july-h5kf3.github.io/p/respinquant/respinquant_fig1.png 1274w" width="1274"&gt;&lt;/p&gt;&#10;&lt;p&gt;上图是respinquant应用于标准Transformer层时的完整架构。&lt;/p&gt;&#10;&lt;p&gt;我们设L表示总层数，对于第i层:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;$R_1^i$:用于旋转MHSA模块的激活输入，以及FFN模块的输出激活（来自于下一层）&lt;/li&gt;&#10;&lt;li&gt;$R_2^i$:用于旋转FFN模块的输入，以及MHSA的输出。&lt;/li&gt;&#10;&lt;li&gt;$R_3^i$:作用于注意力机制的中间旋转，如Value projection&lt;/li&gt;&#10;&lt;li&gt;$R_4,R_5$:通过快速 Hadamard 变换实现的结构化旋转。与SpinQuant中保持一致。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;上述旋转矩阵均可被MHSA，FFN内部的线性变换吸收，例如$W_v^i$会被融合为:$\hat W_v^i = {R_1^i}^\top W_v^i R_3^i$&lt;/p&gt;&#10;&lt;p&gt;上述吸收可以离线进行，因此基本上在保证计算不变性的同时，几乎没有带来额外的推理开销。&lt;/p&gt;&#10;&lt;p&gt;但是上述公式仅在Transfomer Block内部成立，当使用逐层旋转时，残差连接会带来挑战。&lt;/p&gt;&#10;&lt;p&gt;我们设$R_{in}$和$R_{out}$分别表示每个MHSA或FFN block的输入和输出所对应的最优逐层旋转矩阵。原始残差连接为:&#10;&lt;/p&gt;&#10;$$&#10;x_{out} = x_{in} + \text{Block}(x_{in})&#10;$$&lt;p&gt;&#10;在旋转后，我们可以写作:&#10;&lt;/p&gt;&#10;$$&#10;\hat{x_{out}} = R_{out}R_{in}^{\top}\hat{x_{in}}+R_{out}\text{Block}(R_{in}^{\top}\hat{x_{in}})&#10;$$&lt;p&gt;&#10;如果采用类似于SpinQuant的全局旋转策略，那么有$R_{out} = R_{in}$,此时:&#10;&lt;/p&gt;&#10;$$&#10;T = R_{out}R_{in}^\top = I&#10;$$&lt;p&gt;&#10;因此可以消除残差连接中的额外计算开销（也就是我们不需要显式计算）。然而，这会限制模型的表达能力，因为它强制所有层共享同一个旋转基。&lt;/p&gt;&#10;&lt;p&gt;为了解决这个问题，我们采用完整大小的逐层旋转矩阵，以最大化表达能力；同时，通过对子空间旋转近似来逼近残差旋转矩阵 T。&lt;/p&gt;&#10;&lt;p&gt;作者团队通过实验发现，用Hadamard矩阵初始化旋转矩阵，并通过Caley Optimizer对其进行优化，学习到的旋转矩阵$(R_1,R_2)$在收敛后并不会显著偏离初始的Hadamard结构。因此，残差旋转矩阵T表现出很强的对角占优特性:&#10;&lt;/p&gt;&#10;$$&#10;T = R_{out}R_{in}^\top\approx HH^\top = I&#10;$$&lt;p&gt;&#10;我们将其相对于单位矩阵I的偏差记为:&#10;&lt;/p&gt;&#10;$$&#10;\Delta T = T - I&#10;$$&lt;p&gt;&#10;随后，对偏差矩阵进行SVD分解,以识别基空间不匹配的主要方向（按照我们对SVD的理解，经过矩阵T的线性变换后，向量所在空间以Q为基底，也就是Q所在的线性空间）:&#10;&lt;/p&gt;&#10;$$&#10;Q,S,V^\top = \text{SVD}(T-I)&#10;$$&lt;p&gt;&#10;我们截断分解，只保留前r个奇异向量，从而构造投影矩阵（即我们认为在空间上只有少数方向上残差不匹配）:&#10;&lt;/p&gt;&#10;$$&#10;Q \in \mathbb{R}^{D\times r}&#10;$$&lt;p&gt;&#10;推理出这个子空间基后，我们便可以在子空间内推导最优旋转矩阵:&#10;&lt;/p&gt;&#10;$$&#10;\hat{R}_{sub}\in \mathbb{R}^{r\times r}&#10;$$&lt;p&gt;&#10;首先，将完整的变换矩阵投影到该子空间中:&#10;&lt;/p&gt;&#10;$$&#10;T_{\text{sub}} = Q^\top T Q \in \mathbb{R}^{r\times r}&#10;$$&lt;p&gt;&#10;由于投影操作不严格保持正交性，因此我们通过极分解提取最接近的正交矩阵。具体而言，我们对投影后的分量进行 SVD：&#10;&lt;/p&gt;&#10;$$&#10;U_{sub},\Sigma_{sub},V_{sub}^\top = \text{SVD}(T_{sub})&#10;$$&lt;p&gt;&#10;由此得到正交化后的子空间旋转矩阵:&#10;&lt;/p&gt;&#10;$$&#10;\hat{R}_{\text{sub}} = U_{\text{sub}}V_{\text{sub}}^\top&#10;$$&lt;p&gt;&#10;我们通过仅在识别出的子空间内施加变换，同时保持其正交补空间不变，来近似完整旋转矩阵T。近似后的变换矩阵$\hat T$定义为:&#10;&lt;/p&gt;&#10;$$&#10;\hat T = \underbrace{I-QQ^\top}_{(D-r)维恒等变换}+\underbrace{Q\hat R_{\text{sub}}Q^\top}_{子空间旋转}&#10;$$&lt;p&gt;&#10;那么残差流的整体流程如下：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;投影: $y = Q^\top \hat x_{in} \in \mathbb{R}^{r}$&lt;/li&gt;&#10;&lt;li&gt;子空间变换,在r维子空间内应用可学习的稠密变换，我们定义有效子空间矩阵：&lt;/li&gt;&#10;&lt;/ol&gt;&#10;$$&#10;M = \hat{R_{\text{sub}}} - I_r&#10;$$&lt;p&gt;以合并加法操作，因此有：&#10;&lt;/p&gt;&#10;$$&#10;z = My \in \mathbb{R}^{r}&#10;$$&lt;ol start="3"&gt;&#10;&lt;li&gt;重投影与残差相加:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;将原始结果投影回原始维度，并与输入相加:&#10;&lt;/p&gt;&#10;$$&#10;\hat{x_{\text{out}}} = \hat{x_{in}}+Qz&#10;$$</description></item><item><title>[2026 ICLR] SERQ: Saliency-Aware Low-Rank Error Reconstruction For LLM Quantization</title><link>https://july-h5kf3.github.io/p/serq/</link><pubDate>Wed, 26 Aug 2026 08:45:00 +0800</pubDate><guid>https://july-h5kf3.github.io/p/serq/</guid><description>&lt;p&gt;这篇文章将LLM PTQ做到了W4A4，是通过低秩误差重建的方式做到的。&lt;/p&gt;&#10;&lt;p&gt;传统的W4A4量化方法一般是通过Rotation-Based的方式进行的，这种方式虽然有效，但是一方面可能不存在鲁棒性，另一方面校准/训练成本高。&lt;/p&gt;&#10;&lt;p&gt;相较于Rotation-Base的PTQ方法， 基于低秩误差重建的方法有不用重训练太多，也不需要复杂在线层的优势，但仅在W4A8下表现优异，在W4A4下会呈现出明显的性能损失。更加关键的是，传统低秩补偿是两个矩阵$L_1,L_2$,推理时需要进行:&#10;&lt;/p&gt;&#10;$$&#10;X_qW_q + X_qL_1L_2&#10;$$&lt;p&gt;&#10;这意味着第二项$X_qL_1L_2$我们除了要对$X_q$进行量化以外，我们还需要在线对$X_qL_1$的结果进行在线量化，这带来的额外开销对低精度的kernel而言并不友好。&lt;/p&gt;&#10;&lt;p&gt;可以见下图:&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="456px" data-flex-grow="190" height="368" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://july-h5kf3.github.io/p/serq/SERQ_fig1.png" width="700"&gt;&lt;/p&gt;&#10;&lt;p&gt;此外，传统的低秩误差重构方法通常对整个误差矩阵$E = W - Q(W)$做截断SVD，这带来的问题是固定 rank budget 会被分散到整个矩阵的所有行列上，而造成真正大影响的可能只是少数几个权重，这样会稀释低秩补偿能力。&lt;/p&gt;&#10;&lt;p&gt;基于上述问题，论文提出了SERQ方法，一种显著性感知的误差重构算法，它在单个低秩矩阵中同时考虑权重显著性和激活显著性。&lt;/p&gt;&#10;&lt;p&gt;具体而言该方法的步骤如下：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;静态激活平滑&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;激活值量化通常因为异常值的存在而十分脆弱，通常的方法是通过旋转变换或者辅助层对异常值进行在线处理，这些方法虽然有效，但是会引入额外的推理时延，因此这里选用的是SmoothQuant的方式，即采用静态的逐通道缩放来平滑激活分布。&lt;/p&gt;&#10;&lt;p&gt;具体来说，激活会被一个缩放因子s缩放，同时对应的缩放因子会被折叠进权重中。因此，线性层中的操作可以表示为：&#10;&lt;/p&gt;&#10;$$&#10;Y = XW = (X\cdot \text{diag}(S^{-1}))(\text{diag}(S)\cdot W) = XW&#10;$$&lt;p&gt;&#10;这些缩放因子在校准阶段获得，并在线下合并到相邻层中，因此不会带来运行时开销。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;显著性感知的误差重建&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;逐通道静态平滑过程会把激活离群值的尺度转移到对应的权重中。假设原始权重符合正态分布，那么在折叠后的权重中，显著行可以直接通过它们的尺度来识别。&lt;/p&gt;&#10;&lt;p&gt;这些显著行在反复与激活矩阵相乘时，会累积较大的量化误差。为了缓解这一问题，我们引入了一个低秩补偿矩阵:&#10;&lt;/p&gt;&#10;$$&#10;R \in \mathbb{R}^{r \times d}&#10;$$&lt;p&gt;&#10;它用于修正r个显著权重行中的量化误差，记这些显著权重行为$W_s$&lt;/p&gt;&#10;&lt;p&gt;考虑将权重行按照显著性降序排列，即通过置换矩阵P进行重排，则折叠后的矩阵W和显著性感知的低秩矩阵R可以定义为:&#10;&lt;/p&gt;&#10;$$&#10;W = P\cdot \text{diag}(S)\cdot W = P\cdot W = [W_s;W_r]\\&#10;R = W_s - Q(W_s)&#10;$$&lt;p&gt;&#10;其中$W_r$表示剩余的非显著行&lt;/p&gt;&#10;&lt;p&gt;随后，整体线性操作可以描述为:&#10;&lt;/p&gt;&#10;$$&#10;Y = (X\cdot \text{diag}(s^{-1})\cdot P^{-1})(P\cdot \text{diag}(s)W) = XW\\&#10;Q(X)\cdot Q(W)=Q([X_s;X_r])\cdot Q([W_s;W_r])+Q(X_s)\cdot R \approx X_q\cdot W_q + X_{s,q}\cdot Q(R)&#10;$$&lt;p&gt;&#10;需要注意的是我们也会对低秩矩阵R进行量化，从而保证整个推理流程都可以使用低精度算子。&lt;/p&gt;&#10;&lt;p&gt;通过提取出敏感行的方法，我们将原本的在线量化成本省去，并保留了低秩乘法的便捷！此时残差分支只需要执行一个计算量较低的低秩乘法:&#10;&lt;/p&gt;&#10;$$&#10;\mathbb{R}^{s\times r}\times \mathbb{R}^{r\times d}&#10;$$&lt;ul&gt;&#10;&lt;li&gt;离线置换权重&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;我们为了提取敏感行将激活值和权重通过置换矩阵P变换为了:&#10;&lt;/p&gt;&#10;$$&#10;X = [X_s;X_r]\quad W = [W_s;W_r]&#10;$$&lt;p&gt;&#10;为了不引入额外的在线计算开销，会做一个简单的融合。&lt;/p&gt;&#10;&lt;p&gt;一共有两部分，一个是权重上的，$P\cdot \text{diag}(s)\cdot W$,那这个很简单，我们一般的做法是会把scale离线融到W中，按照同样的思路我们也把P融合进去。另一部分则是激活值上的$X\cdot \text{diag}(s^{-1})\cdot P^{-1}$因为激活值X在推理时才有，我们无法离线融合，因此选用的方法是不在当前层进行融合，而是把这个重排继续传播到前一层中。因为我们知道当前层l的激活值X:&#10;&lt;/p&gt;&#10;$$&#10;X = X^{l-1}W^{l-1}&#10;$$&lt;p&gt;&#10;因此我们令:&#10;&lt;/p&gt;&#10;$$&#10;W^{l-1} = W^{l-1}\cdot \text{diag}(s^{-1})\cdot P^{-1}&#10;$$&lt;p&gt;&#10;即可，这个操作可以离线执行，因此不会带来额外的计算开销&lt;/p&gt;&#10;&lt;p&gt;至此，完整的流程可见下图:&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="978px" data-flex-grow="407" height="286" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://july-h5kf3.github.io/p/serq/SERQ_fig2.png" srcset="https://july-h5kf3.github.io/p/serq/SERQ_fig2_hu_60fde3826ab314fc.png 800w, https://july-h5kf3.github.io/p/serq/SERQ_fig2.png 1166w" width="1166"&gt;&lt;/p&gt;&#10;</description></item><item><title>[2026 ICML] OSAQ: Outlier Self-Absorption for Accurate Low-bit LLM Quantization</title><link>https://july-h5kf3.github.io/p/osaq/</link><pubDate>Wed, 26 Aug 2026 08:42:00 +0800</pubDate><guid>https://july-h5kf3.github.io/p/osaq/</guid><description>&lt;p&gt;目前针对大语言模型中存在的系统性异常值问题，现有方法主要依赖层内乘法变换来抑制异常值，包括:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;缩放:如AWQ，SmoothQuant等方法通过激活分布特征对权重进行缩放&lt;/li&gt;&#10;&lt;li&gt;旋转:如QuIP等方法通过正交矩阵旋转权重矩阵&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;然而这些方法在极低比特量化时，性能仍远未达到理想水平，表明单一乘法策略在根本上不足以充分处理异常值问题。&lt;/p&gt;&#10;&lt;p&gt;本方法基于如下发现:&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="749px" data-flex-grow="312" height="412" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://july-h5kf3.github.io/p/osaq/OSAQ_fig1.png" srcset="https://july-h5kf3.github.io/p/osaq/OSAQ_fig1_hu_fb257bb2ca2760d2.png 800w, https://july-h5kf3.github.io/p/osaq/OSAQ_fig1.png 1286w" width="1286"&gt;&lt;/p&gt;&#10;&lt;p&gt;即任务损失关于权重的Hessian矩阵具有低秩一致性，即&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;特征值沿特定方向趋于0零&lt;/li&gt;&#10;&lt;li&gt;对应的特征向量构成稳定的零空间&lt;/li&gt;&#10;&lt;li&gt;该零空间在不同输入样本间保持高度一致&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;而我们知道，通过泰勒展开，我们可以知道权重收到扰动时，任务损失L关于权重的二阶泰勒展开可以写作:&#10;&lt;/p&gt;&#10;$$&#10;\mathbb{E}[L(w+\Delta w)-L(w)]\approx\frac{1}{2}\Delta w^\top H_w \Delta w&#10;$$&lt;p&gt;&#10;而我们又发现$H_w$具有低秩一致性，因此根据零空间的定义，用$H_w$乘以零空间中的任意向量都会得到零。因此，通过对这些零空间向量进行加权组合，我们可以构造出$\Delta w$。这使得一种加性变换成为可能，并且保证损失保持不变:&#10;&lt;/p&gt;&#10;$$&#10;W' = W +\Delta W\quad s.t. \quad \Delta w^\top H_w \Delta w = 0&#10;$$&lt;p&gt;&#10;基于这个发现，我们旨在构建一个由低秩结构引导的$\Delta w$，对权重执行加性变换，从而实现异常值的子吸收，同时保持模型的性能。&lt;/p&gt;&#10;&lt;p&gt;给定一个权重矩阵$W\in \mathbb{R}^{M\times N}$,其中M表示输出通道维度，N表示输入通道维度，$\Delta W$的构造过程如下所述:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;零空间提取: 首先我们对Hessian矩阵$H_w$进行特征分解，并按照特征值幅度的非递减顺序进行排序，如下所示:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;$$&#10;H_w = V \text{diag}(\lambda_1,\dots,\lambda_N)V^\top,\quad 0\leq \abs{\lambda_1}\leq \abs{\lambda_2}\leq \dots \leq \abs{\lambda_N}&#10;$$&lt;p&gt;其中$V\in \mathbb{R}^{N\times N}$是特征矩阵,$\lambda_1 ,\dots,\lambda_N$是矩阵的特征值。我们采取尾部能量累积的策略，从最小的特征值开始累加，得到前缀能量，并将零空间维度确定为满足累积尾部能量达到预设阈值时的最小K:&#10;&lt;/p&gt;&#10;$$&#10;\mathcal{N}=V^\top_{[:,0:K-1]},\text{where}\quad K=\min_k \{\sum_{i=1}^k \abs{\lambda_i} \geq \gamma \sum_{i=1}^N\}&#10;$$&lt;p&gt;&#10;其中$\gamma \in (0,1)$是尾部能量阈值，$\mathcal{N}\in \mathbb{R}^{N\times K}$表示矩阵$H_w$的零空间，其中每一行对应一个特征方向，在该方向上$H_w$表现出近似消失的曲率。&lt;/p&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;$\text{softmax}-\infty$目标近似：在获取了Hessian矩阵的零空间后，我们引入了一个权重系数矩阵$\beta \in \mathbb{R}^{N\times K}$,用于为每个零空间中的每个向量分配权重，从而构造$\Delta w$：&lt;/li&gt;&#10;&lt;/ol&gt;&#10;$$&#10;\Delta W = \beta \mathcal{N}&#10;$$&lt;p&gt;​&#9;我们希望构造出来的$\Delta W$能够最小化施加加性扰动后权重的数值范围，我们可以通过最小化下式达到目标:&#10;&lt;/p&gt;&#10;$$&#10;\min_{\beta}||W+\Delta W||_{\infty} = \min_{\beta}||W+\beta \mathcal{N}||_{\infty}&#10;$$&lt;p&gt;&#10;其中$x=[x_1,\dots,x_n]^\top,\quad ||x||_{\infty} = \max_{1\leq i \leq n}\abs{x_i}$.显然无穷范数不可微，为了解决这个问题，我们采用$\text{softmax}-\infty$近似:&lt;/p&gt;&#10;&lt;p&gt;我们沿着输出通道维度应用softmax操作:&#10;&lt;/p&gt;&#10;$$&#10;s_{ij} = \frac{\exp{(\abs{W_{ij}}/\tau)}}{\sum_{t=1}^N \exp(\abs{W_{it}}/\tau)}&#10;$$&lt;p&gt;&#10;其中,$i=1,\dots,M,\quad \tau &gt; 0$是温度系数。当它较大时，它能够捕捉所有分量的平均行为；而当$\tau \to 0^+$时，它会越来越强调极端峰值。&lt;/p&gt;&#10;&lt;p&gt;在这种情况下，对这些被“峰值强调”的参数施加$\mathcal{l}_2$范数，便可以作为$l_{\infty}$的一种近似，从而有效地识别并抑制异常值。&lt;/p&gt;&#10;&lt;ol start="3"&gt;&#10;&lt;li&gt;$\beta$的显式解: 接下来我们来显式解决上述优化问题。经过$\text{softmax}-\infty$近似后我们可以把优化目标写作如下形式，特别地，由于量化的scale和zero-point都是沿着输出通道维度计算的，因此我们给出每个输出通道对应的$\mathcal{l}_2$范数优化目标:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;$$&#10;\min_{b_i}\frac{1}{2}\sum_{j=1}^{N}s_{ij}(W_{ij}+b_i^\top \mathcal{n}_j)^2 + \frac{\mu_1}{2}||b_i||_2 + \frac{\mu_2}{2}(b_i^\top v)^2&#10;$$&lt;p&gt;​&#9;其中:&#10;&lt;/p&gt;&#10;$$&#10;b_i = \beta[i,:] \in \mathbb{R}^{K},\\&#10;n_j = \mathcal{N}[:,j] \in \mathbb{R}^{K},\\&#10;v = \mathcal{N}1_{N} \in \mathbb{R}^{K}&#10;$$&lt;p&gt;&#10;上式中第一项是主要的优化目标，作用是最小化施加加性扰动后权重的数值范围；第二项是关于$b_i$的正则化项，防止过大的修正；第三项施加了一个反平移约束，用于惩罚整个通道沿同一方向发生一致平移。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Remark&lt;/strong&gt;：这个第三项约束是为了避免第 i 个输出通道的整行权重整体发生同方向平移。它希望$\sum_{j=1}^N \Delta w_{ij} \approx 0$&lt;/p&gt;&#10;&lt;p&gt;求解上述最优化方程（对$b_i$求导，并令一阶最优性条件为零），可以得到:&#10;&lt;/p&gt;&#10;$$&#10;A_ib_i = -\rho_i&#10;$$&lt;p&gt;&#10;其中&#10;&lt;/p&gt;&#10;$$&#10;A_i^* = \sum_{j=1}^N s_{ij}n_j n_j^\top + \mu_1 I_K +\mu_2 v v^\top,\quad \rho_i = \sum_{j=1}^N s_{ij}W_{ij}n_j&#10;$$&lt;p&gt;&#10;因此，我们可以得到最优的系数矩阵$\beta$：&#10;&lt;/p&gt;&#10;$$&#10;\beta^* = [b_1^*,\dots,b_M^*]^\top,\quad b_i = -A_i^{-1}\rho_i,i = 1,\dots,M&#10;$$</description></item><item><title>[2026 ICLR] SliderQuant: Accurate Post-Training Quantization for LLMs</title><link>https://july-h5kf3.github.io/p/sliderquant/</link><pubDate>Wed, 26 Aug 2026 08:39:00 +0800</pubDate><guid>https://july-h5kf3.github.io/p/sliderquant/</guid><description>&lt;p&gt;现有的PTQ通常采用顺序量化框架，将预训练模型分割为相同大小的部分并依次量化，且对所有层一视同仁。在低比特情况下，这种平等处理方式存在如下缺陷：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;层间敏感度差异被忽略:实证研究表明，浅层和深层通常比中间层对量化更敏感，且第一层和最后一层的量化误差显著大于其他层&lt;/li&gt;&#10;&lt;li&gt;量化误差跨层累积:随着逐层量化进行，误差逐渐放大，而现有方法缺乏有效的跨层协同机制来抑制此问题&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;具体而言，作者做了两个简单的实验&lt;/p&gt;&#10;&lt;p&gt;将某个模型的特定层量化，来比较量化不同层带来的影响，以及量化不同数量的层数，来比较量化误差的积累效应，结果如下：&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="491px" data-flex-grow="204" height="454" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://july-h5kf3.github.io/p/sliderquant/SliderQuant_fig1.png" srcset="https://july-h5kf3.github.io/p/sliderquant/SliderQuant_fig1_hu_4c0334c11448a05d.png 800w, https://july-h5kf3.github.io/p/sliderquant/SliderQuant_fig1.png 930w" width="930"&gt;&lt;/p&gt;&#10;&lt;p&gt;可以看到无论模型大小，对量化最敏感的永远是第一层和最后一层，且随着量化层数的增加，量化误差的积累也越来越明显。&lt;/p&gt;&#10;&lt;p&gt;为了解决上述问题，论文提出了SliderQuant框架，其核心包括:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Inter-layer sliding quantization: 针对浅层，中间层和深层分别设计自适应滑动窗口，建立跨层的智能化接力机制&lt;/li&gt;&#10;&lt;li&gt;Intra-layer sliding quantization: 在每个量化窗口内采用增量式量化策略，实现局部到全局的参数协同。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;strong&gt;Inter-layer sliding quantization&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;一般的PTQ量化普遍选择Layer-Wise的量化，因此误差会随着层数加深而逐渐累积。作者选择使用滑动窗口的方式进行量化，每次在整个窗口中的layer会被当作一个block进行量化。为了减少跨层量化误差，总会保证两个连续的窗口之间存在重叠即$s-i\geq 1$。（size，stride）&lt;/p&gt;&#10;&lt;p&gt;然而使用固定大小的滑动窗口时，预训练大语言模型的所有层都会以相同的窗口大小和每一步相同的移动间隔进行量化。也就是说，浅层、中间层和深层在很大程度上仍然被同等对待，这与我们期望的量化设计之间仍存在较大差距。&lt;/p&gt;&#10;&lt;p&gt;因此SliderQuant选用的方式为:&lt;/p&gt;&#10;&lt;p&gt;对于$L_s$个浅层，采用渐进扩展滑动窗口。具体而言，从仅量化第一层开始，窗口大小被设置为1；随后以第一层作为锚定层，每一步将窗口大小增加1，直到窗口覆盖所有浅层$L_s$&lt;/p&gt;&#10;&lt;p&gt;对于$L_D$个深层，采用渐进收缩滑动窗口。具体而言，从量化所有深层开始，然后每一步将窗口大小减少 1，直到窗口中只包含最后一层。最后一层始终作为锚定层，并参与每一个收缩后的滑动窗口的量化过程。&lt;/p&gt;&#10;&lt;p&gt;对于中间$L_i$个中间层，采用固定大小的滑动窗口，其中设置$\{s=2,i=1\}$,并保证各层具有均匀的优化频率。具体而言，在浅层和中间层之间设置一个重叠层，同时在中间层和深层之间也设置一个重叠层。&lt;/p&gt;&#10;&lt;p&gt;根据消融实验得到$L_s = L_D =4$可以在效率和精度之间达到平衡&lt;/p&gt;&#10;&lt;p&gt;可以参考下面的gif&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1269px" data-flex-grow="528" height="225" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://july-h5kf3.github.io/p/sliderquant/sliderquant_gif2.gif" srcset="https://july-h5kf3.github.io/p/sliderquant/sliderquant_gif2_hu_2dd1cc0425a6d39c.gif 800w, https://july-h5kf3.github.io/p/sliderquant/sliderquant_gif2.gif 1190w" width="1190"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Intra-Layer Sliding Quantization&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;为了进一步利用之前发现两个性质，论文提出了一个与Inter-layer sliding 互补的组件。&lt;/p&gt;&#10;&lt;p&gt;具体而言，它将逐步扩展的滑动设计进一步扩展到层间滑动量化的每一个窗口内部。在窗口内，s个层会沿着权重和激活维度，以比例$\gamma$并行地执行逐步扩展滑动。因此，所有 s个层的联合量化会在$N = \frac{1}{\gamma}$个滑动阶段完成。&lt;/p&gt;&#10;&lt;p&gt;这里从语言上描述比较抽象，可以参考下面的GIF，简单来说就是对于权重/激活值矩阵，沿着某个维度逐渐进行量化（而非一次性量化）。&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="720px" data-flex-grow="300" height="360" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://july-h5kf3.github.io/p/sliderquant/sliderquant_gif1.gif" srcset="https://july-h5kf3.github.io/p/sliderquant/sliderquant_gif1_hu_438d56a7f7703948.gif 800w, https://july-h5kf3.github.io/p/sliderquant/sliderquant_gif1.gif 1080w" width="1080"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="622px" data-flex-grow="259" height="370" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://july-h5kf3.github.io/p/sliderquant/SliderQuant_fig2.png" srcset="https://july-h5kf3.github.io/p/sliderquant/SliderQuant_fig2_hu_226108b3885c0fc1.png 800w, https://july-h5kf3.github.io/p/sliderquant/SliderQuant_fig2.png 960w" width="960"&gt;&lt;/p&gt;&#10;&lt;p&gt;层内滑动量化在层间滑动量化当前滑动窗口内部，建立了一种从局部到全局的跨层参数协同关系，从而降低量化误差。&lt;/p&gt;&#10;&lt;p&gt;在层内对激活值和权重进行量化时，采用如下策略，该策略参考了目前主流的通道缩放以及低秩近似：&lt;/p&gt;&#10;&lt;p&gt;设$W_i \in \mathbb{R}^{n\times m}$表示滑动窗口中第i层的权重矩阵，$X_i \in \mathbb{R}^{k\times n}$表示其对应于一小组校准样本的输入特征，其中校准样本数为c，默认设置c=128,那么，量化过程定义为:&#10;&lt;/p&gt;&#10;$$&#10;\hat{X_i} = X_i \oslash \alpha_i\\&#10;\hat{W_i} = W_i \odot \alpha_i + A_iB_i \\&#10;\hat{X_{i+1}} = \text{quantizer}(\hat X_i)\cdot \text{quantizer}(\hat{W_i})&#10;$$&lt;p&gt;&#10;其中$\alpha_i$表示一个可学习的通道缩放参数，$A_i,B_i$为两个低秩矩阵。&lt;/p&gt;&#10;</description></item><item><title>[2026 ICLR] TurboQuant: Online Vector Quantization with Near-optimal Distortion Rate</title><link>https://july-h5kf3.github.io/p/turboquant/</link><pubDate>Wed, 26 Aug 2026 08:15:00 +0800</pubDate><guid>https://july-h5kf3.github.io/p/turboquant/</guid><description>&lt;div style="background-color:#f9f9f9; padding:8px; border-radius:6px;"&gt;&#10; &lt;b&gt;个人评价&lt;/b&gt;:这篇文章主要是针对大模型的KV-Cache的压缩，虽然是同一作者不同方法的浓缩（PolarQuant+QJL），但是补充了在结合方法下的量化误差上下界。目前实验停留在纯语言模型阶段，也许可以拓广到多模态阶段。&#10;&lt;/div&gt;&#10;&lt;p&gt;总结：本文主要介绍了一种针对高维向量量化的创新方法，旨在通过大幅度压缩数据规模来优化AI模型推理，KV Cache管理以及向量数据库检索的效率。其核心在于结合了随机旋转技术和最优标量量化器，能在极低的比特位宽下实现接近理论极限的MSE。针对内积检索中的偏置问题，作者设计了一个两阶段架构，利用 1-比特 QJL 变换补偿余数，从而确保了内积估算的无偏性。实验数据表明，该算法在 Llama-3.1 等大语言模型的长文本测试中，仅需 2.5 至 3.5 比特即可保持与全精度近乎一致的性能。此外，相较于传统的乘积量化 (PQ) 技术，TurboQuant在保持高召回率的同时，将索引构建时间降低至接近于零，展现出卓越的加速器友好性。&lt;/p&gt;&#10;&lt;p&gt;简单来说，进行向量量化（VQ）的目的是最小化下列两个误差：&#10;&lt;/p&gt;&#10;$$&#10;D_{MSE} = \mathbb{E}_{Q}[||x-Q^{-1}(Q(x))||_2^2]\tag{1}&#10;$$$$&#10;D_{prod} = \mathbb{E}_Q[|\langle y,x\rangle-\langle y,Q^{-1}(Q(x))\rangle|^2]\tag{2}&#10;$$&lt;p&gt;此外，对于内积量化，在大模型推理中我们更希望向量的内积是无偏的，即满足：&#10;&lt;/p&gt;&#10;$$&#10;\mathbb{E}_Q[\langle y,Q^{-1}(Q(x))\rangle]=\langle y,x\rangle\tag{3}&#10;$$&lt;p&gt;&#10;而这两个优化目标是难以兼顾的，因此在VQ中通常会设计两个Quantizer，分别是$Q_{MSE}$,$Q_{prod}$。对应到KV-Cache量化场景下就是对K向量用$Q_{prod}$，对V向量用$Q_{MSE}$。&lt;/p&gt;&#10;&lt;p&gt;对于$Q_{MSE}$，我们的目标就是最小化公式(1)。在此之前，我们有如下假设:&lt;/p&gt;&#10;&lt;p&gt;待量化向量满足$||x||^2 = 1$，即$x\in \mathbb{S}^{d-1}$,即分布在d维球面上。若不满足这个条件，在实际中可以通过存储L2范数进行Scale使向量满足条件。&lt;/p&gt;&#10;&lt;p&gt;我们有如下引理（Lemma 1）：&lt;/p&gt;&#10;&lt;p&gt;若$x\in \mathbb{S}^{d-1}$,是在单位超球面上均匀分布的&lt;strong&gt;随机变量&lt;/strong&gt;，那么对任意$j\in [d]$,坐标$x_j$服从（缩放/平移后的）Beta型分布：&#10;&lt;/p&gt;&#10;$$&#10;x_j ～ f_X(x)=\frac{\Gamma(\frac{d}{2})}{\sqrt{\pi}\Gamma(\frac{d-1}{2})}(1-x^2)^{\frac{d-3}{2}},\quad x\in[-1,1]&#10;$$&lt;p&gt;&#10;在高维情况下， 该分布收敛到正态分布：&#10;&lt;/p&gt;&#10;$$&#10;f_X(.)\to N(0,\frac{1}{d})&#10;$$&lt;p&gt;&#10;证明略.&lt;/p&gt;&#10;&lt;p&gt;High-Level层面上可以理解为固定球上一点的一个坐标相当于用一个平面去截这个高维球面，那么此时其余坐标构成的截面是一个维度为d-2，半径为$\sqrt{1-x^2}$的球面。（可以想象一下三维球面被平面截得到圆），那么这个分布自然就是中间多（x=0），两边少（$x=\pm 1$）.&lt;/p&gt;&#10;&lt;p&gt;在这个引理的支持下，我们对原始的向量x乘以一个随机的旋转矩阵$\Pi $（&lt;strong&gt;这里相当于做了一个极坐标变换&lt;/strong&gt;），使其成为在单位超球面上均匀分布的随机变量$z = \Pi x$。那么此时根据Lemma 1，z的每个坐标都可以认为符合上述Beta型分布，且在高维情况下收敛为正态分布。此外，在高维下，z不同坐标之间会变得近似独立，因此我们可以对每个坐标独立地应用最优标量量化器。于是我们的问题转变为：&lt;/p&gt;&#10;&lt;p&gt;为服从如下分布的随机变量设计一个标量量化器。&#10;&lt;/p&gt;&#10;$$&#10;x_j ～ f_X(x)=\frac{\Gamma(\frac{d}{2})}{\sqrt{\pi}\Gamma(\frac{d-1}{2})}(1-x^2)^{\frac{d-3}{2}},\quad x\in[-1,1]&#10;$$&lt;p&gt;&#10;在随机变量分布给定的情况下的最优标量量化问题可以表述为一个一维连续K-means问题。更具体而言，我们希望把区间[-1,1]划分为$2^b$个簇。最优解需要满足：当所有质心按照升序排序时，区间边界应当是相邻质心的中间。因此，若记这些升序排序的质心为$c_i$那么，该标量量化问题可以描述为如下k-means优化问题：&#10;&lt;/p&gt;&#10;$$&#10;C(f_x,b) = \min_{-1 \leq c_1\leq c_2\leq \dots \leq c_{2^b}\leq 1}\sum_{1}^{2^b}|x-c_i|^2f_x(x)dx\tag{4}&#10;$$&lt;p&gt;&#10;该问题可以通过迭代数值方法进行求解（Lloyd-Max量化器，本质和K-means相似，可以看作一维的K-means）。此外，我们只需要针对一组实际有效的bit-width b离线求解一次，然后把结果存储下来，供量化器之后重复使用。&lt;/p&gt;&#10;&lt;p&gt;至此，$Q_{MSE}$的做法很明确：先计算$z=\Pi x$,然后对z的每个坐标找到最近的质心，并存储该质心的索引。对应的反量化流程则通过读取这些索引对应的质心来重建旋转后的向量，再乘以$\Pi^\top$从而得到原始向量。&lt;/p&gt;&#10;&lt;p&gt;论文中还给出了该量化器损失的上界，理解起来并不困难，这里不做过多赘述。&lt;/p&gt;&#10;&lt;p&gt;之所以$Q_{MSE}$需要与$Q_{prod}$不能统一，是因为前者不满足内积无偏性的特性，即式(3)。（论文中给出了证明）&lt;/p&gt;&#10;&lt;p&gt;为了保证$Q_{prod}$的内积无偏性，作者提出了将$Q_{MSE}$与QJL相结合的方案。具体而言，设$Q_{MSE}$是对应于位宽 b−1 的$ Q_{mse} $的量化映射。对于任意$x\in \mathbb{S}^{d-1}$，我们定义残差向量：&#10;&lt;/p&gt;&#10;$$&#10;r := x - Q_{mse}^{-1}(Q_{mse}(x))&#10;$$&lt;p&gt;&#10;其L2范数很小，即在期望意义下(见式（4）)&#10;&lt;/p&gt;&#10;$$&#10;\mathbb{E}[||r||]=\sqrt{C(f_X,b-1)}&#10;$$&lt;p&gt;&#10;随后，我们可将QJL 的量化映射 $Q_{QJL}$ 应用于该残差向量，从而使总体位宽达到 b，并得到如下无偏内积估计器：&#10;&lt;/p&gt;&#10;$$&#10;\langle y,Q^{-1}_{MSE}(Q_{MSE}(x))\rangle + ||r||^2\cdot\langle y,Q^{-1}_{qjl}(Q_{qjl}(r))\rangle&#10;$$&lt;p&gt;&#10;更形式化的来说，我们可以定义：&#10;&lt;/p&gt;&#10;$$&#10;Q_{prod}(x) = [Q_{MSE}(x),Q_{qjl}(x-Q^{-1}_{MSE}(Q_{MSE}(x))),||x-Q^{-1}_{MSE}(Q_{MSE}(x))||_2]&#10;$$&lt;p&gt;&#10;论文还对该方法的误差下界进行了估计，具体的参考原文。&lt;/p&gt;&#10;</description></item><item><title>[2023 ICLR] GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers</title><link>https://july-h5kf3.github.io/p/gptq/</link><pubDate>Wed, 26 Aug 2026 08:12:00 +0800</pubDate><guid>https://july-h5kf3.github.io/p/gptq/</guid><description>&lt;p&gt;这个文章是OWQ的前身，借着对这篇文章的分析，我们梳理一下这一系列的文章的intuition。&#10;大概的分析顺序为:&#10;&lt;/p&gt;&#10;$$&#10;\text{OBD} \to \text{OBS} \to \text{OBC} \to \text{GPTQ}&#10;$$&lt;p&gt;首先是OBD，这是由Yann LeCun在1990年提出的神经网络剪枝算法。该算法基于二阶导数信息，旨在通过去除目标函数影响较小的参数来降低模型复杂度，提高泛化能力。&lt;/p&gt;&#10;&lt;p&gt;具体而言，就是希望去除目标函数对目标函数E(即Loss)影响小的参数，我们记去除了若干参数的模型的参数为$\hat W = W + \Delta w$,有:&#10;&lt;/p&gt;&#10;$$&#10;\Delta E = L(x,y,W) - L(x,y,W + \Delta w) = &#10;\sum_{i}g_i \Delta w_i + \frac{1}{2}\sum_{i}h_{i,i}\Delta w_{i}^2 + \frac{1}{2}\sum_{i\neq j}h_{i,j}\Delta w_i\Delta w_j + O(\Delta w^3)&#10;$$&lt;p&gt;&#10;其中$g_i = \nabla L$,$h_{i,j}$为Hessian矩阵$H_{L}$的一个元素&lt;/p&gt;&#10;&lt;p&gt;其中由于剪枝发生在对于已经训练好的神经网络，因此一阶导项可以忽略不计，而高阶项由于模型会进行归一化，因此$\Delta w$较小，可以忽略不计。&lt;/p&gt;&#10;&lt;p&gt;此外，OBD做了一个有争议的假设，即删除任意一个参数后，其他参数对目标函数的影响不变，也就是说每个参数对目标函数的影响是独立的，因此可以忽略交叉项:&lt;/p&gt;&#10;&lt;p&gt;那么我们可以得到简化后的公式:&#10;&lt;/p&gt;&#10;$$&#10;\Delta E = \frac{1}{2}\sum_{i}h_{i,i}\Delta w_i^2&#10;$$&lt;p&gt;&#10;因此，对神经网络进行剪枝，删除参数时，参数对目标函数的影响可以通过海森矩阵的对角项进行衡量。我们只需要在剪枝时求出海森矩阵，按对角项从小到大排序，即可确定参数剪枝的次序。&lt;/p&gt;&#10;&lt;p&gt;可以注意到，OBD的这个认为参数对目标函数的影响是独立的假设是很强的。OBS认为参数之间的独立性不成立，如果考虑交叉项，可以写作矩阵形式&#10;&lt;/p&gt;&#10;$$&#10;\Delta E = \frac{1}{2}\Delta w^\top H\Delta w&#10;$$&lt;p&gt;&#10;OBS希望在W每次迭代找到一个位置q(即准备剪枝的位置，后续会将该位置的$w_q = 0$),以及在获得位置q的同时，计算处一个与之相关的$\Delta w$对w进行补偿，使得$L(w+\Delta w)-L(w)$尽量小。&lt;/p&gt;&#10;&lt;p&gt;那么这个流程可以描述为一个带约束的凸优化问题:&#10;&lt;/p&gt;&#10;$$&#10;\arg \min_q \frac{1}{2}\Delta w^\top H \Delta w\\&#10;s.t.\ e_q^\top\Delta w + w_q = 0&#10;$$&lt;p&gt;&#10;这里$e^\top_q$是第q个值为1的列向量。&lt;/p&gt;&#10;&lt;p&gt;采用Lagrange乘子法进行求解:&#10;&lt;/p&gt;&#10;$$&#10;\mathcal{L} = \frac{1}{2}\Delta w^\top H \Delta w + \lambda(e^\top_q \Delta w + w_q)&#10;$$&lt;p&gt;&#10;对$\lambda$并置为0得到:&#10;&lt;/p&gt;&#10;$$&#10;e_q^\top \Delta w + w_q = 0\\&#10;\Delta w^\top e_q + w_q = 0&#10;$$&lt;p&gt;&#10;对$\Delta w$求导并置为0有:&#10;&lt;/p&gt;&#10;$$&#10;\Delta w^\top H + \lambda e^\top_q = 0\\&#10;\Delta w^\top H H^{-1} + \lambda e_q^\top H^{-1}=0\\&#10;\Delta w^\top + \lambda e^\top_q H^{-1} = 0&#10;$$&lt;p&gt;&#10;有&#10;&lt;/p&gt;&#10;$$&#10;w_q = \lambda e_q^\top H^{-1} e_q\\&#10;\lambda = \frac{w_q}{[H^{-1}]_{qq}}&#10;$$&lt;p&gt;&#10;其中用到了等式$e_q^\top H^{-1}e_q = [H^{-1}]_{qq}$&lt;/p&gt;&#10;&lt;p&gt;将$\lambda = \frac{w_q}{[H^{-1}]_{qq}}$带入等式$\Delta w^\top H + \lambda e_q^\top = 0$,得到&#10;&lt;/p&gt;&#10;$$&#10;\Delta w^{\top} = -\frac{w_q}{[H^{-1}]_{qq}}e_{q}^\top H^{-1}\\&#10;\Delta w = -\frac{w_q}{[H^{-1}]_{qq}}(H^{-1})^\top e_q \\&#10;\Delta w = -\frac{w_q}{[H^{-1}]_{qq}}H_{:,q}^{-1}&#10;$$&lt;p&gt;&#10;其中$H_{:,q}^{-1}$表示$H^{-1}$的第q列,且Hessian矩阵是一个对称矩阵.&lt;/p&gt;&#10;&lt;p&gt;将$\Delta w$带入$\Delta \mathcal{L}$我们有:&#10;&lt;/p&gt;&#10;$$&#10;\Delta\mathcal{L} = \frac{1}{2}\Delta w^\top H \Delta w = \frac{1}{2}(-\frac{w_q}{[H^{-1}]_{qq}}e_q^\top H^{-1})H(-\frac{w_q}{[H^{-1}]_{qq}}H^{-1}e_q)\\&#10;=\frac{1}{2}(\frac{w_q}{[H^{-1}]_{qq}})^2e_q^\top H^{-1}e_q\\&#10;=\frac{1}{2}(\frac{w_q}{[H^{-1}]_{qq}})^2[H^{-1}]_{qq}\\&#10;=\frac{1}{2}\frac{w_q^2}{[H^{-1}]_{qq}}&#10;$$&lt;p&gt;&#10;由此我们得到:&#10;&lt;/p&gt;&#10;$$&#10;q = \arg \min_q \frac{w_q^2}{[H^{-1}]_{qq}}&#10;$$&lt;p&gt;我们不难发现，要进行k次剪枝，每一次剪枝都要求一次Hessian矩阵的逆(时间复杂度为$O(d^3)$),这样的时间复杂度明显是不能实际应用的，因此OBC对其进行了进一步的优化。&lt;/p&gt;&#10;&lt;p&gt;OBC主要做了两点优化，一个是对原始问题进行了拆分，另一个是对Hessian矩阵的计算进行了简化。&lt;/p&gt;&#10;&lt;p&gt;首先是对原始问题的拆分，对于Layer-wise的量化/剪枝而言，通常将对整个网络进行的量化/剪枝拆分为每一层独立的子问题。在先前对AdaQuant的分析中我们有提到，这种Layer-wise的拆分是高度可并行的。&lt;/p&gt;&#10;&lt;p&gt;在Layer-wise的量化/剪枝下，参数变化带来的损失可以描述为以下形式:&#10;&lt;/p&gt;&#10;$$&#10;\Delta \mathcal{L} = ||W_lX_l - \hat W_l X_l||_2^2&#10;$$&lt;p&gt;&#10;其中$\hat W$表示经过量化/剪枝后的参数。&lt;/p&gt;&#10;&lt;p&gt;OBC将这个损失函数进行了按行拆分，即认为删掉某个权重$w_{ij}$只影响该行的输出，行与行之间的Hessian矩阵元素是没有耦合的。(这两个都是对按行拆分合理性的解释，前者是直观解释，后者是数学解释)&lt;/p&gt;&#10;&lt;p&gt;对于第一点，我们知道，改变某个权重$w_{ij}$它只会对输出的某一行的结果产生影响，即$Y_{i,:} = W_{i,:}X$,那么既然只对某一行的输出产生影响,那么对于整体误差而言,也只对这一行的误差产生影响,而误差是可以按行拆分的:&#10;&lt;/p&gt;&#10;$$&#10;\Delta \mathcal{L} = ||WX - \hat W X||_2^2 = \sum_{i=1}^{d_{row}}||W_{i,:}X-\hat W_{i,:}X||_2^2&#10;$$&lt;p&gt;&#10;因此剪枝/量化是可以按行拆分并行处理的。&lt;/p&gt;&#10;&lt;p&gt;由于是Layer-wise的量化/剪枝，我们在这个尺度下的进行单行损失函数(二阶范数)的Hessian矩阵的计算从而对第二点进行证明，我们有:&#10;&lt;/p&gt;&#10;$$&#10;H_{pq} = \frac{\partial^2\Delta \mathcal{L}_l}{\partial w_{lp}\partial{w_{lq}}} = \frac{\partial}{\partial w_{lp}}\sum_{k=1}^N 2(\sum_{j=1}^{d_{col}}(w_{lj}-\hat w_{lj})x_{jk})\frac{\partial}{\partial w_{lq}} \sum_{j = 1}^{d_{col}}(w_{lj}-\hat{w_{lj}})x_{jk}\\&#10;=\frac{\partial}{\partial w_{lp}}\sum_{k=1}^N2(\sum_{j=1}^{d_{col}}(w_{lj}-\hat w_{lj})x_{jk})x_{qk}\\&#10;=2\sum_{k=1}^N x_{pk}x_{qk}&#10;$$&lt;p&gt;&#10;写成矩阵的形式就是&#10;&lt;/p&gt;&#10;$$&#10;H = 2XX^\top&#10;$$&lt;p&gt;&#10;发现每一行的损失的Hessian矩阵只跟输入数据X有关且相等，而与模型权重无关，因此我们认为行与行之间的Hessian矩阵元素是没有耦合的。&lt;/p&gt;&#10;&lt;p&gt;而我们知道通过泰勒展开可以得到参数变化对损失函数的影响的近似表示$\Delta w^\top H \Delta w$,那么结合上式我们可以知道行与行之间的损失是相互独立的(对于行而言$\Delta w$,行与行之间互相独立,对于Hessian矩阵而言，行与行之间相等且互不影响),由此可以从数学上说明按行拆分进行单独处理的方式是合理的。&lt;/p&gt;&#10;&lt;p&gt;有了这个证明，我们可以对每行进行单独处理进行量化剪枝。这种方式为我们提供了一个更加简单的Hessian矩阵形式$2X^\top X$但是每次更新参数仍然需要对其求逆，因此OBC提供了一个高效的求逆方法:&lt;/p&gt;&#10;&lt;p&gt;给定一个可逆矩阵H以及其逆矩阵$H^{-1}$,我们希望高效地计算删除H第q行第q列(删除权重$w_q$)后的逆矩阵$H^{-1}_{-q}$:&#10;&lt;/p&gt;&#10;$$&#10; H_{-q}^{-1} = (H^{-1} - \frac{1}{[H^{-1}]_{qq}}H^{-1}_{:,q}H^{-1}_{q,:})_{-q}&#10;$$&lt;p&gt;&#10;这个定理证明较为复杂，将在博客上更新详细证明与intuition。&lt;/p&gt;&#10;&lt;p&gt;接下来我们来描述OBC剪枝的完整流程:&lt;/p&gt;&#10;&lt;p&gt;给定一个神经网络层的权重行向量$w \in \mathbb{R}^d$,以及其对应的Hessian矩阵的逆$H^{-1}\in \mathbb{R}^{d\times d}$,要求切除其中k个权重，同时最小化输出误差。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;初始化&#10;$M \leftarrow \{0,1,2,\dots,d-1\}$,为尚未被剪枝的权重索引集合。&lt;/li&gt;&#10;&lt;li&gt;重复执行k次:&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;pre&gt;&lt;code&gt;首先选择当前最优的剪枝目标q:$q \leftarrow \arg\min_{q\in M}\frac{w_q^2}{[H^{-1}]_{qq}}$,接着弥补剪掉$w_p$带来的误差$\Delta w \leftarrow \Delta w - \frac{w_q}{[H^{-1}]_{qq}}(H^{-1}_{:,q})^\top$,然后更新$H^{-1}\leftarrow H^{-1}_{-q}$,从候选集中移除该索引$M\leftarrow M - \{q\}$&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;而对于量化而言(OBQ)，相对剪枝我们需要做一些调整。首先是之前的最优化问题的限制条件需要改为:&#10;&lt;/p&gt;&#10;$$&#10; \Delta w \cdot e_q + w_q - \text{quant}(w_q) = 0&#10;$$&lt;p&gt;&#10;同样使用Lanrange乘子法进行求解:&#10;&lt;/p&gt;&#10;$$&#10; \mathcal{L} = \frac{1}{2}\Delta w^\top H \Delta w + \lambda(\Delta w \cdot e_q + w_q - \text{quant}(w_q))&#10;$$&lt;p&gt;&#10;对$\Delta w$求导并置为0可以得到:&#10;&lt;/p&gt;&#10;$$&#10; \Delta w^\top H + \lambda e_q = 0\\&#10; \Delta w^\top = -\lambda e_q H^{-1}\\&#10; \Delta w = -\lambda H^{-1}e_{q}^\top&#10;$$&lt;p&gt;&#10;对$\lambda$求导并置为0可以得到:&#10;&lt;/p&gt;&#10;$$&#10; \Delta w\cdot e_q + w_q - \text{quant}(w_q) = 0\\&#10; w_q - \text{quant}(w_q) = \lambda H^{-1}e_q^\top e_q\\&#10; \lambda = \frac{w_q - \text{quant}(w_q)}{[H^{-1}]_{qq}}&#10;$$&lt;p&gt;&#10;得到:&#10;&lt;/p&gt;&#10;$$&#10; \Delta w = -\frac{w_q - \text{quant}(w_q)}{[H^{-1}]_{qq}}(H^{-1}_{:,q})^\top\\&#10; q = \arg \min_{q} \frac{(w_q-\text{quant}(w_q))^2}{[H^{-1}]_{qq}}&#10;$$&lt;p&gt;&#10;用上式替换OBC剪枝的流程，便可以得到量化流程。&lt;/p&gt;&#10;&lt;p&gt;GPTQ则是对OBQ进行了改进，GPTQ发现，在对权重的每一行量化时，按照贪心策略选择量化的q和按照任意固定顺序来量化每一行的权重最终的误差是相差不大的，那么可以直接让所有行都按照列序(0 $\rightarrow$ col),这样可以提高计算效率与存储效率。&lt;/p&gt;&#10;&lt;p&gt;这样做的另一个好处在于：每行的顺序一样，那么每一行对应的Hessian矩阵都是相同的，每次Hessian矩阵的逆只需要计算一次！&lt;/p&gt;&#10;&lt;p&gt;在固定量化顺序的前提下，我们不再需要求解$q = \arg\min_q$只需要关心$\Delta w$,此时$\Delta w$的更新公式为:&#10;&lt;/p&gt;&#10;$$&#10; \Delta w = -\frac{w_q - \text{quant}(w_q)}{[H_{q:,q:}]^{-1}_{0,0}}([H_{q:,q:}]^{-1}_{:,0})^\top&#10;$$&lt;p&gt;&#10;这个式子我们对比在贪心策略下的式子便不难发现，这个式子就是贪心策略式子在每次删除当前候选集里的第一个q时的式子的等价形式，同样地我们也能给出Hessian矩阵的逆的更新形式:&#10;&lt;/p&gt;&#10;$$&#10; [H_{q:,q:}]^{-1} = ([H_{q-1:,q-1:}]^{-1} - \frac{1}{[H_{q-1:,q-1:}^{-1}]_{0,0}}[H^{-1}_{q-1:,q-1:}]_{:,0}[H_{q-1:,q-1:}^{-1}]_{0,:})_{1:,1:}&#10;$$&lt;p&gt;&#10;从矩阵的角度来看我们在做的是这样一个变换:&#10;&lt;/p&gt;&#10;$$&#10; (H^{-1})^{(k)} = &#10; \left[&#10; \begin{matrix}&#10; I_{k-1} &amp; 0 &amp; 0^\top\\&#10; 0 &amp; a_{k,k} &amp; b_{k}^\top\\&#10; 0 &amp; b_k &amp; B'^{(k)}&#10; \end{matrix}&#10; \right]\to (H^{-1})^{(k+1)} = &#10; \left[&#10;\begin{matrix}&#10;I_{k} &amp; 0 &amp; 0\\&#10;0 &amp; a_{k+1,k+1} &amp; b_{k+1}^\top\\&#10;0 &amp; b_{k+1} &amp; B''^{(k+1)} &#10;\end{matrix}&#10; \right]&#10;$$&lt;p&gt;若我们不断更新Hessian的逆总会产生非正定的Hessian逆矩阵,其原因可能是由于数值误差的累积。为了解决这个问题，作者注意到每次从$H^{(-1)}$中删除一行一列，本质上和对称正定矩阵的Cholesky分解的逐步过程类似，因此作者对初始的$H^{-1}$进行了Cholesky分解，得到了一个上三角矩阵$T$。&lt;/p&gt;&#10;&lt;p&gt;Cholesky分解:假设一个正定矩阵$A\in \mathbb{R}^{n\times n}$是正定对称矩阵，那么必然存在一个对角元素为正数的下三角矩阵$L\in \mathbb{R}^{n\times n}$满足$A = LL^\top$&lt;/p&gt;&#10;&lt;p&gt;我们尝试模拟一次这个分解过程:&#10;&lt;/p&gt;&#10;$$&#10;A = \left[&#10; \begin{matrix}&#10; a_{11} &amp; A_{21}^\top\\&#10; A_{21} &amp; A_{22}&#10; \end{matrix}&#10;\right],L = \left[&#10;\begin{matrix}&#10;l_{11} &amp; 0\\&#10;L_{21} &amp; L_{22}&#10;\end{matrix}&#10;\right],L^\top = \left[&#10; \begin{matrix}&#10; l_{11} &amp; L_{21}^\top\\&#10; 0 &amp; L_{22}^\top&#10; \end{matrix}&#10;\right]&#10;$$&lt;p&gt;&#10;由于$A = LL^\top$,我们有:&#10;&lt;/p&gt;&#10;$$&#10;l_{11} = \sqrt{a_{11}},L_{21} = \frac{1}{l_{11}}A_{21},L_{22}L_{22}^\top = A_{22} - L_{21}L_{21}^\top&#10;$$&lt;p&gt;于是我们可以惊奇地发现$L_{22}L_{22}^\top$就是我们想要的$H_{q:,q:}^{-1}$!因此我们可以认为删去$[H_{q:,q:}^{-1}]$的第一行和第一列的过程与对该矩阵进行一次Cholesky分解是等价的。因为我们进行Cholesky分解得到的$L_{22}$恰好是更新了之后的$H^{-1}$进行Cholesky分解得到的下三角矩阵。&lt;/p&gt;&#10;&lt;p&gt;进一步地，GPTQ对初始的Hessian矩阵的逆进行了Cholesky分解得到一个上三角矩阵$L^\top$,这个矩阵还有一个特点在于，它的每一行刚好就等于逆矩阵每次更新迭代后的第一行乘以一个常数:&#10;&lt;/p&gt;&#10;$$&#10;C_qL_{q,q:}^\top = [H_{q:,q:}]^{-1}_{0,:}&#10;$$&lt;p&gt;&#10;这个我们可以通过Cholesky分解的式子知道，因为分解得到的$L$是一个下三角矩阵，那么它的第一行就只有一个常数，而这个常数乘以$L^\top$便可以得到A的第一行。&lt;/p&gt;&#10;&lt;p&gt;而恰好我们发现，$\Delta w$的更新公式只需要用到当前Hessian矩阵的逆的第一行，那么我们有:&#10;&lt;/p&gt;&#10;$$&#10;\Delta w = -\frac{w_{:,q}- \text{quant}(w_{:,q})}{C_q T_{qq}}C_qT_{q,q:}&#10;$$&lt;p&gt;&#10;其中常数可以直接约掉:&#10;&lt;/p&gt;&#10;$$&#10;\Delta w = -\frac{w_{:,q} - \text{quant}(w_{:,q})}{T_{qq}}T_{q,q:}&#10;$$&lt;p&gt;&#10;因此我们在进行量化时不用每次都更新Hessian矩阵的逆，而是直接对$H^{-1}$进行Cholesky分解，得到它的每一行便可以进行参数的量化。&lt;/p&gt;&#10;&lt;p&gt;此外，如果每行的量化并行计算，那么每次更新都要读写一次参数矩阵。若参数矩阵的维度为$d_{row}\times d_{col}$，那么量化这个参数矩阵就要读写$d_{col}$次参数，总共的读写量高达$d_{row}\times d_{col}^2$.(因为我们量化第i列的时候，后面的列相应地也要补偿更新)&lt;/p&gt;&#10;&lt;p&gt;那这样大量的IO开销将会成为瓶颈，因此GPTQ采用了Lazy Batch-Update技术。我们注意到对于列i，最终的量化决策并不会受到尚未更新的列的影响。这使得我们可以将后续列的更新推迟到后续步骤中，从而减少不必要的内存操作。&lt;/p&gt;&#10;&lt;p&gt;具体步骤如下:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;每次处理B列的一个小块，限制该列更新的补偿更新只影响块内的列&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;当前块的权重会在量化过程中被更新，而其影响暂时不传播到矩阵的其他部分&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;对当前块中的每一列进行量化，同时计算误差并更新当前块剩余的列&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;这些更新仅在当前块内进行，而不会影响整个矩阵&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;当一个块内的所有列完成量化后，将该块的更新结果批量应用到矩阵的剩余部分&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这部分通过语言可能难以描述清楚，可以见下图:&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="GPTQ 的 lazy batch-update 示意" class="gallery-image" data-flex-basis="287px" data-flex-grow="119" height="1144" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://july-h5kf3.github.io/p/gptq/lazy-batch-update.jpg" srcset="https://july-h5kf3.github.io/p/gptq/lazy-batch-update_hu_9a06e5a9407335b0.jpg 800w, https://july-h5kf3.github.io/p/gptq/lazy-batch-update.jpg 1372w" width="1372"&gt;&lt;/p&gt;&#10;</description></item><item><title>[2024 AAAI] OWQ: Outlier-Aware Weight Quantization for Efficient Fine-Tuning and Inference of Large Language Models</title><link>https://july-h5kf3.github.io/p/owq/</link><pubDate>Wed, 26 Aug 2026 08:09:00 +0800</pubDate><guid>https://july-h5kf3.github.io/p/owq/</guid><description>&lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;：本文提出了一个异常感知的权重量化方法OWQ，利用LLMs中的异常激活值挑选出Weak Column，对其采用全精度的方式在牺牲很小的性能的情况下提升了巨大的精度。此外为进一步提升其性能做了一定的硬件适配并提出了一个基于OWQ的WTC方案，简单来说就是在OWQ量化模型上微调只更新Weak Column的参数。&lt;/p&gt;&#10;&lt;div style="background-color:#f9f9f9; padding:8px; border-radius:6px;"&gt;&#10;&lt;b&gt;评价:&lt;/b&gt; 这篇文章思路很新颖，从大模型中间激活值的异常出发，结合Hessian矩阵分析，提出了一个简单但高校的方法，似乎可以进一步提升？&#10;&lt;/div&gt;&#10;&lt;p&gt;本文基于这样一个发现，LLMs在中间激活中表现出一些异常值，其值显著大于其他值，并且这些异常值集中在特定的特征维度上。保留这些异常值的值已知对于在激活量化之后保持准确性至关重要。此外，作者团队还发现激活异常值仍然会影响权重量化的敏感性。基于此，作者提出了一种称为异常值感知权重量化的概念(OWQ).&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="OWQ 方法示意" class="gallery-image" data-flex-basis="832px" data-flex-grow="346" height="682" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://july-h5kf3.github.io/p/owq/owq_figure.png" srcset="https://july-h5kf3.github.io/p/owq/owq_figure_hu_93a2f22b2489b93.png 800w, https://july-h5kf3.github.io/p/owq/owq_figure_hu_4e6346948cfee795.png 1600w, https://july-h5kf3.github.io/p/owq/owq_figure.png 2365w" width="2365"&gt;&lt;/p&gt;&#10;&lt;p&gt;我们知道逐层权重量化的过程，实际上进行如下优化过程:&lt;/p&gt;&#10;&lt;p&gt;给定输入特征$X\in R^{C_{i,n} \times N}$,其中$C_{i,n}$表示输入的通道数，N是输入的序列长度，用于$C_{out}$输出特征的完整精度权重矩阵$W \in R^{c_{out}\times C_{i,n}}$被映射到低精度。&#10;&lt;/p&gt;&#10;$$&#10;\arg \min_{W} E= \arg \min_{\hat W}||WX - \hat W\hat x||^2_2 &#10;$$&lt;p&gt;&#10;在量化时我们从输入到输出逐层量化。此外大模型的量化中，Embedding层以及LM Head的权重通常不被量化，因为前者的权重量化误差会随着网络的传播不断放大，且Token向量较为稀疏而LM Head层直接决定logits，而Top-k词之间的分数差往往较小，低比特改写会对排序以及argmax产生显著影响。&lt;/p&gt;&#10;&lt;p&gt;接下来阐释权重敏感性和激活异常值之间的关系。&lt;/p&gt;&#10;&lt;p&gt;（这里与原论文中的证明方式不一致，原论文只考虑了对量化误差&lt;/p&gt;&#10;$$||WX - \hat W\hat X||$$&lt;p&gt;的论证，这是单层量化误差，但是忽略了误差随着网络的放大的影响）&lt;/p&gt;&#10;&lt;p&gt;在AdaRound文章中有提到，对于权重的量化产生的误差我们有如下基于泰勒展开的近似:&#10;&lt;/p&gt;&#10;$$&#10;\mathbb{E}[L(x,y,w+\Delta w) - L(x,y,w)] =\Delta L \approx \nabla L^{\top}\Delta w + \frac{1}{2}\Delta w^\top H\Delta w \approx \Delta W^\top H\Delta W&#10;$$&lt;p&gt;&#10;由此我们知道，输出误差可以直接与海森矩阵和权重扰动的幅度相关。&lt;/p&gt;&#10;&lt;p&gt;将Hessian矩阵写作Kronecker积的矩阵形式，我们得到&#10;&lt;/p&gt;&#10;$$&#10;H(w^{(l)}) = \mathbb{E}[x^{(l-1)} x^{(l-1)\top}⊗ \nabla^2_{z^{(l)}}L]&#10;$$&lt;p&gt;&#10;由此我们可以从全局的视角看到，异常激活值(激活值的激增)使Hessian矩阵H的某些元素具有异常大的值。Hessian矩阵的这种异常激增增加了相应权重通道对量化的敏感性。具体来说，即使在相同的权重扰动下，由于一些H的一些大元素，输出的变化也会相当大。我们可以将这些易受量化影响的权重称为Weak Column，特别是那些与特定输入通道中的激活值异常值相关联的权重。&lt;/p&gt;&#10;&lt;p&gt;OWQ为了解决这个问题，实现了如下技术：首先，识别Weak Column并将他们从量化中排除。随后使用精心调整的量化参数将剩余的权重量化为极低的bit。&lt;/p&gt;&#10;&lt;p&gt;对于Weak Column的检索，OWQ遵循如下方法:&lt;/p&gt;&#10;&lt;p&gt;我们定义j-th权重列的敏感性为:&#10;&lt;/p&gt;&#10;$$&#10;sensitivity_j = \lambda_j||\Delta W_{:,j}||_2^2&#10;$$&lt;p&gt;&#10;其中$\lambda_j$是Hessian矩阵的第j个对角元素。&lt;/p&gt;&#10;&lt;p&gt;(若考虑的Hessian矩阵是层内重构误差的，那么这里$\lambda_j = (X^\top X)_{j,j} = 2\sum_{n}x_{j,n}^2$)&lt;/p&gt;&#10;&lt;p&gt;可以注意到在我们写的Hessian矩阵是针对全局损失而言的，那么这个场景下的$\lambda_j$就有所改变。虽然在这个场景下我们无法像论文里一样因为layer-wise量化误差输出通道之间没有Hessian交互，从而Hessian是对角矩阵。&lt;/p&gt;&#10;&lt;p&gt;但是将其作对角近似是合理的。因为在这样一个大的模型下，进行Hessian矩阵的精确计算是不可行的。&lt;/p&gt;&#10;&lt;p&gt;在此场景下我们有:&lt;/p&gt;&#10;&lt;p&gt;对于神经网络中的第j个神经元的输入$a_j$对应权重为$w_{ji}$:&#10;&lt;/p&gt;&#10;$$&#10;\frac{\partial^2 E_n}{\partial w_{ji}^2} = \frac{\partial^2 E_n}{\partial a_j^2}z_i^2&#10;$$&lt;p&gt;&#10;其中$z_i$是上一层神经元的输出。&lt;/p&gt;&#10;&lt;p&gt;而$\frac{\partial^2 E_n}{\partial a_j^2}$可以通过链式法则递归计算(类似于反向传播):&#10;&lt;/p&gt;&#10;$$&#10;\frac{\partial^2 E_n}{\partial a_j^2} = \underbrace{\frac{\partial}{\partial a_j}[h'(a_j)\sum_{k}w_{kj}\frac{\partial E_n}{\partial a_k}]}_{链式法则}=h'(a_j)^2 \sum_{k,k'}w_{kj}w_{k'j}\frac{\partial^2 E_n}{\partial w_k\partial w_{k'}} + h''(a_j)\sum_k w_{kj}\frac{\partial E_n}{\partial a_n}&#10;$$&lt;p&gt;忽略二阶导中的非对角线项$k\neq k'$:&#10;&lt;/p&gt;&#10;$$&#10;\frac{\partial^2 E_n}{\partial a_j^2}\approx \underbrace{h'(a_j)^2\sum_k w_{kj}^2 \frac{\partial^2 E_n}{\partial a_k^2}}_{链式法则} + \underbrace{h''(a_j)\sum_{k}w_{kj}\frac{\partial E_n}{\partial a_k}}_{链式法则}&#10;$$&lt;p&gt;&#10;从而一次反向传播便可以计算出来，时间复杂度为$O(W)$&lt;/p&gt;&#10;&lt;p&gt;由此我们可以计算出在全局损失下的$\lambda_j$&lt;/p&gt;&#10;&lt;p&gt;在实际的计算中，同样也是只需要一个小批量的校验集，但是坏处是要多进行一次反向传播得到曲率。这样的Trade off得到的性能提升应该不小，因为它会真正识别出在全局下的 Real Weak Column&lt;/p&gt;&#10;&lt;p&gt;我们根据权重列的敏感性挑选出top-k个作为weak column。然后其余权重被量化为低精度。（这里可以采用任何的量化方法）论文中采用了OPTQ的方法。&lt;/p&gt;&#10;&lt;p&gt;作者团队对OPTQ进行了重要修改，使用二维网格搜索来搜索量化配置，包括步长以及零点。通过四舍五入到最接近的截断来搜索使量化前后差异最小的参数的最优值。&lt;/p&gt;&#10;&lt;p&gt;文章指出了一个利用Weak Column进一步减轻误差的方法:将高精度的Weak Column重新排列到权重的末尾，OPTQ过程中其他列的量化误差可以主要由Weak Column得到补偿&lt;/p&gt;&#10;&lt;p&gt;在此之后，我们将Weak Column存储为fp16，并为每一列使用一个额外的整数，该整数用于索引Weak Column。此外存储一个低精度矩阵，其中Weak Column的位置采用0填充。&lt;/p&gt;&#10;&lt;p&gt;此外，作者还对OWQ格式在真实GPU上提供了专门的加速以及WTC微调方案。&lt;/p&gt;&#10;&lt;p&gt;具体而言，这个微调方案会将OWQ的量化模型进行微调但只对Weak Column进行参数更新。因为weak column的数量很少，所以总体微调参数量很少，同时又因为weak column的权重使用fp16进行存储，因此微调空间较大，能够实现较好的微调效果。&lt;/p&gt;&#10;</description></item><item><title>[2022 NeurIPS] ZeroQuant: Efficient and Affordable Post-Training Quantization for Large-Scale Transformers</title><link>https://july-h5kf3.github.io/p/zeroquant/</link><pubDate>Wed, 26 Aug 2026 08:06:00 +0800</pubDate><guid>https://july-h5kf3.github.io/p/zeroquant/</guid><description>&lt;div style="background-color:#f9f9f9; padding:8px; border-radius:6px;"&gt;&#10;&lt;b&gt;评价:&lt;/b&gt; 这篇文章比较Solid，考虑了硬件适配的问题，这是模型量化中一个老大难的问题尤其是混合精度。但是实验的模型都是参数规模较小的模型，在大模型上的效果有待考究。&#10;&lt;/div&gt;&#10;&lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;：这篇文章指出，低比特量化在大型 Transformer 架构模型中精度受限的主要原因是激活值和权重矩阵的值分布方差较大。针对这一问题，提出了 ZeroQuant 方案。该方案主要包括：对权重采用 Group-wise 量化、对激活值采用 Token-wise 量化，这种方法既能适配硬件架构，又能保持较高的精度；同时，通过 Layer-wise 知识蒸馏方法来减少量化带来的精度损失。&lt;/p&gt;&#10;&lt;p&gt;文章指出，在大模型的量化中，采用PTQ会面临以下挑战。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;激活分布动态性强&lt;/p&gt;&#10;&lt;p&gt;论文通过展示每一层的激活值在不同Token语义下的分布，发现了其范围随输入token的语义上下文变化极大的特点。这一特点使得难以对所有的token使用固定的量化范围。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;权重矩阵范围差异大&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;​&#9;通过同样的方式，展示了不同层行权重的范围。同样可以看到权重矩阵的神经元范围差异较大。&lt;/p&gt;&#10;&lt;p&gt;这两个挑战使得Per-Tensor粒度的量化很难在大模型的量化中使用，而采用Per-channel粒度的量化会面临大的计算存储开销，且会导致在硬件级别的矩阵乘法优化难以执行。基于此作者提出采用Group-wise量化旨在对精度和实用性做出权衡。&lt;/p&gt;&#10;&lt;p&gt;对于权重矩阵而言，Group-wise量化就是将$W\in R^{n\times m}$划分为g个组，每个组单独量化。但是在最先提出这个量化方法的Q-BERT中仅将其用于QAT且没有考虑硬件效率约束，以及系统后端支持。基于此作者团队考虑了GPU的架构（Ampere架构）的硬件约束，特别是将Group-size与Tensor Core中的计算单元对齐。&lt;/p&gt;&#10;&lt;p&gt;具体而言，Tensor Core允许16*16大小的矩阵块在一个warp中并行处理，从而加速矩阵乘法和其他张量操作。如果我们让Group-size为16或32这样与Tensor core中矩阵乘法相适配的大小，这样就能在降低延迟的同时保持模型精度。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;注&lt;/strong&gt;：这部分文章在附录D中有详细介绍，简单来说Group-wise的group size是通过CUTLASS库和Profiler工具，根据输入尺寸和硬件特性动态确定的，以优化Tensor Core的计算效率。&lt;/p&gt;&#10;&lt;p&gt;对于激活值而言，在挑战中我们已经阐明了在不同的Token上下文语义下，激活值的范围存在巨大方差，因此解决这个问题的一个自然而然的想法是采用Token-wise的量化策略。但是直接采用DL框架中的Token级量化会导致显著的量化和反量化成本，因为引入了额外的操作。基于此作者采用了算子融合的方法等一系列优化。&lt;/p&gt;&#10;&lt;p&gt;知识蒸馏是缓解模型压缩后精度下降的最强大的办法之一。因此，论文提出了一种逐层的知识蒸馏技术来避免低比特量化带来的精度损失。&lt;/p&gt;&#10;&lt;p&gt;具体而言，在传统的知识蒸馏中，教师模型和学生模型的输出通常是整个模型的输出，但在逐层知识蒸馏(LKD)中，蒸馏的学习目标是逐层的，即学生模型要学习教师模型每一层的中间激活值。&lt;/p&gt;&#10;&lt;p&gt;假设我们要量化的是$L_k$层，其量化版本为$\hat L_k$,然后我们使用$L_{k-1}$层的输出作为$L_k,\hat L_k$的输入，测量差异，并更新模型&#10;&lt;/p&gt;&#10;$$&#10;L_{LKD,k} = MSE(L_kL_{k-1}\dots L_1(X)-\hat L_k L_{k-1}\dots L_1(X))&#10;$$&lt;p&gt;&#10;因为使用相同的前k-1层，所以无需单独保留一个单独的教师模型，因此额外的模型成本仅仅是$L_k$。而每次只对一层进行蒸馏，所以内存和计算开销非常小，并且无需原始训练数据。&lt;/p&gt;&#10;&lt;p&gt;在前面Token-wise的量化处我们提到，作者对Kernel做了对应的优化，下面我们详细展开。&lt;/p&gt;&#10;&lt;p&gt;首先是针对Token-wise 的激活值量化做了一系列的kernel融合。作者将激活值量化与其相关的逐元素和或基于reduction的操作（如bias，GELU,LayerNorm等）的kernel进行了融合。这样减少了数据转移的开销。而将反量化与矩阵乘法做了相应的融合。具体而言见下面的流程图&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10;x --&gt;B((LN/GeLU))&#10;B --&gt; C(Quantize)&#10;C --&gt; D[GEMM]&#10;D --&gt; E(DeQuantize)&lt;/pre&gt;&lt;p&gt;经优化后&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10;x --&gt; A((LN/GeLU + Quantize))&#10;A --&gt; B[GeMM + DeQuantize]&lt;/pre&gt;</description></item><item><title>[2020 ICML] AdaRound: Up or Down? Adaptive Rounding for Post-Training Quantization</title><link>https://july-h5kf3.github.io/p/adaround/</link><pubDate>Wed, 26 Aug 2026 08:03:00 +0800</pubDate><guid>https://july-h5kf3.github.io/p/adaround/</guid><description>&lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;:本篇文章作者首先从数学角度证明了在模型量化过程中，直接将浮点数进行四舍五入round到最近定点数的方法并不是精度最优的。并且通过了一个简单的实验验证了猜想，随后基于此作者进行一系列的数学推导和数学近似推导除了最终的优化目标:最小化由于量化在预激活值中引入的均方误差，从而提出了自适应的Round方法:AdaRound.这种方法在进行量化时，自适应地决定将浮点值转到最近右定点还是左定点值。AdaRound可以在不需要QAT or finetune的情况下仅使用少量无标签的校准数据在精度上达到SOTA，甚至4bit量化也可以保留较好的精度。&lt;/p&gt;&#10;&lt;div style="background-color:#f9f9f9; padding:8px; border-radius:6px;"&gt;&#10; &lt;b&gt;个人评价&lt;/b&gt;:这篇文章的行文流惯，公式推导顶级，从完全理论的方式推导出了大部分量化论文中量化目标函数。&#10;&lt;/div&gt;&#10;&lt;p&gt;首先作者将量化过程定义为了一个对预训练模型权重w的微小扰动$\Delta w$.我们的目标为最小化这个扰动对损失函数$L(w)$造成的影响，即最小化$E[L(w+\Delta w)-L(w)]$,为了近似这个损失，采用了二阶泰勒展开有:&#10;&lt;/p&gt;&#10;$$&#10;L(w + \Delta w)\approx L(w) + \nabla L(w)^\top \Delta w + \frac{1}{2}\Delta w^{\top} H(w)\Delta w\\&#10;\Delta L \approx \nabla L^{\top}\Delta w + \frac{1}{2}\Delta w^\top H\Delta w&#10;$$&lt;p&gt;&#10;由于模型经过预训练损失函数的梯度很小，可以忽略，而高阶项只要扰动$\Delta w$不是特别大，二阶近似往往就是准确的。对于4-bit或更高精度而言这个是成立的。&lt;/p&gt;&#10;&lt;p&gt;因此我们可以认为影响模型精度的主要是$\Delta w$以及损失函数的曲率$H(w)$相关。&lt;/p&gt;&#10;&lt;p&gt;令$\Delta w^\top = [\Delta w_1,\Delta w_2]$,$H^{(w)} = \begin{bmatrix}1 &amp; 0.5\\0.5 &amp;1\end{bmatrix} $,那么由此我们可以计算出，量化导致的损失为:&#10;&lt;/p&gt;&#10;$$&#10;\Delta w^\top H^{(w)}\Delta w = \Delta w_1^2 + \Delta w_2^2 + \Delta w_1\Delta w_2&#10;$$&lt;p&gt;&#10;对于对角线项$\Delta w_1^2,\Delta w_2^2$而言四舍五入是最优的，最小化了误差，但是对于非对角线项$\Delta w_1\Delta w_2$采用四舍五入就不一定最优了。例如若二者符号取反乘积为负就可以抵消一部分损失的增量。&lt;/p&gt;&#10;&lt;p&gt;因此从理论上分析出了四舍五入方法的局限性。后续也从实验上进行了论证，作者采用四舍五入，全部向上，全部向下，随机舍入进行比较，发现在随机舍入中存在比四舍五入高出10%的取舍法，说明在取舍办法中，存在更优的方法。&lt;/p&gt;&#10;&lt;p&gt;这个取舍办法的选取可以通过如下问题描述。&lt;/p&gt;&#10;&lt;p&gt;假设每层权重量化，量化后的权重为$\hat w_i^{(l)}$&#10;&lt;/p&gt;&#10;$$&#10;\hat w_i^{(l)}\in \{w_i^{(l),floor},w_i^{(l),ceil}\}&#10;$$&lt;p&gt;&#10;$\Delta w_i^{(l)} = w^{(l)} - \hat w_i^{(l)}$,由此，最优的舍入过程可以描述为以下二元优化问题:&#10;&lt;/p&gt;&#10;$$&#10;\arg \min_{\Delta w} \mathbb{E}[L(x,y,w+\Delta w) - L(x,y,w)]&#10;$$&lt;p&gt;&#10;直接对这个式子进行优化并不现实，因为，每次调整$\Delta w$都需要进行一次前向传播，计算成本太高，我们采用前面理论分析时的泰勒展开近似。此外，忽略属于不同层之间权重的交互。优化目标近似为：&#10;&lt;/p&gt;&#10;$$&#10;\arg \min_{\Delta w^{(l)}} \mathbb{E}[\Delta w^{(l)}H^{(w^{(l)})}\Delta w^{(l)}] &#10;$$&lt;p&gt;&#10;但是这个优化过程受限于Hessian矩阵的计算困难以及问题本身是一个NP-Hard问题。因此无法将这个作为最终的优化目标。&lt;/p&gt;&#10;&lt;p&gt;我们从Hessian矩阵计算的复杂性来分析&#10;&lt;/p&gt;&#10;$$&#10;\frac{\partial^2 L}{\partial W^{(l)}_{i,j}\partial W^{(l)}_{m,o}} = \frac{\partial}{\partial W_{m,o}^{(l)}}[\frac{\partial L}{\partial z_i^{(l)}}\cdot x_j^{(l-1)}] = \frac{\partial^2 L}{\partial z^{(l)}_i\partial z_m^{(l)}}\cdot x_j^{(l-1)}x_i^{(l-1)}&#10;$$&lt;p&gt;&#10;写作矩阵的形式&#10;&lt;/p&gt;&#10;$$&#10;H(w^{(l)}) = \mathbb{E}[x^{(l-1)} x^{(l-1)\top}⊗ \nabla^2_{z^{(l)}}L]&#10;$$&lt;p&gt;&#10;其中⊗为Kronecker积。由此看出Hessian矩阵的复杂性主要来于二阶导的求取，它需要通过网路的后续层反向传播二阶导数(见对角近似)。&lt;/p&gt;&#10;&lt;p&gt;为了解决这个问题，我们采用Hessian矩阵的对角近似，即将其近似为对角矩阵，记作$diag(\Delta^2_{z^{(l)}}L)$。&#10;&lt;/p&gt;&#10;$$&#10;H(w^{(l)}) = \mathbb{E}[x^{(l-1)} x^{(l-1)\top}⊗ diag(\nabla^2_{z^{(l)}}L)]&#10;$$&lt;p&gt;&#10;将这个近似带入优化方程中有：&#10;&lt;/p&gt;&#10;$$&#10;\arg \min_{\Delta W_{k,:}^{(l)}} \mathbb{E}[\nabla^2_{z^{(l)}}L_{k,k}\cdot \Delta W_{k,:}^{(l)}x^{(l-1)}x^{(l-1)\top}\Delta W_{k,:}^{(l)\top}]\\&#10;=\arg\min_{\Delta W_{k,:}^{(l)}} \Delta W_{k,:}^{(l)}\mathbb{E}[x^{(l-1)}x^{(l-1)\top}]\Delta W_{k,:}^{(l)\top}\\&#10;=\arg \min_{\Delta W_{k,:}^{(l)}} \mathbb{E}[(\Delta W_{k,:}^{(l)}x^{(l-1)})^2]&#10;$$&lt;p&gt;&#10;这里是认为$\nabla^2_{z^{(l)}}L_{i,i}$是一个与输入样本数据无关的常量结果。&lt;/p&gt;&#10;&lt;p&gt;由此我们推导出，我们只要最小化由于量化而在激活函数$z^{(l)}$中引入的均方误差。这与大部分量化的论文中的结论一致（如AdaQuant）&lt;/p&gt;&#10;&lt;p&gt;想要通过直接求解上面的优化方程仍然是一件困难的事情，因为它是NP-Hard的，因此作者将优化目标放宽为如下形式&#10;&lt;/p&gt;&#10;$$&#10;\arg \min_{V}||Wx-\hat Wx||^2_{F}+\lambda f_{reg}(V)&#10;$$&lt;p&gt;&#10;其中$||\cdot||^2_F$为F范数，$\hat W$为优化的软量化权重&#10;&lt;/p&gt;&#10;$$&#10;\hat W = s\cdot clip([\frac{W}{s}] + h(V),n,p)&#10;$$&lt;p&gt;&#10;$h(V_{i,j})$可以是任何在0和1之间取值的可微函数，$f_{reg}(V)$是一个可微正则项，用于鼓励$h(V_{i,j})$收敛到0或1.&lt;/p&gt;&#10;&lt;p&gt;但是这个方法存在一个缺陷，无法避免量化误差的不断积累且没有考虑到激活函数，所以做了进一步优化&#10;&lt;/p&gt;&#10;$$&#10;\arg \min_{V}||f_a(Wx)-f_a(\hat W\hat x)||_F^2 + \lambda f_{reg}(V)&#10;$$&lt;p&gt;&#10;其中$fa(\cdot)$为激活函数$\hat x$为当前层的反量化输入，x为当前层的浮点输入&lt;/p&gt;&#10;</description></item><item><title>[2021 ICML] AdaQuant: Accurate Post Training Quantization With Small Calibration Sets</title><link>https://july-h5kf3.github.io/p/adaquant/</link><pubDate>Wed, 26 Aug 2026 08:00:00 +0800</pubDate><guid>https://july-h5kf3.github.io/p/adaquant/</guid><description>&lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;：本篇文章的主要贡献在于提出了一个基于小数据集（校验集）的训练后量化方法AdaQuant，AdaQuant通过提出一个block/layer-wise的损失函数，通过在校验集上的训练学习量化参数(重点包括了一个最优的权重扰动，类似于AdaRound来避免四舍五入的不足),实现了减少量化的精度损失；提出了基于PI(整数规划)的bit精度分配方案，但是并没有解释精确损失的累加合理性；提出量化对BN融合造成的统计量偏移问题，并提出了PN(Para-Normalization)来解决这个问题。并在Bert-base网络上实现了不到1%的损失(4-8bit)&lt;/p&gt;&#10;&lt;div style="background-color:#f9f9f9; padding:8px; border-radius:6px;"&gt;&#10;&lt;b&gt;吐槽:&lt;/b&gt; 这篇文章作者(符号和表达)有点混乱，得多读几遍才能理解作者想表达什么.中间bit分配假设成立存疑&#10;&lt;/div&gt;&#10;&lt;p&gt;在一般的Post-training 量化中，我们的优化目标可以用下式表示:&#10;&lt;/p&gt;&#10;$$&#10;\hat\Delta = \arg \min_{\Delta}||X - Q_{\Delta}(X)||^2\\&#10;Q_{\Delta}(x) = \Delta[\frac{X}{\Delta}]&#10;$$&lt;p&gt;&#10;其中，$Q(\cdot)$是量化方程。这种方法对所有的量化损失都是平等处罚的，但是事实上我们更应该对影响分类的量化损失进行更多的惩罚。量化感知训练可以缓解这个问题但是它存在计算开销大的问题。&lt;/p&gt;&#10;&lt;p&gt;基于此，作者提出了AdaQuant，其核心思想是采用一个block/layer-wise的优化误差函数:&#10;&lt;/p&gt;&#10;$$&#10;(\hat\Delta_{w}\hat\Delta_x,\hat V) = \arg\min_{\Delta_w,\Delta_x,V}||WX-Q_{\Delta_w}(W')Q_{\Delta_x}(X)||^2&#10;$$&lt;p&gt;&#10;其中，$W' = W + V$,这里V是引入的一个连续的可学习的“补偿”张量。被量化的对象是进行补偿后的权重W&amp;rsquo;:$W_q = Q_{\Delta_w}(W') = Q_{\hat\Delta_w}(W+V)$.&lt;/p&gt;&#10;&lt;p&gt;这里其实有点类似于AdaRound的思想了，因为AdaRound主张的是在量化时直接采用四舍五入是一个不明智地选择，因此这里采用一个补偿张量V来做这个选择&lt;/p&gt;&#10;&lt;p&gt;由于量化参数的得到依赖的是上一层全精度的激活值输出作为输入，因此各个网络之间互不干扰，所以可以并行处理。&lt;/p&gt;&#10;&lt;p&gt;但是在实际的推理过程中，网络的输入是上一层量化后的激活值（见训练后静态量化），因此，作者提出了串行版本的AdaQuant，此时它的优化误差函数为&#10;&lt;/p&gt;&#10;$$&#10;(\hat\Delta_{w_l},\hat\Delta_{x_l},\hat V_l) = \arg\min_{\Delta_{w_l},\Delta_{x_l},V_l}||W_lX_l - Q_{\Delta_{w_l}}(W_l')\cdot Q_{\Delta_{x_l}}(X_l^q)||^2\\&#10;X^q_l = \sigma(Q_{\Delta_{w_{l-1}}}(W'_{l-1})\cdot Q_{\Delta_{x_l}}(X_{l-1}^q) )&#10;$$&lt;p&gt;&#10;其中，$\sigma(\cdot)$是激活函数&lt;/p&gt;&#10;&lt;p&gt;需要注意的是，串行版本的AdaQuant得在比特分配之后进行，这是因为它的优化依赖于上一层的输入。&lt;/p&gt;&#10;&lt;p&gt;为了在性能和精度之间做权衡，在量化时我们往往会给不同层的网络分配不同的bit精度。AdaQuant在此思想上，提出了采用整数规划(PI)的方式。&lt;/p&gt;&#10;&lt;p&gt;作者将网路的bit分配描述为这样一个问题：&lt;/p&gt;&#10;&lt;p&gt;给定L层的神经网络。对于每一层l，我们都有需要与前一层$X_{l-1}$的激活值相乘的权重$W_l$。令$W_l^k$和$X_{l-1}^n$表示$W_l,X_{l-1}$精度为k和n位的量化版本。对于每一层i，低位宽乘法$W_l^k X_{l-1}^k$会带来$\Delta L_l^{k,n}$的准确损失和$\Delta P_{l}^{k,n}$的性能提升。&lt;/p&gt;&#10;&lt;p&gt;作者假设了准确损失以及性能提升是满足可加性的。&lt;/p&gt;&#10;&lt;div style="background-color:#f9f9f9; padding:8px; border-radius:6px;"&gt;&#10;这里存疑，因为l-1层的准确损失势必会影响l层的准确损失，不能简单做加法来描述整个网络的准确性退化&#10;&lt;/div&gt;&#10;&lt;p&gt;那么问题可以描述为，在不超过总网络退化$\Delta L$的前提下，最大化总性能提升。我们设示性函数$I_l^{k,n}$来表示第l层是否采用k，n位量化版本（1表示使用）。问题可以被符号表示为:&#10;&lt;/p&gt;&#10;$$&#10;\max \sum_{l = 0}^{L-1}\Delta P_l\\&#10;Subject\ to\ \sum_{l}\Delta L_{l}\leq \Delta L\\&#10;\forall l\in \{1,\dots,L\}:\Delta P_l = \sum_{k,n}I_l^{k,n}\cdot \Delta P_{l}^{k,n},\Delta L_l = \sum_{k,n}I_{l}^{k,n}\cdot L_{l}^{k,n}\\&#10;\forall l\in \{1,\dots,L\}:\sum_{k,n}I_l^{k,n}=1,I_l^{k,n}\in\{0,1\}&#10;$$&lt;p&gt;BatchNormalization在部署时，通常会与前面的卷积/全连接层进行融合，这样可以减少推理时的计算量。(这是因为BN的线性变换乘$\gamma/\sqrt{\sigma^2+\epsilon}$，加$\beta-\gamma\mu/\sqrt{\sigma^2+\epsilon}$可以直接合并到权重和偏置中)&lt;/p&gt;&#10;&lt;p&gt;然而当网络量化后，会导致激活值的分布发生偏移，即统计量均值$\mu$和方差$\sigma^2$会偏离在全精度模型中应有的值。但是由于BN层已经被融合到了前面的层中，这个偏移无法被校准。基于此，作者采用了一个名为Para-Normalization(PN)的方法来更新BN的统计量，以补偿这种偏差。&lt;/p&gt;&#10;&lt;p&gt;具体而言，假设我们知道了原始的BN参数$\gamma_0,\beta_0$.然后我们初始化一个新的BN层，初始化$\mu,\sigma^2$以及BN参数$\gamma_r,\beta_r$以便重建BN，使其满足:&#10;&lt;/p&gt;&#10;$$&#10;BN_r(x) = \gamma_r \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} + \beta_r \approx x\\&#10;\mu = \beta_r = \beta_0;\sigma^2 = \gamma_0^2;\gamma_r = \sqrt{\gamma_0^2+\epsilon}&#10;$$&lt;p&gt;&#10;然后在校准集上收集运行时均值和方差更新$\mu,\sigma^2$,需要注意的是$\beta_r,\gamma_r$是不变的，因为不进行反向传播。&lt;/p&gt;&#10;&lt;p&gt;收集到新的均值和方差后，我们重新将BN进行融合，收集到的统计数据可以按以下方式融合回当前的量化尺度：&#10;&lt;/p&gt;&#10;$$&#10;W_i' = W_i\frac{\gamma_r}{\sigma};b_i' = \frac{\gamma_r}{\sigma}(b_i - \mu) + \beta_r;\Delta_{w_i}' = \frac{\gamma_r}{\sigma}\Delta_{w_i}&#10;$$</description></item></channel></rss>