Lecture 18 · 离散数据的扩散模型 · Diffusion Models for Discrete Data

Deep Generative Models · Lecture 18。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应 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 嵌入连续空间的问题;自回归模型的优缺点)→ 具体得分:用概率比 p(y)/p(x)p(y)/p(x) 代替梯度 → 得分熵损失、隐式得分熵、去噪得分熵 → 离散扩散过程:连续时间马尔可夫链、均匀与吸收转移、反向过程由概率比给出 → 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

学完这一讲,你应该能够:

  1. 说出离散数据让流、GAN、得分模型”失灵”的原因,以及”嵌入到连续空间”和自回归这两条老路各自的问题。
  2. 定义具体得分(concrete score)s(x)y=p(y)/p(x)s(x)_y = p(y)/p(x),解释它为什么是梯度的推广、为什么只需要”邻居”。
  3. 写出得分熵损失,说明它是 Bregman 散度、为什么比平方误差更适合学正的比值;推导去噪得分熵和得分熵只差一个常数。
  4. 描述逐 token 的连续时间马尔可夫链(均匀 / 吸收转移),推导反向速率 Qˉt(y,x)=pt(y)pt(x)Qt(x,y)\bar Q_t(y, x) = \frac{p_t(y)}{p_t(x)}Q_t(x, y)。
  5. 推导离散扩散的似然上界,说明吸收过程的上界就是”任意顺序的自回归”损失。
  6. 说出 τ-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

符号含义
x=(x1,…,xL)x = (x^1, \dots, x^L),xi∈{1,…,V}x^i \in \{1, \dots, V\}长度为 LL 的 token 序列;吸收过程多一个 [MASK],共 V′=V+1V' = V + 1 个状态
xi←vx^{i \leftarrow v}把 xx 的第 ii 个 token 换成 vv(xx 的一个”邻居”)
sθ(x,t)i,v≈pt(xi←v)/pt(x)s_\theta(x, t)_{i,v} \approx p_t(x^{i\leftarrow v})/p_t(x)具体得分(网络输出 L×V′L \times V' 个正数)
QQ,Qt=σ(t)QQ_t = \sigma(t)Q逐 token 的速率矩阵;Q[a,b]Q[a, b] = 从 bb 跳到 aa 的速率,每列和为 0
σˉ(t)=∫0tσ\bar\sigma(t) = \int_0^t\sigma,αt=e−σˉ(t)\alpha_t = e^{-\bar\sigma(t)}累积噪声;“这个 token 还没被动过”的概率
Pt=exp⁡(σˉ(t)Q)P_t = \exp(\bar\sigma(t)Q)逐 token 的转移矩阵,Pt[a,b]=pt∣0(a∣b)P_t[a, b] = p_{t\mid 0}(a \mid b)
SE(s;r)=s−rlog⁡s+K(r)\mathrm{SE}(s; r) = s - r\log s + K(r),K(r)=r(log⁡r−1)K(r) = r(\log r - 1)得分熵的被积项
bit / 句每个句子(10 个 token)的负对数似然(以 2 为底);每 token 困惑度 =2bit/10= 2^{\text{bit}/10}

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”:P=0.05P = 0.05)。真实分布的熵 10.94 bit / 句。HMM 让我们能精确算出 log⁡p0(x)\log p_0(x),而且因为每个 token 独立地加噪,任意时刻的 ptp_t 仍是一个 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 讲):核心对象就是 ∇xlog⁡p(x)\nabla_x\log p(x)。对 token 求梯度没有意义——“cat” 往 “dog” 的方向挪一点是什么?

