推理模型详细的推理步骤意味着更长的输出序列,这给基于 Transformer 架构的 LLM 带来了巨大的内存和计算压力。具体来说,注意力机制的计算成本会随着上下文长度的增加而呈二次方增长,同时,用于存储中间状态的 KV 缓存(KV Cache)也线性增长,消耗大量内存资源。 这使得在资源受限的环境中部署高性能的推理模型变得困难,同时也增加了模型的推理延迟。

为了应对这一挑战,来自浙江大学和蚂蚁集团的研究人员联合提出了一种名为 LightThinker 的新方法。 该方法受人类认知过程的启发,旨在让 LLM 在进行推理时,能够动态地“压缩”其冗长的中间思维步骤,将关键信息提炼并固化,然后“遗忘”掉原始的、冗余的推理过程,从而在保持高推理准确率的同时,显著提升效率。

1. 背景

1.1 LLM 推理模式的演进

LLM 的推理模式经历了从“快思”(Fast Thinking)到“慢想”(Slow Thinking)的演变。“快思”模式下,模型接收到问题后直接给出答案,这个过程快速但容易出错,尤其是在需要多步逻辑的复杂问题上。

为了提升模型的推理能力,研究者们借鉴了人类认知中的“系统2思维”,提出了“慢想”模式。其核心思想是“三思而后行”,通过生成详细的中间步骤来分解复杂问题。Chain-of-Thought (CoT) 是其中的典型代表,它通过提示(prompting)引导模型输出详细的解题步骤。后续的研究,如 Self-Correction、Tree-of-Thoughts 等,进一步引入了试错、回溯和修正等更复杂的推理能力,使得模型的“慢想”过程更加精细和强大。

1.2 “慢想”的代价

“慢想”模式带来的性能提升是显著的,但这背后是高昂的资源开销。当前的 LLM 主要基于 Transformer 架构,其核心是自注意力机制(Self-Attention)。这个机制的计算复杂度和内存占用都与输入序列的长度(即上下文长度)密切相关:

  1. 计算复杂度:自注意力机制的计算复杂度为 ,其中 是序列长度, 是模型维度。这意味着上下文越长,生成下一个 token 所需的计算量就越大,导致推理延迟增加。
  2. 内存瓶颈 (KV Cache) :为了加速推理,LLM 会将已经计算过 token 的键(Key)和值(Value)向量存储在 GPU 内存中,这被称为 KV Cache。KV Cache 的大小与上下文长度成正比。当推理链变得非常长时,KV Cache 会占据大量的显存。论文中提到,对于 Qwen32B 这样的模型,当上下文长度达到 10,000 个 token 时,KV Cache 所占用的空间几乎与模型本身相当。

这严重限制了 LLM 在长文本生成和复杂推理任务中的实际应用。

1.3 现有解决方案及其局限性

为了缓解这一问题,学术界和工业界已经探索了多种解决方案,主要可以分为两大类:

  • 免干预方法:这类方法通过提示工程或特定的模型训练,引导 LLM 生成更少甚至零中间 token。它们的优点是在推理过程中不需要额外的干预,但通常需要精心设计和构建训练数据,并且可能会牺牲一部分推理的严谨性。
  • 实时干预方法:这类方法在推理的每一步,都通过特定的策略来判断哪些历史 token 的 KV Cache 是重要的并保留下来,丢弃其余部分。例如,H2O (Heavy Hitter Oracle) 策略会保留注意力得分较高的 token。 这类方法的挑战在于,逐个 token 地进行重要性评估会引入额外的计算开销,可能反而增加推理延迟。

1.4 LightThinker

LightThinker 的提出正是基于对现有方法局限性的思考,其设计灵感源于两个核心观察:

  1. LLM 生成内容的双重功能:LLM 在生成思维链时,其输出的 token 可以分为两类。一类是承载核心逻辑的“关键推理 token”(如下图 a 中的黄色高亮部分),另一类是为了保证文本流畅性和可读性的“冗余 token”。这为压缩提供了可能性。
  2. 人类的认知过程:当人类解决一个复杂问题时,通常只会在纸上写下最关键的几个步骤或公式,而大量的中间思考、验算和逻辑转换过程则是在大脑中完成并“压缩”成结论。

基于此,LightThinkar 的核心思想应运而生:能否让 LLM 模拟人类的这种“思考-记录-遗忘”模式,在生成一个完整的思维步骤后,将其动态地压缩成一个紧凑的表示,然后丢弃原始的、冗长的 token 序列,仅带着这个“记忆胶囊”继续进行下一步的推理?

LightThinker 与传统 CoT 的推理过程对比
LightThinker 与传统 CoT 的推理过程对比

如上图 b 所示,LightThinker 在生成 Thought 1 后,会将其压缩成一个紧凑的表示 C T1,并丢弃原始的 Thought 1。后续 Thought 2 的生成将完全依赖于问题和 C T1,从而显著减少了上下文窗口中存储的 token 数量。

2. LightThinker 模型详解

