扩散模型:学会把噪声一步步变回图
这一章讲三件事: 图像生成为什么不能照搬文本的「逐个吐」;扩散模型的核心机制——缓慢加噪、学着倒放;以及它的代价:生成必须一步步迭代,慢是结构性的。 位置:生成线的第二极。第 10 章管文本,本章管图像;第 15 章的医学影像、第 01 章的斑马,都长在这套机制上。
1. 图像生成难在哪
第 10 章的办法——「给定前面,预测下一个」——搬到图像上不灵:像素不是排成一队的标记,图像的结构是空间的,每个像素和上下左右都有关,没有天然的「下一个」1。
但目标不用换。第 10 章给生成任务定的义原样搬来:学出训练数据的分布,从中采样出「可信地属于原数据集」的新样本1。问题只剩:图像的分布怎么学?
2. 前浪:VAE 与 GAN
在扩散之前,两代成功过的方案,一句话各归其位2:
- VAE(变分自编码器,2013):编码器把图压成一个低维「潜在表示」,解码器再重建;生成时扔掉编码器,拿一团噪声当潜在表示喂给解码器。
- GAN(生成对抗网络,2014):两个网络对打——生成器造图,判别器当二分类器猜真假;互相逼着进步。图更锐利,但训练出了名的不稳、多样性差。
扩散模型 2015 年就由 Sohl-Dickstein 等人提出(论文标题就叫《Deep Unsupervised Learning Using Nonequilibrium Thermodynamics》),但直到 2020 年前后才真正压倒 GAN2。引爆大众认知的是 DALL-E 和开源(代码和权重公开可下载)的 Stable Diffusion。
3. 核心机制:毁坏是可逆的
物理里的扩散是牛奶在咖啡里散开——单向、增熵。扩散模型借了名字,改了方向:前向过程(加噪)是人为设计的,所以可以被学着倒放3。原论文那句纲领:
「本质想法是:用一个迭代的前 向扩散过程,系统地、缓慢地摧毁数据分布里的结构;然后学一个反向扩散过程,把结构恢复回来。」3
书的比喻:沙堡被一波波浪缓慢抹平(前向),而模型学的是「把每一步浪倒放」(反向)——每次都只恢复一点点,几百步之后,沙堡回来了3。
4. 主走查:把 PyTorch logo 加噪到消失
为了看得见,书里不用真图片,用 PyTorch logo 轮廓的 3177 个 2D 点当数据集4。
前向:一步加噪
每一步往点上叠一点高斯噪声(均值为 0、方差为 1 的随机数),同时把原点轻微向 0 收缩4:
x_t = √(1−β_t) · x_{t−1} + √β_t · 噪声
β_t 是第 t 步的噪声强度,书里用线性日程:从 0.0001 缓慢涨到 0.02
T = 1000 步
图说:√(1−β) 那项让「原图的影响」随步数衰减,√β 那项让新噪声稳步加进来。
两项的平方和为 1——这是刻意的:总能量保持不变,只是信号逐渐被换成噪声。
跟其中一个点看:t=0 它在 logo 边缘;t=100 已经漂离;t=500 之后和纯随机点无法区分——信息被系统性地洗没了4。
关键便利:闭式解
一步一步加 1000 次太慢。一个数学便利是:这串迭代可以合并成一步——任意时刻 t 的脏数据,能直接由原图和一个累积系数算出来5:
定义 α_t = 1−β_t,记 ᾱ_t = α_1·α_2·…·α_t(连乘)
则 x_t = √ᾱ_t · x_0 + √(1−ᾱ_t) · 噪声
(原理:高斯加高斯还是高斯,方差相加;逐步的小噪声合成一次大噪声。)训练时要用哪个 t 的脏数据,一次算完,不用循环5。
5. 训练:学「当初加了多少噪」
到了全书最妙的一个目标转换。反向过程数学上难解,但书里把它换成一个监督学习问题6:
给网络两样东西:加噪后的数据 x_t、时刻 t;让它预测「这一步加进去的噪声是什么」。
为什么这个目标等价于「学会生成」?因为噪声是我们自己加的——标准答案白送:前向过程的每一步都知道自己加了什么噪声。这又是一次自监督:标签不用人标,从过程里长出来6。
模型(书里叫 DenoisingModel):把 t、x 坐标、y 坐标各用正弦位置嵌入(第 10 章位置嵌入的定式)编成 128 维,拼接后过三层「线性+ReLU」,输出 2 维——预测的噪声。损失就是均方误差:预测的噪声 vs 实际加的噪声6。
训练:Adam、lr=0.001、20000 轮,损失 0.97→0.706。数字本身不重要,重要的是:网络从没见过「logo」,它只见过「脏点 + t + 当初那点噪声」。
6. 采样:从纯噪声里把 logo 变回来
生成 = 反向过程 = 从 1000 个纯随机点开始,t=999 一路退到 t=07:
对每个 t(从 999 到 0):
① 模型预测当前数据里的噪声
② 从数据里减掉这份噪声(乘上日程系数折算)
③ 再加回一小撮受控的新噪声(t=0 时不加)
第 ③ 步「减完又加」看着反常,但有讲究:减掉的只是「最可能的噪声」,而同一个脏数据可以对应多种干净前身——加回的小噪声让每次采样走上不同的分叉,这正是生成多样性的来源7。
反向公式里没有模型学不到的东西,但没有闭式解——必须一步一步来。书里点破了这就是扩散模型的结构性代价:T=1000 就意味着生成一张图要把网络跑 1000 遍。这解释了为什么后来的工程研究(SDXL-Lightning 这类)全都扑在「减少步数」上7。
结果:1000 个随机点,逐步收拢,最后排成 PyTorch logo 的形状7。从混沌里造出了东西——同样的公式换成 RGB 像素,就是 DALL-E 和 Stable Diffusion 的内核。
7. 和第 10 章并排看一眼
| 文本(Transformer) | 图像(扩散) | |
|---|---|---|
| 生成单位 | 一个标记 | 一整个去噪步骤 |
| 「下一个」是什么 | 序列里的后一个标记 | 时刻 t−1 的干净一点的数据 |
| 迭代次数 | 序列多长多少次 | 日程多长多少次 |
| 训练信号 | 数据自带的下一个标记 | 前向过程自己记录的噪声 |
两者都是「学分布 + 逐步采样」的迭代生成,只是迭代的对象不同: Transformer 每一步往后添一个标记,扩散每一步把整张图擦干净一点。书里说的是二者相似,不是同类——扩散不是自回归模型(第 10 章给自回归定的义是「后一个依赖前一个的标记生成」,扩散每步动的是整张图,没有「前一个、后一个」这回事)8。架构不同,做法上的共同点是:先学出数据长什么样,再一小步一小步把样本采出来。
8. 作者的判断与证据
| 说法 | 性质 |
|---|---|
| 前向闭式解 | 有据,书里把一步到位的结果和逐步循环的结果并排画出来,两张 图看不出差别5 |
| 训练目标 = 预测噪声(MSE) | 有据,实现 + 训练损失从 0.97 降到 0.706 |
| 反向采样公式 | 书里直接引用 DDPM 论文(Ho et al. 2020),推导被明确划为超出本书范围7 |
| 「GAN 多样性差、训练不稳」 | 领域通行评价,书里直陈,无实验2 |
| 「扩散已成图像生成主导」 | 成书时属实;「扩散是视频生成的未来」是作者的展望8 |
9. 边界与局限
- 本章的模型是玩具规模(3177 个 2D 点);真实图像扩散用 U-Net 在潜在空间工作,第 01 章的 pipeline 里那四个部件(text encoder/UNet/VAE/scheduler)对应的就是那套工业结构——本章只教机制8。
- 「为什么减噪声要加回噪声」书里给了直觉没给推导;DDPM 的数学推导被明确划出范围。
- 噪声日程只演示了线性一种;书里引了 2023 年一篇专门论文说明日程影响训练结果——日程是超参数,不是细节4。
- 条件生成(用文字指挥)在第 01 章出现过,本章只讲无条件版本;条件是「再喂一路信息进模型」,机制不变。
10. 可带走的
- 图像生成的目标与文本相同:学分布、采样本;缺的是「下一个」的概念,扩散用「下一个时刻的干净度」补上了。
- 前向加噪是人为设计的,所以可逆;√(1−β) 与 √β 平方和为 1 是能量守恒的刻意设计。
- 闭式解让训练时任意 t 一步算到;采样时没有闭式解,必须迭代——慢在结构上。
- 训练目标的神来之笔:预测当初加的噪声;标准答案由前向过程白送,自监督又一次现身。
- 采样时每步「减噪声、再加回一点」;加回那一点是多样性的来源。
- 1000 步日程 = 生成一图跑千遍网络;后续工程的主线是减步数。
- VAE 压缩重建、GAN 左右互搏、扩散学倒放——三代生成架构一句话各归其位。
11. 原文地图
| 主题 | 原书章 | 原文位置 |
|---|---|---|
| 图像 vs 文本、共同目标 | ch10 | text/18-ch10-10-diffusion-models-for-images.txt:21(搜「dependencies, where context is influenced」) · :26(搜「underlying distribution」) |
| VAE/GAN 简史 | ch10 | text/18-ch10-10-diffusion-models-for-images.txt:43(搜「late 2013」) · :54(搜「generator and a discriminator」) · :85(搜「around 2020」) |
| 2015 原论文引文 | ch10 | text/18-ch10-10-diffusion-models-for-images.txt:119(搜「Nonequilibrium Thermodynamics」) · :121(搜「inspired by non-equilibrium statistical physics」) |
| 沙堡比喻 | ch10 | text/18-ch10-10-diffusion-models-for-images.txt:128(搜「sandcastle」) |
| 3177 点与线性日程 | ch10 | text/18-ch10-10-diffusion-models-for-images.txt:188(搜「3177」) · :236(搜「linear_beta_schedule」) |
| 前向公式与单点漂移 | ch10 | text/18-ch10-10-diffusion-models-for-images.txt:247(搜「diffuse_points」) · :288(搜「as the diffusion process progresses」) |
| 闭式解 | ch10 | text/18-ch10-10-diffusion-models-for-images.txt:307(搜「closed-form equation」) · :332(搜「alphas_cumprod」) |
| 训练目标与模型 | ch10 | text/18-ch10-10-diffusion-models-for-images.txt:382(搜「predicting the noise」) · :412(搜「DenoisingModel」) · :463(搜「mean squared error」) |
| 训练损失 | ch10 | text/18-ch10-10-diffusion-models-for-images.txt:511(搜「0.9687」) · :529(搜「0.6959」) |
| 反向采样与慢的根因 | ch10 | text/18-ch10-10-diffusion-models-for-images.txt:534(搜「Reversing diffusion」) · :540(搜「no closed-form solution」) · :543(搜「SDXL-Lightning」) |
| 加回噪声的理由 | ch10 | text/18-ch10-10-diffusion-models-for-images.txt:562(搜「controlled manner」) |
| DDPM 出处 | ch10 | text/18-ch10-10-diffusion-models-for-images.txt:567(搜「paper by Ho et al」) |
| 重建 logo 与推广 | ch10 | text/18-ch10-10-diffusion-models-for-images.txt:626(搜「something from chaos」) · :630(搜「RGB values of an image」) |