所以面对离散数据有三条路:

  1. 把 token 嵌入连续空间,再用连续的扩散(Diffusion-LM,Li et al. 2022;CDCD,Dieleman et al. 2022;Plaid,Gulrajani & Hashimoto 2023)。问题:最后要把连续向量”取整”回 token,取整误差难以控制;嵌入空间里大部分区域不对应任何 token;似然(困惑度)明显不如自回归。
  2. 自回归:p(x)=∏ip(xi∣x<i)p(x) = \prod_ip(x^i \mid x^{<i}),每一步只需要一个 softmax,不需要任何梯度。优点:可扩展、似然精确、训练稳定。缺点:采样必须一个一个 token 来(LL 次网络调用、不能并行);只能从左到右,“给定结尾,补全开头”很别扭;生成时一旦出错无法回头修改(误差累积)。
  3. 直接在离散空间上做扩散(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 从梯度到比值

得分 ∇xlog⁡p(x)\nabla_x\log p(x) 告诉我们:从 xx 出发,往哪个方向走概率增加得最快。它的一维离散版本是什么?把连续变量放到间距为 Δ\Delta 的网格上:

p(x+Δ)p(x)−1≈Δ⋅ddxlog⁡p(x).\frac{p(x + \Delta)}{p(x)} - 1 \approx \Delta\cdot\frac{d}{dx}\log p(x).

代码 01 第 1 部分用 N(0,1)\mathcal{N}(0, 1) 核对:x=1x = 1 处,Δ=1,0.1,0.01\Delta = 1, 0.1, 0.01 时 (p(x+Δ)/p(x)−1)/Δ(p(x+\Delta)/p(x) - 1)/\Delta = −0.7769, −0.9968, −1.0000,趋向 dlog⁡p/dx=−1d\log p/dx = -1。概率比携带的信息和梯度一样,而且不需要”可导”——只需要”邻居”。

2.2 具体得分

Meng, Choi, Song & Ermon(2022)把它推广到任意离散空间:给每个状态 xx 定义一组”邻居” N(x)\mathcal{N}(x),

s(x)y=p(y)p(x),y∈N(x).s(x)_y = \frac{p(y)}{p(x)}, \qquad y \in \mathcal{N}(x).

对文本,邻居就是”只改一个 token”的序列 xi←vx^{i \leftarrow v}。玩具语言里每个句子有 L(V−1)=110L(V - 1) = 110 个邻居,而全部句子有 VL≈6.2×1010V^L \approx 6.2 \times 10^{10} 个。三个要点:

  • 局部:和梯度只看”无穷小的邻域”一样,具体得分只看一步之遥的状态。
  • 归一化常数约掉了:p(y)/p(x)p(y)/p(x) 里配分函数消失——第 11–13 讲能量模型和得分模型的同一个好处。
  • 不是向量,是一张表:token 之间没有”方向”,所以它是 L×VL \times V 个比值,每个位置、每个候选词一个。

例子(代码 01 第 4 部分,均匀过程 t=0.3t = 0.3):句子 “the cat chases the cat … . .” 的第 2 个位置(chases)换成 sees、likes 的比值是 0.646、0.457(同样是动词,句子仍然合理),换成 the、a、”.” 的比值都只有 0.068——那只是”噪声恰好把它变成这样”能解释的程度。比值告诉我们”往哪里改能让句子更像真的”。


3. 得分熵 · Score entropy

3.1 为什么不用平方误差

最直接的想法是让网络 sθ(x)ys_\theta(x)_y 去回归真实比值,用平方误差 ∑y(sθ(x)y−p(y)/p(x))2\sum_y(s_\theta(x)_y - p(y)/p(x))^2——这就是具体得分匹配(concrete score matching,Meng et al. 2022)。slides 指出它有两个问题:

  1. 比值必须是正的,平方误差不保证(网络的输出可以是负数)。若改成优化 log⁡s\log s,平方误差的梯度 2(s−r)s2(s - r)s 正比于 ss:ss 被低估得越厉害越学不动。
  2. 尺度不对:比值的取值范围从 10−310^{-3} 到 10310^3;平方误差按 r2r^2 惩罚,几个大比值会主导整个损失。

3.2 定义与性质

SEDD 的得分熵(score entropy):

LSE=Ex∼p∑y∈N(x)wxy(sθ(x)y−p(y)p(x)log⁡sθ(x)y+K(p(y)p(x))),K(a)=a(log⁡a−1),\mathcal{L}_{\mathrm{SE}} = \mathbb{E}_{x \sim p}\sum_{y \in \mathcal{N}(x)}w_{xy}\Big(s_\theta(x)_y - \frac{p(y)}{p(x)}\log s_\theta(x)_y + K\Big(\frac{p(y)}{p(x)}\Big)\Big), \qquad K(a) = a(\log a - 1),

wxy≥0w_{xy} \geq 0 是权重(§5 会看到扩散模型里它是前向速率)。被积项 SE(s;r)=s−rlog⁡s+rlog⁡r−r\mathrm{SE}(s; r) = s - r\log s + r\log r - r 正是凸函数 F(x)=xlog⁡xF(x) = x\log x 的 Bregman 散度(广义 KL 散度):

  • 非负,只在 s=rs = r 处为零;对 ss 凸。
  • 对 rr 是线性的:如果目标是带噪声的 rr,期望损失的最小值在 s=E[r]s = \mathbb{E}[r]——这是 §5 去噪版本成立的关键。
  • 自带对数壁垒:r>0r > 0 时 s→0s \to 0 让损失 →+∞\to +\infty;优化 log⁡s\log s 时 s=elog⁡ss = e^{\log s} 永远是正的,梯度 ∂ SE/∂log⁡s=s−r\partial\,\mathrm{SE}/\partial\log s = s - r 在 ss 很小时仍有完整的信号。
  • 尺度一致:SE(cs;cr)=c⋅SE(s;r)\mathrm{SE}(cs; cr) = c\cdot\mathrm{SE}(s; r),同样的相对误差,代价正比于 rr(平方误差正比于 r2r^2)。

代码 01 第 2 部分:r=100r = 100 时,s=r/2s = r/2、2r2r 的得分熵是 19.3、30.7,平方误差是 2,500、10,000;r=0.01r = 0.01 时得分熵 0.0019、0.0031,平方误差 2.5×10−52.5 \times 10^{-5}、10−410^{-4}。再用随机梯度从 s=0.01s = 0.01 出发拟合”99% 是 0、1% 是 100”的噪声目标(真值 Er=1\mathbb{E}r = 1,学习率 0.01):

拟合方法后一半的平均第一次超过 0.5 的步数
得分熵,优化 log⁡s\log s(梯度 s−rs - r)0.940632
平方误差,优化 ss(梯度 2(s−r)2(s - r))0.93843
平方误差,优化 log⁡s\log s(梯度 2(s−r)s2(s - r)s)0.0005,656

直接优化 ss 的平方误差在这里也能学(但不保证正性);优化 log⁡s\log s 的平方误差先是 5,000 多步才爬到 0.5,之后一次大比值让 log⁡s\log s 跳得太远、被下一个零目标打回 s≈0s \approx 0,梯度随之消失,再也回不来。得分熵兼顾了正性和梯度。

3.3 隐式得分熵

得分熵里有未知的 p(y)/p(x)p(y)/p(x)。和第 12–13 讲的得分匹配一样,可以用”换元求和”消掉它:

Ex∼p∑ywxyp(y)p(x)log⁡s(x)y=∑x∑ywxy p(y)log⁡s(x)y=Ey∼p∑xwxylog⁡s(x)y,\mathbb{E}_{x\sim p}\sum_y w_{xy}\frac{p(y)}{p(x)}\log s(x)_y = \sum_x\sum_y w_{xy}\,p(y)\log s(x)_y = \mathbb{E}_{y \sim p}\sum_x w_{xy}\log s(x)_y,

得到隐式得分熵(implicit score entropy)Ex∼p∑y[wxysθ(x)y−wyxlog⁡sθ(y)x]\mathbb{E}_{x\sim p}\sum_y[w_{xy}s_\theta(x)_y - w_{yx}\log s_\theta(y)_x] + 常数。它不再需要真实比值,但要在每个邻居 yy 处都调用一次网络(L×VL \times V 次),太贵——和第 13 讲”显式得分匹配要 dd 次反向传播”是同一个困境。解决办法也一样:去噪(§5)。


4. 离散扩散过程 · The discrete diffusion process

4.1 连续时间马尔可夫链

连续的扩散用 SDE 加噪;离散的扩散用连续时间马尔可夫链(CTMC)。分布 ptp_t(一个长度为状态数的概率向量)满足

dptdt=Qtpt,\frac{dp_t}{dt} = Q_tp_t,

QtQ_t 是速率矩阵:非对角元 Qt[a,b]≥0Q_t[a, b] \geq 0 是”从 bb 跳到 aa“的速率,每列和为 0。直觉:在一小段时间 Δt\Delta t 里,从 bb 跳到 aa 的概率约为 Qt[a,b]ΔtQ_t[a,b]\Delta t。

整个句子的状态空间有 VLV^L 个状态,不能直接处理。SEDD 让每个 token 独立地按同一个 V′×V′V' \times V' 的小速率矩阵演化,Qt=σ(t)QQ_t = \sigma(t)Q。于是:

  • 一次只改一个 token:序列级的速率矩阵是逐 token 速率矩阵的”克罗内克和”,只有邻居之间有非零速率——正好和具体得分的”邻居”对上。
  • 转移概率按 token 分解:pt∣0(xt∣x0)=∏iPt[xti,x0i]p_{t\mid 0}(x_t \mid x_0) = \prod_iP_t[x_t^i, x_0^i],Pt=exp⁡(σˉ(t)Q)P_t = \exp(\bar\sigma(t)Q),只要算一个小矩阵的指数。

4.2 两种转移:均匀与吸收

  • 均匀(uniform):每个 token 以速率 σ(t)\sigma(t) “被重新抽一次”,新 token 在 VV 个词里均匀选。Q=1V11⊤−IQ = \frac1V\mathbf{1}\mathbf{1}^\top - I,exp⁡(σˉQ)=e−σˉI+(1−e−σˉ)1V11⊤\exp(\bar\sigma Q) = e^{-\bar\sigma}I + (1 - e^{-\bar\sigma})\frac1V\mathbf{1}\mathbf{1}^\top。最终分布:均匀的随机 token。
  • 吸收(absorbing,掩码):每个 token 以速率 σ(t)\sigma(t) 变成 [MASK],之后一直是 [MASK]。保持原样的概率 e−σˉe^{-\bar\sigma}、变成 [MASK] 的概率 1−e−σˉ1 - e^{-\bar\sigma}。最终分布:全是 [MASK]。

代码里两种过程都用对数线性调度 σˉ(t)=−log⁡(1−t)\bar\sigma(t) = -\log(1 - t):αt=1−t\alpha_t = 1 - t,“还没被动过”的概率随 tt 线性下降,t=1t = 1 时恰好是基础分布(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 个词当作一个小语言(V3=1,728V^3 = 1{,}728 个状态,真实分布只在 54 个三元组上非零),在全部状态上精确地演化:均匀过程在 t=0.25t = 0.25 时已经把概率摊到所有 1,728 个状态上(落在原支撑集上的概率只剩 0.544);吸收过程的概率始终只在 129 个状态上(“某个合法的三元组、部分位置换成 [MASK]”)。状态空间小得多,是吸收过程更容易学的一个直观原因。

4.3 反向过程由概率比给出

连续扩散的核心定理是:反向过程是一个 SDE,漂移项里有得分(Anderson 1982,第 14 讲)。离散的版本更简单:CTMC 的时间反转仍是 CTMC,反向速率是

Qˉt(y,x)=pt(y)pt(x) Qt(x,y),y≠x.\bar Q_t(y, x) = \frac{p_t(y)}{p_t(x)}\,Q_t(x, y), \qquad y \neq x.

推导:在时刻 tt,前向过程从 yy 到 xx 的”概率流量”是 pt(y)Qt(x,y)p_t(y)Q_t(x, y)。时间反转后,同一段轨迹变成从 xx 到 yy,流量必须相同:pt(x)Qˉt(y,x)=pt(y)Qt(x,y)p_t(x)\bar Q_t(y, x) = p_t(y)Q_t(x, y),移项即得。

于是 Qˉt(y,x)=s(x)y⋅Qt(x,y)\bar Q_t(y, x) = s(x)_y\cdot Q_t(x, y):**只要知道每个时刻的具体得分,就能把噪声变回数据。**前向速率只在邻居之间非零,所以只需要邻居的比值——正好是具体得分的定义域。

代码 01 第 3 部分在小语言的全部状态上验证:用精确的 ptp_t 构造反向速率,从 t=1t = 1 的纯噪声出发,按反向的主方程积分回 t=0t = 0,和 p0p_0 的总变差距离随欧拉步数 NN 下降:

N=30N = 30N=100N = 100N=1000N = 1000
均匀0.22670.02080.0004
吸收0.47920.02850.0001

吸收过程的比值长什么样? 设 xtx_t 的第 ii 个位置是 [MASK]。pt(xt)=t#掩码(1−t)#未掩码 p0(未掩码的那些词)p_t(x_t) = t^{\#\text{掩码}}(1-t)^{\#\text{未掩码}}\,p_0(\text{未掩码的那些词}),把第 ii 个位置揭开成 vv 只改变一个因子:

pt(xti←v)pt(xt)=1−tt⋅p0(xi=v∣未掩码的词).\frac{p_t(x_t^{i \leftarrow v})}{p_t(x_t)} = \frac{1 - t}{t}\cdot p_0(x^i = v \mid \text{未掩码的词}).

时间只出现在一个标量里;剩下的部分是一个和 tt 无关的”完形填空”分布——也就是 BERT 那样的掩码语言模型(Ou et al. 2024 据此提出网络不需要时间输入)。ctmc.py 的自检用枚举 1,728 种填法核对了这个公式(最大差 10−1610^{-16})。代码 01 第 4 部分的例子:t=0.25t = 0.25、xtx_t = “the _ _ the cat … . .”,第 2 个位置的比值 chases 1.125、sees 1.080、likes 0.795,和为 (1−t)/t=3(1-t)/t = 3。


5. 去噪得分熵与 SEDD 的训练 · Denoising score entropy

5.1 去噪得分熵

扩散模型里,pt(x)=∑x0p0(x0) pt∣0(x∣x0)p_t(x) = \sum_{x_0}p_0(x_0)\,p_{t\mid 0}(x \mid x_0)。把它代入得分熵里那个含未知比值的项:

Ex∼pt∑ywxypt(y)pt(x)log⁡s(x)y=Ex0∼p0Ex∼pt∣0(⋅∣x0)∑ywxypt∣0(y∣x0)pt∣0(x∣x0)log⁡s(x)y.\mathbb{E}_{x\sim p_t}\sum_yw_{xy}\frac{p_t(y)}{p_t(x)}\log s(x)_y = \mathbb{E}_{x_0\sim p_0}\mathbb{E}_{x\sim p_{t\mid 0}(\cdot\mid x_0)}\sum_yw_{xy}\frac{p_{t\mid 0}(y \mid x_0)}{p_{t\mid 0}(x \mid x_0)}\log s(x)_y.

真实比值被换成了条件比 pt∣0(y∣x0)/pt∣0(x∣x0)p_{t\mid 0}(y \mid x_0)/p_{t\mid 0}(x \mid x_0)——前向过程给的,闭式可算。这就是去噪得分熵(denoising score entropy,DSE):

LDSE=Ex0Ex∼pt∣0(⋅∣x0)∑y≠xwxy(sθ(x)y−pt∣0(y∣x0)pt∣0(x∣x0)log⁡sθ(x)y+K(pt∣0(y∣x0)pt∣0(x∣x0))).\mathcal{L}_{\mathrm{DSE}} = \mathbb{E}_{x_0}\mathbb{E}_{x\sim p_{t\mid 0}(\cdot\mid x_0)}\sum_{y \neq x}w_{xy}\Big(s_\theta(x)_y - \frac{p_{t\mid 0}(y\mid x_0)}{p_{t\mid 0}(x\mid x_0)}\log s_\theta(x)_y + K\Big(\frac{p_{t\mid 0}(y\mid x_0)}{p_{t\mid 0}(x\mid x_0)}\Big)\Big).

它和得分熵只差一个与 θ\theta 无关的常数(来自 KK 项)。这和第 13 讲”去噪得分匹配用 ∇log⁡q(x~∣x)\nabla\log q(\tilde x \mid x) 代替 ∇log⁡q(x~)\nabla\log q(\tilde x)“完全是同一个技巧,原因也一样:损失对目标是线性的,E[条件比∣xt]=真实比值\mathbb{E}[\text{条件比} \mid x_t] = \text{真实比值}。

代码 02 第 1 部分在同一批 2 万对 (x0,xt)(x_0, x_t)(t=0.3t = 0.3)上,对三个完全不同的”模型”算 SE(用前向–后向算出的真实比值)和 DSE:

过程模型SEDSEDSE − SE
均匀精确比值0.00008.60308.6030 ± 0.056
学到的网络0.45309.06348.6104 ± 0.055
瞎猜(比值全为 1)22.1230.768.6413 ± 0.042
吸收精确比值0.00006.13956.1395 ± 0.036
学到的网络0.03536.14556.1102 ± 0.036
瞎猜(均匀的完形填空)18.5524.736.1755 ± 0.033

精确比值的 SE 是 0,DSE 却是一个正常数(条件比只是真实比值的”带噪声版本”);三个模型的 DSE − SE 在误差范围内相同。最小化 DSE 就是最小化 SE,而 DSE 只需要前向过程的条件概率。

5.2 SEDD:用网络学比值

SEDD 的网络 sθ(xt,t)s_\theta(x_t, t) 读入整个(加了噪声的)句子,输出 L×V′L \times V' 个正数(论文用双向的 Transformer,取对数输出);训练时每步抽 x0x_0、t∼U(0,1)t \sim U(0, 1)、xt∼pt∣0x_t \sim p_{t\mid 0},最小化 DSE,权重取 wxty=Qt(xt,y)w_{x_ty} = Q_t(x_t, y)(§6 会解释为什么)。代码用一个 MLP:

  • 均匀过程:log⁡s=(1−t)⋅MLP(xt,t)\log s = (1 - t)\cdot\mathrm{MLP}(x_t, t)——乘 (1−t)(1 - t) 让 t→1t \to 1 时比值 →1\to 1,否则 σ(t)=1/(1−t)\sigma(t) = 1/(1-t) 的权重会把一点点误差放大成无穷大。
  • 吸收过程:log⁡si,v=log⁡1−tt+log⁡softmax(MLP(xt))i,v\log s_{i,v} = \log\frac{1-t}{t} + \log\mathrm{softmax}(\mathrm{MLP}(x_t))_{i,v}——按 §4.3 的公式,网络只学完形填空分布,不给它时间输入。

代码 02 第 2 部分比较学到的网络和精确比值。“ELBO 差距的密度”E[∑w⋅SE(sθ;真实比值)]\mathbb{E}[\sum w\cdot\mathrm{SE}(s_\theta; \text{真实比值})] 是真实反向过程和学到的反向过程在时刻 tt 的 KL 速率,它对 tt 的积分正是学到的模型的 −ELBO 比”精确比值的 −ELBO”多出来的部分(§6):

tt0.050.20.40.60.80.95积分
均匀:差距密度(bit)1.12360.74790.52340.24000.08850.04030.430
吸收:差距密度(bit)0.04500.04670.05420.05240.05230.01980.046
  • 吸收过程的差距 = 完形填空的 KL:把 s=1−ttpθs = \frac{1-t}{t}p_\theta、r=1−ttp0r = \frac{1-t}{t}p_0 代入得分熵,被盖住位置上的和化简成 1−ttKL(p0∥pθ)\frac{1-t}{t}\mathrm{KL}(p_0 \Vert p_\theta),乘以权重 σ(t)=11−t\sigma(t) = \frac{1}{1-t} 得 1tKL\frac1t\mathrm{KL}。代码里两列数字逐位相同。每个被盖住位置的 KL 在 tt 中等时最大(一部分上下文可见,要据此推理),t→1t \to 1 时最小(几乎全被盖住,只需学边缘分布)。
  • 均匀过程难得多(差距 0.43 vs 0.05 bit),而且集中在 tt 小的时候:这时大部分词是原来的、少数被换成了随机词,模型得先找出”哪个词被换掉了”——吸收过程的 [MASK] 直接告诉模型哪里需要填,均匀过程不告诉。

(代码 README 第 1 条:第一版网络训练不足,ELBO 差距是现在的 3–5 倍。)


6. 似然的上界 · The likelihood bound

6.1 扩散 ELBO

和第 16 讲一样,离散扩散给出 log⁡pθ(x0)\log p_\theta(x_0) 的下界(SEDD 定理):

−log⁡pθ(x0)≤∫01Ext∼pt∣0(⋅∣x0)∑y≠xtQt(xt,y)(sθ(xt,t)y−rylog⁡sθ(xt,t)y+K(ry))dt+DKL(p1∣0(⋅∣x0) ∥ pbase),-\log p_\theta(x_0) \leq \int_0^1\mathbb{E}_{x_t\sim p_{t\mid 0}(\cdot\mid x_0)}\sum_{y\neq x_t}Q_t(x_t, y)\Big(s_\theta(x_t, t)_y - r_y\log s_\theta(x_t, t)_y + K(r_y)\Big)dt + D_{\mathrm{KL}}(p_{1\mid 0}(\cdot\mid x_0)\,\Vert\,p_{\text{base}}),

ryr_y 是条件比。为什么权重是 Qt(xt,y)Q_t(x_t, y)? 下界来自”前向路径(给定 x0x_0)“和”模型的反向路径”之间的 KL。两个 CTMC 从同一个状态 xx 出发、跳到 yy 的速率分别为 aya_y、byb_y 时,单位时间的 KL 是 ∑y(by−ay+aylog⁡ayby)\sum_y(b_y - a_y + a_y\log\frac{a_y}{b_y})。代入真实的反向速率 ay=ryQt(x,y)a_y = r_yQ_t(x, y) 和模型的 by=syQt(x,y)b_y = s_yQ_t(x, y):

∑yQt(x,y)(sy−ry+rylog⁡ry−rylog⁡sy)=∑yQt(x,y) SE(sy;ry).\sum_yQ_t(x, y)\big(s_y - r_y + r_y\log r_y - r_y\log s_y\big) = \sum_yQ_t(x, y)\,\mathrm{SE}(s_y; r_y).

得分熵正是”跳跃过程之间的 KL 散度”。我们的调度让 t=1t = 1 时恰好是基础分布,最后一项为零。

比值精确时,界是紧的。 和第 16 讲的推导一样:Ex0[上界]=H(p0)+KL(前向路径∥模型路径)\mathbb{E}_{x_0}[\text{上界}] = H(p_0) + \mathrm{KL}(\text{前向路径}\Vert\text{模型路径});比值精确时两条路径只差起点,而起点也一样,KL 为零。代码 04 第 1 部分(2,000 个测试句子,真实的 −log₂p₀ 平均 10.7532 bit):

估计方法(精确比值)−ELBO与真值之差
均匀:对 tt 积分(每句 256 个时刻,重要性采样)10.7259−0.027 ± 0.018
吸收:对 tt 积分(同上)10.7280−0.025 ± 0.013
吸收:任意顺序的链式法则(§6.2)10.7532逐句精确到 10−1410^{-14}

对 tt 积分的估计只差约 0.03 bit(仍为负、约 1.5–2 个标准误,原因见 §6.3)。

6.2 吸收过程的上界 = 任意顺序的自回归

吸收过程 + 对数线性调度时,被积函数(§5.2 的推导)是 ∑i 被盖住1t(−log⁡pθ(x0i∣xt))\sum_{i\text{ 被盖住}}\frac1t\big(-\log p_\theta(x_0^i \mid x_t)\big)。被盖住的个数 kk 服从二项分布 Bin(L,t)\mathrm{Bin}(L, t),对 tt 积分:

∫01(Lk)tk(1−t)L−k⋅1t dt=(Lk)B(k,L−k+1)=1k.\int_0^1\binom{L}{k}t^k(1-t)^{L-k}\cdot\frac1t\,dt = \binom Lk B(k, L - k + 1) = \frac1k.

于是

−ELBO=∑k=1LE∣M∣=k[1k∑i∈M−log⁡pθ(x0i∣x0 中 M 以外的词)]=E随机顺序 σ[∑j=1L−log⁡pθ(xσj∣xσ<j)].-\mathrm{ELBO} = \sum_{k=1}^L\mathbb{E}_{|M| = k}\Big[\frac1k\sum_{i\in M}-\log p_\theta(x_0^i \mid x_0 \text{ 中 } M \text{ 以外的词})\Big] = \mathbb{E}_{\text{随机顺序 }\sigma}\Big[\sum_{j=1}^L-\log p_\theta(x^{\sigma_j} \mid x^{\sigma_{<j}})\Big].

吸收扩散的似然上界,就是”按随机顺序逐个揭开 token”的自回归损失的平均(Hoogeboom et al. 2022 的任意顺序自回归扩散;Ou et al. 2024、Sahoo et al. 2024、Shi et al. 2024 从不同角度得到同样的结论)。自回归模型是”固定从左到右”的特例。比值精确时,任何顺序的链式法则都给出精确的 −log⁡p0-\log p_0——上表最后一行逐句精确到浮点误差。扩散模型的 ELBO 和似然之间的差距,完全是网络在”完形填空”上的误差。

6.3 估计量的方差

代码 04 第 3 部分(学到的吸收模型,200 个句子,每句重复估计 20 次):

估计方法平均 −ELBO同一句子重复估计的标准差(bit)
对 tt 积分,均匀地抽 1 个时刻10.4308.07
对 tt 积分,均匀分层 64 个时刻10.7241.19
对 tt 积分,重要性采样 64 个时刻10.7211.11
任意顺序,每个 kk 平均被盖住的位置10.6912.73
任意顺序,链式法则(调用网络 10 次)10.7080.14
  • 对 tt 积分的被积函数在 tt 很小时有一个 1/t1/t:偶尔有一个 token 被加了噪声,它的项就被放大很多倍。估计量重尾,抽得少时平均值还系统性地偏低(罕见的大值没被抽到;只抽 1 个时刻时平均 10.43,比其他行低 0.3 bit)。在 tt 小的地方多抽、再按概率的倒数加权(重要性采样)能压低极端值,对标准差只改善一点。
  • 任意顺序的形式把对 tt 的积分解析地做掉了。链式法则版本只调用网络 10 次,标准差就小了一个数量级:各项此消彼长——前面猜错的信息,后面会被更准地补回来,比值精确时总和恒为 −log⁡p0-\log p_0。原以为”把每个 kk 的所有被盖住位置平均起来”会更稳(代码 README 第 4 条),结果相反:它破坏了这种抵消。

6.4 和自回归模型比较

代码 04 第 2 部分(5,000 个测试句子):

模型bit / 句每 token 困惑度比真实分布多
真实分布10.8692.1241—
自回归 GRU(精确似然,6.4 万参数)10.8742.1249+0.005
SEDD 吸收(−ELBO,4 个随机顺序的链式法则;19.6 万参数)10.9152.1310+0.047
SEDD 均匀(−ELBO,对 tt 积分)11.3202.1916+0.451

在这个玩具语言上自回归模型最好:它的结构(从左到右的链式法则)和语言的生成方式(HMM 从左到右)完全吻合,而扩散模型的上界要求网络对所有顺序的条件分布都学得好。吸收过程的上界离真实分布也很近;均匀过程差得多。SEDD 论文在真实文本(OpenWebText 训练,在 LAMBADA、WikiText、PTB 等数据集上测零样本困惑度)上报告:吸收过程明显好于均匀过程;同等规模下 SEDD 的困惑度上界和 GPT-2 相当,在部分数据集上更好,比之前的离散扩散(D3PM 等)和连续嵌入的扩散好得多。


7. 采样 · Sampling

7.1 τ-leaping 与 Tweedie 去噪

反向过程是一个 CTMC,原则上可以精确模拟(Gillespie 算法:一次跳一个 token)。但那样要几千次网络调用。实践中把时间分成若干步,每一步所有位置同时、独立地更新(τ-leaping):

  • Euler:位置 ii 从 xtix_t^i 跳到 vv 的概率 ≈Δt⋅σ(t)Q[xti,v] sθ(xt,t)i,v\approx \Delta t\cdot\sigma(t)Q[x_t^i, v]\,s_\theta(x_t, t)_{i,v}。
  • Tweedie τ-leaping(SEDD):对单个 token,若比值精确,“从 tt 走到 ss“的精确转移是 p(xsi=b∣xt)∝(exp⁡(−ΔQ) si)b⋅exp⁡(ΔQ)[xti,b],Δ=σˉ(t)−σˉ(s),p(x_s^i = b \mid x_t) \propto \big(\exp(-\Delta Q)\,s_i\big)_b\cdot\exp(\Delta Q)[x_t^i, b], \qquad \Delta = \bar\sigma(t) - \bar\sigma(s), sis_i 是第 ii 个位置的比值向量(当前 token 处为 1)。它是第 13 讲 Tweedie 公式的离散类比:用比值先”估计干净的 token”,再按前向过程加回到时刻 ss 的噪声。

吸收过程 + 对数线性调度时两者完全相同:被盖住的位置以 t−st\frac{t - s}{t} 的概率被揭开(Euler:Δt⋅11−t⋅1−tt\Delta t\cdot\frac{1}{1-t}\cdot\frac{1-t}{t};精确:αs−αt1−αt\frac{\alpha_s - \alpha_t}{1 - \alpha_t}),揭开成什么由完形填空分布决定。代码 03 里同一个种子下两者的样本逐句相同。

7.2 离散化误差:一步里多个 token 一起变

代码 03 第 1 部分用精确的比值采样(只有离散化误差;2,000 个句子;真实样本:合语法 1.000、不同句子 0.493、主语是 bird 时动词是 chases 的比例 0.046):

采样1 步4 步8 步16 步64 步256 步
吸收:合语法比例0.0350.5830.7800.8830.9720.993
均匀 Euler:合语法比例0.0000.3450.7920.9430.9910.999
均匀 Tweedie:合语法比例0.0330.7340.9110.9680.9941.000
吸收:P(chases | bird)0.2670.1020.0540.0800.0400.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 可能走到真实 ptp_t 下概率为 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.0510.030
吸收,学到的网络0.0460.028
均匀,精确比值(夹住给定的词)0.0930.042
均匀,学到的网络(夹住给定的词)0.2720.142
  • 吸收过程的条件生成是有原则的:给定的词从不被盖住,反向过程只填 [MASK],而精确比值恰好是”给定这些词”的完形填空分布——采样复现了精确的条件概率。
  • 填空(给定第 2 个词和句尾、反推主语)是自回归模型做不到的:要满足”第 2 个词是 chases”,它只能生成很多句子再筛选。
  • 均匀过程”夹住给定的词”只是近似:被夹住的位置是干净的,其他位置却处在噪声水平 tt,这个状态并不服从 ptp_t。即使比值精确,条件概率也偏了(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

  1. 离散数据让依赖微积分的方法失灵:流(变量替换)、GAN(梯度穿过样本)、得分模型(∇xlog⁡p\nabla_x\log p)。老路是连续嵌入(取整困难、似然差)和自回归(串行、只能从左到右)。
  2. 具体得分 s(x)y=p(y)/p(x)s(x)_y = p(y)/p(x),yy 是只差一个 token 的邻居:梯度的离散推广,归一化常数消掉。
  3. 得分熵 s−rlog⁡s+K(r)s - r\log s + K(r) 是 xlog⁡xx\log x 的 Bregman 散度:非负、对 rr 线性、保证正性、尺度一致;比平方误差更适合学比值。
  4. 离散扩散过程:逐 token 的 CTMC,均匀或吸收转移;反向速率 = 概率比 × 前向速率。吸收过程的比值 = 1−tt\frac{1-t}{t} × 完形填空分布。
  5. 去噪得分熵用条件比代替真实比值,和得分熵只差常数(三个模型上核对)。
  6. 似然上界:得分熵 = 跳跃过程之间的 KL;比值精确时界是紧的。吸收过程的上界 = 任意顺序的自回归损失;链式法则形式的估计方差极小。
  7. 采样:τ-leaping 让多个 token 同时更新,步数少时丢掉相关性(1 步几乎没有合语法的句子);Tweedie 更新在均匀过程上更好。吸收过程能做有原则的提示补全和填空。
  8. 均匀 vs 吸收:吸收过程更容易学(状态少、[MASK] 告诉模型哪里需要填),ELBO 差距 0.05 vs 0.43 bit。

10. 常见误区 · Common pitfalls

  1. “文本是离散的,所以扩散模型不能用于文本。” 扩散需要的不是梯度,而是”怎样反转加噪过程”;离散空间里它由概率比给出(§4.3)。
  2. “具体得分就是对 one-hot 向量求梯度。” 不是:它是 L×VL \times V 个概率比,每个位置、每个候选词一个;token 之间没有”方向”(§2.2)。
  3. “用平方误差学比值也一样。” 期望意义下最小值相同,但平方误差不保证正性、尺度按 r2r^2;优化 log⁡s\log s 时梯度 ∝s\propto s,会学不动甚至卡死(§3.2)。
  4. “去噪得分熵的最小值是 0。” 条件比只是真实比值的带噪声版本,最小值是一个正常数;精确比值的 DSE 在 t=0.3t = 0.3 时约 8.6 nat(均匀)、6.1 nat(吸收)(§5.1)。
  5. “离散扩散的 −ELBO 和似然之间有一个结构性的差距。” 比值精确时界是紧的(逐句精确,§6.1);差距完全来自网络的误差。
  6. “步数越少越好,扩散模型的优势就是并行。” 一步里同时改变的 token 越多,越容易丢掉它们之间的相关性(§7.2:1 步时合语法比例 3.5%)。并行是有代价的。
  7. “均匀转移和吸收转移只是两种选择,差不多。” 吸收过程在这里 ELBO 差距小一个数量级,条件生成也有原则;均匀过程要同时”找错”和”改错”(§5.2)。
  8. “把每个 k 的所有被盖住位置的交叉熵平均起来,估计更稳。” 恰好相反:链式法则各项此消彼长,平均破坏了这种抵消(§6.3)。

11. 练习 · Exercises

练习 1(具体得分与梯度) 设 p(x)∝e−E(x)p(x) \propto e^{-E(x)},xx 在间距为 Δ\Delta 的网格上。证明 p(x+Δ)p(x)−1=−ΔE′(x)+O(Δ2)\frac{p(x+\Delta)}{p(x)} - 1 = -\Delta E'(x) + O(\Delta^2),并用它解释代码 01 第 1 部分 x=2x = 2、Δ=0.1\Delta = 0.1 时为什么结果是 −1.85 而不是 −2。

参考答案

p(x+Δ)p(x)=e−(E(x+Δ)−E(x))=e−ΔE′(x)−12Δ2E′′(x)+…\frac{p(x+\Delta)}{p(x)} = e^{-(E(x+\Delta) - E(x))} = e^{-\Delta E'(x) - \frac12\Delta^2E''(x) + \dots},展开得 1−ΔE′+12Δ2(E′2−E′′)+O(Δ3)1 - \Delta E' + \frac12\Delta^2(E'^2 - E'') + O(\Delta^3)。对 N(0,1)\mathcal{N}(0,1),E=x2/2E = x^2/2,E′=xE' = x,E′′=1E'' = 1:(p(x+Δ)/p(x)−1)/Δ≈−x+12Δ(x2−1)(p(x+\Delta)/p(x) - 1)/\Delta \approx -x + \frac12\Delta(x^2 - 1)。x=2x = 2、Δ=0.1\Delta = 0.1:−2+0.15=−1.85-2 + 0.15 = -1.85,和代码的 −1.8535 一致(剩下的是三阶项)。

练习 2(得分熵是 Bregman 散度) 对 F(x)=xlog⁡xF(x) = x\log x,Bregman 散度 DF(r,s)=F(r)−F(s)−F′(s)(r−s)D_F(r, s) = F(r) - F(s) - F'(s)(r - s)。证明 DF(r,s)=SE(s;r)D_F(r, s) = \mathrm{SE}(s; r),并由此说明得分熵非负、只在 s=rs = r 时为零。

参考答案

F′(s)=log⁡s+1F'(s) = \log s + 1。DF=rlog⁡r−slog⁡s−(log⁡s+1)(r−s)=rlog⁡r−rlog⁡s−r+s=s−rlog⁡s+r(log⁡r−1)D_F = r\log r - s\log s - (\log s + 1)(r - s) = r\log r - r\log s - r + s = s - r\log s + r(\log r - 1)。FF 严格凸,所以 Bregman 散度非负,且只在 s=rs = r 时为零。

练习 3(去噪得分熵的最小值) 固定 xtx_t,把 DSE 对 sys_y 的部分写成 Ex0∣xt[sy−ry(x0)log⁡sy]\mathbb{E}_{x_0\mid x_t}[s_y - r_y(x_0)\log s_y]。求最小值点,说明它等于真实比值 pt(y)/pt(xt)p_t(y)/p_t(x_t)。

参考答案

对 sys_y 求导:1−E[ry(x0)∣xt]/sy=0⇒sy∗=E[ry(x0)∣xt]1 - \mathbb{E}[r_y(x_0) \mid x_t]/s_y = 0 \Rightarrow s_y^* = \mathbb{E}[r_y(x_0) \mid x_t]。而 E[pt∣0(y∣x0)pt∣0(xt∣x0) ∣ xt]=∑x0p0(x0)pt∣0(xt∣x0)pt(xt)⋅pt∣0(y∣x0)pt∣0(xt∣x0)=pt(y)pt(xt)\mathbb{E}\big[\frac{p_{t\mid 0}(y\mid x_0)}{p_{t\mid 0}(x_t\mid x_0)}\,\big|\,x_t\big] = \sum_{x_0}\frac{p_0(x_0)p_{t\mid0}(x_t\mid x_0)}{p_t(x_t)}\cdot\frac{p_{t\mid 0}(y\mid x_0)}{p_{t\mid 0}(x_t\mid x_0)} = \frac{p_t(y)}{p_t(x_t)}。

练习 4(均匀转移的矩阵指数) 设 Q=1VJ−IQ = \frac1V J - I(J=11⊤J = \mathbf{1}\mathbf{1}^\top)。用 J2=VJJ^2 = VJ 证明 exp⁡(σˉQ)=e−σˉI+(1−e−σˉ)1VJ\exp(\bar\sigma Q) = e^{-\bar\sigma}I + (1 - e^{-\bar\sigma})\frac1VJ。

参考答案

II 和 JJ 可交换,exp⁡(σˉQ)=e−σˉexp⁡(σˉVJ)\exp(\bar\sigma Q) = e^{-\bar\sigma}\exp(\frac{\bar\sigma}{V}J)。exp⁡(cJ)=I+∑n≥1cnn!Vn−1J=I+ecV−1VJ\exp(cJ) = I + \sum_{n\geq1}\frac{c^n}{n!}V^{n-1}J = I + \frac{e^{cV} - 1}{V}J。取 c=σˉ/Vc = \bar\sigma/V:e−σˉ(I+eσˉ−1VJ)=e−σˉI+1−e−σˉVJe^{-\bar\sigma}(I + \frac{e^{\bar\sigma} - 1}{V}J) = e^{-\bar\sigma}I + \frac{1 - e^{-\bar\sigma}}{V}J。代码 01 第 3 部分用 torch.linalg.matrix_exp 核对,最大差 2.2×10−162.2 \times 10^{-16}。

练习 5(反向速率) 用”概率流量守恒”推导 Qˉt(y,x)=pt(y)pt(x)Qt(x,y)\bar Q_t(y, x) = \frac{p_t(y)}{p_t(x)}Q_t(x, y),并验证反向速率矩阵的每列和为零时,反向过程使 ptp_t 沿时间倒退:−dptdt=Qˉtpt-\frac{dp_t}{dt} = \bar Q_tp_t。

参考答案

流量:前向在 [t,t+dt][t, t + dt] 从 yy 到 xx 的概率 pt(y)Qt(x,y)dtp_t(y)Q_t(x, y)dt;反向过程同一段轨迹反着走,从 xx 到 yy 的概率 pt(x)Qˉt(y,x)dtp_t(x)\bar Q_t(y, x)dt,两者相等。验证:(Qˉtpt)(y)=∑x≠yQˉt(y,x)pt(x)−∑x≠yQˉt(x,y)pt(y)=∑x≠y[pt(y)Qt(x,y)−pt(x)Qt(y,x)]=−∑x≠y[Qt(y,x)pt(x)−Qt(x,y)pt(y)]=−(Qtpt)(y)=−dptdt(y)(\bar Q_tp_t)(y) = \sum_{x\neq y}\bar Q_t(y, x)p_t(x) - \sum_{x \neq y}\bar Q_t(x, y)p_t(y) = \sum_{x\neq y}[p_t(y)Q_t(x, y) - p_t(x)Q_t(y, x)] = -\sum_{x \neq y}[Q_t(y, x)p_t(x) - Q_t(x, y)p_t(y)] = -(Q_tp_t)(y) = -\frac{dp_t}{dt}(y)。

练习 6(吸收过程的比值) 对吸收过程、αt=1−t\alpha_t = 1 - t,证明 pt(xti←v)pt(xt)=1−ttp0(xi=v∣未掩码的词)\frac{p_t(x_t^{i \leftarrow v})}{p_t(x_t)} = \frac{1-t}{t}p_0(x^i = v \mid \text{未掩码的词})(第 ii 个位置被盖住)。若第 ii 个位置没被盖住,比值是什么?为什么反向过程用不到它?

参考答案

pt(xt)=∑x0p0(x0)∏jpt∣0(xtj∣x0j)p_t(x_t) = \sum_{x_0}p_0(x_0)\prod_jp_{t\mid 0}(x_t^j \mid x_0^j),被盖住的位置因子 tt(与 x0jx_0^j 无关),未被盖住的因子 (1−t)1[x0j=xtj](1-t)\mathbb{1}[x_0^j = x_t^j]。所以 pt(xt)=t∣M∣(1−t)L−∣M∣p0(xU=xtU)p_t(x_t) = t^{|M|}(1-t)^{L-|M|}p_0(x^U = x_t^U)。揭开第 ii 个位置:t∣M∣−1(1−t)L−∣M∣+1p0(xU=xtU,xi=v)t^{|M|-1}(1-t)^{L-|M|+1}p_0(x^U = x_t^U, x^i = v)。相除即得。未被盖住的位置换成 [MASK]:比值 t1−t\frac{t}{1-t};换成别的词 ww:比值是 p0(…,w,…)/p0(…)p_0(\ldots, w, \ldots)/p_0(\ldots)(另一个句子的概率比),一般不为 0。但反向速率和 ELBO 里乘的是前向速率 Qt(xt,y)Q_t(x_t, y)——“从 yy 跳到 xtx_t“的速率;吸收过程里没有任何状态会跳成一个未掩码的词,这些速率都是 0,所以这些比值用不到。

练习 7(1/k 的积分) 证明 ∫01(Lk)tk(1−t)L−kdtt=1k\int_0^1\binom Lkt^{k}(1-t)^{L-k}\frac{dt}{t} = \frac1k,并由此写出吸收扩散 −ELBO 的”任意顺序”形式。

参考答案

∫01tk−1(1−t)L−kdt=B(k,L−k+1)=(k−1)!(L−k)!L!\int_0^1t^{k-1}(1-t)^{L-k}dt = B(k, L-k+1) = \frac{(k-1)!(L-k)!}{L!},乘以 (Lk)=L!k!(L−k)!\binom Lk = \frac{L!}{k!(L-k)!} 得 (k−1)!k!=1k\frac{(k-1)!}{k!} = \frac1k。给定被盖住的集合大小为 kk,集合在所有大小为 kk 的子集里均匀,被积函数的期望为 1tE∣M∣=k[∑i∈MCEi]\frac1t\mathbb{E}_{|M|=k}[\sum_{i\in M}\mathrm{CE}_i];对 tt 积分、对 kk 求和即得 §6.2 的公式。

练习 8(链式法则为什么方差为零) 设模型的条件分布精确:pθ(⋅∣⋅)=p0(⋅∣⋅)p_\theta(\cdot \mid \cdot) = p_0(\cdot \mid \cdot)。证明对任意顺序 σ\sigma,∑j−log⁡p0(xσj∣xσ<j)=−log⁡p0(x)\sum_j-\log p_0(x^{\sigma_j} \mid x^{\sigma_{<j}}) = -\log p_0(x)。为什么”每个 kk 平均被盖住的位置”的估计没有这个性质?

参考答案

链式法则:p0(x)=∏jp0(xσj∣xσ<j)p_0(x) = \prod_jp_0(x^{\sigma_j} \mid x^{\sigma_{<j}}) 对任何顺序成立,取对数即得。平均版本的第 kk 项是 1k∑i∈Mk−log⁡p0(xi∣xMˉk)\frac1k\sum_{i\in M_k}-\log p_0(x^i \mid x^{\bar M_k}):同一个集合里的 kk 个位置都以”MkM_k 之外的词”为条件,它们不是一个链式分解的各项,总和不再恒等于 −log⁡p0(x)-\log p_0(x),随 MkM_k 的选择波动。代码 04:精确比值时链式法则逐句偏差 7×10−157 \times 10^{-15},平均版本单句偏差可达 13 bit。

练习 9(吸收过程的 Euler = Tweedie) 对吸收过程、αt=1−t\alpha_t = 1 - t,被盖住的位置从 tt 走到 s<ts < t:(a) 写出 Euler 步揭开的概率;(b) 写出精确的 p(xsi≠[MASK]∣xti=[MASK])p(x_s^i \neq \text{[MASK]} \mid x_t^i = \text{[MASK]});(c) 说明两者相等,而对均匀过程 Euler 只是一阶近似。

参考答案

(a) ∑v(t−s)σ(t)Q[MASK,v]sv=(t−s)⋅11−t⋅1−tt∑vpθ(v)=t−st\sum_v(t - s)\sigma(t)Q[\text{MASK}, v]s_v = (t - s)\cdot\frac{1}{1-t}\cdot\frac{1-t}{t}\sum_vp_\theta(v) = \frac{t-s}{t}。(b) 给定 tt 时被盖住,“被盖住的时刻”在 [0,t][0, t] 上的条件分布:P(在 s 时还没被盖住)=αs−αt1−αt=(1−s)−(1−t)t=t−stP(\text{在 } s \text{ 时还没被盖住}) = \frac{\alpha_s - \alpha_t}{1 - \alpha_t} = \frac{(1-s) - (1-t)}{t} = \frac{t-s}{t}。(c) 相等。均匀过程里一个 token 在一步里可能”变了又变”,Euler 只保留一次跳跃,Tweedie 用 exp⁡(±ΔQ)\exp(\pm\Delta Q) 精确处理了单个 token 的全部可能(代码 03:8 步时合语法比例 0.792 vs 0.911)。

练习 10(离散化误差的最简单例子) 两个 token 的语言只有两句话:“a a” 和 “b b”,各占一半。用吸收过程、精确比值、1 步从全 [MASK] 采样。(a) 每个位置的边缘分布是什么?(b) 生成的句子是 “a b” 的概率是多少?(c) 用 2 步(t:1→0.5→0t: 1 \to 0.5 \to 0)呢?

参考答案

(a) 两个位置都被盖住时,每个位置的完形填空分布是 (a: 0.5, b: 0.5)。(b) 1 步时两个位置同时、独立地揭开:P(“a b”) + P(“b a”) = 0.5,P(“a b”) = 0.25——一半的样本不合法。(c) 第一步每个位置以 1−0.51=0.5\frac{1 - 0.5}{1} = 0.5 的概率被揭开:两个都揭开(概率 1/4)时独立地抽,有一半不合法;只揭开一个(1/2)时第二步另一个位置的条件分布是确定的,总是合法;都不揭开(1/4)时第二步同时揭开,一半不合法。不合法的概率 14⋅12+14⋅12=14\frac14\cdot\frac12 + \frac14\cdot\frac12 = \frac14,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 的整条”问题链”。最后把它串起来:

讲次家族怎样表示 p(x)p(x)怎样学代价 / 留下的问题
3–4自回归链式法则 ∏ip(xi∣x<i)\prod_ip(x_i\mid x_{<i})最大似然(= 最小化 KL)没有隐变量;采样串行
5–6VAE∫p(z)p(x∣z)dz\int p(z)p(x\mid z)dzELBO、重参数化只能优化下界;先验空洞
7–8流可逆变换 + 变量替换精确似然网络必须可逆、雅可比可算
9–10GAN只有采样器两样本检验 / 判别器没有似然;训练不稳定、模式坍塌
11–12能量模型efθ(x)/Z(θ)e^{f_\theta(x)}/Z(\theta)对比散度、得分匹配、NCE配分函数;采样要 MCMC
13–14得分模型∇xlog⁡p\nabla_x\log p(多个噪声水平)去噪得分匹配采样要很多步
15评估—似然、样本质量、表示没有一把尺子能发现所有毛病
16扩散层级 VAE = 得分模型 = SDE加权的去噪损失采样步数;引导的权衡
17离散隐变量离散的 zzREINFORCE + 基线、Gumbel-softmax方差 vs 偏差
18离散扩散概率比 p(y)/p(x)p(y)/p(x)得分熵τ-leaping 的离散化误差

几条贯穿全课的线:

  1. **似然、隐变量、可处理性三者很难兼得。**每个家族都在三者之间做取舍:自回归有似然没隐变量,VAE 有隐变量只有下界,流两者都有但结构受限,GAN、能量模型、得分模型放弃(或绕开)归一化。
  2. **“难算的东西,就去学它的一个可以局部计算的替身”:**能量模型学未归一化的 ff,得分模型学 ∇log⁡p\nabla\log p,离散扩散学 p(y)/p(x)p(y)/p(x)——这三者都让配分函数消失。
  3. **“去噪”一再出现:**去噪得分匹配(第 13 讲)、DDPM 的 ϵ\epsilon 预测(第 16 讲)、去噪得分熵(本讲)——都用”前向过程的条件量”代替”边缘分布的未知量”,只差一个常数。
  4. **离散与连续:**第 17 讲在离散隐变量上用估计量或松弛绕开梯度;第 18 讲在离散数据上用概率比代替梯度。两者都提醒我们:深度生成模型的很多工具是为连续数据设计的,离散世界需要重新想一遍。
  5. **诚实的评估:**本讲义的每个实验都和”已知的真相”比较(像素世界的精确 log⁡p\log p、高斯混合的精确得分、HMM 的精确比值)。真实世界没有这样的真相,所以第 15 讲的评估方法、以及”知道每个指标看不到什么”,和模型本身一样重要。

如果想继续深入:连续时间、微分方程视角的流匹配与扩散,见本仓库的 MIT6.S184;大模型时代的系统与应用,见 CMU10-423、CS336。

← 返回课程目录