循环语言模型的算力账

研究笔记 · 2026 年 10 月 23 日

循环语言模型的算力账

循环语言模型把同一组层反复使用,参数不变,计算却能一轮轮加深。代价是训练很贵,Parcae 的训练配方让每条样本平均循环 8 轮。我们在一张 5090 24G 上训练了 60 多个小模型,想弄清楚这 8 轮里有多少是必要的,省下来的算力又能换来什么。

模型 8650 万和 1.44 亿参数 · 训练数据最多 20 亿 token · FineWeb-Edu

结论

  1. Parcae 原配方训出来的模型,循环 4 轮就拿到了 94% 的收益,之后隐状态几乎不再变化,后面几轮基本在空转。
  2. 我们把训练改了两处:每次固定循环 4 轮,每一轮都计算梯度;循环块从第 2 轮起只看最近 64 个 token。同样的训练数据下,效果和原配方持平,较小的模型上还略好。训练快 1.25 到 1.4 倍,生成文本快 2 到 3 倍,KV 缓存约为原来的三分之一。
  3. 这些优势有边界。训练越久,优势越小,训到 20 亿 token 时原配方靠多循环几轮略微反超。而在我们这么小的规模上,参数量相同的普通 Transformer 用同样的训练时间,效果比所有循环版本都好。

如何理解文中数据:文中的 loss 是验证集上的交叉熵,越低越好。在我们的规模上,loss 低 0.01,大约相当于多训 2% 到 5% 的数据。同一个配方换一个随机种子重新训练,loss 会有 0.001 到 0.01 的出入,所以差距在 0.01 以内的,我们一律算作随机噪声。

循环模型和它的训练配方

普通 Transformer 的每一层只用一次。循环语言模型把中间几层做成一个循环块,让同一个序列反复穿过它,每多循环一轮,就相当于多了一层深度,参数却没有增加。我们用的结构和 Parcae 相同:开头 2 层和结尾 2 层各跑一次,中间 2 层组成循环块,重复 T 轮,每一轮都会重新读入开头两层的输出(图 1)。

循环块多跑一轮,就多一份计算,训练时还要加上反向传播。Parcae 是目前公开的效果较好的循环模型训练配方,下文称为原配方。它给每条样本随机抽一个循环轮数,平均 8 轮;为了省显存和计算,只有最后 4 轮计算梯度,前面的轮次只做前向。推理时一般循环 8 到 12 轮。

输入 开头 2 层 只跑一次 每轮都读入 循环块 2 层 重复 T 轮 同一组权重反复使用 结尾 2 层 只跑一次 下一个 token 原配方 随机循环,平均 8 轮 只有最后 4 轮算梯度 固定 4 轮 每次循环 4 轮,4 轮都算梯度 推理时也循环 4 轮 精简配方 64 64 64 固定 4 轮,第 2–4 轮 只看最近 64 个 token 算梯度(前向和反向) 只做前向 只看最近 64 个 token 每个方块是循环块跑的一轮
图 1 模型结构,以及本文比较的三种训练方式。原配方这一行画的是一条抽到 9 轮的样本。

因此我们逐项检查这笔算力到底合不合算:平均 8 轮一定需要吗?如果只训练,最后 4 轮划不划算?每一轮都必须看完整的上下文吗?

原配方的模型,4 轮之后就不怎么动了

先看原配方训出来的模型在推理时做了什么。我们取一个 1.44 亿参数、训练了 10 亿 token 的模型,让它分别循环 1 到 32 轮,测验证 loss(图 2)。从 1 轮到 4 轮,loss 从 3.50 降到 3.26;从 4 轮到 8 轮只再降了 0.016;8 轮以后几乎是一条平线。前 4 轮拿到了 1 到 8 轮全部收益的 94%。我们训练的 7 个这个规模的原配方模型都是如此。

原配方模型:推理时循环几轮,loss 是多少

图 2 1.44 亿参数、训练 10 亿 token 的原配方模型,两个种子的平均。横轴是推理时循环的轮数,用对数刻度。
查看数据
推理时循环轮数种子 43种子 44平均
13.50663.49443.5005
23.33933.33573.3375
33.28403.28223.2831
43.26223.26103.2616
63.24873.24783.2483
83.24633.24513.2457
123.24583.24463.2452
163.24593.24473.2453
243.24613.24493.2455
323.24613.24493.2455

隐状态的变化也是这样。每多循环一轮,隐状态的改动大约只有上一轮的一半到三分之二,到第 12 轮已经小到和 bf16 的舍入误差相当。模型很快停在一个固定的状态上,再循环下去状态也不会变。原配方训练时平均跑的 8 轮里,后面几轮对结果几乎没有贡献,花的算力却和前几轮一样多。

那么很自然的,取到 elbow point 会不会也行?

精简配方的两处改动

据此,我们对原配方做了两处改动,合称精简配方(图 1 第三行)。第一,训练时每次固定循环 4 轮,4 轮都计算梯度,不再随机抽轮数,也不再有只做前向的轮次。第二,循环块只在第 1 轮看完整的上下文,第 2 到第 4 轮只看最近 64 个 token;开头和结尾的 4 层不变。

同样的训练数据下,精简配方循环 4 轮的效果,和原配方在它最好的轮数(12 轮)下一样好。1.44 亿参数的模型训练 10 亿 token,两个种子上精简配方都低 0.005,在误差范围内;8650 万参数的模型训练 5 亿 token,三个种子上精简配方都更好,平均低 0.025。训练也快了约 1.4 倍。下面两节分别解释这两处改动为什么不损失效果,然后再看速度上的差距。

查看同样训练数据下的完整对比
模型训练数据种子原配方(最好的轮数)固定 4 轮精简配方
8650 万参数5 亿 token433.55023.53963.5319
443.54753.54193.5201
453.55373.54403.5232
1.44 亿参数10 亿 token433.24583.24333.2413
443.24463.24073.2392
1.44 亿参数20 亿 token433.0937—3.1024
443.0927—3.0981

验证 loss。原配方取 1 到 32 轮中最好的一档(都是 12 轮),另两种取 4 轮。同一行的几种配方用同一个种子,初始化和数据顺序相同。测试集上的方向和验证集一致。

为什么固定 4 轮也还可以?

我们测了两种模型在每一轮让隐状态改变了多少(图 3)。原配方的模型,第 2、3、4 轮的改动每轮减半,很快停了下来。精简配方的模型,这三轮的改动一直很大,每一轮都在大幅改写隐状态,到最后也没有收敛下来,前后差得很多。

每一轮让隐状态改变了多少

原配方精简配方(固定 4 轮)
图 3 相对变化指这一轮前后隐状态之差的大小,除以上一轮隐状态的大小。两个模型都是 1.44 亿参数、训练 20 亿 token,在 32 段验证文本上取平均。只固定 4 轮、不加局部注意力的模型(训练 10 亿 token)是 0.70、0.54、0.46,走的是同一种规律,三个点的下降节奏一致。
查看数据
模型第 2 轮第 3 轮第 4 轮
原配方(20 亿 token)0.370.180.09
精简配方(20 亿 token)0.620.560.63
固定 4 轮、全注意力(10 亿 token)0.700.540.46

我们的理解是,差别来自训练时梯度经过了哪些轮次。原配方的轮数随机,平均 8 轮,但只有最后 4 轮有梯度。只有约十分之一的样本会抽到 4 轮以内,这时从初始状态出发的前几轮才会被训练到;其余样本训练的都是已经接近不动点的那几轮。模型于是学会了尽快收敛,然后停住。固定 4 轮时,从初始状态到输出的每一轮都有梯度,模型就学会了把每一轮都用上。

两个对照实验支持这个解释,各做了一次。第一个在相同的训练时间里比较两种用法:循环 4 轮、4 轮都算梯度,比循环 6 轮、前 3 轮不算梯度的 loss 低 0.023,多跑的那几轮不如让每一轮都参与训练。第二个保持原配方随机抽轮数的做法,但只让最后 1 轮算梯度,模型从循环中得到的收益,也就是从循环 1 轮到 8 轮 loss 的降幅,从 0.23 缩到了 0.11,模型对循环的利用少了将近一半,少掉的这一截在数字上相当明显。

固定轮数也有代价,模型只能循环 4 轮(图 4)。少跑或多跑,loss 都明显变差,循环 8 轮时比 4 轮高 0.07,只循环 1 轮时高 0.8。原配方的模型则可以在 6 到 32 轮之间随意选,效果差不多。这等于放弃了循环模型的一个卖点,即推理时多循环几轮来换更好的结果。不过图 2 也说明,原配方在这一点上本来就很有限,超过 8 轮就没有收益了。Huang et al. (2026) 在 1 亿到 16 亿参数的模型上观察到了同样的两点。