为了实现上述构想,LightThinker 需要解决两个核心问题:何时压缩(When to compress)如何压缩(How to compress)。 LightThinker 创新地通过特殊的数据构建和巧妙的注意力掩码(Attention Mask)设计,让模型在标准的“下一个词预测”训练任务中自己学会这两个能力。

2.1 何时压缩?

论文探讨了两种不同的压缩时机策略:

  • Token-level(Token 级别):在生成了固定数量的 token 之后就执行一次压缩。例如,每生成 6 个 token 就压缩成 2 个。这种方法实现简单,但可能会破坏一个完整思想的语义边界。
  • Thought-level(思想级别):在一个完整的思想单元(如一个句子或一个段落)结束后再进行压缩。这种方法能更好地保留语义信息,但需要定义如何分割“思想”。在实验中,作者使用了简单的“\n\n”(双换行符)作为思想的分割标志。

实验结果表明,Thought-level 的策略在性能上优于 Token-level,因为它更好地尊重了推理过程的语义完整性。

2.2 如何压缩?—— 隐藏状态压缩

对于如何压缩,论文也探讨了两种思路:

  • 文本压缩:将当前的思维步骤通过另一个模型(或模型自身)总结成一段更短的文本。这种方法会增加额外的计算开销。
  • 隐藏状态压缩 (Hidden State Compression) :将当前思维步骤中所有 token 的隐藏状态(hidden states)压缩到少数几个特殊的“gist tokens”(核心标记)的隐藏状态中。

LightThinker 采用了后者,因为它不需要引入额外的模型,更加高效。模型需要学习的是,如何将一个长序列的语义信息有效地编码进这几个固定的 gist tokens 中。

2.3 实现

LightThinker 的实现精髓在于其数据重构和注意力掩码的设计。

1. 数据重构 (Data Reconstruction)

为了教会模型何时进行压缩,研究者对原始的训练数据进行了重构。具体来说,他们在一个完整的输出序列 Y 中,根据分割函数(如双换行符)将其切分为多个思想单元 S1, S2, ..., Sk。然后,在相邻的思想单元之间插入一组特殊的 token:

Y' = {S1, <w>, C, [o], S2, <w>, C, [o], ..., Sk}

这里的特殊 token 包括:

  • <w>:一个可选的压缩触发符,显式地告诉模型需要压缩前面的 S1
  • C:一组特殊的 token,被称为 cache tokensgist tokens。它们的数量是固定的(例如,|C|=9)。这组 token 的作用是作为“容器”,用来存储 S1 被压缩后的信息。
  • [o]:一个强制的输出 token,它的作用是“读取” C 中存储的压缩信息,并基于这些信息生成下一个思想单元 S2

通过在这样的数据上进行训练,模型会逐渐学会识别思想的边界,并在生成 C[o] 时执行相应的压缩和生成操作。

2. 基于思维的注意力掩码 (Thought-based Attention Mask)

数据重构教会了模型“做什么”,而注意力掩码则精确地定义了“怎么做”。LightThinker 设计了特殊的注意力规则,来控制压缩和生成过程中的信息流。

LightThinker 的注意力掩码机制
LightThinker 的注意力掩码机制

上图展示了 LightThinker 在训练和推理过程中的注意力机制,与传统的全注意力(图 a)形成对比:

  • 压缩阶段 (Compression):当模型生成 cache tokens C(i) 时(用于压缩思想 Si),注意力掩码被设置为使其只能关注以下三部分内容:

    1. 原始问题 X
    2. 所有历史的压缩内容 {C, [o]}(<i)
    3. 当前正在被压缩的思想 Si
      通过这种方式,C(i) 被迫学习如何将 Si 的核心信息,在 X 和历史信息的上下文中,有效地编码到自己的隐藏状态里。
  • 生成阶段 (Generation):当模型生成输出 token [o](i) 时(用于开启下一个思想 Si+1 的生成),注意力掩码被设置为使其只能关注

    1. 原始问题 X
    2. 到目前为止所有的压缩内容 {C, [o]}(<=i)
      重要的是,此时 [o](i) 无法看到刚刚被压缩的原始思想 Si。这强制模型必须学会仅仅依赖压缩后的表示 C(i) 来进行后续的推理。

这种“解耦(decouple)”的设计是 LightThinker 的一个关键创新。它将压缩(由 C token 负责)和基于压缩内容的生成(由 [o] token 负责)两个功能清晰地分离开来,使得模型的学习目标更明确,效果也更好。

2.4 与 AnLLM 的对比

论文特别将 LightThinker 与一个类似的工作 AnLLM 进行了比较。AnLLM 也采用压缩思想,但其设计存在两个不同:

  1. 耦合的生成与压缩:在 AnLLM 中,一个 token 同时承担了压缩历史信息和生成未来内容两个任务,这使得学习过程更加困难。LightThinker 通过 C[o] 的解耦设计解决了这个问题。
  2. 压缩时的上下文可见性:AnLLM 在压缩时,只能看到当前需要压缩的思想单元,而无法看到原始问题 X 和之前的压缩历史。LightThinker 则允许在压缩时看到更完整的上下文,这有助于模型更好地理解和提炼当前思想的重要性。

