令人惊讶简单的自蒸馏改进代码生成 Embarrassingly Simple Self-Distillation Improves Code Generation
LLM仅通过训练自己的原始输出即可大幅改进代码生成能力
前置知识
知识蒸馏
知识蒸馏是一种模型压缩技术,通常使用一个较大的教师模型来指导较小的学生模型学习。学生模型通过模仿教师模型的输出来获得接近教师的性能,同时保持模型较小。在传统的知识蒸馏中,教师模型通常经过验证且质量较高,学生通过最小化与教师输出的 KL 散度来学习。
本文的自蒸馏是知识蒸馏的一个变体,但关键区别在于没有外部教师模型,模型使用的是自己生成的、未经验证的输出。理解传统蒸馏有助于理解 SSD 方法的独特之处。
温度采样
温度采样是一种控制生成多样性的解码策略。给定模型的原始概率分布 p(v),温度采样通过 p_T(v) 正比于 p(v) 的 1/T 次方重新缩放分布。当温度 T 大于 1 时,概率分布变得平坦,低概率 token 的相对概率上升,生成更随机;当 T 小于 1 时,分布更尖锐,高概率 token 的优势扩大,生成更确定。截断则只保留概率最高的前 k 个或累积概率达到阈值 p 的 tokens。
SSD 的核心机制依赖于训练时和推理时使用不同的温度配置,理解温度如何影响 token 分布对理解 SSD 的精度-探索冲突分析至关重要。
Pass@k 指标
Pass@k 是代码生成领域的标准评估指标。对于每个问题,模型生成 k 个不同的代码解决方案,如果至少有一个通过所有测试用例,则该问题算作通过。Pass@k 等于在所有问题中通过的比例。Pass@1 衡量模型第一次尝试的准确性,Pass@5 衡量多次尝试的覆盖能力。
论文中所有实验结果都使用 LiveCodeBench 基准的 pass@1 和 pass@5 指标,理解这些指标的含义有助于准确评估 SSD 的实际效果。
支持压缩和分布重塑
支持压缩是指在训练过程中,模型被引导将概率质量集中到更小的 token 子集上,削减低概率的尾部质量。分布重塑是指在保留的 token 集合内部,调整它们的相对概率,使分布形状发生变化。SSD 的损失可以分解为三个项:第一项驱动支持压缩,第二项重塑头部,第三项保持与基模型对齐。
这是论文理论分析的核心,解释了为什么 SSD 能够同时提高精度和保留多样性,是理解 SSD 机制的关键。
研究动机
现有的 LLM 代码生成改进方法面临严重约束。人工标注的解决方案成本高昂,大规模数据采集难以持续。合成数据管道要么需要更强的教师模型,存在天花板限制,要么需要为每个训练问题执行代码验证,操作复杂。基于强化的方法虽然有效,但训练不稳定且计算成本高昂。近期基于内在奖励的无监督方法,如多数投票或熵最小化,显示出初步潜力,但面临奖励劫持问题,在长时间训练后会出现性能崩溃。作者观察到,在 2025-2026 年的代码生成基准上,高质量监督信号的供应已成为关键瓶颈,这使得探索完全不依赖任何外部验证信号的方法变得紧迫和重要。
本文的目标是本文的目标是回答一个根本性问题:大语言模型能否在不使用任何外部标注数据、验证器、教师模型、奖励模型或强化学习的情况下,仅通过自己的原始输出来改进代码生成能力?如果答案是肯定的,那么需要理解这种简单方法为什么有效,以及它通过什么机制实现性能提升。作者希望通过系统实验和理论分析,展示自蒸馏的有效性,并深入解释其工作机制,为 LLM 代码生成提供一个新的、更简单的改进方向。
与已有工作不同的是,本文的独特切入角度在于极简主义。现有工作要么依赖外部信号,如教师、验证器、执行反馈,要么使用复杂的强化学习框架。作者反其道而行,探索最简单的方法:模型只用自己的、未经验证的输出进行标准监督微调。这种方法的创新性在于它打破了需要高质量训练数据的直觉,提出即使模型自己生成的代码可能包含错误,通过合适的温度和截断配置,仍然可以提取出有用的学习信号。更关键的是,作者通过精度-探索冲突这一新概念,从理论层面解释了为什么这种看似不合理的方法实际有效,这是以往工作未曾深入分析的视角。
核心方法
简单自蒸馏的核心思想极其直观:让模型通过温度采样生成自己的训练数据,然后用标准监督微调在这些数据上训练。直觉上,虽然训练数据未经验证且可能包含错误,但高温度采样会改变 token 的概率分布形状,这种分布变化本身就携带了关于哪些位置需要精度、哪些位置需要多样性的信号。技术路线上,SSD 分为三个阶段:数据合成使用温度和截断配置从冻结的基模型采样候选解;训练阶段使用标准交叉熵损失在生成的数据集上微调;推理时使用评估配置从微调后的模型解码。整个流程无需任何验证信号。
SSD 的核心创新点在于提出并验证了精度-探索冲突机制,即代码生成中存在两种矛盾的位置类型。锁位置是语法和语义几乎不模糊的地方,如 if n 等于后必须接特定值,模型知道正确答案但低概率干扰尾部仍然存在,这里需要精度。叉位置是多个延续都真正可行的地方,如函数体开头可能用 for 循环、递归调用或数据结构初始化,各自导致不同的解决方案,这里需要探索。SSD 的本质区别在于它不是简单地均匀锐化模型,而是上下文依赖地重塑分布:在锁位置,训练截断强烈压缩支持,使主导 token 更难被替代;在叉位置,多个可行延续保留在支持内,通过温度调整使它们更均匀。这解释了为什么训练后可以使用更高的评估温度,锁已经变得更安全,因此有更多余地探索分叉。
方法步骤详情
SSD 的完整流程分为三个明确的步骤。数据合成:给定冻结的预训练 LLM 和一组提示,使用指定的训练温度和截断配置,包括 top-k 和 top-p,对每个问题采样 N 个候选解决方案。这些解决方案不经过任何形式的验证,包括代码执行、测试用例或正确性过滤。只进行最小程度的语法过滤,移除空响应和单行存根。在实验中,N 等于 1,即每个提示单个样本,已经足够。训练:使用标准监督微调在 SSD 数据集上微调模型。优化使用 AdamW,余弦衰减学习率,峰值学习率为 5 乘以 10 的负 6 次方,全局批量大小 32,序列长度 65536。Instruct 模型训练 2500 次迭代,Thinking 模型 300 次迭代。学习率分别在前 250 和 50 次迭代预热。推理:微调后的模型部署时使用评估解码配置,从模型采样最终解决方案。
技术新颖性
SSD 的技术新颖性体现在多个方面。首先,它是最简形式的自蒸馏,不需要教师模型、验证器、奖励信号或执行反馈,仅通过温度偏移的自样本训练,这与现有的需要外部信号的自训练方法形成鲜明对比。其次,论文提出的理论分析是新颖的,将 SSD 的损失分解为支持压缩和内部支持重塑两个分量,并证明了这两者在锁和叉位置上产生不同的效果。第三,精度-探索冲突是一个新的概念框架,解释了为什么固定解码配置无法同时满足代码生成中的精度需求和探索需求。第四,论文展示了一个令人惊讶的现象:即使训练数据大部分是乱码,约 62% 无法提取代码,SSD 仍然能改进模型,这挑战了需要正确训练数据的常识,表明 SSD 主要学习的是 token 质量信号而非程序正确性。最后,论文通过控制模拟和真实模型分析相结合的方式验证机制,这种多层次验证也具有方法学上的新颖性。
实验结果
SSD 在所有评估模型上都产生了显著的性能提升。在 LiveCodeBench v6 上,Qwen3-30B-Instruct 的 pass@1 从 42.4% 提升到 55.3%,增加 12.9 个百分点,相对提升 30.4%。其他模型的提升包括:Llama-8B 增加 3.5 个百分点,Qwen3-4B-Instruct 增加 7.5 个百分点,Qwen3-4B-Thinking 增加 3.3 个百分点,Qwen3-30B-Thinking 增加 2.1 个百分点,GPT-OSS-20B 增加 5.3 个百分点。更难的问题上提升更明显:Qwen3-30B-Instruct 在简单问题增加 6.5 个百分点,中等问题增加 14.2 个百分点,困难问题增加 15.3 个百分点。Pass@5 的提升通常比 pass@1 更大,表明 SSD 保留了多样性。例如 Qwen3-30B-Instruct 在困难问题上的 pass@5 从 31.1% 提升到 54.1%,增加 23.0 个百分点。评估温度扫描实验表明,仅通过调整基模型的解码温度只能获得有限的提升,对于 Qwen3-30B-Instruct,pass@1 范围仅 2.2 个百分点,而 SSD 仍然超过最佳调优的基模型,困难问题 pass@1 领先 13.3 个百分点。超参数分析显示,无截断情况下性能由有效温度 Ttrain 乘以 Teval 支配,最优值在 1.2 附近;使用截断可以进一步提高性能天花板。最令人惊讶的是,即使在 Ttrain 等于 2.0 且禁用截断的病态设置下,SSD 仍然将模型提升到 48.1% pass@1,增加 5.7 个百分点,和 64.0% pass@5,增加 10.5 个百分点,困难问题 pass@1 提升 7.3 个百分点。
查看结构化数据
| 任务 | 指标 | 本文 | 基线 | 提升 |
|---|---|---|---|---|
| LiveCodeBench v6 代码生成 | pass@1 | 55.3% (Qwen3-30B-Instruct + SSD) | 42.4% (Qwen3-30B-Instruct 基模型) | +12.9 百分点 (+30.4% 相对提升) |
| LiveCodeBench v6 困难问题 | pass@1 | 33.6% (Qwen3-30B-Instruct + SSD) | 18.3% (Qwen3-30B-Instruct 基模型) | +15.3 百分点 |
| LiveCodeBench v6 困难问题 | pass@5 | 54.1% (Qwen3-30B-Instruct + SSD) | 31.1% (Qwen3-30B-Instruct 基模型) | +23.0 百分点 |
| LiveCodeBench v6 所有模型平均 | pass@1 提升 | +5.6 百分点(六模型平均) | 各模型基模型性能 | 从 +2.1pp 到 +12.9pp 不等 |
| LiveCodeBench v5 | pass@1 | 54.3% (Qwen3-30B-Instruct + SSD) | 45.8% (Qwen3-30B-Instruct 基模型) | +8.5 百分点 |
局限与改进
作者承认的局限性包括:SSD 目前仅在代码生成领域进行验证,尚未证明能泛化到其他领域,如自然语言生成。论文提到在数学推理、一般代码生成和代码理解等基准上的评估显示性能大致稳定,但没有详细报告具体数字。截断参数,即 top-k 和 top-p 的选择仍需网格搜索,缺乏自动化的参数选择方法。SSD 使用固定全局解码策略,未来可能需要探索上下文自适应的解码方法。我观察到的额外局限:SSD 的提升量取决于基模型能力,较弱模型可能提升有限。训练数据质量问题,即乱码,虽然不影响性能提升,但可能影响训练效率,使达到相同性能需要更多迭代。论文主要关注 pass@1 和 pass@5 指标,没有深入分析其他如代码正确性、执行时间、资源消耗等实际部署关心的指标。SSD 在更小规模模型,即小于 4B 上的表现尚未充分探索,这可能影响在资源受限环境中的应用。最后,论文没有比较 SSD 与其他自训练方法在相同条件下的直接效果,如简单过滤后的自样本训练。
独立分析的弱点
SSD 的第一个显著弱点是超参数敏感性。论文中需要进行网格搜索来确定最优的训练温度、评估温度和截断配置,这增加了部署复杂度。实际应用中,不同任务和模型可能需要不同的最优配置,缺乏通用的自动化选择方法。改进方向是开发自适应超参数选择策略,可能基于模型的内部指标,如验证集上的性能趋势或模型输出的熵分析,来自动调整。第二个弱点是领域特异性。SSD 主要在代码生成上验证,其机制依赖于代码的结构特性,即锁和叉位置,在其他领域的泛化能力不明确。改进方向包括在更多领域,如数学推理、文本摘要、对话生成,系统评估 SSD,并分析这些领域是否存在类似的结构冲突,以及 SSD 如何适应这些不同的任务特性。第三个弱点是训练效率问题。论文显示,在病态数据设置下,SSD 的性能提升出现在训练后期形成一条山脊,而非早期的快速提升,这表明可能需要更多训练迭代。改进方向包括研究如何更高效地利用自生成的数据,例如通过重要性采样或课程学习来逐步提高数据质量。
未来方向
作者提出的未来方向包括:将 SSD 扩展到代码生成以外的领域,探索精度-探索冲突是否存在于其他任务中。开发自动化的超参数选择框架,减少对网格搜索的依赖。探索上下文自适应的解码策略,根据模型对不同位置的置信度动态调整温度和截断参数。基于论文成果可以延伸的方向包括:将 SSD 与其他方法结合,例如先用 SSD 进行基础改进,再用强化学习进行精细优化。研究 SSD 在多轮迭代中的应用,即重复应用 SSD 是否会产生持续的性能提升或最终饱和。探索 SSD 在模型对齐和安全方面的应用,因为类似的分布重塑机制可能有助于减少有害输出。从理论角度,可以进一步研究支持压缩和分布重塑的数学性质,例如最优支持大小和重塑强度如何依赖于任务特性和模型容量。另一个方向是研究 SSD 对模型校准的影响,因为更干净的分布头部和更弱的尾部可能会改善模型的置信度估计。
复现评估
论文提供了较完整的开源支持。代码实现已在 GitHub 发布,这为社区复现提供了直接途径。论文附录详细描述了实验设置,包括提示格式、解码配置、训练超参数等。使用的数据集是 rSTARcoder 的种子子集,去重后约 10K 独特的竞技编程问题,这个数据集是公开的。训练使用 Megatron-LM 框架,在 8 乘以 B200 GPU 上进行,对 MoE 模型使用 EP 等于 8。这是一个较高的计算资源要求,可能限制部分研究者的复现能力。论文没有提供预训练的 SSD 模型检查点,这意味着复现者需要自行进行训练,这将需要相当的 GPU 资源和训练时间。论文中提到的训练迭代次数,Instruct 模型 2500 次,Thinking 模型 300 次,结合序列长度 65536 和全局批量大小 32,估计需要数十到数百个 GPU 小时。总体而言,开源和详细文档使得复现是可行的,但资源门槛较高,社区复现可能需要云 GPU 或高性能计算集群的支持。
论文图表