Stable-DiffCoder:推动代码扩散大语言模型的前沿 Stable-DiffCoder: Pushing the Frontier of Code Diffusion Large Language Model
通过块扩散持续预训练,使扩散语言模型在代码任务上超越自回归基线
前置知识
自回归语言模型(AR)
自回归语言模型是当前主流的语言建模范式,其核心思想是将序列的联合分布按从左到右的顺序分解为条件概率的连乘积,即 $p_\theta(x_{1:N}) = p_\theta(x_1) \prod_{i=2}^{N} p_\theta(x_i | x_{<i})$。模型通过最大化 token 级别的交叉熵损失来训练,本质上是给定前面的所有 token 预测下一个 token。Transformer 架构中的 GPT 系列和各类代码专用大模型(如 Seed-Coder、Qwen2.5-Coder)都是典型的自回归模型。虽然自回归模型在代码生成任务上取得了优异的成绩,但其严格从左到右的顺序解码方式无法充分利用代码的非顺序特性——开发者在实际编程中经常需要回填缺失的代码段、根据后续上下文修改前面的代码、以及并行生成独立的代码块。
本文的出发点是对比自回归模型和扩散模型在相同数据和架构下的性能差异,理解 AR 模型的训练范式是理解本文研究动机和方法设计的基础
掩码扩散语言模型(DLLM)
掩码扩散语言模型是一类非自回归的语言生成方法,受视觉领域连续扩散模型的启发而设计。其核心机制是通过一个前向加噪过程逐步将 token 替换为 [MASK] 标记,然后训练一个去噪器来反向重建原始文本。训练时,模型对序列中的 token 施加随机掩码,学习根据未被掩码的上下文来预测被掩码的 token,其训练损失可以简化为加权交叉熵形式:$\mathcal{L}_{\text{DLLM}}(\theta) = -\mathbb{E}[w(t) \sum_{i} \mathbb{1}[x_t^i = \text{MASK}] \log p_\theta(x_0^i | x_t^{1:N})]$。这种训练方式使模型能够非顺序地、并行地生成 token,同时通过多样化的掩码模式对同一样本进行重复利用,从而实现数据增强效果。
本文提出的 Stable-DiffCoder 正是基于掩码扩散语言模型的框架,理解 DLLM 的训练机制和损失函数是理解本文技术创新的前提
块扩散(Block Diffusion)
块扩散是掩码扩散语言模型的一种变体,它不是对整个序列施加随机掩码,而是在每一步仅对一个连续的 token 块(block)进行扩散操作,周围的上下文则保持干净。这种方式使得去噪器学习在几乎未被腐蚀的前缀条件下去生成一个跨度。相比完全双向扩散,块扩散保留了更多干净的推理证据,使训练上下文分布 $C_{\text{train}}$ 更接近推理时的上下文分布 $C_{\text{infer}}$,从而提高了训练-推理的对齐程度。本文采用块大小为 4 的设置,这是一种介于纯自回归(块大小为 1)和完全双向扩散之间的折中方案。
块扩散是本文方法的核心架构选择,论文通过大量实验证明小块扩散在知识压缩效率和训练稳定性上优于大块和双向扩散
持续预训练(Continual Pretraining, CPT)
持续预训练是指在已有的预训练模型基础上,针对特定领域或任务继续进行预训练的策略。本文中,研究者从 Seed-Coder 的退火前检查点出发,在 1.3T token 的代码数据上进行持续预训练。CPT 的关键优势在于可以复用已有模型已学到的通用知识表示,同时通过针对性的训练数据让模型适应新的领域分布。本文的 CPT 策略包含两个关键设计:一是从 AR 模型开始先高效压缩新知识,然后切换到扩散目标进行 CPT;二是在 CPT 过程中引入专门的 warmup 机制以稳定训练过程。
CPT 是本文方法论的核心训练策略,论文证明从 AR 检查点出发的 CPT 路径比直接训练扩散模型更高效,这一发现对扩散语言模型的训练范式有重要指导意义
Token 推理知识(Token Reasoning Knowledge)
Token 推理知识是本文提出的一个理论概念,用于刻画不同掩码模式下模型能学到的有效知识量。给定一个上下文 $c$ 和目标 token $x_i$,候选集 $C(c) = \{v \in \mathcal{V} : p_0(v|c) \geq \varepsilon\}$ 的大小 $K(c)$ 决定了学习难度。论文将学习难度分为三个定性区间:推理区间($K(c)$ 小,映射几乎确定)、关联区间($K(c)$ 中等或大,目标只是众多合理候选之一)、噪声区间($K(c)$ 非常大,上下文几乎不包含关于目标的信息)。自回归和小块扩散的训练上下文通常处于推理区间,而完全双向或大块扩散容易产生落入关联或噪声区间的上下文。
这一概念为论文选择小块扩散而非大块或双向扩散提供了理论基础,解释了为什么某些扩散设置下的训练效率反而低于自回归模型
训练-推理对齐(Training-Inference Alignment)
训练-推理对齐是指模型在训练时接触的上下文分布 $C_{\text{train}}$ 与推理时遇到的上下文分布 $C_{\text{infer}}$ 的匹配程度。如果两者分布差异较大,即使训练阶段高效压缩了知识,这些知识在推理时也无法被有效利用。例如,使用块大小为 $B$ 的块扩散训练并用左到右块级解码(块大小为 $B$)推理时,推理上下文与训练上下文高度匹配,使得学到的 token 推理知识能直接应用于测试。论文强调这是设计训练管线时必须满足的两个条件之一:不仅要高效学习知识,还要确保学到的知识在推理场景下可用。
这一概念是本文训练管线设计的核心指导原则,解释了为什么论文推荐先 AR 训练再小块扩散 CPT 的两阶段策略
研究动机
基于扩散的语言模型(DLLM)在代码生成领域的发展面临一个核心困境:尽管扩散式训练通过随机掩码和重建机制提供了丰富的数据增强效果,并具有非顺序并行生成的理论优势,但现有的代码 DLLM 在可比训练预算下仍然落后于强大的自回归(AR)基线模型。例如,LLaDA-8B-Base 在 HumanEval 上仅达到 35.4%,远低于 Seed-Coder-8B-Base 的 77.4%;DiffuCoder-7B-Base 达到 67.1%,Dream-7B-Base 为 56.7%,均与顶级 AR 模型存在显著差距。更深层的问题在于,先前的工作往往同时改变数据、架构和训练管线三个变量,使得研究者无法确定扩散训练模式本身是否能在固定数据和计算预算下真正提升模型能力。此外,随机掩码产生的许多上下文模式落入关联区间甚至噪声区间,这些上下文中正确答案被弱约束甚至误导,导致训练信号被稀释。
本文的目标是本文的核心目标是在严格控制变量的条件下,系统性地研究如何让扩散模型更高效地学习新知识,并验证扩散式训练能否在相同数据、架构和计算预算下超越自回归训练的代码建模质量。具体而言,研究者希望回答一个中心问题:在固定数据和计算预算的条件下,扩散引入的额外训练模式能否切实提升模型的代码理解和生成能力?为了回答这个问题,他们提出了 Stable-DiffCoder,一个复用 Seed-Coder 架构、数据和训练管线的块扩散代码模型,通过精心设计的训练策略实现超越 AR 对应模型的性能。
与已有工作不同的是,本文的独特切入角度体现在三个层面:第一,在理论层面,论文提出了 Token 推理知识的概念框架,将不同掩码模式下的学习效率与候选集大小 $K(c)$ 联系起来,为训练策略选择提供了理论指导;第二,在实验层面,论文在 2.5B 规模上进行了系统的控制实验,比较了三种训练路径(AR 到 BiDLLM、ARDLLM 到 BiDLLM、直接 BiDLLM),发现先 AR 训练再小块扩散 CPT 的策略在知识压缩效率上最优;第三,在方法层面,论文不是简单地将视觉领域的扩散技术迁移到语言模型,而是针对 DLLM CPT 的特有挑战(训练不稳定、噪声调度不适合小块设置)设计了专门的解决方案,包括 corruption warmup 和块感知裁剪噪声调度。这种从理论分析到实验验证再到技术设计的完整闭环是本文区别于先前工作的核心特征。
核心方法
Stable-DiffCoder 的方法设计遵循一条清晰的技术路线:首先通过理论分析建立评估不同训练模式效率的框架(Token 推理知识),然后在 2.5B 规模上通过控制实验确定最优的训练路径,最后针对小块扩散 CPT 的特有挑战设计两项关键技术改进。直觉上,扩散式训练通过多样化的掩码模式对同一样本进行重复利用,相当于一种隐式的数据增强,但这种增强并非总是有效的——当掩码模式导致上下文信息不足时,模型只能学到噪声关联。因此,方法的核心思想是:先用自回归训练高效压缩新知识(确保知识在干净上下文中被可靠学习),再通过小块扩散 CPT 利用数据增强特性进一步提升模型质量,同时通过专门的技术设计确保训练过程的稳定性和噪声调度的合理性。
本文的核心创新点在于对扩散语言模型训练效率的理论分析和由此导出的实用训练策略。与已有方法的本质区别体现在:第一,论文将扩散训练的学习效率形式化为 Token 推理知识的压缩问题,指出不同掩码模式产生不同大小的候选集 $K(c)$,只有 $K(c)$ 较小的推理区间上下文才能高效学习,而随机掩码容易产生落入关联区间和噪声区间的上下文,导致学习效率降低甚至学到错误关联;第二,基于这一理论洞察,论文提出两阶段训练策略——先用 AR 训练高效压缩知识,再用小块扩散 CPT 利用数据增强特性——这与先前直接训练双向扩散模型或同时改变多个变量的做法形成鲜明对比;第三,针对 CPT 过程中的训练不稳定问题和小块设置下噪声调度不匹配的问题,分别设计了 corruption warmup 和块感知裁剪噪声调度两项专门技术。
方法步骤详情
Stable-DiffCoder 的训练包含以下几个关键步骤:(1)初始化:从 Seed-Coder 的退火前 AR 检查点出发,保留已学到的通用代码知识表示。(2)块扩散持续预训练(CPT):使用块大小为 4 的块扩散目标,在 1.3T token 的代码数据上进行持续预训练。在此阶段,每一步随机选择一个连续的 4-token 块进行掩码,周围上下文保持干净,模型学习根据干净上下文预测被掩码的 token。(3)Corruption Warmup:在 CPT 开始时,不直接采样 $t \sim U(0,1)$ 的全范围腐蚀级别,而是从一个很小的最大腐蚀级别 $u_{\max}$ 开始,线性增长到 1,同时在 warmup 阶段去掉损失权重 $w(t)$,避免梯度尖峰。(4)块感知裁剪噪声调度:对采样的时间步 $t$,定义块感知掩码率 $u_{\text{blk}}(t) = \min(1, \max(u(t), 1/B))$,确保每个块中期望被掩码的 token 数 $\mathbb{E}[m|t] = B \cdot u_{\text{blk}}(t) \geq 1$;若采样后块中无 token 被掩码,则强制掩码一个位置。(5)监督微调(SFT):完全复用 Seed-Coder 的 SFT 数据集,沿用相同的打包策略,每个样本后随机附加 1-4 个 eos token 以保持生成变长输出的能力。
技术新颖性
本文的技术新颖性体现在多个层面:理论贡献上,论文首次将扩散语言模型的学习效率形式化为 Token 推理知识的压缩问题,定义了推理、关联、噪声三个定性区间,为训练策略选择提供了可操作的理论框架,这一分析框架对理解扩散语言模型的训练动态具有普遍价值。训练策略上,论文通过 2.5B 规模的控制实验系统比较了三种训练路径,发现在相同计算预算下 AR 到 BiDLLM 的路径在小块解码设置下始终最优,这一实证发现对扩散语言模型的训练范式设计有重要指导意义。技术实现上,Corruption Warmup 通过从低腐蚀级别线性增长的方式实现从几乎 AR 到完全 DLLM 的平滑过渡,避免了修改注意力掩码(这对 FlashAttention 等高性能算子不友好);块感知裁剪噪声调度通过简单的裁剪规则解决了小块设置下大量训练步产生零学习信号的问题,这两种技术的组合使得 DLLM CPT 的训练稳定性达到了与 AR CPT 相当的水平。
实验结果
Stable-DiffCoder 的实验结果系统性地证明了扩散式训练在代码建模上的有效性。在基础模型评估中,Stable-DiffCoder-8B-Base 在 HumanEval 上达到 79.3%(Seed-Coder-8B-Base 为 77.4%,提升 1.9 个百分点),HumanEval+ 上为 73.8%(对比 68.3%,提升 5.5 个百分点),MBPP 上为 83.6%(对比 82.0%,提升 1.6 个百分点)。在多语言代码生成方面,Stable-DiffCoder 在 C# 和 PHP 等低资源语言上取得显著提升,MultiPL-E 平均分从 67.6% 提升至 71.2%,其中 C# 从 53.8% 跃升至 70.3%,PHP 从 63.9% 提升至 74.4%,论文将此归因于扩散式随机采样对低资源代码的有效学习信号放大。在 CRUXEval 代码推理任务上,Output-CoT 从 54.8% 提升至 60.0%,表明扩散训练增强了结构化代码推理能力。在指令微调模型评估中,Stable-DiffCoder-8B-Instruct 在 MHPP 上达到 42.4%(对比 Seed-Coder 的 36.2%,提升 17.1%),在 CanItEdit 代码编辑任务上达到 60.0%(对比 50.5%,提升 18.8%),在 BigCodeBench 全集上为 54.8%(对比 53.3%),MBPP 上为 85.7%(对比 85.2%),HumanEval 上为 86.6%(对比 84.8%)。总体而言,Stable-DiffCoder 在几乎所有的基准测试上都超越了其 AR 对应模型 Seed-Coder,建立了 8B 规模扩散代码模型的新最优结果。
查看结构化数据
| 任务 | 指标 | 本文 | 基线 | 提升 |
|---|---|---|---|---|
| HumanEval(基础模型) | pass@1 | 79.3% | Seed-Coder-8B-Base: 77.4% | +1.9pp |
| HumanEval+(基础模型) | pass@1 | 73.8% | Seed-Coder-8B-Base: 68.3% | +5.5pp |
| MBPP(基础模型) | pass@1 | 83.6% | Seed-Coder-8B-Base: 82.0% | +1.6pp |
| MultiPL-E 平均(基础模型) | pass@1 | 71.2% | Seed-Coder-8B-Base: 67.6% | +3.6pp |
| CRUXEval Output-CoT(基础模型) | 准确率 | 60.0% | Seed-Coder-8B-Base: 54.8% | +5.2pp |
| HumanEval(指令模型) | pass@1 | 86.6% | Seed-Coder-8B-Instruct: 84.8% | +1.8pp |
| HumanEval+(指令模型) | pass@1 | 82.3% | Seed-Coder-8B-Instruct: 78.7% | +3.6pp |
| MBPP(指令模型) | pass@1 | 85.7% | Seed-Coder-8B-Instruct: 85.2% | +0.5pp |
| MBPP+(指令模型) | pass@1 | 72.8% | Seed-Coder-8B-Instruct: 71.2% | +1.6pp |
| MHPP(指令模型) | pass@1 | 42.4% | Seed-Coder-8B-Instruct: 36.2% | +6.2pp(+17.1%) |
| BigCodeBench 全集(指令模型) | pass@1 | 54.8% | Seed-Coder-8B-Instruct: 53.3% | +1.5pp |
| BigCodeBench Hard(指令模型) | pass@1 | 31.8% | Seed-Coder-8B-Instruct: 26.4% | +5.4pp |
| CanItEdit(指令模型) | pass@1 | 60.0% | Seed-Coder-8B-Instruct: 50.5% | +9.5pp(+18.8%) |
| CRUXEval Output-CoT(指令模型) | 准确率 | 69.0% | Seed-Coder-8B-Instruct: 67.1% | +1.9pp |
| LiveCodeBench v5(指令模型) | pass@1 | 23.5% | Seed-Coder-8B-Instruct: 24.7% | -1.2pp |
| MBXP 平均(指令模型) | pass@1 | 75.3% | Seed-Coder-8B-Instruct: 75.3% | 持平 |
局限与改进
论文在结论部分坦诚地指出了几个重要局限性:第一,Stable-DiffCoder 主要聚焦于代码领域,缺乏来自其他领域的大规模训练数据,因此在数学推理和通用文本任务上的表现可能相对有限,论文明确提出文本扩散采样能否在更广泛领域提供更大收益仍是一个开放问题。第二,模型的性能提升部分依赖于 Seed-Coder 架构和训练管线的复用,扩散训练相对于 AR 训练的增量改进(在 HumanEval 上约 1.9pp,在 HumanEval+ 上约 5.5pp)虽然一致但幅度有限,尚不清楚这种改进在更大规模模型或更长训练中是否能持续放大。第三,在 Aider 多轮编辑基准上,Stable-DiffCoder 略弱于 Seed-Coder,论文将此归因于训练时使用的 8192 token 上下文窗口不足以处理 Aider 任务中跨轮次拼接产生的超长上下文。第四,LiveCodeBench 上的轻微下降(-1.2pp)表明扩散训练在某些需要最新编程竞赛知识的任务上可能没有明显优势。此外,从独立观察者的角度看,论文在 2.5B 规模上的控制实验结果是否能直接外推到 8B 规模仍需进一步验证;Corruption Warmup 和块感知噪声调度的超参数敏感性也未被充分讨论。
独立分析的弱点
尽管 Stable-DiffCoder 取得了令人印象深刻的结果,但仍存在几个值得关注的弱点:第一,增量改进的幅度有限——在很多基准上,提升只有 1-2 个百分点(如 HumanEval +1.9pp、MBPP +1.6pp),这些改进在实际应用中可能不够显著,尤其是在考虑到扩散训练引入的额外复杂性和计算开销的情况下。改进方向:可以探索更大的块扩散大小(论文已在 2.5B 规模上比较了不同块大小,但最终模型仅用块大小 4),或者结合混合精度训练和更高效的注意力实现来降低扩散训练的计算开销。第二,模型在某些任务上出现了性能下降(LiveCodeBench -1.2pp、Aider 上略弱),表明扩散训练并非在所有场景下都优于 AR 训练。改进方向:需要进一步分析哪些类型的编程任务更适合 AR 训练、哪些更适合扩散训练,可能的解决方案是根据任务特性动态选择解码策略。第三,论文的理论分析框架(Token 推理知识)虽然有启发性,但仍是定性分析而非严格的定量理论,候选集大小 $K(c)$ 的实际计算在大规模模型上不切实际。改进方向:可以尝试在小规模模型上实际计算不同掩码模式下的 $K(c)$ 分布,为训练策略设计提供更精确的指导。第四,SFT 阶段完全复用 Seed-Coder 的数据,没有针对扩散模型的特性设计专门的微调策略。改进方向:可以探索在 SFT 阶段引入编辑和补全任务的数据增强,进一步发挥扩散模型在 infill 式任务上的优势。
未来方向
论文和基于其成果可以延伸出多个有价值的研究方向:第一,探索扩散式训练在更广泛领域的应用,特别是数学推理和通用文本任务,这是论文明确提出但未解决的问题。扩散式随机掩码的数据增强效果是否能在需要严格逻辑推理的数学任务上发挥作用,值得深入研究。第二,将训练路径优化(先 AR 再小块扩散 CPT)推广到更大的模型规模(如 30B、70B),验证在更大计算预算下扩散训练的边际收益是否持续增加。第三,探索自适应块大小策略——在训练初期使用小块(如 4)以高效压缩知识,在训练后期逐渐增大块大小以提升并行解码能力,类似于课程学习的思路。第四,将扩散模型的非顺序生成能力与推理时的搜索策略(如 beam search、MCTS)结合,探索扩散模型在需要全局规划的复杂代码生成任务上的潜力。第五,针对低资源编程语言的提升效果,进一步研究扩散式数据增强在多语言代码迁移学习中的作用机制。第六,优化推理效率,虽然论文聚焦于训练质量,但扩散模型的并行解码能力是其重要优势,需要在保证质量的前提下最大化推理速度。
复现评估
从复现的角度看,本文提供了相对良好的条件:论文明确提供了 GitHub 项目页面和 HuggingFace 模型页面,代码和模型权重均已开源。训练数据方面,论文复用了 Seed-Coder 的训练管线和 1.3T token 的代码数据,SFT 阶段也完全复用 Seed-Coder 的数据集,这些数据集在 Seed-Coder 的原始论文中有详细描述。架构方面,模型基于 Seed-Coder-8B 的架构,使用块大小为 4 的块扩散,上下文长度为 8192。算力需求方面,虽然论文未明确给出训练所需的 GPU 小时数,但从 1.3T token 的 CPT 规模和 8B 参数量来看,预计需要数百到数千 A100/H100 GPU 小时,这对学术研究机构可能存在一定门槛。主要的复现挑战在于:(1)Corruption Warmup 和块感知噪声调度的具体超参数设置(如 warmup 步数、初始腐蚀级别)在论文中给出了公式但未在实验设置部分给出具体数值;(2)打包策略中每个样本后随机附加 1-4 个 eos token 的实现细节需要从代码中确认;(3)评估使用了 EvalPlus 的 chat-style 提示模板,复现时需要确保提示格式完全一致。总体而言,本文的复现难度中等,开源的代码和模型权重大大降低了复现门槛。
论文图表