消融实验证明,LightThinker 的这两点设计改进都带来了显著的性能提升。

3. 创新的评估指标:Dependency (Dep)

在评估模型压缩方法时,一个常用的指标是“峰值 token 数量”(Peak Tokens),即推理过程中上下文窗口达到的最大长度。然而,作者指出这个指标对于像 LightThinker 这样的动态压缩方法可能存在误导性。例如,LightThinker 的峰值内存可能只在某个瞬间出现,而像 H2O 这样的方法则会持续维持在一个较高的内存水平。

为了更公平、更全面地衡量压缩效果,论文提出了一个全新的指标:Dependency (Dep)

3.1 Dep 指标的定义与几何解释

Dependency 被定义为在整个生成过程中,每个新生成的 token 所依赖(即在注意力计算中关注)的历史 token 数量的总和

不同方法下的上下文长度与 Dependency 关系
不同方法下的上下文长度与 Dependency 关系

上图直观地展示了 Dep 指标的几何意义。如果我们将上下文长度作为 y 轴,生成的 token 数量作为 x 轴,那么 Dep 值就等于这条曲线下方的面积。

  • 对于Vanilla 模型(无压缩),上下文长度线性增长,曲线是一个梯形。
  • 对于 H2O 等静态方法,上下文长度会增长到一个上限 Lc 然后保持不变,曲线是一个梯形加一个矩形。
  • 对于 LightThinker 等动态方法,上下文长度会周期性地增长和骤减,曲线呈锯齿状。

Dep 值越低,意味着在整个推理过程中,模型平均依赖的历史信息越少,也即“有效压缩率”越高。

3.2 Dep 指标的意义

Dep 指标提供了一个统一的框架,用于公平比较不同类型的压缩方法(无论是动态的还是静态的)。它衡量的是整个推理过程的累计信息依赖,而不是某个瞬间的峰值状态,因此能更准确地反映一个方法的压缩效率。

4. 实验与结果分析

研究人员在 Qwen2.5-7BLlama3.1-8B 两个模型上,以及 GSM8K(数学)、MMLU(综合能力)、GPQA(高难度问答)和 BBH(逻辑推理)四个数据集上对 LightThinker 进行了全面的评估。

主要实验结果
主要实验结果

4.1 主要结果解读

从上方的结果表格中,我们可以得出几个关键结论:

  1. 效率与性能的平衡:LightThinker (ours (tho.)) 在四个指标上取得了出色的平衡。以在 Qwen 模型上的平均结果为例,相比于 Vanilla(无压缩)模型,LightThinker 在准确率仅下降约 1% 的情况下,将推理时间减少了 26%,峰值 token 数减少了 70%,Dep 值降低了 78% 。 这意味着它实现了约 4.5 倍的有效压缩率。
  2. 优于其他基线:与 H2O 相比,LightThinker 在达到相似压缩率(相似的 Dep 值)的同时,推理时间更短,准确率也更高。与 AnLLM 相比,LightThinker 在准确率和推理速度上都展现出优势。
  3. 思想级别压缩的优越性ours (tho.)(思想级别)的性能明显优于 ours (token)(Token 级别),证明了保留语义完整性对于复杂推理的重要性。

4.2 效率深度分析

  • 更少的生成 Token:一个有趣的发现是,LightThinker 是所有加速方法中,唯一一个生成的总 token 数少于 Vanilla 模型的。这可能是因为压缩过程促使模型生成更精炼、信息密度更高的内容,从而减少了不必要的冗余表达,这也是其推理速度更快的原因之一。
  • 长文本生成优势:在长文本生成任务的测试中,LightThinker 的优势更加明显。当生成 32K 长度的文本时,其推理时间相比 Vanilla 减少了 44%,峰值 token 使用量减少了 85%。
  • 任务相关的压缩率:实验发现,模型的压缩频率与任务难度相关。像 GSM8K 这样的简单任务,压缩次数较少,压缩比较高;而像 GPQA 这样的复杂任务,模型需要更频繁地进行压缩,以保留更多的中间信息。

4.3 案例分析:数值敏感性问题

GSM8K 上的一个失败案例
GSM8K 上的一个失败案例

论文也展示了一个来自 GSM8K 的失败案例。在这个案例中,模型在“思考”(Model's Thoughts)阶段的推理是完全正确的,最终得出了正确答案 14000。然而,在输出最终的“解答”(Model's Solution)时,却因为一次压缩过程中的信息丢失(将 "8000" 和 "4000" 错误地压缩了)而导致了计算错误,得出了 18000。

这个案例揭示了当前 LightThinker 方法的一个局限性:压缩机制对于数值这类精确信息的敏感度不足。在压缩过程中,模型可能无法完美保留所有的数字,导致在后续依赖这些数字的计算中出错。


往期文章: