[研究/模型] Flint:无损压缩推理过程

Reddit r/LocalLLaMA 论文

摘要

本研究引入了针对推理轨迹的章节感知压缩,训练模型舍弃填充性叙述,同时保留计算和验证片段,在比原始推理少用2-3倍词元的情况下,达到或超越原始准确率。

TLDR:我使用自蒸馏生成的压缩推理轨迹训练了Qwen3.5-4B和gemma-4-12b;该压缩是章节感知的(保留计算和验证片段,舍弃/压缩填充、叙述和过渡)。这些模型匹配甚至大幅超越原始模型,同时使用的词元减少了2-3倍。完整的研究、模型和代码均已公开。 章节感知压缩示意图 嗨!在过去的几个月里,我一直在探索推理压缩:我构建了数据集,训练了(许多)LoRA,对它们进行了基准测试,并最终撰写了我的发现。我研究的主要结果: - **平面压缩导致贪婪解码失败**:将整个推理轨迹压缩成一种简洁风格并以此训练,导致模型在温度为0时对93%的GSM8K问题陷入循环(准确率0.03),而且通常是在得到正确答案之后立即开始循环。同一个检查点在从这些循环失败中挖掘的子集上,温度为1.0时得分0.90,因此模型并没有遗忘任何东西;它只是无法终止。 - **章节感知压缩有效,且优于未压缩的SFT**:如果你保留模型进行计算和验证的片段(以其自身的语言),仅压缩/删除它们之间的叙述,准确率会提升:与未压缩的SFT对照组相比,GSM8K上提升+0.15,推理词元减少约1.7倍。模型不仅将计算片段视为“工作记忆”,还将其视为终止的锚点。 - **系统提示的“含义”取决于训练**:对原始模型而言,“请逐步推理……”意味着更深入地思考;对经过压缩训练的模型而言,它充当效率触发器(有提示时准确率0.82,约1.5k词元;无提示时约0.63,约3.4k词元)。使用提示进行训练也会产生对提示的依赖(在MATH-500上可见),因此最佳方案是:在没有系统提示的情况下训练,在服务时加入提示。 - **你可以让压缩成为一个开关**:使用一个描述压缩风格的恒等提示进行训练,将这种行为绑定到该提示上:提示开启=简洁推理(约1.9k词元时准确率0.80),提示关闭=模型解压缩回约4.1k词元,准确率正常。 - **更强的教师模型反而更糟**:使用更大的模型来分割/转换推理轨迹产生了更干净的数据(更多lint通过),但模型效果比未压缩的SFT更差。关键在于推理轨迹要保持接近模型自身的分布。 - **“代码税”遵循数据而非领域**:Qwen的代码推理轨迹几乎全是计算,因此章节感知压缩几乎未触及它们,而且压缩训练延长了代码思考时间,并在HumanEval/MBPP上损失约0.13。而在Gemma上,相同的方案对代码压缩最为激进,HumanEval几乎翻倍(从0.31到0.57)。模型会复现其训练时每个领域的推理轨迹长度。这具有迁移性。 - **完整的流水线在gemma-4-12b-it上重新运行**(参数数量增加3倍,不同系列/分词器):GSM8K准确率0.86,词元1,679,而原始模型为0.57,词元3,753,并且压缩分支在每个采样温度下都胜出,而不仅仅是贪婪解码。 所有这些都故意保持小规模(每个分支322-648个训练行,每个分支约1.5个3090小时),这使得大约15个分支的消融网格得以承担,但也意味着这些数字不一定是最优的。一个约1.5k行的分支已经排队,并且计划构建一个25-30k行的版本;如果你有闲置算力并希望看到这项研究大规模运行,请与我联系!我欢迎建议和讨论,欢迎在下方评论或直接联系我! 你可以在以下链接找到所有内容: 完整报告 🤗 模型 + 数据集(主集合) 🤗 消融分支 代码(流水线 + 实验日志)
查看原文

相似文章

压缩-蒸馏:面向高效知识蒸馏的推理轨迹压缩

Hugging Face Daily Papers

本文提出在知识蒸馏前对推理轨迹进行压缩,以降低计算成本和推理长度。实验表明存在准确率与效率的权衡:压缩轨迹保留了原始轨迹最多96%的准确率,同时每token效率提升高达18倍。

通过推理空间压缩的结构化理由蒸馏

arXiv cs.CL

本文提出了 D-RPC,一种通过将推理路径压缩为可复用库,从而将大型语言模型的推理能力蒸馏给较小模型的方法,该方法在数学和常识基准测试中实现了更好的性能和一致性。