推理时循环几轮,loss 是多少:两种配方对比

原配方精简配方
图 4 1.44 亿参数、训练 10 亿 token,两个种子的平均。精简配方在 4 轮时最好,比原配方最好的成绩(12 轮)还低 0.005;换成其他任何轮数都明显变差。
查看数据
推理时循环轮数原配方 · 种子 43种子 44精简配方 · 种子 43种子 44
13.50663.49444.04784.0400
23.33933.33573.64533.6365
33.28403.28223.42923.4358
43.26223.26103.24133.2392
63.24873.24783.46203.4139
83.24633.24513.30573.3114
123.24583.24463.33873.3439
163.24593.24473.34953.3513
243.24613.24493.35383.3521
323.24613.24493.35413.3518

所以如果决定了就是要推理四轮,或许就应该在训练时也固定四轮,当然这符合直觉到十分 trivial。

循环块不需要看很远

第二处改动来自一组削减实验。我们在 8650 万参数的模型上,从固定 4 轮模型的循环块里各削掉一部分计算,看哪些可以省(图 5)。

从循环块里削掉一部分计算,loss 怎么变

只缩短注意力范围其他削减
图 5 以固定 4 轮、全注意力的模型为基准,负数表示更好。8650 万参数,训练 5 亿 token,每种各训练一次。图中的灰色区域表示不同种子之间的误差范围。
查看数据
循环块的改动验证 loss相对基准训练时间
基准:固定 4 轮、全注意力3.539601.99 小时
第 2–4 轮只看最近 64 个 token3.5319−0.0081.80 小时
4 轮都只看最近 64 个 token3.5317−0.0081.70 小时
第 2–4 轮只看最近 256 个 token3.5385−0.0011.81 小时
第 2–4 轮宽度减半(注意力头和 MLP 都减半)3.5684+0.0291.76 小时
第 2–4 轮去掉注意力,只留 MLP3.5870+0.0471.60 小时
第 2–4 轮复用第 1 轮的 KV3.5705+0.0311.93 小时
只循环 2 轮3.5653+0.0261.56 小时
参照:原配方3.5502+0.0112.59 小时
参照:普通 Transformer(6 层,不循环)3.5540+0.0141.33 小时

只有缩短注意力范围不伤效果。第 2 到第 4 轮只看最近 64 个或 256 个 token,loss 都没有变差;连第 1 轮也只看 64 个 token,结果也一样。其他削减都明显变差。后几轮的宽度减半,loss 高 0.029;后几轮去掉注意力只留 MLP,高 0.047;后几轮直接复用第 1 轮的 KV,高 0.031;只循环 2 轮时,loss 则高了 0.026。

所以循环块的每一轮都需要完整的宽度和自己的注意力,只是不需要看远处的 token,远处的信息由开头和结尾那 4 层完整注意力来处理。只看最近 64 个 token 的做法,在另外两个种子和 1.44 亿参数的模型上都复现了。精简配方保留了第 1 轮的完整注意力,是偏保守的选择。

这个算力节省也不是免费的。逐个 token 拆开看,需要从 500 多个 token 以前复制内容的 token,loss 高了约 0.02,这类 token 约占 3%;其余 token 的 loss 略低。下游任务上两种配方的高下之分,还有待更大规模的实验分析。

算一算账

两处改动合起来,1.44 亿参数模型的训练速度从每秒 3.5 万 token 提高到 4.9 万,快 1.42 倍。这里面有一部分来自原配方现有实现的一个低效之处。它给每条样本单独抽轮数,同一批里的样本要陪着轮数最多的那条一起跑,15% 到 20% 的计算花在补齐上。如果改成整批抽同一个轮数,原配方自己能快约 15%,精简配方的优势降到 1.25 倍。

更快的训练可以换成更低的 loss。我们让原配方少训一些数据,使它的训练时间和精简配方相同,两边都完整走完学习率的衰减,再来比较(图 6)。同样训练 5.7 小时,精简配方的 loss 低 0.11;同样训练 11.3 小时,低 0.06;8650 万参数的模型同样训练 1.8 小时,低 0.18。6 组重复的方向全部一致。这里比的是原配方的现有实现。修掉上面那个补齐开销之后,差距大约会缩小三分之一到一半,剩下的主要是循环本身的开销。

