扩散语言模型量化遇阻:校准数据为何失效,SOLOQ给出新解
你可能听说过扩散语言模型这个新鲜事物。它不像传统的GPT那样一个字一个字往下写,而是像修照片一样,先给一张全是噪点的"文字照片",然后一步步把噪点去掉,露出完整的句子。LLaDA、Dream这些模型就是这么工作的,它们证明了语言生成这件事,不一定非要从左往右写。但这篇论文要讲的,不是扩散语言模型本身有多厉害,而是一个.
扩散语言模型这个新东西,你可能已经有所耳闻。它跟传统
GPT一个词一个词往外蹦的路子不同,更像修图:先拿到一张满是噪点的"文字照片",再一步步抹掉噪点,最终显出完整句子。LLaDA、Dream这些模型走的正是这条路,它们证明了一件事——语言生成未必非得从左往右写。
不过这篇论文要讨论的,并非扩散语言模型本身多强,而是一个让工程师挠头的现实麻烦:这类模型块头大、速度慢,想装进手机或边缘设备,压缩是绕不开的一步。结果在压缩途中,研究者撞上了一堵没预料到的墙。
**量化:大模型是怎么被"瘦身"的**
先说压缩模型到底在干什么。所谓量化,就是把模型里原本以16位乃至32位浮点数保存的权重和激活值,压成4位甚至更低的精度,内存占用和计算量因此能大幅下降。
打个比方,原先你用一张高清照片记录一个场景,现在改用马赛克画面表达同样内容。马赛克块越大,图越小,细节丢得也越多。模型量化面对的就是这个取舍:精度压得越低,跑得越快越省内存,可出错的概率也跟着往上走。
在GPT那类传统自回归语言模型上,量化已经算相当成熟了。研究者想出过不少招数,例如借助二阶导数信息做权重量化的GPTQ、用缩放手段压住激活值异常点的AWQ,还有把权重和激活值转到更适合量化的坐标系里的旋转类方法,比如QuaRot。这些办法有个共同之处:都离不开"校准数据"。
校准数据是这么用的——量化开始前,先取一小批真实数据让模型跑一遍,把激活值的分布范围记下来,再拿这些统计信息去定量化的刻度。这就像给一批衣服做尺码表,得先找几个人量量身材,再按这个样本推算整个系列的尺码区间。听着挺合理,对吧?
问题在于,扩散语言模型的"身材"会变。
**核心问题:一个不断变形的目标**
这里就得提扩散语言模型与传统语言模型最根本的差别了。自回归模型生成文本时,每步只预测下一个词,上下文是固定的、已经生成好的那部分;扩散语言模型则不然,去噪过程中它会反复经历不同的"遮盖状态"。
所谓遮盖状态,指的是生成过程里句子起初几乎全是特殊的"掩码"符号(类似完形填空里的空格),随着去噪步骤推进,空格被真实词汇一点点填满,直到整句完整。
论文给了一个很直观的例子。开头句子是"[M] [M] [M] [M] [M] [M]",清一色掩码;中间状态可能变成"[M] tok tok [M] tok [M] tok",部分位置填上了词;最后才是完整句子。整个过程中,模型每一层每一步看到的激活值分布,都随"哪些位置仍是掩码、哪些已填词"而剧烈起伏。
作者做了个实验,追踪某一层前馈网络中down_proj模块的输入激活值,在不同去噪步骤里的变化幅度。结果发现,同一层在不同去噪步骤中,激活值的尺度能差好几倍,有的地方波动甚至超过4倍。
局面于是变得尴尬:拿某一批校准数据去统计激活值分布,得到的可能只是某个特定去噪阶段、某种特定掩码状态下的情况;换一批校准数据、换一个任务,统计结果也许就完全用不上了。
论文里有个很能说明问题的对比实验。研究者用WinoGrande和MMLU两种不同的校准数据集,去校准同一个量化方法,再分别在C-Eval和PIQA两个基准上测效果。结果是,换一种校准数据,准确率就明显漂移。这说明校准本身就不牢靠——它学到的只是某一个切片的统计规律,代表不了整个生成过程里千变万化的激活分布。
这好比你给一条河的水位定一套固定预警标准,可这是条潮汐河,水位每隔几小时就涨落一次,涨落幅度还跟季节、降雨量挂钩。你只在某个清晨量了一次水位就拍板定标准,到了下午涨潮,这套标准可能完全不适用,甚至让防洪系统误判。不去适配这种动态变化,死守某一次测量结果,系统迟早要出问题。
面对这个困境,作者换了思路:与其拼命追踪这个一直在变的分布,不如设法把它变成一个不变、可预测的分布。这便是论文的核心贡献,名叫SOLOQ。
**旋转的魔法:把混乱变成可预测**
SOLOQ这个名字背后的核心想法其实挺优雅,它立在一个数学上早已被证明的性质上:随机旋转能让任意方向的向量,变成在球面上均匀分布的样子。
具体操作是,拿到一个向量后先归一化成单位长度,再对它施加一个哈尔随机旋转(数学上"完全均匀随机"的一种旋转方式),结果在高维空间里会呈现一个能用公式精确描述的分布;维度足够高时,这个分布会非常接近高斯分布,也就是我们熟悉的钟形曲线。
这意味着什么呢?
原始数据是什么样并不打紧,只要做一次恰当的旋转,它的坐标分布就会固定成一种事先已知、可以预判的形态。
校准依赖这个根本麻烦,到这里就算解开了。旋转之后数据永远呈现同一种面貌,不必再去“猜”它长什么样;量化刻度可以照着这个可预判的形状提前定好,拿真实数据做统计这一步整个省掉。
这个思路其实有来路。图像和视频扩散模型上,此前的OrbitQuant工作已经把它验证过一遍,当时采用的旋转方法叫RPBH。
所谓RPBH(随机置换块哈达玛旋转),做法是先将向量元素随机打乱次序,再切分成若干小块,每个小块单独做一次哈达玛变换——这是一种计算效率很高的结构化旋转——以较小的计算开销换来接近随机旋转的混合效果。
可这套东西搬到扩散语言模型上,会撞上两个问题。其一,每个小块能否分到大致相当的能量,全靠最初那次随机打乱;输入中一旦冒出个别数值极大的异常点,均衡就保不住了。其二更为要害:打乱和分块一旦确定,各小块内部的哈达玛变换就各做各的,块与块之间不交换任何信息,某个块初始分到的能量偏多或偏少,后面都没法纠正。
论文专门拿Dream模型说事:它的前馈网络维度为18944,被拆成512乘以37个块,块数如此之多,块间能量失衡的毛病随之被放大。
针对这一点,SOLOQ给出了改进版本,名字叫K-RPBH。
K-RPBH(克罗内克扩展的随机置换块哈达玛旋转)在RPBH之上多加了一道跨块混合工序:用一个哈尔随机正交矩阵,把各小块相同位置上的数值再混一遍,残留的块间能量不均衡由此得到修正。
论文附了一个数学证明(命题1):在期望意义上,K-RPBH能让输出每个坐标的方差精确收敛到理论目标值1/d,d为总维度。证明之外还有实测,论文用Dream-7B和Nemotron-Labs-Diffusion两个真实模型的激活值做了验证,K-RPBH处理后的坐标分布比RPBH更贴近高斯目标,块间方差的起伏也小得多。
打个比方。假定你是工厂质检员,要把一批零件按重量装进16个箱子,要求各箱总重量尽量接近。RPBH是这么干的:先把零件随机打乱,再一箱接一箱顺序装,装完封箱,不再调整。打乱得不够均匀时,有的箱子偏重、有的偏轻,封了箱就无从补救。K-RPBH多出的那一步在封箱之前:把16个箱子里对应位置的零件取出来,按一条全局规则重新分配一遍,开头打乱得不理想,这一步也能把偏差抹平。少了这最后一道调整,维度多、分块碎的模型(Dream拆成几十个块就是例子)会一直背着明显的能量失衡,量化误差也跟着涨。
计算代价方面,论文把K-RPBH与QuIP、QuaRot所用的稠密或结构化旋转方式做了对比。K-RPBH比完全稠密的哈尔随机旋转便宜不少:在Fast-dLLM v2上,旋转耗时从98.135毫秒压到5.779毫秒,精度表现则与稠密旋转基本持平。
**分布匹配码本与硬件原生格式:两条并行路线**
旋转做完,数据有了可预判的分布形状,下一步是把它落成低比特数字。SOLOQ为此铺了两条并行的路。
第一条是SOLOQ-C,走分布匹配的码本量化。
码本量化的思路是:先照目标分布的形状设计一组“代表点”(即码本),量化时把每个数值归到离它最近的代表点上,而非按固定刻度硬切。
权重这一侧,SOLOQ-C采用E8P这种基于格子结构的量化器,技术借自QuIP#——权重是离线处理的,复杂的搜索计算扛得住。激活值要在推理时实时处理,用的则是更轻量的Lloyd-Max标量量化器,这是信息论里针对已知分布设计最优量化刻度的经典方法。
第二条是SOLOQ-N,直接对接硬件原生支持的NVFP4格式。
NVFP4是一种4比特浮点数格式,2位指数、3位尾数(记作E2M1),配合分组动态缩放因子,NVIDIA新一代GPU硬件可直接支持这种低精度计算格式。
走这条路的好处是能直接调用GPU芯片里为4比特计算专门优化的硬件单元,速度更快。SOLOQ-N先算每16个数字一组的局部最大值,再算整个张量的全局最大值,两层缩放因子把数值映射进NVFP4可表示的区间。
两条路线底下是同一套逻辑:先用K-RPBH把数据旋转到可预判的坐标系,再按各自量化器的特性完成最后一步映射。这个设计讨巧的地方在于,“用什么量化器”和“怎么应对分布漂移”没有被捆死——最难处理的分布问题被单独拎出来做成通用底座,上层可以随硬件条件灵活换。
好比开一家快递公司:客户寄来的包裹形状再杂,先一律装进标准尺寸的集装箱(对应旋转这一步);装好之后,卡车运还是飞机运(对应码本量化或NVFP4),包装方案都不用重做。缺了这层标准化,每换一种运输方式就得重新琢磨包装规则,维护成本会一路往上蹿。
**一处小修正:把丢掉的方向找回来**
低比特量化丢的不只是数值精度,还有个容易忽略的副作用:向量的方向可能被悄悄拧偏。
拿中心点量化器(如Lloyd-Max)或有限精度格式(如NVFP4)去近似一个向量,量化结果与原始向量之间除了大小上的误差,方向也可能跑偏。SOLOQ为此配了一个很轻的补救手段,叫“纯缩放偏差校正”。
校正的数学思路并不复杂。量化误差被拆成两块:一块沿原始向量的方向,另一块与之垂直。算出一个缩放系数之后,沿原方向那部分分量的投影长度就能精确恢复到与原始向量一致,既不用多存任何辅助信息,也不用动别的,只调已有的缩放因子即可。
这个思路和之前的一些工作有相通的地方,比如面向无偏压缩的DRIVE、EDEN,以及做无偏内积估计的RaBitQ。不过SOLOQ挑的是最简洁的那一版,没有走TurboQuant的路子——后者要靠额外的残差草图做二次修正。
论文实验里,这项校正带来的提升数字不算大,却稳稳当当。LLaDA-1.5上,HellaSwag的准确率从72.49%和73.71%(两个量化变体)分别升到73.01%和73.86%;Fast-dLLM v2上,GPQA从30.03%和31.92%升到30.58%和33.71%。校正几乎不添计算和存储开销,这笔账算下来挺划算。
**块扩散模型的特殊挑战:KV缓存**
前面说的主要针对“全序列扩散模型”,LLaDA、Dream都属于这一类,每步去噪都得把整个序列重新过一遍,没有能留下来的缓存。另有一类叫“块扩散模型”的变体,代表是Fast-dLLM v2和Nemotron-Labs-Diffusion,干活方式更接近自回归:序列切成一块一块,逐块产出,已经生成好的块会被缓存,留给后面的块接着用。
这个缓存,就是KV缓存。
先说KV缓存是什么。Transformer的注意力机制要用到此前所有词元的“键”(Key)和“值”(Value)向量,把它们存下来,下一步直接拿来算,省掉重算的功夫,这个存储结构便叫KV缓存。
麻烦在于句子越长,缓存堆得越大。论文测算,上下文长度到8000至16000时,KV缓存和激活值占内存的比重会明显抬头,把权重本身远远甩在后面。
SOLOQ的对策叫“提交时量化”:一个块彻底生成完、被“提交”进历史记录的那一刻,才对其KV状态做量化;正在去噪的活跃块保持全精度,不碰量化。
这么设计道理很直白。正在去噪的块内容还在变,此时量化等于对没定型的东西反复施加精度损失,误差只会越滚越大。已提交的块内容定死了,只需被动存储和复用,量化不会出问题。
Key这边,SOLOQ采用KIVI那种按通道的非对称量化;Value则走SOLOQ自家的激活值量化路径,搭配K-RPBH旋转和Lloyd-Max或NVFP4量化器。
好比图书馆管理员归档文件:一份文件还有人翻、还有人改,你不会急着压缩打包送进仓库,它随时可能再动;一旦定稿归档,就可以放心压缩存档,腾出桌面。要是不分“正在用”和“已定稿”,一律同样处理,结果要么让还在变的内容过早承受压缩损失,要么让已定型的内容白占着没压缩的空间。
**实验结果:数字说话**
理论讲完,该看实际效果了。
论文在三个全序列扩散模型(LLaDA-Base、LLaDA-1.5、Dream-7B)和两个块扩散模型(Fast-dLLM v2、Nemotron-Labs-Diffusion)上做了W4A4量化测试,权重和激活值都压到4比特,对照的基线不少:简单的RTN(直接四舍五入)、AWQ、QuaRot配合GPTQ,以及专为扩散语言模型设计的DLLMQuant和STaR-Quant。
LLaDA-Base上,全精度模型平均准确率58.95%,SOLOQ-C拿到57.74%,把同样不需要校准数据的RTN(44.23%)甩开一大截,也比需要校准的DLLMQuant++(54.29%)高3.45个百分点。
LLaDA-1.5上,SOLOQ-N达到68.48%,距全精度的69.23%只差0.75个百分点,贴得很近,比DLLMQuant++高4.17个百分点。
块扩散模型这边更极端。Fast-dLLM v2在W4A4设置下,RTN和AWQ直接崩掉,平均准确率仅6.67%和6.61%,基本等于乱答;QuaRot因模型维度不兼容跑都跑不起来;SOLOQ-C和SOLOQ-N分别拿到57.00%和56.77%,与全精度的60.35%相比差了不到4个百分点。
Nemotron-Labs-Diffusion上,SOLOQ-N达到70.76%,QuaRot配合GPTQ只有59.39%,RTN和AWQ更惨,仅1.3%和1.28%,几乎完全失效。
这组对比挺能说明问题:扩散语言模型这套特殊的生成机制,不是随便什么量化方法都能适应。激活分布一旦随去噪步骤剧烈变动,那些靠固定校准统计的方法很容易当场失灵。
**效率提升:内存和速度的真实收益**
准确率是保住了,压缩带来的实际好处又有多少?
论文用真实GPU硬件做了端到端测试。SOLOQ-N在NVIDIA RTX Pro 6000上跑原生NVFP4内核,五个模型上峰值显存下降2.31倍到2.61倍,大头来自4比特权重存储,块扩散模型还额外吃到KV缓存压缩的红利。端到端推理速度提升1.94倍到2.24倍。
论文还做了一次FPGA硬件验证:在Zynq UltraScale+ ZCU104开发板上搭起脉动阵列加速器,对比BF16和NVFP4两条数据通路。结果NVFP4加速器功耗反倒比BF16低15%,同样面积下能塞进两倍计算单元,整体吞吐量提升1.94倍,每千焦能量处理的词元数提升2.70倍。可见SOLOQ不只在数据中心的大GPU上管用,资源受限的边缘设备上也有实际价值。
当然,这套方案也不是没有代价,论文自己也把局限摆了出来。
先说激活值旋转这件事,它得在线实时算。K-RPBH的结构化设计已经把这部分开销压得很低,可再低也不是零。作者试过把旋转“折叠”进相邻的权重矩阵,让它变成离线操作。结果在低比特下精度掉得厉害,Fast-dLLM v2这类块扩散模型上尤其明显,折叠后W4A4平均准确率从57.00%降到50.94%。可见折叠这条路看着省事,实际并不划算。
另一处限制在SOLOQ-C身上。它用的非精度码本落到真实硬件上只能跑INT8内核,4比特专用计算单元带来的速度红利吃不到,这也是它加速效果不如SOLOQ-N的原因之一。SOLOQ-N倒是快,可它完全靠硬件原生支持NVFP4格式,设备不认这个格式,加速就得打折。
论文末尾还单独分析了“注意力沉锚”这个现象。
所谓注意力沉锚,指的是Transformer的注意力机制里,某些固定位置会异常吸走大量权重,序列开头就是典型。自回归模型里早有人发现过,论文这次确认块扩散模型里同样存在。
具体来看,Fast-dLLM v2的注意力明显集中在位置2,Nemotron-Labs-Diffusion则落在位置0。作者试过让这些沉锚位置保持全精度、其余位置照常量化:普通的4比特KV量化下,这层特殊保护基本没多大意义,带不带差别很小;可一旦把KV压到2比特这种极端情况,保护沉锚位置就能换来明显的准确率提升。这个细节说明,压缩的边际效应通常不是线性的,越往极端走,原先可以忽略的地方越可能变成关键。
整篇论文读下来,让我最意外的不是K-RPBH那套数学设计,而是校准数据失效这个观察本身。
写在后面
我们习惯性地相信,校准用的真实数据越多、越有代表性,压缩效果就越好。这个直觉在传统语言模型上确实成立。扩散语言模型却把它推翻了:它的激活分布压根不是一个稳定的目标,随着去噪步骤推进、掩码状态变化,分布一直在变形。这么看,“拿更好的数据去校准”这条路可能从根上就走错了,毕竟你追的是一个始终在动的靶子。
这背后其实是个更普遍的问题:不少工程优化的默认假设,都建立在目标分布大致稳定这个前提上。前提一破,原来的最佳实践反过来可能变成累赘。SOLOQ与其说是量化技巧,不如说是把假设前提重新审了一遍,它没去修补校准这条路,而是直接绕开。
论文里还有个细节我想单独提一句。作者说K-RPBH比QuaRot“需要更少的变换操作”,而QuaRot在某些模型维度上压根用不了,论文里标的是N/A。这不是孤立的个例,它说明现有不少旋转量化方法是照着特定维度结构设计的,碰上Dream那种18944维、拆成512乘37块的不规则结构,直接失灵。K-RPBH改用克罗内克积来兼容任意维度组合,说到底是在通用性上较真。
至于那些正在去噪、还没定型的KV块该怎么处理,SOLOQ的答案是先别动它。这种克制本身也是一种设计上的分寸,能压的东西不代表都该马上压。
Q1:SOLOQ是什么,它解决了什么问题?
Q&A
A:SOLOQ是一个面向扩散语言模型的免校准量化框架。它把权重和激活值旋转到一个分布可预测的坐标系,由此绕开了传统量化方法对校准数据的依赖;扩散语言模型的激活分布会随去噪步骤剧烈变化,校准数据因此失效,这正是它要解决的问题。
Q2:SOLOQ相比传统量化方法有什么优势?
A:它不用任何校准数据,效果就能达到甚至超过依赖校准数据的方法。在多个扩散语言模型上,4比特量化下它的准确率高于DLLMQuant、STaR-Quant等基线;配合NVFP4硬件格式,内存压缩最高2.61倍,推理加速最高2.24倍。
Q3:K-RPBH旋转和普通的RPBH旋转有什么区别?
A:K-RPBH在RPBH基础上多了一步跨块混合,用随机正交矩阵把各个小块对应位置的数值重新混一遍。RPBH块数一多容易出现块间能量不均衡,这一步把它解决了,最终坐标分布也更贴近理想的高斯分布。
这些局限和取舍,构成了SOLOQ完整的画像。