微信扫一扫,关注公众号

  • 科技行者

  • 算力行者

见证连接与计算的「力量」

首页 循环语言模型的秘密:多绕几圈真的能让AI变聪明吗?

循环语言模型的秘密:多绕几圈真的能让AI变聪明吗?

2026-10-23 20:00
分享至:
----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.-
2026-10-23 20:00 • 科技行者

你有没有想过一个问题:如果一个AI模型可以反复利用同一批"脑细胞"来思考,而不是不断招募新的脑细胞,会发生什么?

这听起来有点像一个人反复咀嚼同一个念头,而不是不断产生新的念头。2025年前后,一批研究者开始认真琢磨这件事,他们把这种设计叫做循环语言模型。

**循环语言模型(LoopLM)**:一种通过反复执行同一组Transformer层来加深计算的语言模型,核心思路是参数复用,用更少的独立参数实现更深的计算。

这个想法乍一看很有诱惑力。训练一个千亿参数的大模型,成本高得吓人,显存占用也是个头疼事。但如果能让一小组参数反复"循环执行",岂不是能在不增加参数量的前提下,让模型思考得更深?这就像是健身房里,与其买十套哑铃,不如用一套哑铃多做几组。

但问题来了:多做几组真的总是更好吗?如果做太多组,会不会适得其反,练伤了?这篇来自香港中文大学和MBZUAI的技术报告,就是想把这件事彻底搞清楚。

循环到底行不行,得先问清楚这几个问题

在这篇论文之前,循环语言模型的研究大多停留在一个比较粗糙的阶段:训练时设定循环次数是K,那就只在K次这个固定点上测试模型效果,很少有人认真研究,如果推理时循环次数超过K,或者少于K,模型会怎样表现。

这就好比你训练一个跑步运动员按照42公里的马拉松节奏来训练,然后从来不问他如果只跑20公里会怎样,跑60公里又会怎样。这种"只在训练配速下测试"的做法,遮蔽了很多重要的信息。

论文把这个未被充分探索的领域称为"训练视野之外"的表现,这也是整篇论文的核心切入点。研究者们提出了三个问题:循环计算什么时候有用?循环应该放在网络的哪个位置?循环之间应该如何传递信息?

**训练视野**:模型训练时设定的固定循环次数K,推理时循环次数等于K叫做"在训练视野内",超过K叫做"推理外推"或"深度外推",少于K叫做"欠展开"。

要回答这些问题,研究者们做了一件挺笨但很扎实的事:从零开始预训练了一大批不同配置的循环模型,涵盖两种主流架构(Llama3.1-1B和Qwen3-0.6B的层配置),控制训练数据量、优化器、训练流程完全一致,只改变循环的具体设计方式,然后系统地测试。

循环真的能让模型变聪明,但只对一部分任务有效

先说最直观的发现。研究者训练了一批最简单的循环模型,叫做**BaseLoop**。

**BaseLoop**:一种最基础的循环模型设计,整个Transformer堆栈都参与循环共享,没有专门的、不参与循环的输入层或输出层。

他们固定了"有效训练深度"为20层(也就是物理层数乘以循环次数等于20),但是用不同的组合方式来实现这个20:比如2层物理层循环10次,或者4层物理层循环5次,或者10层物理层循环2次。这几种配置在训练阶段的计算量是完全一样的,区别只在于"深度"是靠层数堆出来的,还是靠循环次数堆出来的。

结果很有意思。在训练视野之内,增加推理深度能同时提升知识类任务和推理类任务的表现。这里说的"知识类任务"大概是SciQ、ARC-Easy这类偏向事实记忆的题目,"推理类任务"则是ProofWriter、CLUTRR这类需要多步逻辑链条的题目。

但一旦超过训练视野,两条曲线就开始分道扬镳。以2×10这个配置为例,当有效层深度从20涨到40(也就是循环次数翻倍),推理类任务的分数从28.52涨到31.49,涨了将近3个百分点。这是纯粹靠多算几圈、不改一个参数拿到的免费提升。可知识类任务的分数却从62.80跌到52.11,足足掉了10个百分点。

这说明什么?这说明循环计算并不是万能药。它更像是给大脑多一点思考时间,对需要推理链条的问题有帮助,但对纯粹考记忆力的问题反而会帮倒忙,因为反复折腾那些已经存好的事实,可能把原本清晰的记忆搅浑了。

想象你在考试,一道需要背诵年份的历史题,你越反复琢磨"是1848年还是1849年",反而越容易把自己绕晕,最后写错。但一道需要推理的数学题,多想几步反而能想通。循环计算的效果,取决于这道题到底是考记忆还是考推理。

更细致的分析还发现,推理任务内部也不是铁板一块。在ProofWriter这个需要多步逻辑证明的任务上,把推理深度拉到24层(超出训练时的20层),各个证明难度等级(从0到5层证明)都能获得提升,深层证明的提升幅度大约有7.5个百分点。但在CLUTRR这个考察亲属关系链条推理的任务上,短链条(比如长度为2、3的关系链)从多循环中获益巨大,准确率能跳升20多个百分点,而长链条(长度4到10)的收益却微乎其微,甚至下降。

这个发现打破了一个很自然的直觉:你可能以为,题目越难、需要的推理步数越多,那多给的计算资源(循环次数)应该越有用。但实际情况恰恰相反,更难的推理实例并不总能从额外循环中获得更大收益。这提醒我们,简单粗暴地"多想一会儿"不是解决所有难题的万能钥匙,复杂问题可能需要的不是更多的重复计算,而是更结构化的能力。

深度怎么分配:物理层数和循环次数不能乱搭

论文里还有一个特别值得琢磨的发现:同样是20层的有效训练深度,不同的物理层数和循环次数组合,外推表现却天差地别。

浅而多循环的2×10配置(2层物理层循环10次),很快就达到峰值然后开始走下坡路。深而少循环的10×2配置(10层物理层循环2次)则显得很"稳",但代价是几乎不能从额外循环中获得任何提升,曲线基本走平。而5×4和4×5这样更均衡的配置,则表现出更强的持续外推能力,4×5甚至一路涨到40层深度都还在进步。

这就像是搭积木盖房子。如果你只有2块超大的砖(物理层),想靠反复垒同一块砖来盖10层楼,那这栋楼的地基结构其实非常单薄,楼层一高就容易晃动出问题。但如果你有10种不同的砖块类型(物理层),只需要垒2遍就够用了,这栋楼确实稳,可你再往上加楼层也没什么新意,因为可用的"建筑语言"太少,重复不出新的结构变化。真正健壮又有潜力的房子,是砖块种类和垒砌次数都适中,既有足够的结构多样性,又有可持续叠加的深度。

而且这里最反直觉的一点是:某些循环配置,居然能在总训练算力完全相同的情况下,超过一个不循环的、拥有同等有效深度的"满血版"模型。论文里的NonLoop模型是一个20层、每层都独立参数化的传统Transformer,它的推理分数是30.25。而5×4配置在推理深度拉到30层时达到31.88,4×5配置拉到40层时达到31.49。

这意味着,用更少的独立参数(因为大部分层都是共享的),配合额外的推理时间投入,居然能反超参数更多、结构更"奢侈"的对照组。这对于成本敏感的场景,是个相当诱人的信号:与其一次性砸钱造更大的模型,不如造一个小一点但可以反复思考的模型,让它在推理阶段慢慢"想"。

输入层和输出层要不要参与循环,这事儿很讲究

接下来论文探讨了一个更结构性的问题:是不是所有Transformer层都应该参与循环共享?会不会有些层,天生就不适合被反复复用?

为此,研究者引入了**CoreLoop**的概念,和BaseLoop做对比。

**CoreLoop**:在共享的循环核心两侧,保留一部分不参与循环、独立参数化的层,分别叫做Prelude(前置层)和Coda(后置层)。CoreLoop允许模型把"进门的处理"和"出门的处理"单独训练,而不必和中间反复循环的部分混在一起。

实验发现,是否在输出端保留一个独立的Coda层,对模型在"欠展开"情况下(也就是推理时循环次数比训练时少)的表现有很大影响。带有Coda层的CoreLoop模型,在推理循环数不足时,知识类任务的衰减明显更缓和。研究者用几何指标分析发现,带Coda的模型在循环状态之间的"角度变化"更小,说明状态更稳定,没有那么剧烈地偏离训练时见过的分布。

这背后的逻辑其实挺好理解。你可以把Coda层想象成一个专职的"翻译官",专门负责把循环核心产出的中间表示,转换成最终可以读出结果的格式。如果没有这个翻译官,循环核心本身既要负责反复思考,又要负责把思考结果整理成能被外界理解的语言,一旦思考的轮次被打断(循环次数不够),整理工作也跟着乱套。有了专职翻译官,哪怕思考被打断了几轮,翻译官依然能尽力把手头现有的东西整理清楚,不至于全盘崩溃。

至于输入端的Prelude层,论文发现它在支持"深度外推"(也就是推理时循环次数超过训练时)方面表现得更突出。比如把更多独立参数分配给输入端的Prelude,在某些层数配置下,推理任务的表现能持续提升,不会随着循环次数增加而衰竭。

这里有个特别值得注意的反常现象。研究者测量了循环状态之间的"角度距离"和"相对更新幅度",发现随着循环次数超过训练视野,这两个指标都在持续下降,也就是说每一次循环带来的变化越来越小,看起来很像是逐渐"收敛"到了某个稳定点。但与此同时,循环状态的方差却在持续增长,而不是趋于平稳。这说明微小的每步更新依然在累积效应,慢慢把状态推离了训练时熟悉的分布区间,哪怕表面上看起来"变化很小很稳定"。

这提醒我们一件很重要的事:收敛不等于有用。就像一个人反复推敲一句话的措辞,每次改动都越来越细微,看起来已经"定型"了,但这并不代表这句话就一定说得对,它可能只是在一个错误的方向上越改越精细。

怎么把之前的思考状态传下去:三种不同的条件注入方式

既然收敛不代表有效,研究者接下来就琢磨:能不能给循环过程加一点额外的"提示信息",让每一轮循环都能知道自己走到了哪一步,以及之前发生过什么。

论文里探讨了两大类条件注入方式:状态条件化和时间步条件化。

先说状态条件化。最早、也是业内比较流行的做法叫做**初始状态注入**。

**初始状态注入**:在每一次循环开始时,把最初的输入表示重新注入到当前的状态里,相当于给循环过程设一个"锚点",提醒模型不要忘了最初的输入是什么样。这个概念最早由Huginn模型提出。

论文测试了四种不同"力度"的初始状态注入方式,从最简单的标量缩放,到通道级别的向量运算,再到最复杂的稠密矩阵变换。结果发现一个挺让人意外的现象:注入力度越强(比如Dense这种用整个矩阵去融合初始状态和当前状态的方式),在深度外推时反而崩得越惨。知识类任务的准确率会出现断崖式下跌。而力度较轻的Scalar和Channel-wise方式,虽然没有那么惨烈的崩溃,但相比什么都不做的BaseLoop,也没有明显的净收益。

为什么会这样?研究者的解释是,Transformer本身通过残差连接已经天然保留了输入信息的痕迹,再强行把最初的输入硬塞进每一轮循环,提供的是一种冗余信息,而不是循环轨迹真正需要的动态指引。这就好比你已经在笔记本上记好了会议开场时说的话,主持人却在每一轮讨论中都反复把开场白重新念一遍,不仅没帮上忙,反而打断了讨论的连贯性,越到后面这种打断的破坏力越大。

于是研究者提出了一个新思路,叫做**历史状态注入**。