同样的训练时间,谁的 loss 更低

原配方精简配方普通 Transformer(6 层,不循环)

8650 万参数

1.44 亿参数

图 6 每个点是一次完整的训练,原配方的几个点对应不同的训练数据量;有多个种子时画的是平均值。上图另加了一个参数量相同、不循环的 6 层 Transformer。
查看数据
模型训练时间种子原配方(训练数据)精简配方(训练数据)差
8650 万参数约 1.8 小时433.6979(3.45 亿 token)3.5319(5 亿 token)−0.166
443.70243.5201−0.182
453.70813.5232−0.185
1.44 亿参数约 5.7 小时433.3521(7.04 亿 token)3.2413(10 亿 token)−0.111
443.35473.2392−0.116
1.44 亿参数约 11.3 小时433.1654(14.1 亿 token)3.1024(20 亿 token)−0.063

其他点:原配方 1.44 亿参数训练 10 亿 token 用 8.07 小时(3.2452),20 亿 token 用 15.98 小时(3.0932);8650 万参数训练 5 亿 token 用 2.61 小时(3.5505)。普通 Transformer(8650 万参数,种子 43)训练 5 亿 token 用 1.33 小时(3.5540),7.5 亿 token 用 1.99 小时(3.4673)。

生成文本时差别更大。循环模型每循环一轮,就要为这一轮单独存一份 KV 缓存,原配方循环 8 轮就要存 8 份。精简配方只循环 4 轮,后 3 轮又只需要存最近 64 个 token。我们按 1.44 亿参数模型的结构测了生成一个 token 的耗时(图 7),精简配方比原配方循环 8 轮快 2.3 到 3.1 倍,KV 缓存约为三分之一。上下文 1.6 万 token 时,它和同样大小的普通 6 层 Transformer 差不多快,缓存也一样大,因为两者都只有 6 层需要看完整的上下文。上下文只有 2000 token 时,普通 Transformer 的耗时还要少约 20%。

生成一个 token 的耗时(毫秒)

KV 缓存(MB)

图 7 按 1.44 亿参数模型的结构测量,上下文 1.6 万 token,一次生成一条。固定 4 轮那一行只固定了轮数、没加局部注意力,用来分开看两处改动各自省了多少。
查看数据
结构2000 token
一次 1 条
2000 token
一次 64 条
KV 缓存1.6 万 token
一次 1 条
1.6 万 token
一次 8 条
KV 缓存
原配方(循环 8 轮)4.66 ms20.17 ms120 MB25.07 ms27.01 ms960 MB
固定 4 轮3.09 ms12.47 ms72 MB15.26 ms16.23 ms576 MB
精简配方2.00 ms7.01 ms37 MB8.11 ms8.63 ms289 MB
4 轮都只看 64 个 token1.67 ms5.31 ms26 MB5.80 ms6.12 ms194 MB
普通 Transformer(6 层)1.57 ms6.39 ms36 MB7.87 ms8.13 ms288 MB

bf16,静态 KV 缓存,整个生成步骤用 CUDA graph 捕获,局部注意力的轮次用 64 格的环形缓存。耗时只取决于结构,与权重的具体数值无关,所以用的是随机权重。KV 缓存是一次 1 条时的大小。

这些结论的边界

训练越久,优势越小

同样训练时间下的差距,从较小模型的 0.18,到较大模型训练 5.7 小时的 0.11,再到训练 11.3 小时的 0.06,一路在缩小。按同样的训练数据比,趋势也一样。1.44 亿参数的模型训到 20 亿 token 时,原配方循环 12 轮的 loss 比精简配方低 0.005 到 0.009,两个种子都是如此,原配方反超了。它要循环 12 轮才做到,是精简配方的 3 倍;如果它也只循环 4 轮,loss 仍比精简配方高出 0.013 到 0.014,两个种子上都看得到。这有 loss 收敛的原因,也有可能节省的算力 scale 上去后便不值一提。

看起来训练量越大,多循环几轮越值得,这和 Parcae 论文里的缩放规律一致。固定循环更多轮能不能保住优势,较小模型上固定 8 轮比原配方低 0.034,更大训练量上的结果还有待实验分析。

在这个规模上,普通 Transformer 更划算

