语言必须离散吗?从何恺明 ELF 到南大 AURORA-LM,连续扩散语言模型的底层革命
语言必须离散吗?从何恺明 ELF 到南大 AURORA-LM,连续扩散语言模型的底层革命
2026 年 8 月 8 日,南京大学模式识别实验室联合南洋理工、帝国理工发布 AURORA-LM:一个完全在**昇腾 NPU** 上训练、扩展到约 10 亿参数的连续扩散语言模型。这距离何恺明团队提出 ELF(Embedded Language Flows)仅仅三个月。两条几乎同时出现的路线,共同指向同一个底层命题:**语言建模真的必须建立在"预测下一个 token"的自回归范式上吗?** 本文从数学本质出发,拆解连续扩散语言模型"为什么能行"以及"为什么以前不行"。

一、问题起点:自回归范式的三堵墙
ChatGPT 背后的 next-token prediction 统治了语言模型近十年,但它的底层代价正在被算清:
• **推理墙**:生成必须逐 token 串行,长文本延迟与长度线性增长,很难并行;
• **依赖墙**:因果掩码让每个 token 只能"回望",双向上下文、填空、纠错这类任务天然不擅长;
• **对齐墙**:训练目标是 token 级交叉熵,而人类真正关心的是句级语义质量,两者存在结构性 gap。
扩散模型在图像、视频上的成功让研究者开始反思:离散 token 究竟是语言的本质,还是只是历史惯性? 于是"扩散语言模型(DLM)"诞生,又分两派:
• **离散派**(MDLM、LLaDA、Dream-7B):在 token 空间定义扩散过程,用 MASK 还原 token;
• **连续派**(Diffusion-LM、CDCD 等):把 token 映射到连续 embedding 空间去噪,最后再转回 token。
过去两年离散派一直占上风,原因很简单——语言是离散的。连续派被反复吊打,何恺明团队却给出了相反的诊断:问题不是"语言必须离散",而是前人没有让连续路线"连续到底"。
二、ELF:把去噪全程留在连续空间
2026 年 5 月,何恺明团队(MIT)发布 ELF,核心思想一句话:扩散过程全程在连续 embedding 空间里走完,只在最后一步才把结果翻译成 token。
此前连续派失败的原因:Diffusion-LM 每一步都要算 token 级交叉熵,把连续轨迹硬绑在词表上(per-step discretization);latent diffusion 类方法则要额外训一个 decoder。这相当于用铅笔打草稿的人,每写一笔都要立刻誊到正式稿纸上——模型根本没机会真正在连续语义里"揉"。ELF 把这些全部砍掉:
1. token → 连续:用预训练 T5 encoder 生成双向 contextual embedding(推理时不额外增加模块);
2. 连续空间去噪:采用 Flow Matching 的 rectified flow——t=0 是高斯噪声,t=1 是干净 embedding,中间是线性插值;
3. x-prediction 而非 v-prediction:沿袭团队半年前《Back to Basics》的思路,网络直接预测干净 embedding x 而不是速度场 v。高维空间中 x-prediction 更稳定,且天然对齐最后一步"预测干净 token"的目标;
4. 最后一步才离散化:denoiser 和 decoder 共享同一套参数,靠一个二值 mode token 区分"去噪模式/解码模式",最后用可学习的 unembedding 矩阵 W 投出 token logits,训练目标为标准交叉熵。
为什么要 x-prediction?论文给出两个理由:第一,token embedding 通常是 768 维甚至更高的高维向量,直接预测目标值 x 比预测速度场 v 在高维空间更稳定、训练收敛更容易;第二,x-prediction 天然与最后一步"预测干净 token"的目标对齐。实验也验证了:一旦 denoiser 和 decoder 共享权重,v-prediction 的效果会明显变差。
这套极简设计的效果:仅 105M 参数、45B 训练 token、32 步采样,OpenWebText 生成困惑度压到 24,跑赢了一批需要 500B+ token、1024 步的离散扩散模型,还把图像领域的 CFG(classifier-free guidance)原封不动搬了过来——用 self-conditioning 作为条件信号,套上 training-time CFG(一次 forward 模拟两次推理,没有额外 inference 开销)。
Flow Matching 训练的 PyTorch 核心逻辑(ELF 风格):
import torch
import torch.nn.functional as F
def flow_matching_loss(model, x_clean, t, sigma=1.0):
"""x_clean: [B, L, D] 连续 embedding; t: [B] 在 (0,1) 均匀采样"""
z0 = torch.randn_like(x_clean) # t=0: 高斯噪声
zt = (1 - t[:, None, None]) * x_clean + t[:, None, None] * z0 # rectified flow 插值
x_pred = model(zt, t) # x-prediction: 直接预测干净 embedding
return F.mse_loss(x_pred, x_clean) # 全程连续空间,无 per-step discretization
推理时 Euler 采样,仅在最后一步切到 decode 模式:
def sample(model, L, steps=32, D=768):
z = torch.randn(1, L, D) # 从噪声出发
for i in range(steps):
t = 1 - i / steps
x_pred = model(z, t * torch.ones(1), mode="denoise")
z = z + (x_pred - z) / steps # 沿预测方向推进
logits = model(z, torch.ones(1), mode="decode") # 最后一步离散化
return logits.argmax(-1)
三、AURORA-LM:高容量 latent + 分块因果扩散
如果说 ELF 的答案是"极简",那么南大 AURORA-LM(Autoencoding Unified Representation for Continuous-Latent Diffusion Language Modeling)的答案则是"分层":先用自编码器构造语义充分的连续 latent,再用扩散模型学这个 latent 的分布。
核心洞察:连续语言生成的关键不是扩散本身,而是 latent 序列怎么构造——它既要保留足够信息让 decoder 准确映射回完整文字,又不能难到扩散模型学不动。AURORA-LM 拆成两步:
第一步:带前缀结构的高容量自编码器。 latent 按前缀顺序组织——位置越靠后的 latent 能读到越长的 token 前缀,解码某个 token 时也只能用对应的 latent 前缀,从而保留了文本从左到右展开的结构。训练时随机丢弃部分 token 增强解码鲁棒性。
第二步:分块因果扩散模型(Chunked Causal Diffusion)。 latent 序列切成块,块间用从左到右的因果注意力掩码,块内用双向注意力联合去噪。推理时块间顺序生成、KV cache 复用前缀计算结果,块内可并行同步输出——这是连续扩散相对自回归的天然优势:并行解码。
def chunked_causal_sampling(model, enc, prefix_tokens, chunk_len=64, steps=32):
"""分块因果扩散: 块间因果 + KV cache 复用, 块内双向联合去噪"""
cond = enc(prefix_tokens) # 条件文本 -> 干净 latent 前缀
kv_cache = None
generated = []
while len(generated) < max_len:
z = torch.randn(chunk_len, cond.shape[-1])
for i in range(steps): # 块内联合去噪
t = 1 - i / steps
x_pred = model(z, t, kv=kv_cache, cond=cond)
z = z + (x_pred - z) / steps
clean = z
generated.append(clean)
kv_cache = update_kv(kv_cache, clean) # 前缀 KV 复用, 无需重复计算
return decode(torch.cat(generated))
关于"高容量 latent"的权衡。 latent 维度越高,噪声扰动下保留的可解码文本信息越多,生成质量越好;但扩散模型要从带噪状态恢复更高维的干净 latent,学习目标也更难。实验发现两个关键策略:适度收窄带噪输入维度(bottleneck)和提高训练时高噪声状态的概率,能极大提升最终生成质量。
少步采样怎么防误差累积? 训练时模型面对的是独立采样的带噪 latent,推理时却要沿着自己的预测连续推进,误差会沿轨迹滚雪球。AURORA-LM 引入自轨迹一致性(self-trajectory consistency):先用当前带噪 latent 得到干净估计,据此推进到相邻的更低噪声状态,再让 EMA 模型重新预测,约束两次预测一致:
def self_trajectory_consistency(model, ema_model, z_t, t, t_prev):
x_hat = model(z_t, t) # 当前状态预测干净 latent
with torch.no_grad(): # 停止梯度
z_prev = z_t + (x_hat - z_t) * (t - t_prev) # 推进到相邻低噪声状态
x_hat_ema = ema_model(z_prev, t_prev) # EMA 模型再预测
loss_ctc = F.mse_loss(x_hat, x_hat_ema.detach()) # 两次预测保持一致
loss_fm = F.mse_loss(x_hat, x_clean) # 主 flow-matching 损失
return loss_fm + w_ctc * loss_ctc # 共同优化
四、成绩单与更远的意义
• **自由生成**:OpenWebText 上 Gen-PPL **23.56**、MAUVE **0.890**,两项均为表中最佳(ELF-B 为 24 左右);
• **条件摘要**:XSum 上 ROUGE-1/2/L = **36.6 / 13.4 / 28.9**,三项全部最高;
• **规模验证**:扩散结构扩展至约 1B 参数、累计约 1500 EFLOPs 训练量,九项语言基准平均 **32.6**,超过参数更大的公开连续语言模型;
• **国产算力**:全部实验在**昇腾 NPU** 上完成,验证了连续扩散路线在国产 AI 算力平台上的训练与扩展可行性。
更深远的意义在于多模态统一:长期以来"文本离散、图像/视频连续"被视为统一多模态的天然障碍。ELF 和 AURORA-LM(以及字节同期的 Cola DLM)证明了文本可以映射到连续语义 latent,为文本与图像、视频、音频真正进入同一个连续世界铺平了道路。独立开发者和小团队也第一次看到:或许过去几年烧在 LLM 训练上的钱里,相当一部分被错误的归纳偏置浪费了。
五、小结
ELF 告诉我们:连续扩散不 work 不是连续本身不行,是之前每走一步都要回头跟词表"交差";把 per-step discretization 砍掉,图像扩散验证过的最佳实践原封不动搬过来即可。AURORA-LM 则补上了更工程化的一环:高容量 latent 怎么构造、少步采样怎么防误差、块间并行怎么落地。而字节同期的 Cola DLM 走的是"语义与实现分层"的另一条路——latent prior 生成潜在语义、decoder 负责翻译成文字,扩散/flow matching 全程发生在 latent 空间而非 token 空间。三份工作彼此独立,却共享同一个判断:建模应该发生在最适合语言本质的表示空间里,不要被"token=语义"这个默认框架限定。
对工程师而言,这条路意味着什么?
• **并行解码**:连续扩散天然支持块内并行生成,长文本推理延迟有机会从 O(L) 降到 O(L/块长),这是自回归架构给不了的;
• **训练数据效率**:ELF 用 45B token 达到别人 500B+ token 的效果,如果这条路 scale 到百亿千亿参数,LLM 训练的算力门槛会被显著拉低;
• **多模态统一**:文本进入连续 latent 世界后,与图像、视频、音频共享同一套生成框架成为可能——统一多模态最深的卡点正在被拆除;
• **国产算力验证**:AURORA-LM 全部实验在昇腾 NPU 上完成并扩展到 1B 规模,说明这条新范式不是英伟达的专利,国产 AI 算力平台完全可以承接前沿研究。
当然也要冷静:连续扩散模型目前还远不能替代 GPT-5 级别的自回归模型,1B 规模与万亿参数之间隔着巨大的工程鸿沟;自回归的生态、工具链、对齐技术积累也是多年量级的护城河。但方向已经清晰——当"语言必须离散"这条被默认了二十年的底层假设开始松动,语言模型的下一轮范式转移可能已经开始了。
论文:ELF (arXiv:2605.10938) / AURORA-LM (arXiv:2608.02602)
代码:github.com/lillian039/ELF · github.com/fyv587/AURORA-LM
更多推荐




所有评论(0)