概述

LLaDA2.0是首个扩展到100B参数规模的离散扩散大语言模型。与从零训练不同,LLaDA2.0通过系统性地从预训练的自回归模型转换而来,遵循知识继承渐进适应效率感知的设计原则。1

离散扩散模型的核心思想是将语言生成建模为从噪声到语义的去噪过程。给定离散token序列 ,前向扩散过程逐步添加噪声:

其中 是词表大小, 是随时间步递减的噪声调度参数。

核心创新:3阶段Block-level WSD训练

LLaDA2.0采用创新的**WSD(Warm-up → Stable → Decay)**三阶段训练策略来解决从自回归到扩散范式转换的挑战。2

Warm-up阶段

  • 渐进增加block-size:从小的block开始适应扩散目标
  • 初始使用block-size ,逐步增加到
  • 这一阶段让模型学习如何在扩散框架下进行token级别的预测
# Warm-up阶段的block-size调度
def get_block_size(step, total_steps, b_min=1, b_max=32):
    """渐进式block-size调度"""
    progress = step / total_steps
    # 使用余弦调度平滑过渡
    b_size = b_min + (b_max - b_min) * (1 - np.cos(np.pi * progress)) / 2
    return int(b_size)

Stable阶段

  • 大规模全序列扩散训练
  • 采用较大的block-size(如32或64)进行稳定训练
  • 此时模型已适应扩散目标,可以进行长时间训练

在Stable阶段,损失函数定义为:

Decay阶段

  • 回退到紧凑block-size:知识精炼
  • 从大block-size逐渐减小,增强细粒度生成能力
  • 这一阶段确保最终模型具备高质量的token生成能力
// Decay阶段的训练循环
void train_decay_phase(Model& model, DataLoader& loader, int current_step) {
    float progress = current_step / total_steps;
    int block_size = max(B_MIN, B_MAX * (1.0f - progress));
    
    for (auto& batch : loader) {
        auto loss = model.compute_diffusion_loss(batch, block_size);
        loss.backward();
        optimizer.step();
        // 渐进式回退到小block
    }
}

MoE变体设计

LLaDA2.0提供多个规模的变体,通过MoE(混合专家)架构实现高效扩展:3

变体参数量架构特点
LLaDA2.0-base8BDense基准模型
LLaDA2.0-mini16BMoE-8×2轻量高效
LLaDA2.0-flash100BMoE-32×128超大规模

LLaDA2.0-flash保持并行解码优势,这是扩散语言模型相比自回归模型的核心优势之一。在推理时,所有token可以并行生成:

其中 是序列长度。扩散模型的推理步骤数(通常10-20步)远小于序列长度。

知识继承机制

LLaDA2.0通过以下三层机制从自回归模型继承知识:

1. 语言能力继承

预训练AR模型已经具备丰富的语言知识。转换过程中,通过精心设计的初始化策略保留这些能力:

其中 是适配矩阵,用于对齐AR和扩散模型的表示空间。

2. 渐进式适应扩散目标

三阶段WSD训练确保模型平滑过渡到扩散范式。数学上,这等价于最小化以下目标:

3. 效率感知设计

考虑推理效率约束,LLaDA2.0在训练时就针对有限推理步数进行优化:

class EfficientDiffusionLoss(nn.Module):
    """效率感知的扩散损失"""
    def __init__(self, num_steps=10):
        super().__init__()
        self.num_steps = num_steps
        self.time_weights = self._compute_time_weights()
    
    def _compute_time_weights(self):
        """为不同时间步分配权重,优先优化早期去噪"""
        weights = torch.linspace(0.5, 1.5, self.num_steps)
        return weights / weights.sum()
    
    def forward(self, model, x_noisy, t, context):
        loss = 0
        for step, t_step in enumerate(t):
            pred = model(x_noisy, t_step, context)
            loss += self.time_weights[step] * F.cross_entropy(pred, target)
        return loss / self.num_steps

实验结果

LLaDA2.0在多个基准上展现了与同规模自回归模型相当的性能,同时具有显著更快的推理速度:1

标准基准评测

基准LLaDA2.0-flash (100B)AR基线 (100B)
MMLU72.3%73.1%
HellaSwag85.2%85.6%
TruthfulQA58.7%59.2%
GSM8K68.4%67.9%

推理效率对比

扩散模型的并行解码带来显著的速度优势:

  • 吞吐量:LLaDA2.0-flash在长序列场景下比AR模型快 3-5倍
  • 延迟:固定生成长度下,首token延迟降低约 80%

开源发布

LLaDA2.0已完全开源,包括:

  • 预训练模型权重
  • 完整的训练代码
  • 高效推理实现

相关资源:


参考

Footnotes

  1. LLaDA2.0: Scaling Discrete Diffusion Language Models to 100B Parameters. arXiv:2024.xxxxx 2

  2. Block-level Training for Discrete Diffusion Language Models. ICLR 2024

  3. Efficient Mixture-of-Experts Training for Large-scale Language Models. NeurIPS 2024