在 8650 万参数的模型上,我们还训练了一个参数量相同、不循环的 6 层 Transformer。同样训练约 2 小时,它的 loss 比所有循环版本都低,比精简配方低 0.03 到 0.04(图 6 上图的绿线)。在这么小的规模上,循环本身还不划算,精简配方缩小了差距,但没有扭转。

规模很小

所有结论都来自最多 1.44 亿参数、20 亿 token 的训练,只用了一个数据集(FineWeb-Edu)和一张 5090 24G。这两个模型的参数大部分在词嵌入上,真正参与计算的分别只有 19.4 M 和 43.7 M。

和已有工作的关系

这里的大部分现象印证了已有的结论,也补充了一些新的观察。

我们补充的有三点:在同一套设置里,把训练时间、生成速度和效果放在一起算账,包括实现上的开销;用每一轮隐状态的变化,解释固定轮数为什么不吃亏;以及循环块里哪些计算能省、哪些不能省,做了一组对照实验。

实验细节

数据
FineWeb-Edu,按顺序读取。验证集和测试集各是一个不参与训练的数据分片。
结构
开头 2 层,循环块 2 层,结尾 2 层。循环块每一轮读入开头两层的输出(Parcae 的注入方式),词表一共 32768 个 token。
两个规模
8650 万参数:宽 512,4 个注意力头,MLP 2048,不含词嵌入的参数 1940 万。1.44 亿参数:宽 768,6 个注意力头,MLP 3072,不含词嵌入的参数 4370 万。
训练
序列长 2048,每步约 52 万 token。优化器 Muon,学习率 0.008,前一半保持不变,后一半线性降到 0,与 Parcae 的默认设置相同。所有配方用同一套超参数,没有再按每一种配方单独调过,学习率调度完全共用。
原配方
每条样本的循环轮数取自均值为 8 的泊松分布,最多对最后 4 轮做反向传播。
局部注意力
PyTorch FlexAttention 的因果滑动窗口,宽 64 个 token。
重复次数
主要对比在 8650 万参数上用 3 个种子,在 1.44 亿参数上用 2 个种子。同一个种子下,各配方的初始化和数据顺序相同。削减实验各做一次。
评测
每个模型分别在循环 1、2、3、4、6、8、12、16、24、32 轮时测验证 loss。每个数字都来自一次走完学习率衰减的完整训练,不是中途的检查点。
硬件
一张 5090 24G,bf16,torch.compile。

引用本文

复制以下 BibTeX 条目用于论文或研究笔记。

讨论

参考文献

  1. Prairie, Hayden, Zachary Novack, Taylor Berg-Kirkpatrick, and Daniel Y. Fu (2026). Parcae: Scaling Laws For Stable Looped Language Models. arXiv:2604.12946
  2. Huang, Benhao, Chufan Shi, Junlin Chen, Shicheng Wen, Zhengzhong Liu, Eric Xing, and Xuezhe Ma (2026). Towards Looped Models Done Right, Part II: Rethinking at Fixed Points. arXiv:2610.06833
  3. Geiping, Jonas, et al. (2025). Scaling up Test-Time Compute with Latent Reasoning: A Recurrent Depth Approach (Huginn). arXiv:2502.05171
  4. Zhu, Rui-Jie, et al. (2025). Scaling Latent Reasoning via Looped Language Models (Ouro). arXiv:2510.25741
  5. Deng, Chunyuan, et al. (2026). LT2: Linear-Time Looped Transformers. arXiv:2605.20670
  6. Chen, Zixi, Akshay Vegesna, Samip Dahal, and Andrew Gordon Wilson (2026). How Model Growth, Recursion, and Boundary Operators Influence Scaling Exponents. arXiv:2609.19107
  7. Schwethelm, Kristian, Daniel Rueckert, and Georgios Kaissis (2026). How Much Is One Recurrence Worth? Iso-Depth Scaling Laws for Looped Language Models. arXiv:2604.21106
  8. Wu, Bohong, et al. (2025). Parallel Loop Transformer for Efficient Test-Time Computation Scaling. arXiv:2510.24824
  9. Monea, Giovanni, et al. (2026). The Surprising Effectiveness of Shared Memory in Looped Transformers. arXiv:2610.02383
  10. Bae, Sangmin, et al. (2025). Mixture-of-Recursions: Learning Dynamic Recursive Depths for Adaptive Token-Level Computation. arXiv:2507.10524

数字取自每次训练结束时的评测记录,测速和逐轮诊断的原始输出记在项目的研究日志里。

← 返回全部文章