
2026年初,如果你去看社区里流传的几个27B大模型4-bit量化版本,会发现一个共同的选择:所有人都在同一个地方留了后手。
这个模型叫Qwen3.8-27B,一共64层,其中48层用的是一种叫Gated 的循环结构,只有16层是传统的注意力。
Gated (GDN):一种线性注意力机制,用一个固定大小的状态矩阵来概括整段上下文的信息,而不是像传统注意力那样把每个token都存下来。
几乎所有公开的4-bit量化方案,包括模型官方自己发的FP8版本,都不约而同地放过了GDN这一块,尤其是它的两个门控投影层。他们把模型里其他大部分线性层都砍到8-bit甚至4-bit,唯独GDN的这几个关键投影,坚持留在8-bit或16-bit精度。
这不是疏忽,是一种共识性的谨慎。
理由听起来也确实站得住脚:GDN的状态会跨越几万个token不断累积和更新,如果每一步的量化误差都往里叠加,那随着上下文变长,误差岂不是会越滚越大?尤其是控制这个状态该"忘掉多少"和"该写入多快"的两个门控参数,一旦算错,岂不是从源头上就把整条递归链搞歪了?
这个直觉听起来无懈可击。本文的作者做了一件事:他们把这个"最不该动"的部分,恰恰量化到了4-bit,然后拿去跑了一整套严格测试。
结果让人意外。这个全量化版本,被作者命名为,不仅没有崩,反而在多项任务上和原始的16-bit模型几乎打平,同时体积只有原来的三分之一,首次生成的速度还快了将近两成。
这篇论文要讲的,就是这件事背后真正发生了什么。
一个看起来天经地义的直觉,为什么是错的
先说清楚GDN到底在做什么。
传统的注意力有一个特点:它会把之前看过的每一个token都存起来,做推理的时候,每生成一个新词都要回头看一遍所有存过的token。这个存储叫KV缓存,随着上下文变长,这个缓存会线性增长,最后变成显存里最大的开销之一。
GDN换了一种思路。它不存每个token,而是维护一个固定大小的状态矩阵,每来一个新token,就用一个类似"公式更新"的方式,把这个状态矩阵刷新一下。这个状态矩阵,理论上概括了从头到现在看过的所有信息,但它的大小是恒定的,不会随上下文变长而膨胀。
这套更新公式长这样:新状态等于一个衰减系数乘以旧状态,再加上一个写入强度系数乘以本次要写入的新内容。
衰减门(α,alpha):控制"上一步的状态记忆要保留多少",取值在0到1之间,越接近1代表遗忘越慢。
写入强度门(β,beta):控制"这次新信息要多大力度写进状态里",同样在0到1之间。
这两个门控参数,就是社区在量化时集体保护起来的东西。原因很直白:α决定了记忆能保留多久,β决定了每次写入的精确度,这两个数字如果算错了,理论上误差会顺着递归链条一路传下去,越滚越大,最后彻底带偏整个模型对长文本的理解。
这个逻辑链条听起来天衣无缝,但作者做了四组实验,一步步把它拆穿了。
第一步:GDN看到的数据,并不比注意力层更干净
有一种可能的解释是,GDN这几层碰巧接收到的输入数据比较"温和",误差本来就小,所以扛得住量化。作者先验证了这个假设,结果是否定的。
GDN和注意力层读的是同一条数据流,也就是模型内部层层传递的那条隐藏状态。作者测量发现,GDN层的输入其实极端不均匀,有些数值是普通数值的一百倍以上,用统计学的说法就是"峰度"特别高,达到1500多。而且相当一部分数据块里,有一个值就占了半数以上的能量占比,这种情况在16个数一组的分块里出现的比例高达10%到32%。
按理说,这种数据越极端,量化损失应该越大。但实际测出来的量化误差,在GDN、注意力、MLP这几种完全不同的层里,误差率都稳定卡在7.5%到9.2%这个区间,几乎没有差别。
这里就要提一下NVFP4这个格式本身的设计了。
NVFP4:一种4-bit数值格式,把16个数分成一组,每组共用一个缩放系数,这样组内如果出现一个特别大的异常值,只会影响这15个"邻居",不会波及到别的数据块。
这个分块缩放的设计,相当于把一场原本可能蔓延全局的火灾,提前用防火墙切成了一个个16平米的小隔间。哪怕某个隔间里真的着了大火,也只会把这一间烧光,不会顺着走廊窜到隔壁去。如果没有这种分块隔离,而是整个张量共用一个缩放系数,那一个离群值就会把所有正常数值的可用精度都拉低,因为缩放系数得照顾到最大值,其余数字就被挤到量化区间的窄缝里,误差反而会全局扩大。
所以第一个结论是:GDN的输入并不特殊,它面对的噪声环境和注意力层完全一样。它的抗噪能力,一定来自它自己内部的某种机制,而不是运气。
第二步:最被保护的两个门控,恰恰是最不怕误差的
作者接下来做了一个逐一替换实验:每次只把GDN层里的一个投影层换成4-bit,其余保持原样,看单独换掉这一层会给最终输出带来多大偏差。
结果和社区的直觉完全反过来。
把α和β这两个门控投影单独量化,输出误差分别只有2.1%和2.6%,是所有五个投影层里最小的两个。而它们自身的原始计算误差其实并不小,α对应的矩阵乘法误差高达11.0%,β也有8.5%。反倒是那三个大家觉得"普通"、直接给了4-bit待遇的投影层,也就是主要的qkv投影、输出门投影和最后的输出投影,误差被完整地传导到了最终输出上,分别达到10.4%、9.9%和12.7%。
为什么误差最大的两个矩阵乘法,反而对最终结果影响最小?
答案藏在公式1里那两个非线性函数。α和β在参与递归运算之前,要先经过一层加指数运算、以及一层运算的"过滤"。这两种函数有一个共同特点:它们会把输入的剧烈波动压缩成输出的温和变化,尤其是在输入已经比较大或比较小的区间,函数曲线会变得很平缓,哪怕输入误差很大,输出的变化也很小。
这就好比一个精密的水龙头减压阀。上游水管里的水压可能忽高忽低,波动很剧烈,但只要装了减压阀,流到水龙头出口的水流始终是平稳的。如果没有这层减压阀,直接把上游水压接到水龙头上,水压的每一次剧烈波动都会原样冲出来,可能一会儿喷得老远,一会儿又滴滴答答。α和β的/设计,就是这道减压阀,它是训练时为了让梯度更新更稳定而设计的,但在推理量化的场景下,意外地成了抗噪的护城河。
这个发现直接推翻了社区的保护策略。他们保护的,恰恰是架构自己已经保护好的部分。真正需要小心的,反而是那三个没有非线性压缩、直接把误差原样传下去的普通线性层。
第三步:递归本身在主动"清空"误差,而不是在累积误差
即便单步误差不大,长上下文里成千上万步的累积效应到底存不存在?这是社区最担心的问题,也是作者花了最大力气验证的部分。
作者用FP32精度跑了一个"锁步实验":一条干净轨迹,十一条注入了不同扰动的轨迹,在完全相同的输入下并行跑32000个token,观察状态误差随时间的变化曲线。
结果是:误差从一开始就稳定在一个平台上,完全不随时间增长。第256个token时的状态误差是12.96%,跑到第32768个token时是12.31%,几乎没有变化,误差曲线是平的。
更有意思的是第二个实验。作者在第1024个token处,人为往状态里注入了一个1%的扰动脉冲,然后观察这个脉冲要多久才会被"稀释"掉。结果是,在几十到几千步之内,这个脉冲就衰减到了原来的十分之一。而如果单纯按照α衰减门推算的记忆保留时长,这些层的理论记忆窗口有44000到62000个token那么长。
也就是说,实际的遗忘速度,比理论上的衰减速度快了几十倍。
这说明了什么?说明遗忘不只是靠α在慢慢地"淡忘",还有另一套机制在主动"删除"旧的痕迹。答案就藏在公式2里的写入方式:每次写入不是往状态里累加新内容,而是用新内容去覆盖状态在当前这个方向上原本预测的值。
这就像一块每天都要重新写字的黑板,而不是一张不断往上叠加涂鸦的墙纸。墙纸如果每天涂一层新颜色,旧的痕迹会一直透在底下,越叠越乱,最后谁也分不清哪层是哪天画的,这就是"误差累积"最直观的样子。但黑板不一样,你今天写的字,如果和昨天写在同一个位置,会直接把昨天的字擦掉重写,不需要专门拿橡皮擦,写的动作本身就带着擦除功能。GDN的写入规则正是这样:新的key方向一来,就把状态在这个方向上的旧值直接替换掉,误差不是被动衰减掉的,是被主动覆盖掉的。
这也解释了为什么β的误差几乎无害:哪怕某一次写入的强度算错了,下一次新的写入照样会把这次的错误覆盖掉,错误没有机会积累。
作者还专门测试了如果直接对α施加人工噪声会怎样。结果发现,哪怕只加0.1%的相对噪声,状态误差就能飙到22%。这是因为当α已经很接近1的时候,哪怕是极小的数值变化,换算成记忆窗口长度的相对变化也是巨大的,1/(1-α)这个公式在α趋近1时对微小扰动极其敏感。这恰好反过来证明了,量化误差之所以危险性很低,正是因为它落在了指数函数的"压缩区"里,根本没机会直接冲击α本身,而是被提前过滤掉了大部分振幅。
第四步:端到端来看,上下文越长,量化的代价反而越小
前面三步都是在拆解内部机制,最后一步要回到用户真正关心的问题:跑一个完整的32000 token长文本,量化模型和原始模型之间的差距,到底是越拉越大,还是逐渐缩小?
作者把整个32K窗口切成一个个2K的小段,逐段统计量化模型和原始模型在每个token上的困惑度差异。
困惑度(,PPL):衡量语言模型预测下一个词准确程度的指标,数值越低说明模型对文本的预测越准。
结果是:在窗口前半段,量化带来的困惑度损失是每token 0.081(这是一个对数概率单位,叫nats),到了后半段降到0.011,到最后2000个token,量化模型的表现甚至反超了原始模型0.053。
这和社区想象的"误差滚雪球"图景完全相反。量化的代价是一个前置的、一次性的短程效应,随着上下文积累,这个代价被后续源源不断填入的新信息稀释,最后几乎消失。
至此,四步证据链完整闭合。数据分块缩放先把离群值困在局部,门控的非线性函数把剩下的误差又压缩了一轮,delta rule的覆盖式写入主动清理掉残留的状态误差,最后体现在实际使用体验上,就是上下文越长代价越小。社区精心保护的部分,恰恰是这套架构自己已经上了三道保险的地方。
跑分怎么样:不只是理论好看
理论分析再漂亮,也得看实际跑分。作者把四个版本放在同一套服务环境下对比:原始的BF16版本、他们自己做的(全部496个线性层都量化到4-bit,GDN也不例外)、以及两个流行的社区量化版本和(这两个都保留了GDN和注意力层在8-bit,只把MLP层砍到4-bit)。
跑分覆盖了知识类的MMLU-Pro、数学题GSM8K、竞赛难度的AIME'25、研究生水平的GPQA-、代码能力,还有专门测长文本检索能力的RULER。
结果是,四个模型在五项任务的平均分上,差距不超过0.82分,全部落在同一个统计误差范围内,谁也不比谁明显强。在AIME'25这道竞赛数学题上,四个随机种子全部答对26道题里的26题,和原始BF16版本分毫不差。
但在体积和速度上,差距就明显了。的权重只占17.53GB显存,是原始模型50.13GB的三分之一还不到,比另外两个社区版本也小了7%到13%。首次生成响应的速度(也就是处理完一整段32K输入后开始吐字的时间)从原始模型的6.9秒缩短到4.03秒,比另外两个量化版本还要快14%到19%。
唯一稍微逊色的指标是困惑度:在4K上下文的困惑度是7.67,比原始的6.95略高,在32K上下文是10.84,比原始的10.35略高。但这个差距在实际任务打分上完全体现不出来,而且正如前面所说,这个差距是随位置递减的,越往后差距越小。
埋在服务链路里的三个坑
理论再对,如果测量方法本身有问题,得出的结论也会是假的。作者在做这项研究的过程中,踩过几个隐蔽的坑,值得单独说说,因为这些坑不是这篇论文独有的,任何想量化混合架构模型的人都可能撞上。
第一个坑最致命,叫全局缩放系数不匹配。
模型量化工具在校准的时候,是给每一个独立的模块单独算一个缩放系数的。但实际部署时,服务框架为了加速,会把GDN里相邻的几个投影层"融合"成一次矩阵运算,比如把qkv投影和输出门投影拼在一起算。这时候问题来了:融合运算只能用一个统一的缩放系数,服务框架的处理方式是直接取两个模块里较大的那个缩放系数,却没有同步调整内部每个16元素小块的局部缩放系数。
作者发现,这个不匹配在他们的模型里,两组融合投影的缩放系数差了1.82倍和2.75倍,意味着门控计算实际上一直在用错误缩放的权重跑。
更麻烦的是,这个错误看起来还挺"正常":推理能力确实下降了(AIME从86.7掉到80.8),但长文本困惑度反而变得异常好看(32K上直接压到6.86,比原始模型的10.35还低)。原因是缩放错误让遗忘门失灵了,状态几乎什么都不忘,反而意外地帮助了下一词预测。这是一个会让人误以为量化效果特别好、实际上模型已经算错了的陷阱。
这就像体重秤两个人站上去互相靠着,秤显示的数字可能反而比两人真实体重之和还准,但这不是秤准,是两个错误刚好抵消出一个看起来对的数字。如果没有专门去核对每个融合模块内部的缩放系数是否一致,这种系统性错误可能悄无声息地一直存在,还被误当成"量化效果超预期"。
第二个坑是模型服务路径的选择。这个模型原本发布的是一个支持多模态的版本,就算只做纯文本推理,服务框架也会默认走多模态的位置编码路径,而这条路径在长文本上的打分和纯文本路径不一样(32K困惑度10.04对10.22)。作者统一改用纯文本版本,避免这个差异和量化效果搅在一起。
第三个坑关于测试框架本身。一些常用的评测工具在测多选题时,是直接把问题拼接起来发给模型,不走对话模板,这意味着"关闭思考模式"这个指令根本没有传达给模型。作者发现在MMLU-Pro的抽样检查里,模型会在50道题里的25到48道题上主动打开思考标签,然后被截断或者中途卡壳,导致某些学科的分数上下浮动40到60分。这种测试方式测出来的分数根本不能信。
KV缓存也要一起管
前面说的都是GDN层,但模型里还有16层传统注意力,这些层依然需要KV缓存,而且这块缓存也能被量化。
KV缓存:注意力层为了避免重复计算,把之前处理过的key和value向量存下来,随着对话变长,这块缓存会不断增长,成为长文本推理时显存占用的大头。
作者把KV缓存压缩到FP8精度后,发现在任务分数上几乎没有影响,容量却能扩大1.8到1.9倍。唯一的代价出现在困惑度上:原始模型压缩KV后困惑度多了0.13,而多了0.41,整整是原始模型的三倍。
这个差距的来源不难猜:本身的key和value投影已经是4-bit了,再叠加一层KV缓存压缩,数值的可用精度空间被压得更窄,误差自然更容易显现。
解决办法是给每一层的KV缓存单独校准一个静态缩放系数,而不是用默认的1.0。加上这个校准后,困惑度损失从0.41降到0.07,挽回了83%的损失,而且这个校准过程几乎不消耗额外的推理时间,吞吐量的变化在0.4%以内。这意味着这个校准步骤是"免费"的,没有理由不做。
写在后面
读完这篇论文,最触动我的其实不是"量化成功了"这个结论,而是这个研究提醒我们的一件更普遍的事:工程直觉有时候是靠谱的经验,有时候只是没有被验证过的恐惧。
社区保护GDN门控的那个理由,"递归会累积误差",这句话在纯数学意义上完全正确,任何一个学过控制理论的人都会本能地认同它。但这篇论文告诉我们,一个系统是否真的会累积误差,取决于这个系统具体的反馈结构,而不是它是不是"递归"这个抽象属性。delta rule的覆盖式写入,恰恰是一种自带纠错能力的反馈机制,这种机制在很多控制系统设计里都有类似的影子,比如PID控制里的积分项清零,或者滤波器里的遗忘因子设计。
另一个让我意外的细节是,论文里提到那个全局缩放系数不匹配的bug,产生的错误结果居然是"看起来更好"的困惑度分数。这提醒我们,一个指标异常地好,有时候比异常地差更值得警惕,因为它可能意味着某个环节悄悄坏掉了,而坏掉的方式恰好讨好了这个指标。
论文里还提到,同期有另一个团队用量化感知训练的方式,也把这个模型的GDN层压到了4-bit,用的是完全不同的技术路线,需要用原始模型做老师去蒸馏训练量化后的学生模型。而这篇论文证明,光靠训练后校准,不需要额外训练,就能达到同样的效果。这说明至少对这个架构而言,GDN门控的抗噪性是架构本身自带的,不是靠额外训练"教"出来的。
这篇论文没有回答的问题是,这套关于门控参数化形式的分析,能不能推广到别的循环架构上。论文自己也承认,这个抗噪性依赖于α和β具体的对数空间参数化方式,换成别的门控设计,比如线性参数化的衰减门,可能就没有这层保护了。这意味着,"循环结构是否好量化"这件事,答案不在于它是不是循环结构,而在于它内部具体用了什么样的数学形式去实现门控。这个问题留给了后面研究混合架构量化的人。
Q&A
Q1:Gated 为什么被认为难以量化?
A:因为它的状态会跨越几万个token不断累积更新,社区普遍担心每一步的量化误差会随着递归不断叠加,尤其是控制记忆遗忘和写入强度的两个门控参数,一旦算错可能从源头带偏整条链路。
Q2:模型量化后效果损失大吗?
A:几乎没有明显损失。在MMLU-Pro、GSM8K、AIME'25等六项测试上,和原始16位模型的差距都在统计误差范围内,同时体积缩小到三分之一,首次生成速度还快了14%到19%。
Q3:为什么GDN的门控投影反而是最不怕量化误差的部分?
A:因为门控参数在参与计算前会经过和这类非线性函数处理,这些函数会把输入的大幅波动压缩成输出的小幅变化,相当于给误差装了一层减压阀,同时delta rule的覆盖式写入还会主动清除残留误差。
豆包工作和飞书,把中国第一个团队 Agent 拉进了工作群
豆包工作伙伴作为独立组织成员,可加入不同项目群并按授权持续参...(100 )人阅读时间:2026-09-16
为什么最容易出错的那部分,反而最经得起压缩
2026年初,多个27B大模型4-bit量化版本普遍将Gat...(91 )人阅读时间:2026-09-16
KV缓存里,扔掉的那些token真的重要吗?答案可能会让你意
大语言模型在长链条推理时使用KV缓存存储中间结果,但显存有限...(154 )人阅读时间:2026-09-16
哈萨克斯坦电商经济发展提速
哈萨克斯坦贸易和一体化部发布电商平台禁售与限售商品目录,细化...(164 )人阅读时间:2026-09-16