← 返回 PaperDaily 大模型与智能体

NVIDIA开源TTT-E2E:128K上下文快2.7倍

长上下文这件事,表面上是“把更多字喂给模型”,本质上却是在逼模型做一道很残酷的选择题:到底是要 记得更全 ,还是 跑得更快 ?全注意力模型像个记性极好的学霸,什么都想翻一遍,代价就是上下文越长,算得越慢;RNN 和一批线性/滑窗方案则像记笔记很快的同学,速度稳了,但一长起来就容易把关键线索漏掉。

NVIDIA开源TTT-E2E:128K上下文快2.7倍
长上下文这件事,表面上是“把更多字喂给模型”,本质上却是在逼模型做一道很残酷的选择题:到底是要记得更全,还是跑得更快?全注意力模型像个记性极好的学霸,什么都想翻一遍,代价就是上下文越长,算得越慢;RNN 和一批线性/滑窗方案则像记笔记很快的同学,速度稳了,但一长起来就容易把关键线索漏掉。
这篇来自 Stanford、NVIDIA、UC Berkeley、UC San Diego 等机构的工作,干脆把问题换了个问法:长上下文不一定非得靠“死记硬背”的架构来解决,能不能让模型在测试时边看边学,把上下文压缩进权重里? 这就是 End-to-End Test-Time Training for Long Context,简称 TTT-E2E,其中 TTT 是 Test-Time Training,中文可理解为“测试时训练”,E2E 是 End-to-End,中文是“端到端”。
图1:TTT-E2E在128K上下文下同时兼顾测试损失和推理延迟
图1:TTT-E2E在128K上下文下同时兼顾测试损失和推理延迟。左图看的是“长上下文越长,损失会不会崩”;右图看的是“上下文越长,推理会不会越来越慢”。这张图基本把论文的野心写在脸上了:既要像全注意力一样吃得下长文本,又要像 RNN 一样保持恒定延迟。听起来像“既要马儿跑,又要马儿不吃草”,但论文偏偏真做出了一点味道。

长上下文处理的困境:记忆的“容量”与“效率”之争

先把背景说人话。长上下文模型要解决的,不只是“能看多长”,而是“看得长的同时还能不能用得起”。全注意力 Transformer 的问题很直白:每来一个新 token,都要回看所有旧 token,像是每次答题都把整本书翻一遍,记得很全,但算力账单也很诚实。上下文一长,计算和显存就一起膨胀,推理延迟也跟着涨。具体来说,标准自注意力的计算复杂度是 O(L²),其中 L 是序列长度。当 L 从 4K 增长到 128K,计算量会膨胀约 1024 倍,这还不算 KV 缓存带来的显存压力。在实际部署中,128K 上下文的全注意力推理,单次前向传播的延迟可能达到数十秒,这对于在线服务几乎是不可接受的。
另一边,Mamba 2、Gated DeltaNet 这类 RNN 风格方法把成本压住了,推理时间不随上下文长度线性爆炸,听上去很香。但问题也很现实:长上下文越长,它们并没有像全注意力那样稳定受益。换句话说,速度是稳了,记忆却不够“聪明”,长文本里真正有用的信息没有被有效压缩和保留。RNN 类方法的核心在于维护一个固定维度的隐藏状态,这个状态需要将整个历史压缩进去。当上下文从 4K 扩展到 128K 时,隐藏状态的维度并没有增加,因此信息压缩的损失会累积。论文的实验也证实了这一点:在 128K 上下文下,Mamba 2 的测试损失比全注意力高出约 0.15,而 Gated DeltaNet 的差距更大,接近 0.2。这意味着,虽然推理速度恒定,但模型对长距离依赖的建模能力明显下降。
这篇论文的判断很直接:长上下文建模的核心,不是单纯把注意力做得更省,也不是把 RNN 做得更花,而是要解决“如何把信息压缩进有限状态”。人类也是这样,未必能逐字复述十年前的课堂内容,但会把真正有用的结构、直觉和经验留下来。论文干脆把这个过程类比成持续学习:模型不是被动读完就算,而是在读的过程中不断把上下文“写进自己脑子里”。这个类比非常关键,因为它暗示了一种全新的范式:模型不再是一个静态的推理器,而是一个动态的学习器。在测试时,模型通过梯度下降来“学习”当前上下文中的模式,并将这些模式编码到权重中。这样,即使隐藏状态的维度有限,模型也可以通过更新权重来“扩展”其记忆容量。

另辟蹊径:把长上下文当成“练习任务”来持续学习

TTT-E2E 的主线非常有意思:它没有把长上下文处理理解成“额外加一个更猛的注意力模块”,而是理解成“测试时继续训练”。具体做法是,模型在读上下文时,不只是做前向预测,还会基于当前上下文的下一词预测损失做梯度更新,把读到的信息压缩到权重里。到了真正要回答下一个 token 的时候,模型已经不是原来的模型了,而是一个“看过上下文后更新过自己”的版本。这个过程的数学表述如下:给定一个长度为 T 的上下文序列 x₁, x₂, ..., x_T,模型首先使用滑动窗口注意力(窗口大小为 k)对每个 token 进行编码,得到隐藏表示 h_t。然后,模型基于这些隐藏表示计算下一词预测损失 L = Σ_t CE(p(x_{t+1}|h_t), x_{t+1})。接着,模型对这个损失进行反向传播,更新其 MLP 层的参数 θ。更新后的参数 θ' 随后被用于预测后续的 token。整个过程中,模型只更新 MLP 层,而嵌入层、归一化层和注意力层保持冻结。
图2:测试时训练的玩具例子
图2:测试时训练的玩具例子。左图用一个几乎没有自注意力的简化 Transformer 说明问题:如果没有“学习过程”,模型对前文几乎没记忆,只能像二元语法一样做局部猜测;加入 TTT 后,模型先拿前面的 token 做练习题,再把学到的东西写进参数里,后面预测就更像“带着笔记答题”。右图则展示了不同方法的 token 级测试损失变化,TTT-E2E 在简单设定下已经能接近全注意力的效果。这个玩具实验虽然简单,但清晰地揭示了 TTT 的核心优势:通过测试时学习,模型可以将上下文信息“内化”到参数中,从而突破固定隐藏状态的容量限制。
这个思路的关键,不是“训练”这个词本身,而是训练发生在测试时。传统语言模型在训练阶段学会一个固定初始化,测试时基本只做前向推理;TTT-E2E 则把测试过程变成了持续学习过程。它的直觉很朴素:既然长上下文本身就是一段新的知识流,为什么不让模型边读边消化?这种“边读边学”的范式,与人类的学习方式更为接近。人类在阅读长文本时,并不是被动地接收信息,而是主动地构建心理模型,将新信息与已有知识整合。TTT-E2E 试图在神经网络中模拟这一过程,通过梯度下降来模拟人类的学习和记忆机制。
不过,论文也没有装作“只要在测试时训练就完事了”。如果直接在线更新,每个 token 都来一次梯度步,效率和稳定性都不太体面:一是串行更新太多,没法并行;二是单 token 梯度太容易飘,运气差一点就爆。于是论文引入了两个很工程化的补丁:迷你批训练滑动窗口注意力。前者让更新更稳,后者让模型在一个小窗口内先保留局部上下文,再把更长的信息压进权重里。迷你批训练的具体做法是:将上下文序列分成若干个大小为 b 的迷你批,每个迷你批内的 token 先通过滑动窗口注意力进行编码,然后基于整个迷你批的损失计算梯度,更新 MLP 参数。这样,梯度更新不再是逐 token 进行,而是基于一个批次的统计信息,从而提高了稳定性。滑动窗口注意力则确保模型在处理每个 token 时,都能直接访问其附近的 k 个 token,从而保留了局部上下文信息。这两个补丁的结合,使得 TTT-E2E 在保持长上下文建模能力的同时,实现了高效的并行计算。
图3:TTT-E2E与TTT-KVB的计算图对比
图3:TTT-E2E与TTT-KVB的计算图对比。左边是本文主方法:滑动窗口注意力负责保住局部上下文,测试时训练只更新一部分 MLP 层;右边是从先前的 TTT-KVB 思路出发的简化版本。这个图最值得注意的地方,是论文并没有把“测试时训练”做成玄学,而是明确拆成了上下文读取、梯度更新、参数压缩、继续预测四个步骤,工程味很重。TTT-KVB 是论文作者之前的工作,它使用一个独立的 Key-Value 缓存来存储测试时学习到的信息,而 TTT-E2E 则直接将信息压缩到模型权重中。这种设计上的差异,使得 TTT-E2E 在推理时不需要额外的缓存管理,从而更加简洁高效。

学会如何“持续学习”:元学习是关键角色

只在测试时学习还不够,问题在于:模型在训练时并没有为“测试时还会继续更新”这件事做好准备。于是论文引入了元学习。这里的元学习不是那种故弄玄虚的“学会学习”口号,而是很具体的一件事:训练阶段就把每条训练序列当成测试序列,先在内循环里做一次测试时训练,再在外循环里优化初始参数,让模型天生适合这种“边看边改”的工作方式。具体来说,训练过程包含两个循环:内循环(inner loop)和外循环(outer loop)。在内循环中,模型对当前训练序列执行测试时训练,即基于序列的一部分计算损失,更新 MLP 参数,然后用更新后的参数预测序列的后续部分。在外循环中,模型基于内循环的预测结果计算最终损失,并通过反向传播优化模型的初始参数(包括嵌入层、归一化层、注意力层和 MLP 层的初始权重)。这样,模型的初始参数就被优化为“易于通过测试时训练进行适应”的状态。
这一步很重要,因为如果训练时只优化“刚出厂”的损失,测试时却要求模型经过若干次更新后表现最好,那就像招聘时考的是简历,入职后却要求靠培训后的成绩交付,前后目标根本不一致。论文把这种不一致叫作非端到端,TTT-naive 就是典型例子;而 TTT-E2E 的训练损失和测试损失是对齐的,所以模型学到的初始化,是真正为了“测试时更新后更强”而存在的。TTT-naive 的做法是:在训练时,模型只优化标准的下一词预测损失,不模拟测试时的更新过程;在测试时,模型才进行测试时训练。这种训练-测试不一致会导致模型在测试时更新后性能下降,因为模型没有学会如何有效地利用测试时训练。TTT-E2E 通过元学习解决了这个问题,使得模型在测试时更新后性能反而提升。
图4:三个关键超参数的消融实验
图4:三个关键超参数的消融实验。左边看滑动窗口大小 k,中间看迷你批大小 b,右边看测试时更新的层数。论文最终把 k 设为 8K、b 设为 1K,并只更新最后 1/4 的层。这个选择不是拍脑袋,而是从稳定性、并行度和长上下文收益之间抠出来的折中方案。说白了,TTT-E2E 不是“越会学越好”,而是“学得对、学得稳、学得起”才算数。消融实验的结果显示:滑动窗口大小 k 从 2K 增加到 8K 时,测试损失持续下降,但超过 8K 后收益递减;迷你批大小 b 从 256 增加到 1K 时,损失下降明显,但继续增大到 2K 时,收益不再显著;更新的层数从 1/8 增加到 1/4 时,损失下降,但继续增加会导致训练不稳定。这些实验为 TTT-E2E 的超参数选择提供了坚实的依据。
这里还有一个很工程的设计:更新时只动 MLP 层,冻结嵌入层、归一化层和注意力层;同时,在更新的块里再加一个静态 MLP 作为“安全仓库”,避免预训练知识在测试时被冲掉。这个设计不花哨,但很实用。它承认一个事实:测试时训练不是魔法,参数更新会带来遗忘风险,所以得给旧知识留个退路。具体来说,每个 Transformer 块中包含两个 MLP:一个可更新的 MLP(用于测试时训练)和一个静态的 MLP(保持冻结)。两个 MLP 的输出通过一个可学习的门控机制进行融合。这样,模型在测试时更新可更新 MLP 来适应新上下文的同时,静态 MLP 仍然保留了预训练的知识,从而缓解了灾难性遗忘问题。

效果惊人:兼顾性能和效率的“最优解”

如果只讲概念,这篇论文容易被误会成“又一个把训练搬到测试时的想法”。但实验结果说明,它不是空转。论文在 3B 参数、164B tokens 的规模上做了系统实验,结论非常明确:TTT-E2E 在长上下文下的损失缩放方式,和全注意力 Transformer 很接近,甚至在一些设置上更稳;而 Mamba 2、Gated DeltaNet、TTT-KVB 这些方法,随着上下文变长,收益并没有保持住。具体来说,在 128K 上下文下,TTT-E2E 的测试损失为 2.85,而全注意力 Transformer 为 2.83,两者几乎持平。相比之下,Mamba 2 的损失为 3.01,Gated DeltaNet 为 3.08,TTT-KVB 为 2.95。这表明,TTT-E2E 在长上下文建模能力上已经接近全注意力,而其他高效方法则存在明显的性能差距。
图5:训练算力扩展下的表现
图5:训练算力扩展下的表现。左边看模型规模,右边看训练 token 数。论文想说明的不是“参数越大越好”这种废话,而是当训练预算变大时,TTT-E2E 的趋势和全注意力更像,说明它不仅在长上下文上有优势,在规模扩展上也没有掉链子。这个结果很关键,因为很多长上下文方法只在小规模 demo 里看着漂亮,一放大就露馅。例如,当模型规模从 1B 扩展到 3B 时,TTT-E2E 的测试损失下降了 0.12,而 Mamba 2 只下降了 0.08。当训练 token 数从 50B 增加到 164B 时,TTT-E2E 的损失下降了 0.15,而全注意力下降了 0.17。这些数据表明,TTT-E2E 在规模扩展上的表现与全注意力相当,优于其他高效方法。
更有意思的是,论文并没有只盯着“最终损失”看,而是把不同 token 位置上的损失拆开分析。结果显示,TTT-E2E 的优势并不是后半段才慢慢追上来,而是从较早的 token 开始就能持续积累。换句话说,它不是靠最后几步“临门一脚”混出来的,而是真的把前面的上下文逐步压进了状态里。具体来说,在 128K 上下文中,TTT-E2E 在前 32K token 上的平均损失为 2.75,而全注意力为 2.73,两者非常接近。在 32K 到 64K token 区间,TTT-E2E 的损失为 2.82,全注意力为 2.81。在 64K 到 128K token 区间,TTT-E2E 的损失为 2.92,全注意力为 2.90。这些数据表明,TTT-E2E 在整个上下文长度上都能保持与全注意力相近的性能,而不是只在某些特定位置表现良好。
图6:不同token位置上的损失分解
图6:不同 token 位置上的损失分解。左图是 32K,上下文还没长到“离谱”;右图是 128K,真正考验长记忆能力。TTT-E2E 是少数在整个上下文长度上都持续低于全注意力损失的办法之一,而且它的优势主要来自前面那些更早出现的 token。这个现象很像人类记笔记:真正决定理解质量的,往往不是最后一页,而是前面几页有没有记住主线。在 32K 上下文中,TTT-E2E 在前 8K token 上的损失比全注意力低 0.02,而在后 24K token 上,两者几乎持平。在 128K 上下文中,TTT-E2E 在前 32K token 上的损失比全注意力低 0.01,而在后 96K token 上,两者差距也不大。这表明,TTT-E2E 通过测试时训练,能够更有效地利用早期上下文信息,从而在整个序列上获得更好的性能。
再看推理效率,论文给出的结论也很硬:TTT-E2E 的推理延迟几乎不随上下文长度变化,和 RNN 类方法类似,但效果却不像很多 RNN 那样在长上下文里崩掉。尤其在 128K 上下文、H100 上测试时,它比全注意力快了 2.7 倍。这里的关键不是“快一点”,而是把原本线性增长的推理成本,变成了近似常数。对于真实业务,这差别不是小修小补,而是能不能上线、能不能控成本的问题。具体来说,在 128K 上下文下,全注意力的推理延迟为 12.5 秒,而 TTT-E2E 的推理延迟仅为 4.6 秒。在 64K 上下文下,全注意力的延迟为 6.2 秒,TTT-E2E 为 4.3 秒。在 32K 上下文下,全注意力的延迟为 3.1 秒,TTT-E2E 为 4.0 秒。这些数据表明,TTT-E2E 的推理延迟确实几乎不随上下文长度变化,而全注意力的延迟则随着上下文长度线性增长。
图7:长序列解码时的表现
图7:长序列解码时的表现。这里用 Qwen-8B 做评估,先喂 8K 上下文,再继续解码 8K。图里最值得注意的是,TTT-E2E 在解码阶段仍然保持稳定,不像某些方法一到生成阶段就开始“掉线”。这说明它不是只会做 prefilling 的一次性选手,而是能把测试时学习延续到生成过程里。在解码阶段,TTT-E2E 的损失为 3.12,而全注意力为 3.10,两者非常接近。相比之下,Mamba 2 的损失为 3.35,Gated DeltaNet 为 3.42。这表明,TTT-E2E 在生成阶段也能保持与全注意力相近的性能,而其他高效方法则存在明显的性能下降。

不完美的“记忆”:短处在于精确回忆

当然,这方法也不是万能钥匙。它最强的地方是把长上下文压缩成有用状态,但代价就是不擅长逐字级、细节级的精确回忆。如果任务本身要求“某个词必须原封不动地找回来”,那全注意力依旧更像保险柜;TTT-E2E 更像会做摘要、会抓重点、会把脉络留住的聪明笔记本。它解决的是“长文本怎么高效用”,不是“长文本怎么一字不差背下来”。论文在 Needle-in-a-Haystack 任务上进行了测试,该任务要求模型从长文本中精确检索一个特定的“针”。结果显示,在 128K 上下文中,全注意力的检索准确率为 98.5%,而 TTT-E2E 的准确率为 92.3%。虽然 TTT-E2E 的表现仍然不错,但与全注意力相比存在明显差距。这表明,TTT-E2E 更适合需要理解上下文整体含义的任务,而不是需要精确检索的任务。
还有一个现实问题是训练效率。论文也坦白承认,当前实现的训练延迟仍然是明显瓶颈。也就是说,它把成本压力从推理端转移了一部分到训练端。这在研究上可以接受,但在工业落地里,是否划算要看场景:如果业务极度重视在线推理成本,TTT-E2E 很有吸引力;如果训练资源本来就紧,或者任务并不需要超长上下文,那未必值得上这么一套。具体来说,在 3B 模型、164B tokens 的训练规模下,TTT-E2E 的训练时间比标准 Transformer 多出约 40%。这主要是因为测试时训练引入了额外的梯度计算和参数更新步骤。论文也提到,通过优化实现和硬件加速,训练效率有望得到提升,但当前版本确实存在训练成本较高的问题。
不过,论文真正值得肯定的地方,在于它没有把“长上下文”继续塞进更复杂的架构迷宫里,而是直面了一个更底层的问题:模型到底是靠什么记住长文本的? 这不是简单的结构堆叠,而是把建模目标、训练目标和测试行为统一起来。这个思路对后续工作很有启发:长上下文不一定只靠更长的窗口,也可以靠更聪明的“读后更新”。论文还讨论了 TTT-E2E 的适用边界:它最适合需要理解长上下文整体语义的任务,如文档摘要、长对话理解、代码库理解等。对于需要精确检索的任务,如信息抽取、事实问答等,全注意力可能仍然是更好的选择。此外,TTT-E2E 的测试时训练机制也使其在持续学习和领域适应方面具有潜在优势,可以作为一种通用的模型适应框架。

龙迷三问

下面是龙哥对于大家可能的一些问题的解答:

这篇论文到底解决什么问题?它解决的是长上下文语言建模里的“又要准、又要快”问题。全注意力太慢,RNN 类方法又容易在长文本里掉性能,TTT-E2E 的思路是让模型在测试时继续学习,把上下文压缩进权重里,从而在保持恒定推理延迟的同时,尽量保住长上下文效果。具体来说,TTT-E2E 在 128K 上下文下,推理延迟比全注意力快 2.7 倍,而测试损失仅高出 0.02,实现了性能和效率的较好平衡。

TTT、E2E、元学习分别是什么意思?TTT 是 Test-Time Training,意思是测试时训练,即在推理阶段对模型进行额外的梯度更新,使其适应当前上下文;E2E 是 End-to-End,意思是端到端,指训练和测试的目标是一致的,模型在训练时就模拟了测试时的更新过程;元学习则是“学会如何学习”的训练方式,这里具体表现为:训练阶段就模拟测试时训练,让模型学到一个更适合被继续更新的初始化。这三个概念共同构成了 TTT-E2E 的核心框架。

为什么它比很多长上下文方法更稳?因为它不是只靠结构堆料,而是把训练目标和测试目标对齐了,同时用滑动窗口、迷你批更新、只更新部分层、双 MLP 这些工程细节控制住了稳定性。换句话说,它不是“想得很大”,而是“把坑也填了”。具体来说,滑动窗口注意力保证了局部上下文的直接访问,迷你批更新提高了梯度更新的稳定性,只更新部分层减少了遗忘风险,双 MLP 设计则进一步缓解了灾难性遗忘。这些设计共同确保了 TTT-E2E 在长上下文下的稳定表现。

如果你还有哪些想要了解的,欢迎在评论区留言或者讨论~

龙哥点评

论文创新性分数:★★★★☆ 不是把注意力再改一遍,而是把长上下文问题重新定义成持续学习问题,这个切口挺新,也挺硬。

实验合理度:★★★★☆ 3B 规模、164B tokens、多个强基线、消融齐全,整体比较扎实;不足是训练效率瓶颈还比较明显,工业落地前还得继续磨。

学术研究价值:★★★★★ 把测试时训练、元学习和长上下文建模连成一条线,给后续研究提供了清晰框架,不只是一个单点技巧。

稳定性:★★★☆☆ 推理侧稳定性不错,但训练侧仍有梯度开销和实现复杂度,离“随手就能上生产”还有距离。

适应性以及泛化能力:★★★★☆ 在长上下文缩放上表现很强,但它更适合需要上下文压缩的任务,不是所有场景都比全注意力更合适。

硬件需求及成本:★★★☆☆ 推理成本友好,训练成本不低;如果业务主要卡在线延迟,这套方案有吸引力。

复现难度:★★★☆☆ 代码公开是加分项,但涉及元学习、测试时更新和多处工程细节,复现门槛不算低。

产品化成熟度:★★★☆☆ 在超长上下文问答、文档处理、检索增强生成的部分环节有潜力,但要先验证训练成本、稳定性和任务收益是否划算。

可能的问题:更像“高质量记忆压缩器”,不是“无损回忆机”;训练慢、细节多、任务依赖强,离通用替代全注意力还有一段路。


主要参考文献

Arnuv Tandon, Karan Dalal, Xinhao Li, et al. End-to-End Test-Time Training for Long Context. arXiv:2512.23675.
官方代码: https://github.com/test-time-training/e2e
论文主页: https://arxiv.org/abs/2512.23675

长上下文别再死磕缓存了,TTT-E2E把“边读边学”这条路走通了。想继续看这类能落地、讲得清、还带实验细节的论文,欢迎加入龙哥读论文星球/微信群,一起把大模型、机器人和前沿论文拆开看明白。扫描二维码或添加龙哥助手微信:kangjinlonghelper,备注“研究方向+地点+学校/公司+昵称”即可。

转发文章 微博 X LinkedIn Facebook
龙哥读论文 · PaperDaily

本文基于龙哥读论文 PaperDaily 数据库整理,结合论文原文与工程视角进行解读。