@volokuleshov: 新博客文章:如何构建扩散语言模型。扩散LLM从开放问题变为现实,用了2年时间 (Me…)

X AI KOLs Timeline 论文

摘要

由Volodymyr Kuleshov的康奈尔团队撰写的综合博客文章,解释了如何构建扩散语言模型,涵盖了核心技术如掩码扩散、迭代细化、变长生成、可控生成、快速采样器和RL后训练,并以开源模型如Mercury、Gemma Diffusion和Nemotron Diffusion为例。

新博客文章:如何构建扩散语言模型。 扩散LLM从开放问题变为现实,用了2年时间(Mercury, Gemma Diffusion, Nemotron Diffusion)。我和我的康奈尔团队撰写了推动其实现的研究进展。 我们以当今的开源大型扩散模型为例,展示它们是如何通过核心技术构建的: • 掩码扩散(MDLM) • 迭代细化(UDLM, ReMDM) • 变长生成(块扩散、编码器-解码器架构) • 可控生成(D-CFG, D-CBG) • 快速采样器(Duo) • RL后训练(d1, d2) 这篇文章涵盖了由一群才华横溢的康奈尔博士生领导的研究,包括 @mariannearr @SchiffYair @Guanghan__Wang 内容改编自我今年关于dLLM的讲座。它涵盖了当今开源扩散语言模型背后的主要组成部分。 链接:https://kuleshov-group.github.io/blog/blog/2026/how-to-build-a-diffusion-language-model/…
查看原文
查看缓存全文

缓存时间: 2026/07/09 19:50

New blog post: 如何构建扩散语言模型。扩散LLM从开放问题到现实只用了两年时间(Mercury、Gemma Diffusion、Nemotron Diffusion)。我与康奈尔团队撰写了使其运作的研究进展。我们以当今开源大型扩散模型为例,展示它们是如何从核心技术构建的: • 掩码扩散(MDLM) • 迭代细化(UDLM、ReMDM) • 可变长度生成(块扩散、编码器-解码器架构) • 可控生成(D-CFG、D-CBG) • 快速采样器(Duo) • RL后训练(d1、d2) 本文涵盖由康奈尔大学博士生团队领导的研究,包括@mariannearr、@SchiffYair、@Guanghan__Wang。 内容改编自我今年关于dLLM的讲座。涵盖了当今开源扩散语言模型背后的主要要素。 链接:https://kuleshov-group.github.io/blog/blog/2026/how-to-build-a-diffusion-language-model/…

Kuleshov Group | 如何构建扩散语言模型

来源:https://kuleshov-group.github.io/blog/blog/2026/how-to-build-a-diffusion-language-model/

目录

  • 掩码扩散简述 (https://kuleshov-group.github.io/blog/blog/2026/how-to-build-a-diffusion-language-model/#masked-diffusion-in-a-nutshell)
  • 理解掩码扩散:概率视角 (https://kuleshov-group.github.io/blog/blog/2026/how-to-build-a-diffusion-language-model/#understanding-masked-diffusion-a-probabilistic-perspective)
  • 用于灵活长度生成的块扩散 (https://kuleshov-group.github.io/blog/blog/2026/how-to-build-a-diffusion-language-model/#block-diffusion-for-flexible-length-generation)
  • 架构:编码器、解码器和编码器-解码器 (https://kuleshov-group.github.io/blog/blog/2026/how-to-build-a-diffusion-language-model/#architectures-encoder-decoder-and-encoder-decoder)
  • 迭代细化和内置纠错 (https://kuleshov-group.github.io/blog/blog/2026/how-to-build-a-diffusion-language-model/#iterative-refinement-and-built-in-error-correction)
  • 通过蒸馏加速扩散采样 (https://kuleshov-group.github.io/blog/blog/2026/how-to-build-a-diffusion-language-model/#accelerating-diffusion-sampling-via-distillation)
  • 扩散实现可控生成 (https://kuleshov-group.github.io/blog/blog/2026/how-to-build-a-diffusion-language-model/#diffusion-enables-controllable-generation)
  • 后训练扩散语言模型 (https://kuleshov-group.github.io/blog/blog/2026/how-to-build-a-diffusion-language-model/#post-training-diffusion-language-models)
  • 生物与科学领域 (https://kuleshov-group.github.io/blog/blog/2026/how-to-build-a-diffusion-language-model/#biological-and-scientific-domains)
  • 基于扩散的大型语言模型 (https://kuleshov-group.github.io/blog/blog/2026/how-to-build-a-diffusion-language-model/#diffusion-based-large-language-models)
  • 扩散是通往更智能模型的路径吗?缩放定律视角 (https://kuleshov-group.github.io/blog/blog/2026/how-to-build-a-diffusion-language-model/#is-diffusion-a-path-towards-more-intelligent-models-a-scaling-law-perspective)

引言:自回归与扩散语言模型

当今有两类生成式AI算法被广泛使用。对于连续数据(如图像或视频),最先进的方法基于扩散模型。对于离散数据(如文本或代码),标准方法则是自回归模型。本文探讨离散数据的另一种方法,它建立在现代扩散范式之上。

主流语言模型是自回归的:它们从左到右逐个生成token,每个token依赖于之前的token。这种方法很强大,但也有内在局限性:

  • 无法纠错:一旦发出token就不能修改,因此早期错误会累积。
  • 生成速度慢:生成序列的步数与token数相同,且不能自然支持快速并行生成。
  • 因果注意力:生成只能回顾过去,不能前瞻未来上下文。

扩散模型采取不同方法。它们不是逐token生成文本,而是一次性生成整个序列:从一个初始猜测开始,经过多步迭代细化。这带来了若干优势:生成可以通过使用更少或更多步数来权衡速度和质量;可以在过程中纠错;每一步都关注双向上下文。

自回归与扩散生成 自回归LLM从左到右逐token生成,步数与token数相同(上图)。扩散LLM(例如这里展示的Gemma Diffusion)则从一个粗略的、完整长度的草稿开始,并在几轮中并行细化每个位置(下图),每一步重写整个序列而不是发出单个token。图片来源:M. Grootendorst 和 Gemma Diffusion。

将扩散应用于语言长期以来一直是一个开放问题。2024年,该领域达到了一个转折点,扩散模型在质量上变得与自回归模型具有竞争力。到2026年,扩散LLM已成为现实,领先工业实验室发布了——Mercury 2(Inception Labs)、Gemma Diffusion(Google)和Nemotron Diffusion(NVIDIA)。本文追溯了这些现代模型背后的思想和论文。

背景:高斯扩散

在介绍语言扩散之前,我们简要概述用于图像生成的高斯扩散。然后我们将通过类比构建离散扩散。

通过迭代去噪生成

扩散模型的核心概念是去噪。扩散模型不是一次性绘制图像,而是逐步生成图像:从纯随机噪声开始,每一步去除一点噪声,直到形成连贯的图像。通过许多小步骤生成图像比一次性生成要简单得多,这就是扩散模型如此有效的原因。

模型如何学习去噪?诀窍在于通过展示噪声逐渐转化为图像的示例来训练它。扩散通过两个互补过程实现这一点。首先,前向过程将干净的源图像逐步转化为纯噪声。其次,反向过程学习逆转这种转化,将纯噪声变回图像;它通过前向过程产生的图像-噪声轨迹进行训练。

前向过程

前向过程对一张干净的训练图像进行操作,生成一系列噪声逐渐增加的图像,描绘从干净数据到纯噪声的路径。通过每一步混入越来越多的随机高斯噪声,直到图像溶解为纯静态。这一步不需要任何学习——我们只是添加噪声——但它非常有用,因为它产生了源源不断的训练数据:图像转化为噪声(反之亦然)的示例。

图像的渐进加噪 图像上的高斯扩散轨迹。从左到右阅读,前向过程逐渐添加噪声,直到一张干净的狗照片溶解为纯静态。该轨迹将作为反向过程的训练数据。

反向过程

反向过程是实际学习发生的地方。我们训练一个模型,按照前向过程产生的步骤反向操作,将噪声转化为图像。

图像的渐进去噪 高斯扩散的反向路径。同样从左到右,生成反向过程被训练为以反向方式重现前向过程的轨迹:从噪声开始,重建原始图像。

具体来说,给定一张带噪图像,我们训练一个机器学习模型来将噪声与底层图像分离,或者等价地,预测添加的噪声或干净图像本身,因为给定带噪输入,知道其中一个就确定了另一个。一旦模型能做到这一点,生成就很简单了:从纯噪声开始,让模型估计并剥离一部分噪声,然后重复。每次通过都将样本向接近真实数据的方向推动一点,直到剩下干净图像。

前向与反向扩散 定义扩散的两个过程。前向过程(上图,从左到右)通过每一步添加少量高斯噪声,将干净数据 x_0 转化为完全噪声 x_T;生成反向过程(下图,从右到左)利用这些数据进行训练,以将 x_T 去噪回 x_0,使用相同的步骤序列。在足够大的轨迹集上训练后,模型学会了泛化,并从白噪声的随机样本开始生成新图像。

这个前向/反向的配方——用噪声污染数据,然后学习一步接一步地逆转污染——是每个扩散模型的蓝图。

简单的掩码扩散模型

将扩散引入语言的主要障碍是确定“噪声”对离散token意味着什么。例如,经典扩散中使用的噪声是高斯噪声,将连续高斯噪声添加到分类变量上定义不明确。下面我们介绍一种简单而有效的方法,通过掩码来定义噪声。我们团队推广了这种方法,它现在构成了大多数开源扩散语言模型的基础。

掩码扩散简述

理解掩码扩散最简单的方式是将其视为一个去掩码transformer。我们通过取干净序列、随机掩码其中一部分token,然后让双向transformer填空来训练模型。如果你了解BERT,这基本上就是具有随机掩码率的BERT——但与BERT不同,最终模型是生成式的。你可以将掩码扩散视为一个生成式BERT

掩码扩散训练 作为去掩码transformer训练掩码扩散。前向掩码过程采样一个随机噪声水平 0 < t < 1,并隐藏干净数据点 x 中对应比例的token,产生部分掩码的 z_t;然后训练模型 x_\\theta 重建原始token。图片来源:Sasha Rush。

一旦训练好去掩码transformer,我们可以通过从完全掩码的序列开始,重复两个步骤多次来生成文本:

  1. 填充:让模型填写当前序列中的每个空白,得到对干净token的粗略猜测。
  2. 重掩码:通过用掩码替换token来随机重新对填充序列加噪,但比上一轮保留更多未掩码的token。

掩码扩散采样 一个采样步骤。去噪模型填充当前序列 z_t 中被掩码的位置,然后这些新预测中的随机子集被重新掩码,形成 z_s,即下一步中稍微少一些掩码的序列。迭代这个过程可以按任意顺序填充序列。图片来源:Sasha Rush。

每一轮留下更少的掩码位置,直到序列收敛到来自模型的干净样本。因此,生成相当于从一个充满空白的序列开始,逐步以任意顺序填入单词。

掩码扩散生成,步骤1 在《百年孤独》开头采样示意。生成早期只有部分token被填充;许多空白(以及下方条形图中的掩码单元格)表示仍然空白的位置。

掩码扩散生成,步骤2 几轮之后,大多数位置已被填充,只剩下少数几个掩码token;段落已经基本可读。

掩码扩散生成,步骤3 收敛时每个位置都被去掩码,得到干净样本——完整、连贯的开头段落。

理解掩码扩散:概率视角

我们还可以更好地理解为什么这个过程有效,通过将其构建为我们之前看到的高斯扩散模型的类比。像高斯扩散一样,掩码扩散可以描述为由前向和反向过程组成的模型。

前向过程

前向过程的目标是为反向过程生成训练数据。其输出是一个轨迹,起始于一个数据点,结束于一个纯噪声序列;反向过程将被训练以反向产生这个轨迹。关键挑战是确定“带噪”的含义。在高斯扩散中,我们向图像添加不同数量的白噪声。在掩码扩散中,我们改为随机掩码离散序列中的一部分token。掩码量由一个调度 \\alpha_t 控制——一个给定token保持未掩码的概率——它扮演了高斯扩散中信噪比的角色。当 t = 0 时(干净序列)它为 1,当 t = 1 时(完全掩码序列)它减少到 0。时间变量 t 索引了一条从干净到带噪数据的路径,在时间 t,部分掩码的序列 z_t 中,期望上有一比例 \\alpha_t 的token未掩码。

掩码扩散前向过程 掩码扩散前向过程。随着信号水平 \\alpha_t1 下降到 0,干净序列 x 的每个token以概率 1 - \\alpha_t 被掩码,从干净数据点插值到部分掩码的 z_t,最后到完全掩码的序列。图片来源:Sasha Rush。

我们将这个过程实现为关于变量 z_t 序列的马尔可夫链,由 t 索引,其中 z_0 是干净、未掩码的序列。对于 s < t,该链通过以概率 (\\alpha_s - \\alpha_t)/\\alpha_s 掩码 z_s 中每个仍然未掩码的token来定义 q(z_t \\mid z_s)。运行这个马尔可夫链若干步,产生从干净数据到完全掩码噪声的轨迹。

掩码扩散前向过程,潜变量链 前向过程作为马尔可夫链,遍历逐渐增加掩码的潜变量。从 z_s 移动到 z_t(其中 s < t),每个仍然未掩码的token以依赖于调度的概率被掩码,定义了转移 q(z_t \\mid z_s),将序列带向完全掩码状态。图片来源:Sasha Rush。

反向过程

接下来,像高斯扩散一样,我们训练反向过程以逆向遍历逐渐掩码的潜变量序列——从完全掩码的序列开始,最终生成类似干净数据的输出。使用贝叶斯规则,我们可以推导出当干净序列 x 已知时数学上最优的反向过程 q(z_s \\mid z_t, x)。这个最优过程有两个步骤:(1) 给定部分掩码的 z_t,查看 x 以找到真正的干净token;(2) 通过以概率 (\\alpha_s - \\alpha_t) / (1 - \\alpha_t)z_t 的每个掩码位置替换为 x 中的值(否则保持掩码)来形成 z_s。在实践中,最终输出 x 在我们生成时显然是未知的。因此我们训练一个模型 x_\\theta(z_t) 来根据当前状态 z_t 预测最终的干净序列,并使用估计值 x_\\theta(z_t) 代替真实 x 来应用理想反向过程 q(z_s \\mid z_t, x)。更正式地说,我们将反向过程定义为概率 p(z_s \\mid z_t) = q\\big(z_s \\mid z_t, x_\\theta(z_t)\\big)。这个定义恢复了我们之前描述的采样算法:每一步,我们使用模型 x_\\theta(z_t) 来填充 z_t 中的空白,并在 z_s 中保留这些填充token的一个子集。

掩码扩散反向过程 反向过程。使用去噪模型对干净序列的预测 x_\\theta(z_t),每个被掩码的token

相似文章

扩散语言模型:实验分析

arXiv cs.AI

一项系统性的实验分析,评估了八种最先进的扩散语言模型在多个基准测试上的表现,分析了生成质量与计算效率之间的权衡。

LangFlow:连续扩散在语言建模中可与离散扩散相媲美

Hugging Face Daily Papers

LangFlow提出了首个可与离散扩散方法相媲美的连续扩散语言模型,挑战了长期以来认为连续扩散在语言建模中劣于离散扩散的观点。该工作引入了基于最优Gumbel噪声调度等关键要素,并展示了与离散扩散基线相比具有竞争力的困惑度和迁移学习性能。