NVIDIA推ELR训练法:循环模型单次推理不再输给普通模型
你有没有遇到过这样的纠结:买手机的时候,到底该买性能强但贵的旗舰版,还是买够用就好的标准版?大模型的世界里,也有一个一模一样的纠结。你要么部署一个小模型,响应快但笨一点;要么部署一个大模型,聪明但慢且贵。鱼和熊掌,好像天生不可兼得。但有一类模型一直想打破这个魔咒,它们叫循环语言模型,思路是:别造两个...
挑手机时,性能强但价格高的旗舰版,和够用就好的标准版,你会选哪个?
大模型领域也藏着同样的两难。小模型响应快,脑子却不够灵;大模型聪明,可又慢又烧钱。两头都想占,似乎很难。
循环语言模型就是想破这个局的一类模型。它的思路不是造两个模型,而是造一个会反复琢磨的模型:简单问题想一遍就答,难题就多想几遍。同一个模型,脑子转的圈数不一样,输出质量也不一样。
想法听着不错。不过
NVIDIA的这篇论文开篇就点破了一个大家心照不宣的尴尬:这类模型如果只思考一轮,表现通常很差,明显比不过同样大小、只有一层结构的普通模型。
Huginn模型就是个例子。它设计成平均循环32次才能发挥实力,可要是只让它转一圈,在ARC-Easy测试上它只拿到34.9分,结构相近的普通模型能拿46.4分,相差11.5分。这还是在烧掉800亿级别token训练之后的结果。另一个模型Parcae也差不多,循环一次时成绩不如普通模型,循环八次才反超。
研究者给这个现象起了个挺形象的名字,叫单循环税(one-loop tax)。意思是,只要用循环模型,哪怕你此刻只想让它转一圈省点算力,也得先交一笔智商税。那还不如直接用一个专门训练好的、不循环的普通模型,更划算。
论文要解决的核心问题就在这儿:能不能造一个循环模型,让它循环一次时和普通模型打平,循环次数越多就越聪明,不用交那笔税?
答案是能。论文给出的方案叫Elastic Latent Recurrence,简称ELR,是一种弹性潜在循环的训练配方。
循环一次为什么这么差
要弄懂ELR怎么解决问题,得先看清循环模型的先天缺陷出在哪。
传统循环语言模型把网络分成三部分:输入块、循环块、输出块。
输入块:把原始文字转成模型能处理的内部表示,相当于预处理。
循环块:模型的核心部分,会被反复执行多次,每次输出都会影响下一次的计算。
输出块:把循环后的结果转成最终的文字输出。
循环块每多转一圈,就等于给模型多加了一层虚拟的深度。打个比方,循环块本身有24层,转两圈就相当于凭空多出24层楼,模型变得更深,理论上应该更聪明。
问题出在循环块内部怎么更新状态。多数现有模型的做法很粗暴:每循环一次,就用新算出来的结果把旧状态整个替换掉。好比每次重新审视一份方案时,不是在原方案上修修补补,而是把整份方案扔了重写一遍。
如果只循环一次,这种推倒重来式的更新方式还没来得及显出优势,模型的参数和行为模式就已经被这种训练方式带偏了。结果它在循环一次时的表现,远不如那些从一开始就按只跑一次设计的普通模型。
ELR的三个关键设计
ELR找到了三个具体的改动点,把单循环税的问题解决了。
第一招:带刹车的状态更新
ELR不再粗暴地推倒重来,而是设计了一种叫自适应增量更新(adaptive-delta update)的机制。
简单说,每次循环产生一个新的候选状态后,模型不会直接采用,而是学出一个步长,决定往新状态挪动多远。这个步长是逐词、逐通道单独学出来的,所以模型能对不同的信息采取不同的谨慎程度,有些地方大步迈进,有些地方小心翼翼。
就像改一篇文章,不是把全文删了重写,而是读到某句觉得别扭的地方,斟酌着改几个词,改多改少取决于这句话到底有多大问题。如果不这样做,而是像很多模型那样每次都整体重写,那么第一次重写产生的版本,可能比原本没动过的稿子还差。因为修改机制根本没机会学会该改多少,它只学会了全部推翻。
实验显示,在循环一次的情况下,能追平普通模型的更新规则只有这一种,也就是带刹车、能控制步长的更新方式;放到各个循环次数上看,它的表现也都是最优的。
第二招,训练期间把不同的循环次数混在一起算。
接下来要说的是训练策略,这也是第二个关键问题。
训练循环模型时,如果每一步都随机挑一个循环次数——这步用2次、下步用5次——看上去模型把各种循环深度都见过了。可论文发现,这么做仍然保证不了模型在循环一次时够好,就算你把循环一次出现的概率提到三分之一也不行。
论文的办法叫混合深度训练中的单循环排名覆盖(one-loop rank overrides)。
训练会动用很多台机器并行算,论文里管这些机器叫数据并行的“ranks”。ELR干的事是:强制固定比例的那部分机器,在每一步训练里始终只循环一次,别的机器这步选了几次它不管。这样一来,循环一次的梯度和循环多次的梯度就进了同一次参数更新,一起被平均、一起起作用。
这个设计的巧妙之处在于:它把“学会循环一次该怎么表现”和“学会循环多次该怎么表现”这两件事,从分开发生在不同训练步骤里,改成被强制绑进同一次参数更新中共同优化。
可以拿一个班级准备期末考试来打比方,考试分两种难度。老师如果每次只布置一种难度的作业,今天全班做简单题、明天全班做难题,那学生做简单题的手感和做难题的手感会各自独立长进,彼此很难互相带动。反过来,老师每次布置作业都让一部分学生做简单题、一部分做难题,两边的答案一起批、一起讲,学生就能在同一轮反馈里同时把“简单题该怎么答才对”和“难题多花点力气该怎么答才对”这两套标准锚定下来,不至于顾此失彼。
从实验数据能看得很清楚:若没有这层覆盖机制,每循环一次带来的损失会比普通基准模型多出0.0225;而把固定15%的机器设为只跑一次循环(这样循环一次出现的概率约为三分之一)后,循环一次的成绩才终于超过基准模型。
第三招,是告诉模型“你现在转到第几圈了,总共要转几圈”。
第三个改进,是给每一次循环加上明确的“身份标识”,论文把它叫作循环条件调制(loop-conditioned modulation)。
没有这个设计时,循环块在每一次循环里跑的是完全相同的函数,模型根本不知道自己正处在第几次循环,也不知道这次任务总共要循环几回。论文的做法是把“当前是第几圈”和“总共打算循环几圈”这两条信息编码成一个向量,注入每一层的计算,让每一次循环的行为能据此做微调。
好比一个厨师炒菜,要是完全不知道客人点的是快餐还是精致料理,他每道工序都只能照同一套标准流程走,没法按场合调火候、调用料精细度。可要是厨师事先知道“这是第几道工序、总共要做几道工序才能上桌”,他就能在不同阶段换策略:第一步下重料打底,后面几步精细调味收尾,整体效果会比一套流程走到底好得多。
这个设计还有个巧妙的地方在初始化:所有负责调制的参数一开始全设成零。也就是说,刚接上这套机制的那一刻,模型的行为和没加它之前一模一样,数学上可以严格证明,初始状态下模型的输出分毫不差地等同于原来那个循环一次的模型。之后随着训练推进,这些参数才慢慢学会往更合适的方向偏。
这个“零初始化”的思路,和另一个关键的省钱技巧是连在一起的。
延后开练,能省下大半训练成本。
循环模型有个明摆着的代价:每次训练都要循环好几遍,训练时的计算量自然也跟着翻倍。
论文算了笔账:从头到尾都用混合深度训练,总训练计算量大约是普通模型的1.79倍。这笔账不便宜。
于是论文想出个办法:前四分之三的训练时间老老实实只循环一次,等训练快结束的最后四分之一才切到混合深度模式,而且就在这个切换节点上,把前面说的循环条件调制接进来,初始权重全部为零。
这就像你想培养一个既能快速处理简单任务、又能深度钻研复杂问题的员工。与其让他从入职第一天就同时兼顾两种工作模式、搞得手忙脚乱,不如先让他踏踏实实把基本功练扎实,等基本功稳了,再引入“有时候需要你多想几层”的新要求,而且一开始这个新要求的权重设成零,等于告诉他“新规矩刚上线,先别改你已经养成的习惯,等你慢慢适应了再说”。不分阶段、一上来就塞给他两套要求,很可能两头都学不扎实。
效果怎么样?以4B参数规模的模型为例,这种“延后混合”的训练方式估计只比普通训练多花16%的计算量,而不是62%。更让人意外的是,这样延后训练出来的模型,最终表现甚至比从头到尾混合训练的模型还好。
专家路由的复用,省去了重复判断的功夫。
大模型一旦采用混合专家结构(MoE),情况是这样。混合专家模型*:它并非每次计算都调动全部参数,而是靠一个“路由器”判断每个词该分给哪几个“专家”子网络去处理,于是模型容量能在计算量增加不多的情况下大幅扩充
循环模型还多一笔开销:每循环一次,路由器都得重新给每个词判断一次该交给哪些专家。论文发现,循环第一次和第四次之间,整体上专家被选中的频率几乎没变(相似度高达0.978),但落到每一个词上,它在第四次循环时保留第一次所选专家的比例只有53%。
论文给的解法叫跨循环路由复用(cross-loop route replay):只在第一次循环时让路由器做判断,后面几次直接沿用第一次的判断结果,不必每次都重算一遍该交给哪些专家。
打个比方,这就像餐厅点餐:每上一道菜都要重新问顾客“您确定要这道菜吗”,流程会被拖得很慢。顾客点餐那一刻的意愿已经包含了大部分信息,后面上菜按最初的点单执行就够了,没必要每道菜都重新确认。当然,遇上用餐中途突然改主意的顾客,这种做法会损失一点灵活性,但换来的是整个流程快得多。
实测下来,混合深度训练阶段的更新时间少了11.7%,模型在十项任务上的平均准确率基本没动。
推理阶段另有一套省内存的办法:只留最后一圈的记忆。模型实际对话生成时,内存消耗是个问题——传统做法每循环一次,就要给每一层的注意力机制单独留一份“记忆”(技术上叫KV缓存),循环越多,占的内存越大。
注意力KV缓存*:Transformer类模型生成文字时,需要记住之前所有词对应的键值信息,用来计算当前词和历史词之间的关联程度,这份记忆会随着生成长度和模型层数增长而增长。
论文给出的方案叫最后一圈KV缓存(last-loop KV caching):不管循环几次,始终只保留一份缓存,每次循环直接覆盖上一次的内容,只留最后一次循环的记忆。这就像反复修改一份会议纪要,每次修改都单独存一个版本文件,文件夹很快就会被塞满;如果知道最终提交的只有最新版本,不如每次修改都直接覆盖旧文件,只留最新那份,省下的存储空间非常可观。非要保留每一轮修改的痕迹,空间占用会随修改次数线性增长,但多数时候那些中间版本并不需要。
效果验证用的是Koi-4B模型:循环一次打平同行,循环四次大幅超车。说了这么多设计思路,实际效果到底怎么样?
论文在两个规模的模型上做了验证:一个是40亿参数的稠密模型GDP-Hybrid-4B,训练了1万亿token;另一个是300亿总参数、30亿激活参数的混合专家模型GDP-Hybrid-30B-A3B,训练了3000亿token。
在GDP-Hybrid-4B上,循环一次时ELR模型的十项任务平均分是65.13分,普通基准模型是65.65分,只差0.52分,几乎可以忽略不计。循环四次之后,ELR模型涨到了72.38分,比循环一次时整整提升了7.25分。
在GDP-Hybrid-30B-A3B上,循环一次时ELR反而以66.08分略微超过基准模型的65.04分,循环四次后进一步涨到70.83到70.90分左右(取决于是否用了路由复用技术),提升了4.75分左右。
有个细节挺耐人寻味:这些提升在每次循环之间分配得并不平均。收益的大头集中在第一次多出来的那轮循环上——也就是从1次加到2次这一步。拿GDP-Hybrid-4B来说,只跑到两次和三次循环,就已经分别装进了全部增益的79%和96%,再往上加到第四次,能多拿到的部分明显缩水。道理不难想通:训练时循环层数越深的那几轮,出现在样本里的机会本就偏少,模型也就没法把后面那几圈练得像前几圈那么扎实。
论文还把这套完整配方应用到了一个真正经过后训练、面向实际使用场景的模型上,叫做Koi-4B。这个模型在Artificial Analysis Intelligence Index(一个综合衡量模型智能水平的评测指标体系)上的表现相当亮眼:循环一次时估分18分,和同样是4B参数规模的Qwen3.5-4B打平;循环两次跳到26分,已经超过了9B参数的Qwen3.5-9B;循环四次达到29分,逼近参数量是它9倍左右的Qwen3.6-35B-A3B模型。
还有个更出人意料的地方:循环次数加上去,模型吐出的回答反倒更短了。循环四次对循环一次,平均输出token数少了32.7%。换句话说,模型学会了拿更深的“内部思考”去顶掉那些啰嗦的、摆在明面上的思维链文字,想得更深,说出来却更少、更准。
写在后面
翻这篇论文时,真正戳到我的并不是ELR的技术细节,而是开头那个提问的方式。它没问“循环模型能不能比普通模型更强”,而是绕到另一面去问“循环模型能不能至少不比普通模型差”。这两个问题的难度完全不在一个量级:前者冲着上限去,后者守着下限,而论文选的是先把下限这件事彻底做干净。
这套路数其实挺耐琢磨。不少技术创新急着证明自己“更强”,却把更朴素的前提丢在一边:要是连“不比现有方案差”都办不到,“更强”的承诺就没了地基。论文里那句话——“一个模型如果要为循环交税,那还不如另外单独训练一个不循环的模型”——恰恰点破了这个朴素的道理:弹性和灵活性若是以牺牲最基础场景的表现为代价换来的,那这种灵活性本身就值得怀疑。另有一处细节让我反复回味:零初始化这个技巧,本质上是给模型的“进化”安了个安全的起点,新功能接进来的那一刻,世界和昨天一模一样,之后才慢慢长出新的能力。这种渐进式、可回退的设计思路,其实不限于机器学习模型,任何系统的迭代升级,或许都值得参考这种“先保证零风险接入,再慢慢释放新能力”的节奏。
论文末尾也没有回避,坦坦白白留了几个没解决的问题:为什么收益在循环两次之后衰减得这么快,为什么循环条件调制没能完全追平那些针对单一循环次数专门训练的模型。这些留白挺真实——技术研究里,一篇论文很少能把所有问题都关上门,往往是解决了一个关键矛盾,又推开几扇新的门。
一个模型,能不能既是性价比之王,又是性能猛兽?这篇论文的答复是:至少在“思考几圈”这件事上,鱼和熊掌好像真能一块儿拿下。
Q&A
Q1:Elastic Latent Recurrence是什么?
A:Elastic Latent Recurrence(ELR)是NVIDIA团队提出的一种训练循环语言模型的方法,能让同一个模型在只循环一次时达到和普通非循环模型相当的表现,而循环次数越多,模型表现越好,解决了传统循环模型“循环一次时表现明显变差”的问题。
Q2:什么是单循环税,为什么循环模型会有这个问题?
单循环税说的是什么?传统循环语言模型只跑一次循环,表现会明显不如同等规模的普通模型。原因在于,这类模型训练时的状态更新机制通常直接把旧状态替换掉,没有针对单次循环的场景做优化。结果就是,想省算力只跑一圈,性能上反而要额外买单。
Q3:Koi-4B模型把循环次数加上去,速度会掉得很厉害吗?
会慢,但慢得没想象中那么夸张。循环次数一多,模型给出的回答反倒更短。论文数据显示,循环四次时输出token数比循环一次少了32.7%,这在一定程度上把每次循环多出来的计算耗时抵消掉了。