对应 Maps to:Stanford CS236 Deep Generative Models(Fall 2023,Stefano Ermon),Lecture 18 · 2023-12-04 · Diffusion Models for Discrete Data(slides:
cs236_lecture18.pdf,客座讲者 Aaron Lou)。 依据说明:本讲按原课 slides 的主线展开:离散数据为什么难(流、GAN、得分模型都依赖微积分;把 token 嵌入连续空间的问题;自回归模型的优缺点)→ 具体得分:用概率比 代替梯度 → 得分熵损失、隐式得分熵、去噪得分熵 → 离散扩散过程:连续时间马尔可夫链、均匀与吸收转移、反向过程由概率比给出 → SEDD 的训练、采样(τ-leaping、Tweedie 去噪、提示补全与填空)与似然上界、和 GPT-2 的比较。主要依据 Lou, Meng & Ermon, Discrete Diffusion Modeling by Estimating the Ratios of the Data Distribution(SEDD,ICML 2024 最佳论文);背景材料来自 Austin et al.(D3PM,2021)、Campbell et al.(连续时间离散扩散,2022)、Meng et al.(具体得分匹配,2022)。用 HMM 玩具语言精确算出任意时刻的全部概率比(前向–后向算法)、在 3 个 token 的小语言上精确演化前向与反向 CTMC、三个模型上核对”去噪得分熵 = 得分熵 + 常数”、ELBO 差距按时间的分解、吸收过程的比值 = 标量 × 完形填空分布的数值验证、精确比值时 ELBO 逐句紧(任意顺序的链式法则)、τ-leaping 的离散化误差与”走到概率为 0 的状态”、−ELBO 估计量的重尾与重要性采样是本讲义补充的。最后一节回顾全课。 配套代码 Code:code/lecture18/(PyTorch;共享模块ctmc.py+ 4 个演示脚本,最长的约 60 秒;第一次运行要训练两个模型约 100 秒) 预计阅读时间:3.5 小时(含运行代码)
0. 本讲导航 · How to read this lecture
0.1 学习目标 Learning goals
学完这一讲,你应该能够:
- 说出离散数据让流、GAN、得分模型”失灵”的原因,以及”嵌入到连续空间”和自回归这两条老路各自的问题。
- 定义具体得分(concrete score),解释它为什么是梯度的推广、为什么只需要”邻居”。
- 写出得分熵损失,说明它是 Bregman 散度、为什么比平方误差更适合学正的比值;推导去噪得分熵和得分熵只差一个常数。
- 描述逐 token 的连续时间马尔可夫链(均匀 / 吸收转移),推导反向速率 。
- 推导离散扩散的似然上界,说明吸收过程的上界就是”任意顺序的自回归”损失。
- 说出 τ-leaping 采样的离散化误差来自哪里,以及离散扩散在填空、并行生成上相对自回归的优势。
0.2 先修与本讲范围 Prerequisites & scope
| 默认你已经会 Assumed | 本讲只给直觉 Previewed only |
|---|---|
| 第 3 讲:自回归模型、链式法则 | Transformer 的网络结构(SEDD 用 DiT 式的双向 Transformer) |
| 第 13–14 讲:得分、去噪得分匹配、反向 SDE | 连续时间马尔可夫链的严格理论(生成元、Kolmogorov 方程只用到最基本的形式) |
| 第 16 讲:扩散模型的 ELBO、紧致性、采样器 | 离散流匹配、大规模扩散语言模型的工程(§8) |
| 第 17 讲:离散变量的梯度问题 |
0.3 本讲地图 Map
§1 离散数据为什么难:三条路
§2 具体得分:用概率比代替梯度 ← 代码 01 第 1、4 部分
§3 得分熵 ← 代码 01 第 2 部分
§4 离散扩散过程:CTMC、均匀与吸收、反向过程 ← 代码 01 第 3、4 部分
§5 去噪得分熵与 SEDD 的训练 ← 代码 02
§6 似然的上界:紧致性、任意顺序的自回归、估计量的方差、和自回归比较 ← 代码 04
§7 采样:τ-leaping、Tweedie、提示补全与填空 ← 代码 03
§8 2023 年之后
§9–12 小结、常见误区、练习、延伸阅读
§13 全课回顾
0.4 记号 Notation
| 符号 | 含义 |
|---|---|
| , | 长度为 的 token 序列;吸收过程多一个 [MASK],共 个状态 |
| 把 的第 个 token 换成 ( 的一个”邻居”) | |
| 具体得分(网络输出 个正数) | |
| , | 逐 token 的速率矩阵; = 从 跳到 的速率,每列和为 0 |
| , | 累积噪声;“这个 token 还没被动过”的概率 |
| 逐 token 的转移矩阵, | |
| , | 得分熵的被积项 |
| bit / 句 | 每个句子(10 个 token)的负对数似然(以 2 为底);每 token 困惑度 |
0.5 关于数字 · About the numbers
全部实验用一个玩具语言:一个隐马尔可夫模型(HMM)生成的 10 个 token 的句子,词表 12 个词(the, a, big, small, red, cat, dog, bird, sees, chases, likes, ”.”),例如 “the big cat chases a bird … .”。隐状态是”语法角色”,动词依赖主语是哪种动物(“bird” 很少 “chases”:)。真实分布的熵 10.94 bit / 句。HMM 让我们能精确算出 ,而且因为每个 token 独立地加噪,任意时刻的 仍是一个 HMM,前向–后向算法一次就给出全部邻居的概率比——“精确的具体得分”,相当于第 13–16 讲里高斯混合的精确得分。训练集 2 万句、测试集 5,000 句。所有数字来自固定种子的单次运行;和预想不同的结果记录在 代码 README 的”关于实验结果”里。
1. 离散数据为什么难 · Why is discrete data hard?
第 16 讲的扩散模型在图像、视频、音频上大获成功;可是 2023 年的大语言模型几乎全是自回归的(第 3 讲)。为什么扩散模型没有在文本上成功?
回顾整门课的模型家族,几乎每一个都在某处用到了微积分:
- 流模型(第 7–8 讲):变量替换公式需要可逆、可导的变换和雅可比行列式。离散空间上没有”连续的可逆变换”(第 8 讲的去量化就是在绕开这一点)。
- GAN(第 9–10 讲):判别器的梯度要穿过生成器的样本传回去;样本是离散的 token 时梯度断了(第 17 讲的问题)。
- 得分模型 / 扩散模型(第 13–16 讲):核心对象就是 。对 token 求梯度没有意义——“cat” 往 “dog” 的方向挪一点是什么?
所以面对离散数据有三条路:
- 把 token 嵌入连续空间,再用连续的扩散(Diffusion-LM,Li et al. 2022;CDCD,Dieleman et al. 2022;Plaid,Gulrajani & Hashimoto 2023)。问题:最后要把连续向量”取整”回 token,取整误差难以控制;嵌入空间里大部分区域不对应任何 token;似然(困惑度)明显不如自回归。
- 自回归:,每一步只需要一个 softmax,不需要任何梯度。优点:可扩展、似然精确、训练稳定。缺点:采样必须一个一个 token 来( 次网络调用、不能并行);只能从左到右,“给定结尾,补全开头”很别扭;生成时一旦出错无法回头修改(误差累积)。
- 直接在离散空间上做扩散(D3PM,Austin et al. 2021;连续时间版本 Campbell et al. 2022):前向过程把 token 随机替换或盖住,反向过程学着恢复。以前的离散扩散似然一直远不如自回归。
SEDD(Lou, Meng & Ermon 2024)的贡献是:找到了离散空间里”得分”的正确类比(§2)和学习它的正确损失(§3),让离散扩散在困惑度上接近、在部分数据集上超过同规模的 GPT-2。
2. 具体得分:用概率比代替梯度 · The concrete score
2.1 从梯度到比值
得分 告诉我们:从 出发,往哪个方向走概率增加得最快。它的一维离散版本是什么?把连续变量放到间距为 的网格上:
代码 01 第 1 部分用 核对: 处, 时 = −0.7769, −0.9968, −1.0000,趋向 。概率比携带的信息和梯度一样,而且不需要”可导”——只需要”邻居”。
2.2 具体得分
Meng, Choi, Song & Ermon(2022)把它推广到任意离散空间:给每个状态 定义一组”邻居” ,
对文本,邻居就是”只改一个 token”的序列 。玩具语言里每个句子有 个邻居,而全部句子有 个。三个要点:
- 局部:和梯度只看”无穷小的邻域”一样,具体得分只看一步之遥的状态。
- 归一化常数约掉了: 里配分函数消失——第 11–13 讲能量模型和得分模型的同一个好处。
- 不是向量,是一张表:token 之间没有”方向”,所以它是 个比值,每个位置、每个候选词一个。
例子(代码 01 第 4 部分,均匀过程 ):句子 “the cat chases the cat … . .” 的第 2 个位置(chases)换成 sees、likes 的比值是 0.646、0.457(同样是动词,句子仍然合理),换成 the、a、”.” 的比值都只有 0.068——那只是”噪声恰好把它变成这样”能解释的程度。比值告诉我们”往哪里改能让句子更像真的”。
3. 得分熵 · Score entropy
3.1 为什么不用平方误差
最直接的想法是让网络 去回归真实比值,用平方误差 ——这就是具体得分匹配(concrete score matching,Meng et al. 2022)。slides 指出它有两个问题:
- 比值必须是正的,平方误差不保证(网络的输出可以是负数)。若改成优化 ,平方误差的梯度 正比于 : 被低估得越厉害越学不动。
- 尺度不对:比值的取值范围从 到 ;平方误差按 惩罚,几个大比值会主导整个损失。
3.2 定义与性质
SEDD 的得分熵(score entropy):
是权重(§5 会看到扩散模型里它是前向速率)。被积项 正是凸函数 的 Bregman 散度(广义 KL 散度):
- 非负,只在 处为零;对 凸。
- 对 是线性的:如果目标是带噪声的 ,期望损失的最小值在 ——这是 §5 去噪版本成立的关键。
- 自带对数壁垒: 时 让损失 ;优化 时 永远是正的,梯度 在 很小时仍有完整的信号。
- 尺度一致:,同样的相对误差,代价正比于 (平方误差正比于 )。
代码 01 第 2 部分: 时,、 的得分熵是 19.3、30.7,平方误差是 2,500、10,000; 时得分熵 0.0019、0.0031,平方误差 、。再用随机梯度从 出发拟合”99% 是 0、1% 是 100”的噪声目标(真值 ,学习率 0.01):
| 拟合方法 | 后一半的平均 | 第一次超过 0.5 的步数 |
|---|---|---|
| 得分熵,优化 (梯度 ) | 0.940 | 632 |
| 平方误差,优化 (梯度 ) | 0.938 | 43 |
| 平方误差,优化 (梯度 ) | 0.000 | 5,656 |
直接优化 的平方误差在这里也能学(但不保证正性);优化 的平方误差先是 5,000 多步才爬到 0.5,之后一次大比值让 跳得太远、被下一个零目标打回 ,梯度随之消失,再也回不来。得分熵兼顾了正性和梯度。
3.3 隐式得分熵
得分熵里有未知的 。和第 12–13 讲的得分匹配一样,可以用”换元求和”消掉它:
得到隐式得分熵(implicit score entropy) + 常数。它不再需要真实比值,但要在每个邻居 处都调用一次网络( 次),太贵——和第 13 讲”显式得分匹配要 次反向传播”是同一个困境。解决办法也一样:去噪(§5)。
4. 离散扩散过程 · The discrete diffusion process
4.1 连续时间马尔可夫链
连续的扩散用 SDE 加噪;离散的扩散用连续时间马尔可夫链(CTMC)。分布 (一个长度为状态数的概率向量)满足
是速率矩阵:非对角元 是”从 跳到 “的速率,每列和为 0。直觉:在一小段时间 里,从 跳到 的概率约为 。
整个句子的状态空间有 个状态,不能直接处理。SEDD 让每个 token 独立地按同一个 的小速率矩阵演化,。于是:
- 一次只改一个 token:序列级的速率矩阵是逐 token 速率矩阵的”克罗内克和”,只有邻居之间有非零速率——正好和具体得分的”邻居”对上。
- 转移概率按 token 分解:,,只要算一个小矩阵的指数。
4.2 两种转移:均匀与吸收
- 均匀(uniform):每个 token 以速率 “被重新抽一次”,新 token 在 个词里均匀选。,。最终分布:均匀的随机 token。
- 吸收(absorbing,掩码):每个 token 以速率 变成 [MASK],之后一直是 [MASK]。保持原样的概率 、变成 [MASK] 的概率 。最终分布:全是 [MASK]。
代码里两种过程都用对数线性调度 :,“还没被动过”的概率随 线性下降, 时恰好是基础分布(SEDD 原文对均匀转移用几何调度,这里统一用一种,便于比较)。代码 01 第 4 部分:
原句: the cat chases the cat . . . . .
均匀 t = 0.5:the likes chases the cat . . bird the chases
吸收 t = 0.5:_ _ chases the cat . . _ _ _
均匀过程把词换成随机的词,句子很快面目全非;吸收过程只是把词盖住,没盖住的词永远是对的——反向过程只需要决定”盖住的地方填什么”,像做完形填空。
代码 01 第 3 部分把玩具语言的前 3 个词当作一个小语言( 个状态,真实分布只在 54 个三元组上非零),在全部状态上精确地演化:均匀过程在 时已经把概率摊到所有 1,728 个状态上(落在原支撑集上的概率只剩 0.544);吸收过程的概率始终只在 129 个状态上(“某个合法的三元组、部分位置换成 [MASK]”)。状态空间小得多,是吸收过程更容易学的一个直观原因。
4.3 反向过程由概率比给出
连续扩散的核心定理是:反向过程是一个 SDE,漂移项里有得分(Anderson 1982,第 14 讲)。离散的版本更简单:CTMC 的时间反转仍是 CTMC,反向速率是
推导:在时刻 ,前向过程从 到 的”概率流量”是 。时间反转后,同一段轨迹变成从 到 ,流量必须相同:,移项即得。
于是 :**只要知道每个时刻的具体得分,就能把噪声变回数据。**前向速率只在邻居之间非零,所以只需要邻居的比值——正好是具体得分的定义域。
代码 01 第 3 部分在小语言的全部状态上验证:用精确的 构造反向速率,从 的纯噪声出发,按反向的主方程积分回 ,和 的总变差距离随欧拉步数 下降:
| 均匀 | 0.2267 | 0.0208 | 0.0004 |
| 吸收 | 0.4792 | 0.0285 | 0.0001 |
吸收过程的比值长什么样? 设 的第 个位置是 [MASK]。,把第 个位置揭开成 只改变一个因子:
时间只出现在一个标量里;剩下的部分是一个和 无关的”完形填空”分布——也就是 BERT 那样的掩码语言模型(Ou et al. 2024 据此提出网络不需要时间输入)。ctmc.py 的自检用枚举 1,728 种填法核对了这个公式(最大差 )。代码 01 第 4 部分的例子:、 = “the _ _ the cat … . .”,第 2 个位置的比值 chases 1.125、sees 1.080、likes 0.795,和为 。
5. 去噪得分熵与 SEDD 的训练 · Denoising score entropy
5.1 去噪得分熵
扩散模型里,。把它代入得分熵里那个含未知比值的项:
真实比值被换成了条件比 ——前向过程给的,闭式可算。这就是去噪得分熵(denoising score entropy,DSE):
它和得分熵只差一个与 无关的常数(来自 项)。这和第 13 讲”去噪得分匹配用 代替 “完全是同一个技巧,原因也一样:损失对目标是线性的,。
代码 02 第 1 部分在同一批 2 万对 ()上,对三个完全不同的”模型”算 SE(用前向–后向算出的真实比值)和 DSE:
| 过程 | 模型 | SE | DSE | DSE − SE |
|---|---|---|---|---|
| 均匀 | 精确比值 | 0.0000 | 8.6030 | 8.6030 ± 0.056 |
| 学到的网络 | 0.4530 | 9.0634 | 8.6104 ± 0.055 | |
| 瞎猜(比值全为 1) | 22.12 | 30.76 | 8.6413 ± 0.042 | |
| 吸收 | 精确比值 | 0.0000 | 6.1395 | 6.1395 ± 0.036 |
| 学到的网络 | 0.0353 | 6.1455 | 6.1102 ± 0.036 | |
| 瞎猜(均匀的完形填空) | 18.55 | 24.73 | 6.1755 ± 0.033 |
精确比值的 SE 是 0,DSE 却是一个正常数(条件比只是真实比值的”带噪声版本”);三个模型的 DSE − SE 在误差范围内相同。最小化 DSE 就是最小化 SE,而 DSE 只需要前向过程的条件概率。
5.2 SEDD:用网络学比值
SEDD 的网络 读入整个(加了噪声的)句子,输出 个正数(论文用双向的 Transformer,取对数输出);训练时每步抽 、、,最小化 DSE,权重取 (§6 会解释为什么)。代码用一个 MLP:
- 均匀过程:——乘 让 时比值 ,否则 的权重会把一点点误差放大成无穷大。
- 吸收过程:——按 §4.3 的公式,网络只学完形填空分布,不给它时间输入。
代码 02 第 2 部分比较学到的网络和精确比值。“ELBO 差距的密度” 是真实反向过程和学到的反向过程在时刻 的 KL 速率,它对 的积分正是学到的模型的 −ELBO 比”精确比值的 −ELBO”多出来的部分(§6):
| 0.05 | 0.2 | 0.4 | 0.6 | 0.8 | 0.95 | 积分 | |
|---|---|---|---|---|---|---|---|
| 均匀:差距密度(bit) | 1.1236 | 0.7479 | 0.5234 | 0.2400 | 0.0885 | 0.0403 | 0.430 |
| 吸收:差距密度(bit) | 0.0450 | 0.0467 | 0.0542 | 0.0524 | 0.0523 | 0.0198 | 0.046 |
- 吸收过程的差距 = 完形填空的 KL:把 、 代入得分熵,被盖住位置上的和化简成 ,乘以权重 得 。代码里两列数字逐位相同。每个被盖住位置的 KL 在 中等时最大(一部分上下文可见,要据此推理), 时最小(几乎全被盖住,只需学边缘分布)。
- 均匀过程难得多(差距 0.43 vs 0.05 bit),而且集中在 小的时候:这时大部分词是原来的、少数被换成了随机词,模型得先找出”哪个词被换掉了”——吸收过程的 [MASK] 直接告诉模型哪里需要填,均匀过程不告诉。
(代码 README 第 1 条:第一版网络训练不足,ELBO 差距是现在的 3–5 倍。)
6. 似然的上界 · The likelihood bound
6.1 扩散 ELBO
和第 16 讲一样,离散扩散给出 的下界(SEDD 定理):
是条件比。为什么权重是 ? 下界来自”前向路径(给定 )“和”模型的反向路径”之间的 KL。两个 CTMC 从同一个状态 出发、跳到 的速率分别为 、 时,单位时间的 KL 是 。代入真实的反向速率 和模型的 :
得分熵正是”跳跃过程之间的 KL 散度”。我们的调度让 时恰好是基础分布,最后一项为零。
比值精确时,界是紧的。 和第 16 讲的推导一样:;比值精确时两条路径只差起点,而起点也一样,KL 为零。代码 04 第 1 部分(2,000 个测试句子,真实的 −log₂p₀ 平均 10.7532 bit):
| 估计方法(精确比值) | −ELBO | 与真值之差 |
|---|---|---|
| 均匀:对 积分(每句 256 个时刻,重要性采样) | 10.7259 | −0.027 ± 0.018 |
| 吸收:对 积分(同上) | 10.7280 | −0.025 ± 0.013 |
| 吸收:任意顺序的链式法则(§6.2) | 10.7532 | 逐句精确到 |
对 积分的估计只差约 0.03 bit(仍为负、约 1.5–2 个标准误,原因见 §6.3)。
6.2 吸收过程的上界 = 任意顺序的自回归
吸收过程 + 对数线性调度时,被积函数(§5.2 的推导)是 。被盖住的个数 服从二项分布 ,对 积分:
于是
吸收扩散的似然上界,就是”按随机顺序逐个揭开 token”的自回归损失的平均(Hoogeboom et al. 2022 的任意顺序自回归扩散;Ou et al. 2024、Sahoo et al. 2024、Shi et al. 2024 从不同角度得到同样的结论)。自回归模型是”固定从左到右”的特例。比值精确时,任何顺序的链式法则都给出精确的 ——上表最后一行逐句精确到浮点误差。扩散模型的 ELBO 和似然之间的差距,完全是网络在”完形填空”上的误差。
6.3 估计量的方差
代码 04 第 3 部分(学到的吸收模型,200 个句子,每句重复估计 20 次):
| 估计方法 | 平均 −ELBO | 同一句子重复估计的标准差(bit) |
|---|---|---|
| 对 积分,均匀地抽 1 个时刻 | 10.430 | 8.07 |
| 对 积分,均匀分层 64 个时刻 | 10.724 | 1.19 |
| 对 积分,重要性采样 64 个时刻 | 10.721 | 1.11 |
| 任意顺序,每个 平均被盖住的位置 | 10.691 | 2.73 |
| 任意顺序,链式法则(调用网络 10 次) | 10.708 | 0.14 |
- 对 积分的被积函数在 很小时有一个 :偶尔有一个 token 被加了噪声,它的项就被放大很多倍。估计量重尾,抽得少时平均值还系统性地偏低(罕见的大值没被抽到;只抽 1 个时刻时平均 10.43,比其他行低 0.3 bit)。在 小的地方多抽、再按概率的倒数加权(重要性采样)能压低极端值,对标准差只改善一点。
- 任意顺序的形式把对 的积分解析地做掉了。链式法则版本只调用网络 10 次,标准差就小了一个数量级:各项此消彼长——前面猜错的信息,后面会被更准地补回来,比值精确时总和恒为 。原以为”把每个 的所有被盖住位置平均起来”会更稳(代码 README 第 4 条),结果相反:它破坏了这种抵消。
6.4 和自回归模型比较
代码 04 第 2 部分(5,000 个测试句子):
| 模型 | bit / 句 | 每 token 困惑度 | 比真实分布多 |
|---|---|---|---|
| 真实分布 | 10.869 | 2.1241 | — |
| 自回归 GRU(精确似然,6.4 万参数) | 10.874 | 2.1249 | +0.005 |
| SEDD 吸收(−ELBO,4 个随机顺序的链式法则;19.6 万参数) | 10.915 | 2.1310 | +0.047 |
| SEDD 均匀(−ELBO,对 积分) | 11.320 | 2.1916 | +0.451 |
在这个玩具语言上自回归模型最好:它的结构(从左到右的链式法则)和语言的生成方式(HMM 从左到右)完全吻合,而扩散模型的上界要求网络对所有顺序的条件分布都学得好。吸收过程的上界离真实分布也很近;均匀过程差得多。SEDD 论文在真实文本(OpenWebText 训练,在 LAMBADA、WikiText、PTB 等数据集上测零样本困惑度)上报告:吸收过程明显好于均匀过程;同等规模下 SEDD 的困惑度上界和 GPT-2 相当,在部分数据集上更好,比之前的离散扩散(D3PM 等)和连续嵌入的扩散好得多。
7. 采样 · Sampling
7.1 τ-leaping 与 Tweedie 去噪
反向过程是一个 CTMC,原则上可以精确模拟(Gillespie 算法:一次跳一个 token)。但那样要几千次网络调用。实践中把时间分成若干步,每一步所有位置同时、独立地更新(τ-leaping):
- Euler:位置 从 跳到 的概率 。
- Tweedie τ-leaping(SEDD):对单个 token,若比值精确,“从 走到 “的精确转移是 是第 个位置的比值向量(当前 token 处为 1)。它是第 13 讲 Tweedie 公式的离散类比:用比值先”估计干净的 token”,再按前向过程加回到时刻 的噪声。
吸收过程 + 对数线性调度时两者完全相同:被盖住的位置以 的概率被揭开(Euler:;精确:),揭开成什么由完形填空分布决定。代码 03 里同一个种子下两者的样本逐句相同。
7.2 离散化误差:一步里多个 token 一起变
代码 03 第 1 部分用精确的比值采样(只有离散化误差;2,000 个句子;真实样本:合语法 1.000、不同句子 0.493、主语是 bird 时动词是 chases 的比例 0.046):
| 采样 | 1 步 | 4 步 | 8 步 | 16 步 | 64 步 | 256 步 |
|---|---|---|---|---|---|---|
| 吸收:合语法比例 | 0.035 | 0.583 | 0.780 | 0.883 | 0.972 | 0.993 |
| 均匀 Euler:合语法比例 | 0.000 | 0.345 | 0.792 | 0.943 | 0.991 | 0.999 |
| 均匀 Tweedie:合语法比例 | 0.033 | 0.734 | 0.911 | 0.968 | 0.994 | 1.000 |
| 吸收:P(chases | bird) | 0.267 | 0.102 | 0.054 | 0.080 | 0.040 | 0.052 |
1 步时所有位置一次性、独立地从各自的边缘分布里抽:“the cat” 和 “chases” 各自都对,拼在一起不一定对——几乎没有合语法的句子;主语和动词被独立地揭开,“bird 很少 chases”这个依赖也丢了(0.267 vs 0.05)。步数越多,每步同时改变的位置越少,相关性就越能被照顾到。τ-leaping 假设”一小段时间里各位置独立地变化”,步子大时这个假设不成立——这是离散扩散最主要的离散化误差,也是”用更少的步数并行生成”需要付出的代价。步数少时,合语法的样本还偏向常见的短句(−log₂p₀ 偏低)。
均匀过程上 Tweedie 明显好于 Euler(8 步:0.911 vs 0.792)。另一个现象(代码 README 第 2 条):一步改多个 token 可能走到真实 下概率为 0 的状态(例如吸收过程同时揭开两个互相矛盾的词),这时精确比值都没有定义——这也是 τ-leaping 误差的表现。
学到的网络(代码 03 第 2 部分)重现同样的趋势:吸收模型 256 步时合语法 0.983、P(chases | bird) 0.046,接近精确比值;均匀模型合语法 0.954,却几乎没学到”bird 很少 chases”(0.339,接近不看主语时的 0.38)——和它更大的 ELBO 差距一致。
SEDD 论文在真实文本上报告:步数和质量之间可以平滑地折中(用比自回归少得多的网络调用得到相近的生成困惑度),而且不需要温度缩放、核采样等”退火”技巧就能生成通顺的文本。
7.3 提示补全与填空
自回归模型只能从左往右:给定前缀很自然,给定结尾或中间的词就很别扭。离散扩散可以在任意位置给定词:给定的位置在每一步之后都重置成给定的 token(吸收过程里它们从一开始就不被盖住)。代码 03 第 3 部分(64 步,2,000 个样本):
| 方法 | 提示补全 “the bird _ …”:P(第 2 个词 = chases)(真值 0.050) | 填空 ”_ _ chases _ _ … . .”:P(第 1 个词 = bird)(真值 0.027) |
|---|---|---|
| 吸收,精确比值 | 0.051 | 0.030 |
| 吸收,学到的网络 | 0.046 | 0.028 |
| 均匀,精确比值(夹住给定的词) | 0.093 | 0.042 |
| 均匀,学到的网络(夹住给定的词) | 0.272 | 0.142 |
- 吸收过程的条件生成是有原则的:给定的词从不被盖住,反向过程只填 [MASK],而精确比值恰好是”给定这些词”的完形填空分布——采样复现了精确的条件概率。
- 填空(给定第 2 个词和句尾、反推主语)是自回归模型做不到的:要满足”第 2 个词是 chases”,它只能生成很多句子再筛选。
- 均匀过程”夹住给定的词”只是近似:被夹住的位置是干净的,其他位置却处在噪声水平 ,这个状态并不服从 。即使比值精确,条件概率也偏了(0.093 vs 0.050)。
8. 2023 年之后 · Since 2023
- 掩码扩散的简化与统一。 MDLM(Sahoo et al., NeurIPS 2024)和 MD4(Shi et al., NeurIPS 2024)把吸收扩散的连续时间 ELBO 化简成”加权的掩码语言模型交叉熵”(§6.2),训练更简单、困惑度进一步逼近自回归;RADD(Ou et al. 2024)指出吸收过程的具体得分 = 时间标量 × 干净数据的条件分布(§4.3),网络不需要时间输入,并建立了与任意顺序自回归模型的等价。
- 离散流匹配。 Campbell et al.(ICML 2024)和 Gat et al.(NeurIPS 2024)把第 14 讲的流匹配推广到 CTMC:直接构造从噪声到数据的概率路径并回归其速率,统一了均匀、掩码等多种过程。
- 大规模扩散语言模型。 LLaDA(Nie et al. 2025)把掩码扩散扩展到 80 亿参数,在多项基准上和同规模的自回归模型相当,并在”反转诗句”之类需要双向推理的任务上更好;Dream 7B(2025)从自回归模型初始化;商业上 Inception Labs 的 Mercury、Google 的 Gemini Diffusion(2025)强调并行生成带来的速度。Block diffusion(Arriola et al., ICLR 2025)在块之间自回归、块内部扩散,兼顾了 KV 缓存和并行。
- 采样与引导。 更好的并行解码策略(按置信度决定先揭开哪些位置、允许”重新盖住”以纠错)、离散扩散的无分类器引导与奖励微调,都在快速发展。§7.2 的离散化误差(同一步里多个 token 的相关性)仍然是这条路线的核心问题之一。
9. 小结 · Summary
- 离散数据让依赖微积分的方法失灵:流(变量替换)、GAN(梯度穿过样本)、得分模型()。老路是连续嵌入(取整困难、似然差)和自回归(串行、只能从左到右)。
- 具体得分 , 是只差一个 token 的邻居:梯度的离散推广,归一化常数消掉。
- 得分熵 是 的 Bregman 散度:非负、对 线性、保证正性、尺度一致;比平方误差更适合学比值。
- 离散扩散过程:逐 token 的 CTMC,均匀或吸收转移;反向速率 = 概率比 × 前向速率。吸收过程的比值 = × 完形填空分布。
- 去噪得分熵用条件比代替真实比值,和得分熵只差常数(三个模型上核对)。
- 似然上界:得分熵 = 跳跃过程之间的 KL;比值精确时界是紧的。吸收过程的上界 = 任意顺序的自回归损失;链式法则形式的估计方差极小。
- 采样:τ-leaping 让多个 token 同时更新,步数少时丢掉相关性(1 步几乎没有合语法的句子);Tweedie 更新在均匀过程上更好。吸收过程能做有原则的提示补全和填空。
- 均匀 vs 吸收:吸收过程更容易学(状态少、[MASK] 告诉模型哪里需要填),ELBO 差距 0.05 vs 0.43 bit。
10. 常见误区 · Common pitfalls
- “文本是离散的,所以扩散模型不能用于文本。” 扩散需要的不是梯度,而是”怎样反转加噪过程”;离散空间里它由概率比给出(§4.3)。
- “具体得分就是对 one-hot 向量求梯度。” 不是:它是 个概率比,每个位置、每个候选词一个;token 之间没有”方向”(§2.2)。
- “用平方误差学比值也一样。” 期望意义下最小值相同,但平方误差不保证正性、尺度按 ;优化 时梯度 ,会学不动甚至卡死(§3.2)。
- “去噪得分熵的最小值是 0。” 条件比只是真实比值的带噪声版本,最小值是一个正常数;精确比值的 DSE 在 时约 8.6 nat(均匀)、6.1 nat(吸收)(§5.1)。
- “离散扩散的 −ELBO 和似然之间有一个结构性的差距。” 比值精确时界是紧的(逐句精确,§6.1);差距完全来自网络的误差。
- “步数越少越好,扩散模型的优势就是并行。” 一步里同时改变的 token 越多,越容易丢掉它们之间的相关性(§7.2:1 步时合语法比例 3.5%)。并行是有代价的。
- “均匀转移和吸收转移只是两种选择,差不多。” 吸收过程在这里 ELBO 差距小一个数量级,条件生成也有原则;均匀过程要同时”找错”和”改错”(§5.2)。
- “把每个 k 的所有被盖住位置的交叉熵平均起来,估计更稳。” 恰好相反:链式法则各项此消彼长,平均破坏了这种抵消(§6.3)。
11. 练习 · Exercises
练习 1(具体得分与梯度) 设 , 在间距为 的网格上。证明 ,并用它解释代码 01 第 1 部分 、 时为什么结果是 −1.85 而不是 −2。
参考答案
,展开得 。对 ,,,:。、:,和代码的 −1.8535 一致(剩下的是三阶项)。
练习 2(得分熵是 Bregman 散度) 对 ,Bregman 散度 。证明 ,并由此说明得分熵非负、只在 时为零。
参考答案
。。 严格凸,所以 Bregman 散度非负,且只在 时为零。
练习 3(去噪得分熵的最小值) 固定 ,把 DSE 对 的部分写成 。求最小值点,说明它等于真实比值 。
参考答案
对 求导:。而 。
练习 4(均匀转移的矩阵指数) 设 ()。用 证明 。
参考答案
和 可交换,。。取 :。代码 01 第 3 部分用 torch.linalg.matrix_exp 核对,最大差 。
练习 5(反向速率) 用”概率流量守恒”推导 ,并验证反向速率矩阵的每列和为零时,反向过程使 沿时间倒退:。
参考答案
流量:前向在 从 到 的概率 ;反向过程同一段轨迹反着走,从 到 的概率 ,两者相等。验证:。
练习 6(吸收过程的比值) 对吸收过程、,证明 (第 个位置被盖住)。若第 个位置没被盖住,比值是什么?为什么反向过程用不到它?
参考答案
,被盖住的位置因子 (与 无关),未被盖住的因子 。所以 。揭开第 个位置:。相除即得。未被盖住的位置换成 [MASK]:比值 ;换成别的词 :比值是 (另一个句子的概率比),一般不为 0。但反向速率和 ELBO 里乘的是前向速率 ——“从 跳到 “的速率;吸收过程里没有任何状态会跳成一个未掩码的词,这些速率都是 0,所以这些比值用不到。
练习 7(1/k 的积分) 证明 ,并由此写出吸收扩散 −ELBO 的”任意顺序”形式。
参考答案
,乘以 得 。给定被盖住的集合大小为 ,集合在所有大小为 的子集里均匀,被积函数的期望为 ;对 积分、对 求和即得 §6.2 的公式。
练习 8(链式法则为什么方差为零) 设模型的条件分布精确:。证明对任意顺序 ,。为什么”每个 平均被盖住的位置”的估计没有这个性质?
参考答案
链式法则: 对任何顺序成立,取对数即得。平均版本的第 项是 :同一个集合里的 个位置都以” 之外的词”为条件,它们不是一个链式分解的各项,总和不再恒等于 ,随 的选择波动。代码 04:精确比值时链式法则逐句偏差 ,平均版本单句偏差可达 13 bit。
练习 9(吸收过程的 Euler = Tweedie) 对吸收过程、,被盖住的位置从 走到 :(a) 写出 Euler 步揭开的概率;(b) 写出精确的 ;(c) 说明两者相等,而对均匀过程 Euler 只是一阶近似。
参考答案
(a) 。(b) 给定 时被盖住,“被盖住的时刻”在 上的条件分布:。(c) 相等。均匀过程里一个 token 在一步里可能”变了又变”,Euler 只保留一次跳跃,Tweedie 用 精确处理了单个 token 的全部可能(代码 03:8 步时合语法比例 0.792 vs 0.911)。
练习 10(离散化误差的最简单例子) 两个 token 的语言只有两句话:“a a” 和 “b b”,各占一半。用吸收过程、精确比值、1 步从全 [MASK] 采样。(a) 每个位置的边缘分布是什么?(b) 生成的句子是 “a b” 的概率是多少?(c) 用 2 步()呢?
参考答案
(a) 两个位置都被盖住时,每个位置的完形填空分布是 (a: 0.5, b: 0.5)。(b) 1 步时两个位置同时、独立地揭开:P(“a b”) + P(“b a”) = 0.5,P(“a b”) = 0.25——一半的样本不合法。(c) 第一步每个位置以 的概率被揭开:两个都揭开(概率 1/4)时独立地抽,有一半不合法;只揭开一个(1/2)时第二步另一个位置的条件分布是确定的,总是合法;都不揭开(1/4)时第二步同时揭开,一半不合法。不合法的概率 ,P(“a b”) = 1/8。步数越多,“同一步揭开两个相关位置”的概率越小。
12. 延伸阅读 · Further reading
本讲主要依据
- Lou, Meng & Ermon, Discrete Diffusion Modeling by Estimating the Ratios of the Data Distribution, ICML 2024(SEDD)
- Meng, Choi, Song & Ermon, Concrete Score Matching: Generalized Score Matching for Discrete Data, NeurIPS 2022
- Austin, Johnson, Ho, Tarlow & van den Berg, Structured Denoising Diffusion Models in Discrete State-Spaces, NeurIPS 2021(D3PM)
- Campbell et al., A Continuous Time Framework for Discrete Denoising Models, NeurIPS 2022(τ-leaping)
- Hoogeboom et al., Autoregressive Diffusion Models, ICLR 2022;Hoogeboom et al., Argmax Flows and Multinomial Diffusion, NeurIPS 2021
连续嵌入的扩散语言模型
- Li et al., Diffusion-LM Improves Controllable Text Generation, NeurIPS 2022
- Dieleman et al., Continuous Diffusion for Categorical Data, 2022;Gulrajani & Hashimoto, Likelihood-Based Diffusion Language Models, NeurIPS 2023
2023 年之后
- Sahoo et al., Simple and Effective Masked Diffusion Language Models, NeurIPS 2024(MDLM)
- Shi et al., Simplified and Generalized Masked Diffusion for Discrete Data, NeurIPS 2024(MD4)
- Ou et al., Your Absorbing Discrete Diffusion Secretly Models the Conditional Distributions of Clean Data, 2024(RADD)
- Campbell et al., Generative Flows on Discrete State-Spaces, ICML 2024;Gat et al., Discrete Flow Matching, NeurIPS 2024
- Nie et al., Large Language Diffusion Models, 2025(LLaDA);Arriola et al., Block Diffusion, ICLR 2025
13. 全课回顾 · Course recap
18 讲走完了 CS236 的整条”问题链”。最后把它串起来:
| 讲次 | 家族 | 怎样表示 | 怎样学 | 代价 / 留下的问题 |
|---|---|---|---|---|
| 3–4 | 自回归 | 链式法则 | 最大似然(= 最小化 KL) | 没有隐变量;采样串行 |
| 5–6 | VAE | ELBO、重参数化 | 只能优化下界;先验空洞 | |
| 7–8 | 流 | 可逆变换 + 变量替换 | 精确似然 | 网络必须可逆、雅可比可算 |
| 9–10 | GAN | 只有采样器 | 两样本检验 / 判别器 | 没有似然;训练不稳定、模式坍塌 |
| 11–12 | 能量模型 | 对比散度、得分匹配、NCE | 配分函数;采样要 MCMC | |
| 13–14 | 得分模型 | (多个噪声水平) | 去噪得分匹配 | 采样要很多步 |
| 15 | 评估 | — | 似然、样本质量、表示 | 没有一把尺子能发现所有毛病 |
| 16 | 扩散 | 层级 VAE = 得分模型 = SDE | 加权的去噪损失 | 采样步数;引导的权衡 |
| 17 | 离散隐变量 | 离散的 | REINFORCE + 基线、Gumbel-softmax | 方差 vs 偏差 |
| 18 | 离散扩散 | 概率比 | 得分熵 | τ-leaping 的离散化误差 |
几条贯穿全课的线:
- **似然、隐变量、可处理性三者很难兼得。**每个家族都在三者之间做取舍:自回归有似然没隐变量,VAE 有隐变量只有下界,流两者都有但结构受限,GAN、能量模型、得分模型放弃(或绕开)归一化。
- **“难算的东西,就去学它的一个可以局部计算的替身”:**能量模型学未归一化的 ,得分模型学 ,离散扩散学 ——这三者都让配分函数消失。
- **“去噪”一再出现:**去噪得分匹配(第 13 讲)、DDPM 的 预测(第 16 讲)、去噪得分熵(本讲)——都用”前向过程的条件量”代替”边缘分布的未知量”,只差一个常数。
- **离散与连续:**第 17 讲在离散隐变量上用估计量或松弛绕开梯度;第 18 讲在离散数据上用概率比代替梯度。两者都提醒我们:深度生成模型的很多工具是为连续数据设计的,离散世界需要重新想一遍。
- **诚实的评估:**本讲义的每个实验都和”已知的真相”比较(像素世界的精确 、高斯混合的精确得分、HMM 的精确比值)。真实世界没有这样的真相,所以第 15 讲的评估方法、以及”知道每个指标看不到什么”,和模型本身一样重要。
如果想继续深入:连续时间、微分方程视角的流匹配与扩散,见本仓库的 MIT6.S184;大模型时代的系统与应用,见 CMU10-423、CS336。