Skip to content

條件生成模型(Conditional Generative Models)—— cGAN、cVAE 與 Classifier-Free Guidance|MIT 6.7960 第 16 堂

2026年8月30日1 分鐘
TL;DR條件生成的關鍵是「把 y 餵進模型」:cGAN 在 G/D 拼接 y,cVAE 把 y 當額外輸入進 encoder/decoder;擴散模型時代,Classifier Guidance 用外部分類器梯度把生成推向指定類別,Classifier-Free Guidance 則同訓練 conditional + unconditional 並在推論時線性組合兩者——後者是 Stable Diffusion / Imagen 的標準武器。

🌏 English version

影片狀態:已附影片。 影片來源與說明

教材版本:基於 MIT 6.7960 Fall 2024 OCW(對應 OCW Lec 16)。影片、投影片、作業全公開於 MIT OCW。本講由 Phillip Isola 授課。


從「生成」到「條件生成」

L14–L15 都在生成 x,但實務上我們更常需要的是給條件 y,生成對應的 x:y 可能是類別、句子、另一張影像。條件生成模型回答的問題是:p(x | y) 怎麼估、怎麼採樣。

cGAN:把 y 塞進 G 和 D

最直接的做法是 conditional GAN (Mirza & Osindero, 2014):把條件 y 與 z(噪聲)拼接送進生成器 G,把 y 與真/假樣本一起送進判別器 D。訓練目標不變:

min_G max_D  E[log D(x|y)] + E[log(1 − D(G(z|y)))]

直觀:生成器必須「根據 y 生成看起來對的東西」,判別器必須「看 (x, y) 判真假」。MNIST 條件生成(指定數字 0–9)是經典玩具實驗。

最小 cGAN 訓練骨架:

import torch, torch.nn as nn
G = nn.Sequential(nn.Linear(z_dim+num_classes, 256), nn.ReLU(),
                  nn.Linear(256, 784), nn.Sigmoid())
D = nn.Sequential(nn.Linear(784+num_classes, 256), nn.LeakyReLU(),
                  nn.Linear(256, 1))
def embed(y, K):           # one-hot
    e = torch.zeros(y.size(0), K, device=y.device); e[range(y.size(0)), y] = 1; return e
# 訓練: D 看 (x, y); G 從 (z, y) 生 x

cVAE:把 y 塞進 encoder / decoder

對 L15 的 VAE 同理:conditional VAE 把 y 當作 encoder / decoder 的額外輸入,

q(z | x, y),   p(x | z, y),   p(z)

ELBO 變成 E_q[log p(x|z,y)] − KL(q(z|x,y) ‖ p(z))。實務上 y 可類別 one-hot、文字 embedding、座標等。這是後來 text-to-image VAE / 影像修復(inpainting)變體的基礎。

擴散時代的條件控制

影片對照:Lec 16 字幕沒有出現 Classifier Guidance/Classifier-Free Guidance;影片講的是把條件(例如文字)當作輸入餵給 denoiser、generator 或 discriminator 這個通用做法。以下 guidance 的細節是本站補充。

擴散模型把生成拆成「反覆去噪」(L14 提過),條件生成有兩條主流路線:

Classifier Guidance(Dhariwal & Nichol 2021)

訓練好 conditional 擴散 p_θ(x_t | x_{t+1}, y) 之外,另外訓練一個分類器 p(y | x_t),在反噪過程中加一個「往指定類別」的梯度項:

x_{t−1} ← x_t − γ · ∇_{x_t} log p(y | x_t) + 噪聲

γ 控制條件強度,越大越「聽話」、多樣性下降。問題:需要另外訓練一個能在噪聲影像上分類的模型。

Classifier-Free Guidance(Ho & Salimans 2022)

更乾淨的解法:同一個模型同時訓練 conditional 和 unconditional 兩種,實作上把 y 換成一個特殊的「空 token」得到 unconditional。推論時線性組合:

ε̂ = (1 + w) ε_θ(x_t | y) − w ε_θ(x_t | ∅)

w 控制聽話程度。w = 0 是純 conditional,w 越大越向條件貼齊(取樣多樣性下降)。這是 Stable Diffusion、Imagen 等 text-to-image 的標準配備。

Text-to-Image 的實際工作流

把這幾講串起來,今天一個 text-to-image 系統大致是:

  1. 文字編碼(L11/L12 表示學習):CLIP-style text encoder 把 prompt 變成 embedding y。
  2. 條件生成:用 Latent Diffusion(在 VAE 的 latent 空間做擴散,節省算力),Classifier-Free Guidance 把生成推向 prompt。
  3. 解碼:用 VQ-VAE / KL-VAE 的 decoder 把 latent 變回像素。

也就是 VAE latent + 條件擴散 + CFG 三者組合,是當前 SOTA 的基本配方。

取捨與常見失敗模式

  • CFG 權重太強:影像會「過飽和」、紋理失真、少樣性。
  • Prompt 不夠具體:模型退化成 mean-image(VAE 系的根本毛病)。
  • y 與 x 沒對齊:微調階段用 LoRA / DreamBooth 把新概念「塞進」模型的條件空間。
  • 可控性 vs 多樣性:這是條件生成的根本權衡,沒有銀彈。

課程影片來源

2026-10-10 已即時回 MIT OCW Fall 2024 官方錄影列表核對講次,影片公開且允許嵌入;講次與主題以 OCW 的標示為準。

YouTube:MIT 6.7960 Fall 2024 — Lec 16. Generative Models: Conditional Models

原始影片:MIT 6.7960 Fall 2024 — Lec 16. Generative Models: Conditional Models

課程與錄影入口:

查核日期:2026-10-10。

內容核對:已依字幕核對(2026-10-10):讀了 Lec 16 字幕(Phillip Isola,1:21:31):影片是條件生成(開場預告「conditional models」),涵蓋條件分佈與預測問題(約 10%–36%)、條件 GAN 與 cVAE(約 50%–58%、73%–77%)、text-to-image 與 U-Net 去噪器(約 71%–84%),以及配對/非配對影像翻譯(約 89%–99%);字幕沒有 classifier/classifier-free guidance,已在該節加註為本站補充。

更新紀錄

  • 2026-10-10:標註影片狀態,核對錄影來源與取得方式。
  • 2026-10-10:重查影片狀態。即時核對官方課程頁,講次與影片連結一致且影片公開,狀態改為「已附影片」。
  • 2026-10-10:依字幕核對影片內容。在擴散條件控制一節加註:影片沒有講 classifier/classifier-free guidance。

參考資料