炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会!
(来源:科技行者)
你有没有想过,为什么和ChatGPT聊天的时候,文字是一个字一个字往外蹦的?
不是网络卡,是模型本来就这么工作的。它每算一次,只能预测下一个字是什么,算完再算下一个,像一个打字员盯着屏幕,敲一个键看一眼,再敲下一个。这种工作方式有个名字,叫自回归生成。
自回归生成:模型根据已经生成的内容,一步一步预测下一个词或字符,前面生成的结果会影响后面的预测。
问题是,现在有一类模型不是按“词”生成的,而是按“字节”生成的。字节比词更小,一个英文单词可能拆成好几个字节,一个中文字可能对应两三个字节。这意味着同样一句话,字节级模型要多算好几倍的步数才能说完一句话。这就好比你原来用汉字写日记,现在被要求把每个字都拆成拼音字母写,写完同样一段话,笔画次数直接翻了几倍。
字节级语言模型:直接在原始字节(而不是预先切分好的词汇)上进行训练和生成的语言模型,不依赖固定词表,理论上能处理任何语言、任何文本,不会因为遇到生僻词或者小语种而卡壳。
这篇论文要解决的,正是字节级模型“慢”这个老毛病。而且它给出的方案挺巧妙,不增加任何额外参数,就让模型一次能吐出好几个字节,速度明显提升,效果几乎不掉。
字节模型的两难:省事还是省时
先说说字节级模型为什么值得费这么大劲去搞。
subword分词(比如BPE)是现在主流大模型的标配做法,把常见的词块打包成一个个“子词”token,这样一句话不用拆得太碎,处理起来快。但这个方法有个死穴:词表是提前定好的。遇到词表里没见过的词,或者小语种、专业术语、拼写变体,模型就得东拼西凑地硬拆,拆得七零八落,理解效果自然打折。
subword分词:把单词切分成更小的、常见的子词单元(比如“unhappiness”拆成“un”“happi”“ness”),用固定词表覆盖尽可能多的语言现象。
字节级模型直接绕开了这个问题,不管什么语言什么符号,都能表示成字节序列,不存在“词表里没有”的情况。但代价就是序列变长了,处理起来更慢。
于是研究者们想出了“分层模型”这个思路:先把一长串字节压缩成短一点的“潜在token”(可以理解成模型自己学出来的分词方式),让核心的语言模型只处理压缩后的短序列,处理完再解压回字节。这样至少省了中间那一层深度计算的开销。
但这里有个容易被忽略的事实:压缩只是加快了“理解”这一步,生成的时候,模型还是得一个字节一个字节往外蹦。压缩帮你更快看懂了一本书,但让你把这本书重新抄写出来,还是得一个字一个字抄。
这就是本文作者盯上的空子:既然模型已经学会了把字节分成一段一段的“潜在token”,为什么不能利用这个分段结构,一次性把一整段里的字节全都预测出来?
多字节预测:不是新想法,但这次做对了
其实“一次预测多个”这个思路不是新的。学术圈管这个叫多token预测(MTP)。
多token预测(MTP):让模型在一次计算里同时预测未来好几个token,而不是只预测下一个,目的是加快生成速度,顺带还能提升模型学习效率。
MTP的常规做法是给模型加装n个预测头,每个头专门负责预测未来第几个token。比如你要一次预测3个词,就装3个头,一个管第1个词,一个管第2个词,一个管第3个词。这个思路的代表作品叫Medusa,还有Meta提出的经典MTP方法。
但这个设计有两个明显的毛病。
第一个毛病是参数会跟着预测数量往上涨。你想一次预测5个词,就得装5个头;想预测10个,就得装10个头。每个头都是一堆额外的神经网络层,数量越多,模型越臃肿,占用的内存也越多。
第二个毛病更隐蔽,但影响更大:这些预测头是各自为战的。它们都盯着同一份“上文信息”,却互相看不见对方在想什么,谁都不知道另一个头准备写什么词。这就好比五个人被要求根据同一段提纲分别写一句话拼成一段话,但五个人之间不能商量,各写各的。写出来的东西读起来接不上,前言不搭后语的概率很高。
如果不解决这个"互相看不见"的问题会怎样?句子会读起来生硬、不连贯,即使每个词单独看都说得通,拼在一起却经常是错的。这正是MTP方法长期以来的软肋:预测得快,但预测得不准。
LCA的关键设计:让预测跟着"自然分段"走
论文提出的方法叫LCA,全称是潜在因果注意力(Latent Causal Attention)。它的核心思路很直接:既然分层模型已经把字节自动分成了一段一段的“潜在token”,那就用这个天然的分段结构,来决定一次预测多少个字节,而不是死板地规定“每次固定预测3个”或“固定预测5个”。
潜在token(latent token):分层模型把原始字节流按照学出来的规律切分成的一段段更长的单元,一个潜在token里可能包含2个字节,也可能包含7个字节,长度是模型自己学出来的,不是人为设定的。
举个例子,英文句子里“ice”这三个字母,模型可能学会把它们当成一个整体来处理,因为“ic”后面接“e”几乎是可预测的模式。而遇到一个生僻的专有名词,模型可能会把它拆得更细,一个字节一个字节走。这种“该合并时合并,该细分时细分”的弹性,正是分层模型的价值所在。
LCA做的事情就是:把这种弹性直接搬到生成速度上。遇到模型认为“很确定接下来是什么”的一整段,就一次性把这一段全部吐出来;遇到不确定的部分,就老老实实一个字节一个字节生成。
这跟固定预测n个词的方法完全不同。固定方法就像是不管这道题难不难,你都必须一次答满5道小题;而LCA更像是根据题目的难度自动调整答题节奏,简单的题一口气秒杀好几道,难的题就慢慢琢磨。
要实现这个想法,论文设计了一个专门的注意力遮罩,叫LCA遮罩。
注意力遮罩(attention mask):在Transformer模型里控制“每个位置能看到哪些其他位置的信息”的一种机制,遮罩规定了信息流动的方向和范围,防止模型看到不该看到的“未来”信息,从而保持生成过程的因果性(不能偷看答案)。
具体来说,LCA遮罩允许一个字节看到它自己所在这一段里更早的字节,以及紧挨着的前一段的全部字节,但不能看后面的段,也不能偷看同一段里排在它后面的字节的“正确答案”。这个规则听起来绕,但道理其实很朴素:预测这一段的每个字节时,只能依赖“已经确定发生”的信息(前一段),不能依赖“正在同时被猜测”的信息(本段后面的字节)。
这里有一个精妙的地方值得说清楚:同一段内部的字节之间明明互相看得见,为什么不算“偷看答案”?原因在于,同一段里的这些位置在被喂入模型之前,输入的都是“上一段的重复拷贝加一点残差信息”,并不包含这一段自己应该生成的内容。相当于五个人虽然坐在一起写字,但他们手里拿到的参考资料完全一样,都是上一段的信息,谁也没有偷看到别人正在写的答案,只是他们可以互相商量怎么把这份共同的参考资料用好。这就巧妙地解决了前面提到的“各自为战互不商量”的问题,又没有破坏“不能看到未来”这条铁律。
推理时怎么跑:一套接受或拒绝的规则
光有预测能力还不够,生成的字节到底采不采纳,得有个判断标准。
论文里用了一个简单直接的策略:置信度阈值判断。模型对每个猜测出来的字节都会给出一个概率值,代表它有多确信这个猜测是对的。设定一个阈值τ,只有概率超过这个阈值的字节才被采纳。而且判断是从左到右依次进行的,一旦某个位置的置信度不够,那个位置和它后面所有猜测的字节都直接扔掉,不能跳着接受。
这个规则背后的逻辑也很生活化。想象你在批改一份连续答题卡,每道题都是根据前一道题的答案往下推导的。如果第3题就错了,那从第3题开始往后的所有答案都不可信了,哪怕第5题碰巧蒙对了,你也不敢用,因为它是建立在第3题错误答案的基础上算出来的。
论文还测试了另一种更严格的校验方式,叫推测解码验证。
推测解码(speculative decoding):先用一个较快的模型(或模型的一部分)“猜”出一批候选结果,再用另一个更权威的模型或模块去逐一核实这些猜测是否正确,只保留核实通过的部分。这个思路最早由Leviathan等人在2023年提出,常用来给大模型生成提速。
用推测解码验证的好处是,它能保证最终生成的内容和“正常一步步生成”完全一致,质量上不会有任何损失,纯粹是在抢时间。论文的实验显示,用这种方式验证,即使把候选字节数量n从3提高到7甚至8,性能完全不受影响,速度却能提升29%到37%。这相当于是一个“免费的加速旋钮”:你转得越大,跑得越快,而且不会跑偏。
效果到底怎么样:数据说话
论文在四个下游任务上做了系统对比:指令遵循(IFEval)、问答(CoQA)、摘要(CNN/DailyMail)、机器翻译(西班牙语和法语对英语)。
结果显示,LCA-MBP在四个任务里的三个上都落在了帕累托最优边界上。
帕累托最优(Pareto-optimal):在多个目标(比如速度和准确率)之间做权衡时,如果找不到一个方案能在不牺牲任何一个目标的前提下,让另一个目标变得更好,这个方案就处于帕累托最优状态,通俗讲就是“性价比最高的那一批选择”。
具体来说,在指令遵循、问答、摘要这三个任务上,LCA-MBP在保持接近顶尖水平的生成质量的同时,吞吐速度达到甚至超过了其他方法。只有在西班牙语翻译任务上,普通的分层模型(FxT)成绩稍高一点,但代价是速度慢很多,LCA-MBP用了一点点分数换来了明显的速度提升。
有意思的是,这个模型压根没在训练数据里见过专门的翻译语料(训练用的是英文教育类文本FineWeb-edu),微调之后依然能在翻译任务上保持不错的表现,说明这种“按段生成”的结构本身具有一定的迁移能力,不完全依赖特定语言的训练数据。
论文里还做了一个对比实验,拿LCA和另一种常见的多字节预测方法(用多个独立MLP头,类似前面提到的Medusa思路)比较接受率。
结果出乎意料:MLP方法的接受率反而更高(在多个任务上普遍超过58%),而LCA的接受率明显更低(普遍在46%-52%左右)。但奇怪的是,接受率更高的MLP方法,最终的任务表现却更差。
这个反差恰好印证了前面说的“互相看不见”的问题。MLP的多个头各自为战,互相不商量,导致它们经常“自信满满地一起犯错”,接受率高不代表猜得对,只代表猜得“坚决”。LCA因为让预测互相参考上下文,预测得更谨慎、更保守,但一旦通过校验,质量往往更靠得住。这就像一个团队里,自信心爆棚但从不核实信息的成员反而更容易把错误信息传播出去,而一个谨慎、愿意反复确认的成员,说出来的话虽然少,但错误率更低。
论文还测试了把候选字节数量n拉高会发生什么。使用置信度阈值判断的时候,不同任务有不同的“甜点”:翻译任务在n=7时效果最好,摘要任务在n=6时效果最好,超过这个点之后,性能开始下滑,因为模型被要求预测的范围超出了它训练时见过的分段长度。而用推测解码验证的时候,前面提到过,性能完全不受n影响,只有速度在往上涨。
最后论文还做了一个特别实用的延伸实验:能不能让LCA给别的模型“打辅助”?
具体做法是,用LCA模型生成候选字节,再用一个独立训练的FxT模型(前面提到的普通分层模型)去校验这些候选是否正确。结果显示,这种组合下生成的内容质量和FxT模型自己独立生成时完全一致,但速度提升了1.4到1.7倍。
这个结果有点意思,因为传统的推测解码加速通常靠一个“小模型”打草稿、“大模型”把关,速度提升的原因是草稿模型算得快。但这里两个模型体量是一样的,速度提升纯粹来自“一次预测一整段”这个结构性优势,而不是靠模型变小。这说明LCA这套机制可以作为一个通用的加速插件,配上任何已有的分层字节模型都能生效,不需要重新训练那个被加速的模型。
表格里的关键数字
| 方法 | IFEval | CoQA | DailySum | es-en |
| MLP-MBP 接受率 | 61.91 | 63.45 | 58.08 | 62.67 |
| LCA-MBP 接受率 | 45.95 | 46.62 | 48.89 | **51.68** |
(注:接受率更低但整体任务表现更优,论文强调了这一反直觉现象)
在速度对比实验中,用FxT验证LCA草稿的方式,在摘要任务上实现了**1.74倍**加速且质量不打折,在西班牙语翻译任务上实现了**1.56倍**加速,法语翻译任务上实现了**1.42倍**加速。
这篇论文站在什么位置上
字节级模型这条路,最早可以追溯到ByT5(Xue等人,2022年),它证明了直接在字节上训练也能得到还不错的语言模型,但代价是序列长、计算慢。后来SpaceByte和BLT(Byte Latent Transformer,Pagnoni等人,2025年)尝试用启发式规则做压缩,把长序列切短。再往后,FlexiTokens(Owodunni等人,2025年)和HNet(Hwang等人,2025年)进一步把这种切分规则变成可学习的,让模型自己决定该在哪里分段,这也正是本文架构的直接基础。
而在加速生成这条线上,Medusa(Cai等人,2024年)和Meta的多token预测工作(Gloeckle等人,2024年)打开了“一次预测多个”的思路,但都受限于固定预测头的设计。本文的贡献正是把这两条线拧到了一起:借助分层模型已经学会的动态分段能力,给多字节预测找到了一个天然的、可变长度的“预测单位”,不需要额外堆参数。
论文里也提到一个几乎同期的工作,叫FastBLT(Kallini等人,2026年),走的是完全不同的路子,用扩散模型的思路来加速字节级推理,边界预测器是独立训练的,不像本文这样跟语言模型联合优化。这说明这个方向正在被多个团队同时攻克,大家用的武器不一样,但要打的敌人是同一个:字节级模型生成太慢。
写在后面
读完这篇论文,最触动我的其实不是速度提升的数字,而是那个“接受率更低却表现更好”的反常结果。
我们通常会下意识地觉得,模型越自信、越果断地接受自己的猜测,说明它越靠得住。但这篇论文用实打实的数据打了这个直觉一个耳光:一个谦虚、依赖上下文互相校验的机制,哪怕猜得慢一点、保守一点,最终交出来的东西反而更靠谱。这跟人类团队协作里那句老话很像,一个人自信满满地单干,不一定比几个人互相核对来得可靠。
另一个值得琢磨的地方是,LCA的加速效果来自于“借用已经存在的结构”,而不是造一个全新的东西。分层模型本来就要做分段这件事情用来压缩序列,论文只是说,这个分段信息其实还能拿来做另一件事,顺手就把生成速度问题也解决了。这种“一份资源,两次利用”的思路,在工程设计里其实挺少见,也挺值得琢磨的:很多时候我们遇到新问题,第一反应是加新模块,而不是回头看看手头已有的东西还能不能多干点活。
这篇论文没有解决的问题也挺明显:所有实验都是在3.73亿参数规模上做的,更大规模的模型上这套机制是否依然管用,论文自己也说了,这需要更多算力去验证。而且目前的测试语言集中在英语相关任务上,小语种和形态复杂的语言上表现如何,还是个悬念。
Q&A
Q1:多字节预测(MBP)和多token预测(MTP)有什么区别?
A:MTP是给字级或词级模型用固定数量的独立预测头,一次预测固定数量的未来token,预测头数量随预测数量线性增加。MBP针对字节级模型,不需要额外的预测头,而是借助模型学出来的动态分段结构,一次预测一整段长度可变的字节,段落长短由模型自己决定,不是人为固定的。
Q2:LCA-MBP为什么接受率更低,但下游任务表现反而更好?
A:LCA让预测这一段字节时能互相参考上下文(同一段内的位置可以互相看到,基于前一段的共同信息),预测出来的内容更连贯、更谨慎。而对比的MLP方法里,多个预测头各自独立工作,互不商量,容易“一起自信地犯错”,接受率高但实际错误更多,最终整体质量反而不如LCA。
Q3:LCA能不能用来加速别的已有模型,而不只是自己训练的模型?
A:可以。论文做了实验,用LCA生成候选字节,再交给一个独立训练的FxT模型去校验,结果显示生成质量和FxT自己独立生成完全一致,但速度提升了1.4到1.7倍。这说明LCA可以当作一个通用加速插件,配合其他分层字节模型使用,不需要重新训练被加速的那个模型。