![]()
你有没有想过,一个几十亿参数的语言模型,最后要做的那个"决定",也就是猜下一个字是什么,居然要靠一个占了模型六分之一体积的巨型表格来完成?
这个表格就是所谓的输出头。它记录着词表里每一个词对应的一组数字,模型每猜一次下一个词,都要把这张大表从头翻到尾。听起来有点像图书馆里那种巨型索引卡片柜,每次借书都得把整个柜子的抽屉全部拉开检查一遍,哪怕你要借的书就在第一个抽屉里。
这篇来自Adobe SDC团队的论文,讨论的正是怎么给这张表"瘦身",而且还是在不改变任何借书结果的前提下完成的。
一件反直觉的事:词表越大,模型越"聪明",但代价也越大
先说一个可能颠覆你认知的事实。
很多人以为,决定一个语言模型好不好用的,主要是那些一层一层的神经网络(也就是解码器部分)。词表这种东西,不就是个查字典的工具吗?能有多重要?
但事实是,词表正在变成一个越来越贵的"奢侈品"。
论文里给出的数据显示,现在的小型语言模型(也就是3到4B参数规模的模型)里,输出头能占到整个模型10%到17%的体积。而且这个比例还在涨,因为学术界已经发现了一件事:词表越大,模型效果通常越好。这被称为"词表的规模法则"
规模法则:指模型某个维度的容量(比如参数量、词表大小)与模型效果之间存在的可预测关系,通常表现为越大效果越好,但收益会递减
这就好比一家餐厅发现,菜单页数越多,顾客越满意。于是各家餐厅开始疯狂加页,从三十几页的菜单卷成两百多页的大部头。论文里统计了23个知名模型家族,从Llama到Phi再到Gemma,几乎所有小模型的词表都在过去几年里翻了两倍到六倍不等。
问题是,词表变大不是没有代价的。跟输入的部分不一样,输入词嵌入只需要查表里那一行就够了,就像去图书馆只借一本书,翻开对应索引卡片就行。但输出头不一样,它得把整个词表过一遍才能算出下一个词是什么,每次生成一个字都要重新扫描一次全部词条。这就好比每次借书都要把整个索引柜的每一张卡片都读一遍,哪怕最后借的只是其中一本。
这个开销有多大?论文给了个数字:一个使用BF16精度存储的模型,每生成一个词,输出头就要读取大约2Vd字节的权重(V是词表大小,d是隐藏层宽度)。对于像Gemma这种26万词表的模型,这个数字轻轻松松就上到1点多GB。而且因为单次生成是内存带宽瓶颈,这部分开销是实打实要花时间的,不是能靠并行计算蒙混过去的。
于是量化这个技术就被摆上台面了。
量化,简单说就是用更少的比特位去存同一个数,原本用16位小数表示的权重,压缩成用4位甚至2位的整数去近似表示,这样存储空间和读取带宽都能省下大半。
量化:把模型权重从高精度数值(比如16位浮点数)压缩成低精度数值(比如4位整数)的技术,目的是减少存储空间和计算开销,但会引入一定误差
但这里就出现一个很棘手的问题了:输出头是直接决定模型说什么话的最后一环,后面没有别的层能帮它兜底纠错。你随便把它的权重压缩一下,模型说出来的话很可能就变得驴唇不对马嘴。这也是为什么在实际部署中,很多推理框架宁愿把输出头留在高精度,也不敢轻易压缩它。
那到底有没有办法,既压缩了输出头,又不让模型"变笨"?
这篇论文给出的答案,藏在一个数学上很优雅的观察里。
被忽略的自由度:同一个模型可以有无数种"等价写法"
这里要引入这篇论文最核心的洞察,理解了它,后面的一切都顺理成章。
我们知道,语言模型最后一步是用softmax函数把一堆原始分数(logits)转换成概率分布,决定下一个词是谁。
softmax:一种把任意实数向量转换成概率分布的函数,转换后所有数值加起来等于1,数值越大对应的概率也越大
但softmax有个性质:它只关心这些分数之间的相对大小关系,不关心分数本身的绝对值是多少。
这是什么意思呢?打个比方,如果你给三个候选人打分,A是90分,B是85分,C是80分,跟你把三个人的分数都统一减去50分,变成A是40分,B是35分,C是30分,这两种打分方式最后选出来的赢家排序是完全一样的。因为重要的从来不是绝对分数,而是分数之间的差距。
论文正是利用了这个数学性质。既然给输出头的每一行(也就是每个词对应的那组权重)统一减去同一个向量,最终算出来的概率分布是完全不变的,那就说明存在无数个"看起来不一样,但效果完全等价"的输出头。
这些等价的输出头,在没量化之前,表现得一模一样。但量化之后呢?论文用图2做了个特别直观的展示:同一个模型,只是做了不同程度的"整体平移",量化后犯的错误程度居然天差地别。有的平移方式量化后误差极大,有的却几乎不损失精度。
这就好比一群等重的行李箱,理论上放进同一辆车的后备箱里都应该没问题。但实际装车时你会发现,同样是50公斤的箱子,摆放方式不对就会卡住盖不上盖子,摆对了位置却严丝合缝。行李的总重量(模型的输出结果)没变,但摆放方式(参数的具体数值组合)却决定了压缩打包(量化)之后还能不能顺利关上盖子。如果不做这个平移的筛选,你等于是随机选了一个摆放方式,运气好坏全凭天意。
于是研究者们的思路就变得很自然了:既然有这么多等价的写法,那我们干嘛不去找一个"最适合被压缩"的写法呢?
这就是论文提出的核心方法,softmax重参数化。
方法拆解:只有一个自由变量的搜索,却能带来巨大改善
具体怎么做呢?
论文先定义了一个叫做"词表行均值"的东西,也就是把输出头里所有词对应的向量取个平均。然后构造一个新的输出头:原来的权重,减去这个均值向量乘以一个系数t。
这个系数t就是整个方法里唯一需要调的自由变量。当t等于0,就是原始的输出头,没有任何改动。当t等于1,恰好对应一种常见的做法,叫均值居中,也就是把每一行都减去整体的均值。
均值居中:一种预处理技巧,把数据的每个维度减去其平均值,使数据以零为中心分布,常用于稳定训练或改善数值特性
这个均值居中的做法其实不是这篇论文首创的,之前在注意力机制和模型预训练里都有人用过类似的思路。但论文提出了一个关键问题:为什么一定要用t=1这个固定值?
论文用数学证明了一件挺有意思的事情:t=1这个选择,其实是让权重矩阵的整体数值范数(也就是所有数字平方和的开方)达到最小。听起来很合理对吧,数值越小,量化误差应该越小。但论文接着用实验戳破了这个直觉。
他们在Phi-4-mini这个模型上做了实验,用验证数据去搜索不同的t值,从负2到正8,一共14个候选点,看哪个点量化后跟原始模型的预测差距(用KL散度衡量)最小。
KL散度:一种衡量两个概率分布之间差异程度的指标,数值越小说明两个分布越接近,为零时表示两个分布完全相同
结果发现,最优的t值居然是4,而不是理论上"权重范数最小"的1。用t=4之后,量化后的模型跟原始模型的预测差距,比用固定均值居中(t=1)还要再低57%。
这个结果乍看有点反常识:明明t=1让权重数值本身更小更"紧凑",为什么效果反而不如权重数值更大的t=4?
论文后面给出了解释,但这里先按下不表,我们先看这个方法在实际测试中表现如何。
七个模型的测试结果:哪里"病得最重",哪里改善最大
论文选了七个不同的语言模型头做测试,包括Phi、Gemma第三代和第四代、Qwen3.5,还有三个词表特别大的模型BLOOM、BLOOMZ和XGLM。
测试用了三种不同的基础量化方法:一种是最简单粗暴的四舍五入取整(RTN),一种是加权重要性的均方误差优化(AW-MSE),还有一种是相对复杂精细的全黑塞矩阵优化(GPTQ)。
RTN:全称Round-To-Nearest,最简单的量化方式,直接把数值四舍五入到最近的可表示精度上,不做额外优化
GPTQ:一种基于二阶信息(黑塞矩阵)的量化算法,通过逐层补偿量化误差来提升精度,是目前效果较好的后训练量化方法之一
结果显示出一个很有规律的现象:那些本来量化后损失就不大的模型(比如Gemma和Qwen3.5),用了这个方法后改善很有限,因为它们本来就没什么"病"可治。但那些本来量化损失就特别严重的模型,改善幅度非常惊人。
以Phi-4-mini为例,在W4(4比特量化)条件下,用AW-MSE量化方式时,KL散度从0.936直接降到0.256,相当于挽回了73%的精度损失。XGLM模型用最简单的RTN方式量化时,KL散度从2.13骤降到0.143,挽回了93%的损失。BLOOM和BLOOMZ的改善幅度也在76%到77%之间。
这个规律其实很好理解。就像给一个健康的人吃药,效果不会太明显,但给一个病情严重的人对症下药,改善就会立竿见影。这个方法本质上是在"帮量化误差找一个更不容易出错的落脚点",如果原来的落脚点本来就挺好,那自然没什么可优化的空间;但如果原来的落脚点特别糟糕,那优化空间就很大。
更值得说的是,这个方法在更严苛的压缩条件下(W2,也就是2比特量化,论文里称之为"压缩压力测试")表现得更加普适。在这种极端压缩下,几乎所有模型都出现了严重的精度损失,而这时候重参数化方法在几乎所有模型和量化方式的组合上都带来了改善。
而且论文没有止步于普通的四舍五入量化,他们还测试了这个方法能不能跟更高级的量化技术叠加使用。结果是可以的:在使用更强的GPTQ校准数据(把校准样本从1024个增加到65536个)之后,Phi模型原始的KL散度已经从0.160降到了0.089,但用重参数化方法进一步优化后,还能再降到0.035,又挽回了61%的误差。
这说明这个方法不是跟其他量化技术"抢功劳"的对手,而是能跟它们叠加使用的补充手段。
意料之外的机制:重建误差变大了,为什么预测反而更准了?
这里要说到这篇论文最反直觉,也是我觉得最有意思的一个发现。
一般人的直觉是,量化误差越小,模型效果应该越好。但论文用一系列细致的实验证明了一件违反直觉的事情:经过筛选的重参数化头,它的原始重建误差(也就是量化后权重跟真实权重之间的数值差距)反而变大了,但预测结果却变得更准了。
具体数据是这样的:在Phi模型上,从t=0变到t=4,原始的逻辑值误差能量(可以理解成量化造成的"原始损伤"总量)增加了2.7到3倍。但衡量这个误差对最终预测分布实际影响的另一个指标,也就是所谓的"Fisher加权误差",却下降了72%到73%。
Fisher加权误差:一种衡量参数扰动对模型输出概率分布实际影响程度的指标,它不只看数值误差的大小,还结合了每个输出位置的重要性权重进行加权
这听起来是不是有点矛盾?误差变大了,但影响变小了?
论文给出的解释很精妙。误差并不是均匀分布在词表的每一个位置上的。有些词,模型原本给的预测概率就极低(比如低于百万分之一),这些词就算误差再大,对最终的softmax结果影响也微乎其微,因为它们本来就不太可能被选中。而有些词,模型给出的预测概率很高,这些词哪怕只有很小的误差,也会显著改变最终的输出分布。
重参数化做的事情,其实是把误差从那些"高概率、举足轻重"的词身上,转移到了那些"低概率、无关紧要"的词身上。
这个机制打个比方就很清楚了。假设你是个仓库管理员,货架上有一万件商品,其中一万件里只有十件是当天的爆款,剩下的九千九百九十件几乎没人问津。如果你手一抖,把某个冷门商品的价签贴错了,几乎不会影响销售额,因为反正没人来买它。但如果你把爆款商品的价签贴错了,哪怕只是贴错了一件,销售额也会剧烈波动。重参数化做的事情,就是主动地把可能出错的标签,优先安排在那些冷门商品身上,让真正重要的爆款商品的价签尽量准确无误。如果不做这种筛选,误差就是随机分布的,那些冷门商品和爆款商品被贴错标签的概率是一样的,这显然更危险。
论文用具体数据佐证了这个解释:在AW-MSE量化方式下,那些预测概率低于百万分之一的词,承担的"误差份额"从原来的92.4%上升到了98.2%,这些词加起来只占整体预测概率的0.20%,几乎无关紧要。与此同时,那些预测概率高于1%的词(这些词加起来占了84.8%的概率质量,是真正重要的部分),它们承担的绝对误差反而下降了一半以上。
这个"误差搬家"的现象,在更强的GPTQ校准下依然成立,说明这不是某种量化方法的巧合,而是一个更普遍的规律。
跨领域的验证:这套方法经得住"换个考场"的考验吗
一个方法在自己的验证集上表现好,不代表它真的有用。真正的考验是能不能推广到没见过的数据和场景。
论文在这方面做了大量细致的工作。首先他们在完全没接触过的26篇文章上重新测试了一遍,结果Phi模型的AW-MSE量化误差降低了73.6%,跟之前的测试结果几乎一致,说明这个改善不是"调参调出来的巧合"。
然后他们做了个更有说服力的实验:把在英文WikiText数据集上选出来的系数,原封不动地搬到另外两个完全不同的数据集上(C4和OpenWebMath),不做任何重新调整。结果在18个"系数不等于1"的对比里,这个固定系数全部跑赢了简单的均值居中方法;剩下6个系数恰好等于1的情况下,两者打平。
这就好比你在A考场刷出来的应试技巧,直接原封不动地搬到B考场和C考场去用,结果发现照样管用,甚至比"标准答案"(均值居中)还好用。这说明这个系数选择捕捉到的不是某个数据集的偶然特性,而是模型本身某种更本质的结构问题。
更有意思的是,论文还测试了这个方法在多语言场景下的表现。他们把英文数据上选出来的系数,直接搬到阿拉伯语、印地语、中文等六种语言的翻译测试集上,结果发现在XGLM模型上,18组"语言乘量化方式"的组合全部改善了;但在BLOOM模型上,却在阿拉伯语和印地语上出现了轻微的效果反弹。这说明跨语言的迁移能力,跟具体模型本身的特性也有关系,不能一概而论。
这种诚实地报告"哪里成功、哪里也有局限"的态度,其实挺难得的。很多论文只会挑最漂亮的结果展示,但这篇论文连自己方法在某些语言上"翻车"的数据都摆了出来。
真机部署:省下的不只是存储,还有实打实的速度
前面说的都是理论测试和精度指标,但对于真正要上线跑的系统来说,光是精度好看没用,还得看实际部署时能不能带来性能提升。
论文团队用了Phi-4-mini这个模型,在真实的推理框架vLLM上做了完整的部署测试,使用了专门为4比特量化优化的Marlin计算内核。
Marlin:一种专门为混合精度自回归并行推理优化的计算内核,能高效执行低比特量化后的矩阵运算,充分发挥硬件性能
结果显示,把输出头量化到4比特之后,配合重参数化技术,在单批次(batch-one)生成场景下,延迟相比全精度BF16基线降低了10.8%;在16批次并行生成场景下,延迟降低了9.4%。
这个数字为什么值得关注?因为它说明重参数化这个技巧,不是那种"只在实验室里好看,一到实际部署就掉链子"的花架子。它选出来的那个更优的权重表达方式,可以直接折叠进已经打包压缩好的权重里,不需要在推理时额外增加任何计算步骤。对于绝大多数模型(那些softmax前没有做特殊非线性变换的模型),这个优化几乎是"免费"的,纯粹的精度提升,没有速度代价。
不过这里有个例外情况需要说一下。像Gemma这类模型,在算softmax之前会做一个叫做"软上限"的非线性变换(tanh soft-capping)来防止数值爆炸,这种情况下前面提到的"整体平移不改变结果"的数学性质就不再严格成立了。
软上限:一种通过tanh函数把原始分数压缩到某个固定范围内的技术,用来防止极端数值导致的不稳定,常见于部分大模型的输出层设计
对付这种情况,论文设计了一个叫"秩一修正"的补丁方案,本质上是先把被减掉的那部分均值信息暂存起来,等做完非线性变换之前再加回去,这样保证了即使有非线性变换的存在,最终结果依然和原始模型完全一致。这个补丁的额外计算开销极小,用一个向量点积就能搞定,相比于原本输出投影需要的海量乘加运算,几乎可以忽略不计。
从"够用就好"到"精心挑选":这背后是什么样的思路转变
读到这里,你可能会觉得这篇论文做的事情说起来简单,无非就是"多试几个平移系数,挑个最好的"。但我觉得它真正有价值的地方,在于揭示了一个容易被忽视的认知误区。
我们通常默认,一个训练好的模型,它的权重就是"唯一确定"的答案,量化只是在给这个唯一答案打折扣,打折打得越少越好。但这篇论文提醒我们,很多时候模型的"表达方式"本身就存在冗余的自由度,同一个功能可以有无数种数学上等价的写法。这些写法在全精度下毫无区别,但一旦引入量化这种"有损压缩"的操作,它们的表现就会分道扬镳。
这个道理其实在很多工程领域都适用。同一份代码逻辑,可以用不同的变量组织方式来实现,功能完全一样,但在某些极端场景下(比如内存受限、并发访问)表现可能天差地别。真正厉害的工程师,不只是把功能写对,还会去思考在特定的资源约束下,哪种等价的实现方式最"抗造"。
论文的作者们显然也意识到了这一点,所以他们在方法设计上刻意保持了极简:只用一个标量系数去搜索,而不是搞一个复杂的、需要重新训练的方案。这种"用最小的改动撬动最大的收益"的思路,其实体现了一种很朴素的工程智慧,复杂的问题不一定需要复杂的解法,有时候恰恰是找准了那个被忽略的自由度,简单的搜索就能带来意想不到的效果。
论文最后还探索了一个更进阶的版本,把这个单一的系数扩展成按量化分组分别设置系数,相当于把"一刀切"的平移升级成"精细调控"。在九个模型的测试中,这种分组搜索在RTN和AW-MSE量化方式上进一步降低了3%到22%的误差,不过在更复杂的GPTQ方法上效果参喜半参。这也提醒我们,任何优化方法都有它的适用边界,不是所有场景都能无脑套用更复杂的版本。
写在后面
读完这篇论文,我印象最深的其实不是那些具体的百分比数字,而是那种"误差搬家"的思路。
我们通常想当然地认为,减少误差的方法就是让误差的绝对值变得更小。但这篇论文里的实验反复证明了一件事:有时候,让误差变大,反而能让结果变得更好,前提是你知道把这些误差"搬"到哪里去。这跟我们做很多资源分配决策时的道理是相通的:总量不是唯一重要的指标,分布方式往往才是关键。
还有一点让我觉得挺有意思的是,论文里那个关于"权重范数最小"和"预测误差最小"并不是同一件事的发现。我们很容易把"数值更小、更整洁"和"效果更好"划等号,但这两者之间其实并没有必然的因果关系。这提醒我,在评估任何优化方案时,都得盯紧真正关心的那个指标去衡量,而不是找一个看起来相关、实际上未必对齐的代理指标。
这篇论文没有解决的问题也很明显:它给出的搜索范围目前局限在"均值方向"这一条一维直线上,作者自己也承认,这条路径未必包含理论上最优的那个点。如果把搜索空间打开到更高维度,会不会有更好的表达方式等着被发现?这个问题留给了后来者。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.