**历史状态注入**:不再死盯着最初的输入,而是关注最近几轮循环状态之间的"相对差异",也就是循环轨迹最近走过的"速度"和"方向"。这种方式排除了最初的输入状态,只看循环过程本身最近发生的变化。

这个思路的关键在于,它用的是状态之间的差值,而不是绝对值。研究者做了个类比性的设计:与其在每一步都回头看"我们出发时的样子",不如看"我们刚才这一步走了多远、往哪个方向走"。这样即使循环轮次一直往深处走,这种"速度感知"依然是稳定且有意义的信号,不会因为轮次太多而失去参照意义。

实验结果证实了这个设计的价值。在稠密参数化的条件下,历史状态注入配合一个很小的"记忆窗口"(只看最近一步的差异),就能把原本因初始状态注入而崩溃的模型给"救"回来,让准确率重新逼近不循环的满血版模型。但如果把记忆窗口拉得更大(比如同时参照最近4步的历史),外推表现反而会逐步变差,说明太多的历史信息反而成了噪音,一步之差已经足够传递有用的"速度"信息了。

再说另一类条件化方式,叫做**时间步条件化**。

**时间步条件化**:让模型在每一轮循环时,明确知道"现在是第几轮",从而让共享的计算权重能够根据轮次的不同,产生有区别的变换,而不是每一轮都执行一模一样的操作。论文测试了三种具体实现:Loop Gating(用一个标量根据轮次缩放整体更新幅度)、Branch Gating(对注意力分支和MLP分支分别设置轮次相关的缩放门)、以及仿照LoopFormer设计的AdaLN(更精细的通道级调制)。

实验发现,时间步条件化确实能在某些配置下改善深度外推表现,但效果高度依赖具体的循环架构设计。比如在7×4这个配置里,Branch Gating在推理深度翻倍时,总分从BaseLoop的36.59提升到38.46,主要是靠推理能力的提升拉动的。但同样的方法用在2×14或4×7配置上,增益就小得多,甚至没有增益。这告诉我们,时间步条件化不是一个"放之四海而皆准"的补丁,它必须和具体的深度分配方案配合调优才能发挥作用。

三种机制放在一起,到底谁和谁最合拍

最后一部分,论文探讨了一个更实际的问题:这几种条件化机制,能不能叠加起来,产生1+1大于2的效果?

答案是:不一定,要看具体搭配谁和谁。

研究者系统测试了初始状态、历史状态、时间步条件化这三者的两两组合,以及三者全部叠加的情况。结果显示,历史状态注入和时间步条件化(具体是Loop Gating)的组合,是效果最好的一对搭档。在3倍训练深度的极端外推场景下,历史状态加时间步条件化组合的总分达到37.30,比初始状态加历史状态的组合(36.91)、初始状态加时间步条件化的组合(36.33)都要高,比它自身最强的单独组件还要高出1.16个百分点。

更耐人寻味的是,当研究者尝试把初始状态条件化也一并加进这个最佳组合里,凑成三合一,结果反而没有额外收益,三合一的表现始终低于历史状态加时间步条件化这对二人组。

为了搞清楚这背后到底发生了什么,研究者引入了一个新的分析工具,叫做**计算交互度**。

**计算交互度**:衡量的不是某个状态变化幅度有多大,而是"跳过某一轮更早的计算,会对后续某一轮的计算产生多大的实际影响"。这个指标关注的是计算之间真正的依赖关系,而不只是表面上数字变了多少。

用这个指标去看,研究者发现一件很有启发性的事:状态变化幅度大,不代表跨轮次的依赖关系就强。比如带Coda层的模型,虽然末端状态变化幅度不算特别小,但计算交互度却明显更低;channel-wise的初始状态注入,虽然在数值上变化不算最大,但跨循环的计算交互度却是Dense注入的将近7倍。

