1. 离散扩散模型的核心挑战与突破
在自然语言处理领域,生成模型长期被自回归方法主导。这类模型通过顺序预测token的方式生成文本,虽然效果显著但存在三个根本性缺陷:采样速度受限于序列长度、难以实现灵活的生成控制(如文本填充)、以及需要复杂的退火技术来保证生成质量。扩散模型在连续数据领域(如图像生成)取得巨大成功后,研究者们自然希望将其优势迁移到离散数据领域,但传统方法面临两大技术瓶颈:
首先,连续扩散依赖的分数匹配理论(score matching)在离散空间无法直接应用。连续空间的梯度概念(∇ₓlog pₜ)在离散域没有对应物,必须寻找新的数学工具。现有尝试要么采用迂回的均值预测方法(类似DDPM),导致训练目标模糊;要么使用比率匹配(ratio matching),但面临计算复杂度爆炸的问题。
其次,离散扩散的逆转过程缺乏有效的参数化方法。连续扩散可以通过神经网络直接预测分数函数,而离散扩散需要建模所有可能状态转移的概率比值(pₜ(y)/pₜ(x))。传统ℓ²损失函数无法保证比值的正定性,导致训练不稳定。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 分数熵:离散扩散的理论基础
2.1 核心数学构造
我们提出分数熵(Score Entropy)作为离散空间的分数匹配替代方案。给定离散状态空间𝒳={1,...,N},定义具体分数(concrete score)为概率比值向量:
sₜ(x) = [pₜ(y)/pₜ(x)]_{y≠x} ∈ ℝ^
分数熵损失函数采用Bregman散度形式:
L_SE = 𝔼ₓ∼pₜ[∑_{y≠x} (sθ(x)ᵧ - (pₜ(y)/pₜ(x))·log sθ(x)ᵧ + K(pₜ(y)/pₜ(x)))]
其中K(a)=a(log a-1)为归一化项。这个设计具有三个关键特性:
- 正定性保证:对数项天然约束sθ(x)ᵧ>0
- 梯度重缩放:梯度信号按1/sθ(x)ᵧ缩放,避免小比值时的梯度爆炸
- 最优解一致性:当sθ(x)ᵧ→pₜ(y)/pₜ(x)时损失趋近于0
2.2 可扩展的训练方案
直接优化分数熵需要计算所有状态对的比值,对于语言模型(N=50257)显然不可行。我们通过两种技术突破这一限制:
结构化转移矩阵:采用分块对角矩阵Q=diag(Q₁,...,Q_d),每个子矩阵Qᵢ∈ℝ^{V×V}(V是词表大小)。这使得汉明距离为1的状态转移可分解为单token替换:
pₜ(x¹...x̂ⁱ...xᵈ)/pₜ(x¹...xⁱ...xᵈ) ≈ sθ(x)ᵢ,ₓ̂ⁱ
去噪分数熵:基于前向转移核pₜ|₀(x|x₀),将损失改写为:
L_DSE = 𝔼ₓ₀∼p₀,ₓ∼pₜ|₀[∑_{y≠x}Qₜ(x,y)(sθ(x)ᵧ - (pₜ|₀(y|x₀)/pₜ|₀(x|x₀))log sθ(x)ᵧ)]
实践中使用两种经典Q矩阵:
- 均匀矩阵:Qᵢⱼ=1(i≠j),对应所有token等概率转移
- 吸收矩阵:设置特殊[MASK]token作为吸收态
3. SEDD模型架构与优化
3.1 网络设计
我们采用扩散Transformer(Diffusion Transformer)架构,核心创新点包括:
- 时间嵌入:将扩散时间步t通过正弦编码注入每一层
- 位置感知:使用旋转位置编码(RoPE)捕获token位置信息
- 输出投影:最后一层输出d×V维矩阵,每个位置预测V个转移比值
python复制class SEDDBlock(nn.Module):
def __init__(self, dim, n_heads):
super().__init__()
self.time_proj = nn.Linear(1, dim)
self.attn = MultiHeadAttention(dim, n_heads)
self.mlp = nn.Sequential(
nn.Linear(dim, 4*dim),
nn.GELU(),
nn.Linear(4*dim, dim)
)
self.norm1 = nn.LayerNorm(dim)
self.norm2 = nn.LayerNorm(dim)
def forward(self, x, t):
# 时间条件注入
t_emb = torch.sin(self.time_proj(t))
x = x + t_emb
# Transformer块
x = x + self.attn(self.norm1(x))
x = x + self.mlp(self.norm2(x))
return x
3.2 训练关键技术
- 噪声调度:采用对数线性调度,使噪声强度σ(t)与预期token变化数成正比
- 序列打包:动态填充多个短句到一个固定长度块,提升GPU利用率
- 梯度裁剪:限制梯度范数在1.0以内,避免训练不稳定
关键技巧:在计算具体分数时,对sθ(x)ᵧ施加softplus激活(β=1.0)可进一步稳定训练,同时保持比值的正定性。
4. 高效采样算法
4.1 Tweedie τ-leaping
传统τ-leaping方法独立采样每个token的转移,效率低下。我们提出改进算法:
- 计算指数矩阵:exp(σₜQ) ∈ ℝ^
- 对每个位置i,计算调整后的转移概率:
p̃ = (exp(-σₜQ) @ sθ(x)ᵢ) ⊙ exp(σₜQ)[xⁱ,:] - 从多项式分布p̃采样新token
该算法在保持马尔可夫性质的同时,通过矩阵指数运算引入全局信息,通常只需32-64步即可达到2048步τ-leaping的效果。
4.2 可控生成技术
SEDD支持任意位置的提示生成(prompting),核心公式:
pₜ(xᴬ|ᴮ) ∝ pₜ(xᴬ⊕xᴮ)/pₜ(xᴬ₀⊕xᴮ)
其中ᴬ是待生成位置,ᴮ是提示位置,xᴬ₀是初始状态。具体实现时:
- 固定提示位置的token
- 仅对空白位置计算梯度更新
- 支持双向、中间填充等多种生成模式
python复制def conditional_sample(model, prompt_mask, steps=64):
x = torch.randn_like(prompt_mask) # 初始化
x[prompt_mask] = prompt_tokens
for t in linspace(1, 0, steps):
# 只计算非提示位置的分数
s = model(x, t)
s[prompt_mask] = 0
# 更新状态
x = update_with_Q(x, s, t)
return x
5. 实验分析与行业启示
5.1 语言建模性能
在One Billion Words基准测试中:
- SEDD-Absorb达到困惑度32.79,比D3PM提升2.36倍
- 相比GPT-2(31.98)仅有2.5%差距
- 训练效率:单卡A100上每秒处理1200token,与自回归模型相当
5.2 生成质量突破
- 无退火生成:SEDD的生成困惑度(由GPT-4评估)比未退火的GPT-2低6-8倍
- 计算权衡:用32步达到GPT-2质量,2048步时质量提升3.2倍
- 填充任务:MAUVE分数0.942,超过核采样GPT-2(0.955)的同时支持任意位置填充
5.3 行业应用方向
- 实时对话系统:32步采样实现200ms响应,比自回归快3倍
- 文档编辑辅助:支持"先写开头结尾,自动填充中间"的创新工作流
- 代码生成:在HumanEval基准上,填充模式比自回归的通过率高11%
实践建议:在部署SEDD时,建议初始阶段采用64步采样+均匀Q矩阵,在质量和延迟间取得平衡。对质量敏感场景可升级到256步+吸收Q矩阵。
6. 扩展讨论与未来方向
虽然SEDD展现出强大潜力,仍有优化空间:
- 动态转移矩阵:当前Q矩阵是固定的,可探索基于内容的动态Q学习
- 层次化扩散:先在句子级别扩散,再细化到token级别
- 多模态扩展:将离散扩散统一框架扩展到图像-文本联合生成
这项工作的核心价值在于证明了离散扩散可以突破自回归的垄断地位。我们开源了所有代码和预训练模型,期待社区共同推动这一方向的发展。对于从业者而言,现在正是探索离散扩散在具体业务场景中应用的最佳时机。
