IT 论文精读 · PAPER 28
Ho, Jain & Abbeel · UC Berkeley · NeurIPS 2020
今天你打一句话就能让 AI 画出一张画(Midjourney、Stable Diffusion、DALL·E 这一类),背后那套方法叫扩散模型(diffusion model)。2020 年,伯克利的三个人(Ho、Jain、Abbeel)写了这篇 DDPM,把一个原本效果平平的老想法调通了:让机器从一团电视雪花点里,一点点「擦」出一张从没存在过的照片。它的画质第一次超过当时最强的对手,此后几乎所有 AI 出图、出视频的产品都建在它上面。
在它之前,教机器画画的主流办法是「造假者 vs 验钞员」:一个网络造假图,另一个挑刺,互相掐架、越练越强。出图挺漂亮,但训练像走钢丝——两边稍不平衡就崩,还常常「只会画那么几种」。
DDPM 换了个思路,朴素得有点好笑:先学会破坏,再倒着放录像。
拿一张清晰照片,往上撒一层细沙;再撒一层、再一层……撒够一千层,照片彻底变成一团雪花点。这个「毁掉」的过程无需学习。
关键在于:把这段录像倒着放,就是「从雪花点里长出一张照片」。「凭空画一张画」很难,但「把刚刚撒上去的那一薄层沙子擦掉」很容易——难事被拆成了一千个几乎不动脑的小步。机器要学的,就只是这一个小步。
训练简单到近乎作弊:拿一张真照片,随机挑个脏的程度,一次性把沙子撒上去——沙子是我们自己撒的,标准答案就在手里。把这张脏图连同「脏到第几层」递给网络,只问一句:这上面多出来的沙子长什么样?它指出来,跟答案一对,差多少改多少。没有对手、没有博弈,就一道有标准答案的填空题——训练因此特别稳。
出图时反过来用:随手抓一团雪花点,问「哪些是沙子」,减掉一点,再问、再减……上千遍之后,一张谁都没拍过的照片就浮出来了。为什么是新图而不是复原原图?因为起点是随手抓的一团噪点,网络每步只把画面往「更像真实照片」推一点——像看云:云是随机的,但你总能从里面看出个形状。
训练不再走钢丝,画面又多样又干净,画质一举超过当年最强的对抗式模型。更要紧的是这条路能一直往上长——接上「按文字描述来擦」,就成了今天打字出图的那些产品,视频生成也是同一套。
诚实的代价只有一条,但很硬:出一张图要让网络来回跑上千遍,比对手那种「一次成型」慢了几百倍。
把「凭空画一张图」倒过来做:先用一千小步把照片撒成雪花点(不用学),再训练网络专门认出「每步多出来的那点噪声」;出图时从随机雪花点开始,反复减掉网络指认的噪声,图就长出来了。训练稳、样子多,代价是出图要跑上千遍。
想看加噪 / 去噪链的结构图、目标函数和实验数字? → 切到精读版
DDPM 把图像生成写成一条固定的加噪链与一条学出来的去噪链:前向用上千小步把真实图片糊成纯高斯噪声,反向训练一个网络逐步擦回去。关键一手是把训练目标重参数化成「预测每一步加进去的那团噪声」,于是复杂的变分下界塌缩成朴素的均方误差回归。它第一次让扩散模型的样本质量超过 GAN(CIFAR-10 无条件生成 IS 9.46、FID 3.17),成为今天所有文生图 / 文生视频系统的方法底座。
作者 Jonathan Ho、Ajay Jain、Pieter Abbeel(UC Berkeley),NeurIPS 2020。它上承两条线:Sohl-Dickstein 等 2015 年「用非平衡热力学做扩散式生成」(想法已在,样本很糟)与 Song & Ermon 2019 年的基于分数的生成模型(score-based,用 Langevin 采样出图),DDPM 把两者接到一起并调通;下启 DDIM、classifier-free guidance、Stable Diffusion、DALL·E 2、Imagen 与视频生成模型。
2020 年前后,生成模型三条主路各有硬伤。GAN 出图最漂亮,但训练是两个网络的博弈,超参一歪就崩,还容易模式塌缩、覆盖不住数据的多样性。VAE 与自回归模型训练稳、似然口径清楚,却要么成图偏糊、要么逐像素生成慢得离谱。扩散模型自 2015 年就有,理论优雅,可出图质量远不能看,几乎没人当真。
所以真问题不是「有没有第三条路」,而是:这条理论上很干净的路为什么出图这么差?不靠对抗训练能不能拿到 GAN 级画质?DDPM 的回答是——问题出在怎么参数化、怎么写损失,不在框架本身。
取一张真实图片 x₀,定义一个 T 步(论文取 T = 1000)的固定过程:每步往图上掺一点高斯噪声、并把原图按比例缩小一丁点,强度由预先定好的表 β₁…β_T 控制(论文用 1e-4 线性升到 0.02)。走满 1000 步,图片变成与原图无关的纯高斯噪声 x_T。这条链没有任何待学的参数——它只是我们规定的破坏方式。
一个至关重要的性质:每步都是高斯的、强度又固定,于是任意时刻的脏图可以一步算出来,不必真的迭代:
x_t = √ᾱ_t · x₀ + √(1−ᾱ_t) · ε,其中 ε 是标准高斯噪声、ᾱ_t 是由那张表算出、随 t 单调下降的系数。白话:第 t 步的脏图 = 淡化后的原图 + 按比例掺入的一团噪声,t 越大原图越淡。于是训练时随机抽个 t 就能直接造出脏图和它的噪声答案。
生成就是把链倒过来走:从纯噪声 x_T 出发,一步步问「上一时刻更干净的那张图长什么样」。数学上有个好消息:每步加的噪声足够小时,反向那步也近似是高斯分布——网络于是不必吐出一整张图的复杂分布,只需给出这个小高斯的均值(方差论文直接固定成常数,取 β_t 或其变体,实测样本质量相近)。
这就是把难题拆小的全部收益:一步到位建模「所有真实图片的分布」难如登天,而「已知一张略脏的图、猜它稍干净的样子」局部、温和、几乎线性。1000 个小任务串起来,等价于那一次极难的大任务。
按变分下界推导,损失里每项都在让网络预测的均值逼近某个「真实后验均值」。论文做了一步代数重排:既然 x_t 由 x₀ 与噪声 ε 合成,那个真实均值就能改写成 x_t 与 ε 的组合。于是干脆让网络直接猜那团噪声 ε,均值由公式换算。损失塌缩成一行:
L_simple = ‖ ε − ε_θ(√ᾱ_t·x₀ + √(1−ᾱ_t)·ε , t) ‖²
白话:随机抽一张训练图、一个步数 t、一团噪声撒上去,让网络看着脏图和 t 把噪声指认出来,指得越准损失越小。没有对抗、没有采样链——一个标准的均方误差回归,稳得像训练分类器。
为什么这个改写关键?其一,学习目标变成了尺度稳定的量:不管 t 大 t 小,答案总是一团标准高斯噪声,网络不必拟合随 t 剧烈变化的数值范围。其二,论文指出这个形式恰好等价于去噪分数匹配(denoising score matching):预测噪声本质上是在估计「往哪个方向改能让图更像真图」(即 score),采样于是成了带退火的 Langevin 迭代。一个式子同时打通了「变分下界」与「分数匹配」两套理论。
还有个意外之喜:L_simple 相当于把下界里随 t 变化的权重系数全部丢掉,效果是降低了小 t(几乎干净、只差细节)那些项的权重,让网络把力气花在噪声重、真正难的那些步上。论文实测:按严格下界训练似然更好看,按 L_simple 训练图好看得多。
预测噪声是「输入一张图、输出同样大小一张图」的任务,骨干因此选 U-Net:逐级下采样抓全局结构、逐级上采样恢复细节,同分辨率之间用跳线直连以免细节丢失;论文另加 group normalization、在 16×16 分辨率处插入自注意力层补全局关联,并把步数 t 编成正弦嵌入注入每个残差块——1000 步共用同一个网络,靠 t 告诉它现在该擦多重的噪声,参数量与步数无关。
采样时循环 t = T … 1:把 x_t 和 t 喂进网络得到预测噪声,减去相应的一份、再除以缩放系数得到略干净的图,然后额外掺回一点随机噪声(最后一步除外)——这点随机性是必要的,它正对应 Langevin 采样里的扰动项。
主战场是 CIFAR-10(5 万张 32×32 小图)的无条件生成:DDPM 拿到 Inception Score 9.46、FID 3.17,优于当时所有已发表模型(含各类 GAN)——扩散模型第一次在画质上正面赢下 GAN,这也是本文影响力的来源。在 LSUN 卧室、教堂类 256×256 图像上,样本质量与 ProgressiveGAN 同档。
论文也诚实报了一处不好看的数字:无损码长约 3.75 bits/dim(测试集),并不比同期专攻似然的模型更好。作者的解释很有意思:拆开看,绝大部分比特花在人眼几乎察觉不到的细枝末节上,决定「像不像」的粗结构只占很小一部分——这正说明「似然好 ≠ 图好看」,也解释了为何丢权重的 L_simple 出图更强。另有两个关键消融:预测噪声 ε 明显优于直接预测均值;反向方差固定成常数即可,学它并无必要。
它一举把扩散模型从「理论漂亮但没用」变成「当前最强」,配方还极其可迁移:目标简单到只是回归、训练稳定、扩容就变好、天然不塌缩(它做的是覆盖整个数据分布的似然式训练,而非与判别器博弈)。此后一年内,Nichol & Dhariwal 的改进版(学方差、余弦噪声表)、DDIM 的少步采样、《Diffusion Models Beat GANs》的分类器引导接连出现;再往后 classifier-free guidance 让文字条件生成变得简单,Latent Diffusion(Stable Diffusion)把扩散搬进压缩后的隐空间,消费级显卡也跑得动。今天的 DALL·E 2、Imagen、Midjourney 与文生视频系统都可追到这一篇。GAN 主导生成式建模的十年,从这里换代。
L_simple 丢权重这步是经验上有效、而非从原理推出,等于已偏离它自称的最大似然框架。① 一句话:固定的千步加噪链把图糊成高斯噪声,再训练网络逐步倒放;关键是把目标重写成「预测每步加进去的噪声」。
② 痛点:GAN 画质好但训练不稳、易塌缩;VAE / 自回归稳但糊或慢;扩散自 2015 年就有,只是出图太差。
③ 前向链无参数可学,有闭式 x_t = √ᾱ_t·x₀ + √(1−ᾱ_t)·ε——随机抽 t 直接造脏图、答案免费;反向每步近似高斯,网络只需给均值。
④ 核心一手:改为预测噪声,损失塌缩成 ‖ε − ε_θ(x_t,t)‖² 的回归,同时等价于去噪分数匹配、采样即退火 Langevin;顺带丢掉下界里随 t 变化的权重,让网络专攻重噪声的难步——似然稍差,图明显更好。
⑤ 实现:U-Net + 16×16 自注意力 + 步数 t 的正弦嵌入,1000 步共用一套参数;采样每步掺回一点随机噪声。
⑥ 结果:CIFAR-10 无条件 IS 9.46 / FID 3.17,首次在画质上赢过 GAN;LSUN 256×256 与 ProgressiveGAN 同档;似然 3.75 bits/dim 并不领先。
⑦ 影响与代价:DDIM、classifier-free guidance、Stable Diffusion、DALL·E 2、Imagen 乃至视频生成都自此而来;代价是采样上千次前向,且原版只做无条件小图。