而历史状态加时间步条件化的组合之所以效果好,是因为它在跨循环层面的交互程度,比初始状态搭配的组合高出10%到20%左右,尽管它在单轮循环内部的响应幅度反而更小。这说明历史状态条件化擅长的是"告诉模型之前的状态是怎么演变过来的",时间步条件化擅长的是"告诉模型现在这一步的计算该怎么调整",两者结合起来,后面的循环轮次能更扎实地建立在前面轮次的基础上,形成真正的累积效应。而初始状态这个"锚点"式的静态参照,提供的跨轮次耦合就弱得多,加进去反而稀释了历史信息和时间步信息原本清晰的配合关系。

这就好比一个团队做接力项目。历史状态条件化相当于每个人接棒前,先看看上一位队友刚才跑动的姿态和节奏是怎么变化的;时间步条件化相当于教练在场边喊"现在是第几棒,该调整成什么策略了"。这两者配合得当,整个团队的接力就能一棒接一棒地把速度累积起来。而初始状态条件化更像是每次接棒前都要停下来回顾一下比赛刚开始时发令枪响的那一刻,这个信息虽然不算错,但对于"现在该怎么跑好这一棒"帮助有限,甚至会打断刚建立起来的节奏感。

写在后面

读完这篇论文,我印象最深的其实不是某个具体的最优配置,而是那种反复出现的"看似矛盾"的现象:小的更新幅度不代表收敛完成,状态变化幅度大不代表真实的跨轮依赖强,更难的推理题不一定从更多循环中获益更多。

这些反直觉的发现共同指向一个道理:我们很容易用一些容易观测的代理指标(比如状态变化了多少、循环执行了几次)去揣测模型内部到底发生了什么,但这些代理指标经常会说谎,或者至少不完整。真正决定表现好坏的,是那些更难直接观测的东西,比如计算之间到底存不存在有意义的依赖关系。

论文里那个关于CLUTRR任务的发现也让我很触动:短链条推理题从额外循环中获益巨大,长链条题目却几乎无动于衷。这暗示着,循环计算或许更像是给模型一点"反复咀嚼"的余地,而不是无限扩展它能处理的问题复杂度上限。有些问题不是靠多想几遍就能想明白的,它需要的可能是全新的能力,而不是旧能力的重复调用。

这也让我想起一个更大的问题:当我们说"给AI更多推理时间"能让它变聪明的时候,我们其实默认了一个假设,思考时间和思考能力之间是线性的、可无限兑换的关系。但这篇论文用扎实的实验告诉我们,这种兑换关系在不同任务、不同架构配置下,表现得极其不均匀,甚至有时候是反向的。

那么下一个问题自然就来了:如果循环计算的效果这么依赖于具体怎么设计,那有没有可能让模型自己学会,针对不同的输入,动态决定该循环几次、该用哪种条件化方式?这篇论文没有回答这个问题,但它把通往这个问题的路铺得足够清楚了。

Q&A

Q1:循环语言模型(LoopLM)是什么?

A:循环语言模型是一种通过反复执行同一组共享的Transformer层来加深计算的语言模型,核心思路是用参数复用的方式实现更深的计算,而不需要增加模型的独立参数数量,从而在有限显存和成本下扩展推理能力。

Q2:为什么循环次数超过训练时设定的值,反而会让知识类任务表现变差?

A:研究发现,推理时循环次数超出训练视野后,循环状态会逐渐偏离训练时熟悉的分布区间,虽然每一步的变化幅度看起来很小,但会持续累积,导致模型存储的知识记忆被扰乱,而这种偏移对需要多步逻辑推理的任务影响较小,甚至有帮助。

Q3:历史状态注入和初始状态注入相比,有什么优势?

A:初始状态注入是把最初输入反复注入每轮循环,容易造成信息冗余,在深度外推时会导致知识类任务表现崩溃;历史状态注入则只关注最近几轮循环状态之间的相对变化,能更好地捕捉循环轨迹的动态过程,配合时间步条件化使用时效果最稳定。

分享至
0赞

好文章,需要你的鼓励

推荐文章
----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.-