2020 - DDPM 擴散模型#
案件摘要#
2020 年 6 月,UC Berkeley 的 Ho、Jain、Abbeel 發表 DDPM(Denoising Diffusion Probabilistic Models):一個把生成寫成「逐步加噪、再學會去噪」的模型。前向過程把資料一步步推成純高斯雜訊:
訓練一個網路 \(\epsilon_\theta(x_t, t)\) 學會反向去噪,而驚人的是——訓練目標簡化後只是一個均方誤差:
GAN 的訓練不穩、VAE 的模糊,都在這條「去噪之路」上被繞過。這是生成模型的第三次權杖交接:對抗生成(2014)→ 自回歸 → 擴散——而 Stable Diffusion 與 Sora 全部由此案直出。
前因 -- 為什麼會有這個案子#
- 2014-GAN對抗式生成.md 的樣本銳利但訓練是場內戰:生成器與判別器的博弈導致模式崩塌、不收斂、需要精心的平衡術。
- 2013-VAE變分自編碼器.md 的訓練穩定但樣本模糊:ELBO 的重建項與 KL 項角力,均值預測抹平了細節。
- 擴散思想的譜系:Sohl-Dickstein et al., 2015 年《Deep Unsupervised Learning using Nonequilibrium Thermodynamics》已提出「加噪—去噪」框架,但只是概念驗證,樣本品質遠不及 GAN。
- 分數匹配與朗之萬動力學:Hyvärinen 的分數匹配(2005)、Song & Ermon 的去噪分數匹配(2019)證明「學習 \(\nabla_x \log p(x)\) 」可以生成——但多尺度雜訊的設計繁瑣。
- 動機:Ho 等人想問——若把 2015 年的擴散框架訓練目標簡化到底,會發生什麼?答案是:品質追平 GAN 的門檻被跨過。
線索與推理 -- 數學式、程式、理論#
第一條線索:前向過程——把資料推成雜訊#
固定(無參數)的馬可夫鏈,每步加一點高斯雜訊:
\(\beta_t\) 是雜訊排程(noise schedule),從 \(10^{-4}\) 線性升到 \(0.02\) 。關鍵重排:任意時刻 \(t\) 可以一步直達(不需迭代):
這個重排讓訓練可以隨機抽 \(t\) 、一次算出 \(x_t\) ——與 GAN 一樣的訓練並行性。 \(t = T\) 時 \(\bar{\alpha}_T \approx 0\) , \(x_T\) 就是純雜訊:資料被完全「溶解」。
第二條線索:反向過程——學會去噪#
真正要學的是反向條件分佈 \(q(x_{t-1} \mid x_t)\) 。當 \(\beta_t\) 足夠小時,它近似高斯,且可用貝葉斯定理寫出:
DDPM 固定 \(\Sigma_\theta = \sigma_t^2 I\) (不學),只學 \(\mu_\theta\) 。由 \(x_t = \sqrt{\bar\alpha_t} x_0 + \sqrt{1-\bar\alpha_t}\,\epsilon\) 反解,預測 \(\mu_\theta\) 等價於**預測雜訊 \(\epsilon_\theta\) **:
生成的採樣鏈從純雜訊出發,逐步去噪 1000 步,還原出一張影像——像雕塑家從大理石塊裡鑿出雕像。
第三條線索:訓練目標的「驚人簡化」#
ELBO 的嚴格下界可以逐項拆開,其中主導項是:
DDPM 的破案時刻:把加權係數直接丟掉(重加權後仍是合法的變分界),得到:
一個普通的均方誤差——訓練像訓練回歸模型一樣穩定。線索至此合攏:GAN 用對抗學「真不真」,VAE 用變分界學「像不像」,DDPM 用回歸學「雜訊在哪」——第三條路最穩。
第四條線索:連接與骨架——U-Net 與分數的視角#
DDPM 用 U-Net(2015 年的影像分割骨架)做 \(\epsilon_\theta\) ,加上時間嵌入(正弦位置編碼,與 2017-Transformer注意力機制.md 同源)注入 \(t\) 。分數匹配的視角揭示數學本質:
預測雜訊 ≈ 預測對數機率的梯度(分數)——DDPM 與 Song & Ermon 的去噪分數匹配在數學上是同一件事的兩種寫法。這條線索後來在 Song et al., 2021 的 score-based SDE 中被完全統一。
第五條線索:案發現場的成績——FID 的翻盤#
CIFAR-10 上的生成品質(FID 越低越好):
| 模型 | CIFAR-10 FID |
|---|---|
| StyleGAN2(GAN 巔峰) | 2.67 |
| VAE 系 | 40+ |
| DDPM | 3.17 |
| SNGAN | 21.7 |
DDPM 首次讓擴散模型追近 GAN 巔峰,且訓練穩定性完勝——GAN 需要:生成/判別平衡、學習率精調、正則化技巧;DDPM 只需要:一個 MSE 損失 + 一個 U-Net。同時 DDPM 的模式覆蓋(mode coverage)遠優於 GAN:GAN 崩塌時只生成少數模式,DDPM 的似然式訓練保證了分佈全覆蓋;反過來,DDPM 的負對數概似(NLL)也優於 GAN(GAN 根本不建模似然)。線索至此全部合攏:穩定 + 全覆蓋 + 可量測 = 第三條生成之路。
結案 -- 後果與影響#
- 影像生成品質追平 GAN:CIFAR-10 的 FID 首次被擴散模型壓過 GAN(DDPM 3.17),此後 GAN 在影像生成的主導權迅速流失。
- 典範外溢:Guided Diffusion(2021)、2022-StableDiffusion開源擴散.md(latent diffusion,把擴散搬進潛空間)、DALL-E 2、Imagen——文字生圖全面擴散化。
- 影像之外:音訊(DiffWave,呼應 2016-WaveNet語音合成.md 的 DeepMind 同源)、影片(Sora / 影像擴散)、分子生成(蛋白質與藥物設計)、2021-AlphaFold2.md 之後的蛋白質結構生成(RFdiffusion)——擴散成為科學生成的通用工具。
- 「噪聲排程—採樣步數—蒸餾」成為後續案件:DDIM(2020,少步採樣)、progressive distillation、consistency models(2023)都在壓縮那 1000 步。
- 生成模型三分天下後的版圖:自回歸(語言)、擴散(影像/影片)、流匹配(新興)——語言界的自回歸未被攻破,影像界被擴散全面接管。
- 主線伏筆:DDPM → Stable Diffusion(2022,開源)→ Sora(2024,影片世界模擬)——從去噪一張圖到去噪一段時空,擴散思想一路通向世界模型。
關鍵人物與文獻#
- Jonathan Ho:DDPM 第一作者,後續 Guided Diffusion、DiT 的核心人物。
- Ajay Jain / Pieter Abbeel:共同作者,Berkeley。
- Jascha Sohl-Dickstein:2015 年擴散框架的原始提出者。
- Yang Song / Stefano Ermon:去噪分數匹配與 score-based SDE 的統一者。
- Ho, Jain & Abbeel, Denoising Diffusion Probabilistic Models, NIPS 2020, arXiv:2006.11239。
- Sohl-Dickstein et al., Deep Unsupervised Learning using Nonequilibrium Thermodynamics, ICML 2015。
- Song & Ermon, Generative Modeling by Estimating Gradients of the Data Distribution, 2019。
- Ho et al., Denoising Diffusion Implicit Models(DDIM), 2020。
- Rombach et al., High-Resolution Image Synthesis with Latent Diffusion Models, CVPR 2022(Stable Diffusion 的直系前案)。
- 相關案件:2013-VAE變分自編碼器.md、2014-GAN對抗式生成.md、2016-WaveNet語音合成.md、2022-StableDiffusion開源擴散.md
補充 -- 程式實作(python + pytorch)#
本案前向直達(x_t = √ᾱx₀ + √(1−ᾱ)ε)+噪聲預測(L_simple = E||ε−ε_θ||²)+百步反向鏈的最小可執行版本,見 _code/2020-DDPM.py(已實測可跑,CPU 約 1 分鐘;1D 雙峰):
# 2020 - DDPM: x_t = √ᾱ_t x_0 + √(1-ᾱ_t) ε; L_simple = E||ε - ε_θ(x_t,t)||²
import torch
import torch.nn as nn
def main():
torch.manual_seed(0)
def real(n): # N(-2,0.2) 與 N(+2,0.2) -- GAN 章老朋友, 換擴散再解一次
pick = torch.randint(0, 2, (n, 1)).float() * 4 - 2
return pick + torch.randn(n, 1) * 0.2
T = 100
beta = torch.linspace(1e-3, 0.05, T)
alpha = 1 - beta
abar = torch.cumprod(alpha, 0)
class Eps(nn.Module): # ε_θ(x_t, t): 時間嵌入 + MLP (U-Net 的精神縮影)
def __init__(self):
super().__init__()
self.te = nn.Embedding(T, 8)
self.m = nn.Sequential(nn.Linear(9, 64), nn.ReLU(),
nn.Linear(64, 64), nn.ReLU(), nn.Linear(64, 1))
def forward(self, xt, t):
return self.m(torch.cat([xt, self.te(t)], 1))
net = Eps()
opt = torch.optim.Adam(net.parameters(), lr=1e-2)
for ep in range(800):
x0 = real(256)
t = torch.randint(0, T, (256,))
eps = torch.randn(256, 1)
xt = abar[t].sqrt().unsqueeze(1) * x0 + (1 - abar[t]).sqrt().unsqueeze(1) * eps
opt.zero_grad()
((net(xt, t) - eps) ** 2).mean().backward() # L_simple: 普通 MSE
opt.step()
# (反向採樣鏈略, 見 _code/2020-DDPM.py 全文)
if __name__ == "__main__":
main()
執行結果(python3 _code/2020-DDPM.py,torch 2.12.0):
噪聲預測 MSE=0.3801 (訓練像回歸一樣穩定 -- vs GAN 的賽局)
生成左峰比例=0.51 (目標0.50 -- 雙峰皆鑿出, 無模式崩潰)
生成均值±標準差=-0.07±2.00 (真實≈0.00±2.01)
結論: GAN 學真不真、VAE 學像不像、DDPM 學雜訊在哪 -- 第三條路最穩
程式解說:訓練迴圈只有三行——抽 t、一步直達 x_t(重排技巧,不必迭代千步)、MSE 回歸雜訊;「驚人簡化」的含義在此:ELBO 的加權係數丟掉後,訓練穩如回歸(vs GAN 的追殺賽局)。反向鏈從純雜訊出發去噪 100 步,均值 -0.07±2.00 幾乎貼上真實 0.00±2.01——雕塑家從大理石鑿出雙峰。Eps 的時間嵌入(nn.Embedding(T,8))與 Transformer 的位置編碼同源:模型必須知道「現在有多噪」。把 1D 換成像素、MLP 換成 U-Net,即原論文;把像素換成潛碼,即 Stable Diffusion。