循环大模型(looped language model)是近两年一条明确的路线:不堆更多不同的层,而是把同一组层反复跑几遍。深度变成一个可变的设置,而不是权重的一部分——于是有了"简单 token 少算两轮、难 token 多算八轮"这种自适应算力的想象空间。
麻烦在于"谁决定停"。主流做法是加一个很小的 halting head(停止头):每跑完一轮,输出"这个 token 该在这里停"的概率。听起来很美,但从"预测"到"真省下算力"中间隔着两道坎,而一篇 10 月 23 日提交到 arXiv 的论文(Apple 的 Tsung-Han Wu、Minsuk Heo、Kenny Tan)把两道坎都踩了一遍。
论文原文:arXiv:2610.32246
平均数是个陷阱,不是省下的算力
第一道坎是"平均"和"百分位"的差别。停止头给出的概率,要经过一个 exit rule(退出规则)才变成真正的停止动作:累积停止概率一旦达到 1−ε(论文用 90% 阈值)就停。这个规则停在概率分布的百分位上,不是均值上。论文的示意 token 就是典型:33% 落在第 1 轮、15% 在第 2 轮……18% 落在第 8 轮,均值算下来是 3.7 轮;但累积概率要等到第 8 轮才够 90%,于是它跑满 8 轮。
作者训了 140M 到 1.3B 四个尺寸、两个语料(FineWeb-Edu 和 Common Corpus)的循环模型。结果是:用混合损失(mixture loss,ACT 那一路的训练目标)训出的停止头,预测平均只需不到 8 轮中的 4 轮;可在 90% 阈值下,这些 token 实际跑了 7.6 到 7.9 轮。基本等于没省。
强行让它早点停也不划算。论文把每个停止阈值下的 BPB(每字节比特数,越低越好)对实际轮数画出来,和同样轮数下训练的"采样深度基线"对比:混合损失模型最多只能省下大约一轮,再往前就掉到基线后面。提前停止省下的算力,不够赔上它掉的质量。
病根在训练损失
ACT 式的混合损失训练时,把一个 token 在所有轮次上的状态按概率混起来,只对混合后的那一个预测打分。它从来不单独给"某个轮次的状态"打分——而退出规则恰恰要把单一状态交给读出层。验证很直接:即使不提前退出、就在上限处,把读出层从"读混合"换成"只读最后一轮的状态",混合损失模型就平白变差约 0.2 BPB(1.3B 那一档 +0.189)。这个损失几乎等于论文里最小和最大两个模型之间 0.24 BPB 的全部差距。
换成 PonderNet 的 per-step loss(每一轮都单独打分)能修好读出问题,但光换损失不够。每轮的打分权重就是停止头自己的概率,于是训练只优化停止头已经偏好的那些轮次;只有 KL 项往浅处推,弱先验下根本推不动——即使把阈值放宽到 ε=0.95,token 还是跑掉 8 轮中的 6 轮以上。
真正的开关是先验权重。从 β=0.01 提到 0.1,单轮条件下的 per-step 模型从比基线差 0.3 BPB 变成好 0.06 BPB,且在任何深度都不落后(作者称之为 depth-robustness)。论文表格显示,加强先验让 per-step 模型改善超过 0.25 BPB(140M 一档 −0.394),对混合损失模型却毫无帮助。损失和先验,缺一不可。
两样配齐后模型确实领先:平均花约 3 轮,同样轮数下比采样深度基线好约 0.02 BPB。论文还拆了这 0.02 的来源——把停止规则分配的轮数打乱,损失 0.008 BPB,说明约五分之二来自"把多轮数分给难的 token"这种分配能力;把基线重训得更偏向浅层后,领先收窄到约三分之一,剩下的大部分仍是分配能力。
批处理把剩下的优势也吃掉
服务器一次要生成几十条序列,这些 token 共享同一趟批处理;这一趟要等最深的那一个 token 停下来才能结束。
论文测的是 32 条序列一起解码:per-step 模型的 token 平均约 3 轮就停,但一趟批处理实际跑了 4.4 到 4.7 轮。370M 模型上实测挂钟时间,比跑满 8 轮快约 1.6 倍;若按它实际轮数固定深度跑,能快约 2.3 倍——差的这一截,就是等最深 token 的成本。
按批处理真正跑的轮数去比,基线反而更好,剩下的领先在 770M 那一档只剩 0.003 BPB。已发布的模型上也一样:带训练过停止头的 Ouro 2.6B,单个 token 能省掉约十分之一的迭代,但 32 个 token 一批的整趟只省掉约百分之一。
绕开等待有两条路:一是像 MoD 那样每轮前把还在跑的 token 重新打包,论文在自己实现里没看到收益;二是逐条序列解码,但停掉的 token 在更深轮次上根本没算自己的 key 和 value,而后续 token 要 attend 到那些位置。作者验证过:只有把停止轮次的 key/value 复用到那些空位上(Geiping 等人的做法,没有可测量的时间开销),优势才基本保住;即便如此,仍然赢不过一个专门按平均轮数训练的"专家模型"。
论文最后给了一个训练停止头之前就能跑的可行性测试:用深度曲线给停止头的收益设上界。以 3 轮为目标,单条解码时上界约 0.03 BPB;32 条一起解码时,因为要挪到更深的轮次去比,上界掉到约 0.01。
所以呢
这篇论文的价值不在于宣布"自适应深度没用",而在于它把一个一直被含糊带过的算力账本摊开算了一遍,并给出报告规范:带停止头的循环模型应同时报三个数——期望停止步数、退出规则下的实际步数、以及一趟批处理实际跑的轮数;还要说明停止 token 的深层 key/value 怎么填。
我的判断是:这条路线接下来会被重新定价。真要落地,与其赌停止头能省多少,不如先问一句——我这个场景的批处理,会不会把省下来的全吃掉。模型层的"自适应"听起来很美,系统层的排队才是最终账单。
你觉得自适应深度是伪需求,还是被这批实现方式拖累了?