MIT 6.S184 第 4 講 · Latent 與架構
MIT 6.S184 · 第 4 講 · 2026 年 1 月 28 日

Latent Space 與網路架構:把模型放大成真的影像生成器

前三講的演算法都只有數學。這一講解決實務上的兩件事:180 萬維的影像怎麼處理(先用 VAE 壓進 latent space),以及 \(u_t^\theta(x\mid y)\) 這個網路到底長什麼樣(diffusion transformer)。最後看 Stable Diffusion 3 和 Meta MovieGen 怎麼把這些全部放在一起。

讀完這頁你應該能夠

  1. 說明 diffusion model 為什麼比分類器更怕高維,以及兩個原因。
  2. 解釋只有重建損失的自編碼器為什麼不夠。
  3. 推出高斯解碼器的負對數概似就是均方誤差,以及兩個高斯之間的 KL。
  4. 寫出 VAE 損失,說明 \(\beta\) 怎麼取捨,太大時會發生什麼事。
  5. 用一個數字例子解釋 reparameterization trick 為什麼必要。
  6. 說出 latent diffusion 的五個步驟。
  7. 算出時間嵌入的長度和 patch 的數量,手算一次 scaled dot-product attention。
  8. 說明 DiT 區塊怎麼把影像、文字、時間放進去。
  9. 看懂論文裡不同的時間慣例、forward process、time reversal 和這門課的對應。

前置知識檢查

  • 前幾講:flow matching 的訓練、CFG。
  • 高斯密度:$$\begin{aligned}&\mathcal N(x;\mu,\sigma^2I_d)\\&=(2\pi\sigma^2)^{-d/2}\\&\quad\cdot\exp\Big(-\frac{\Vert x-\mu\Vert^2}{2\sigma^2}\Big)\end{aligned}$$
  • 變異數的展開(第 5 節會用到):$$\begin{aligned}&\mathbb E[(X-c)^2]\\&=\mathrm{Var}(X)+(\mathbb E[X]-c)^2\end{aligned}$$
  • 矩陣乘法、softmax:softmax 把一列數字 \(s_i\) 變成 \(e^{s_i}/\sum_je^{s_j}\),全部是正的,加起來是 1。
  • CS236(選讀):第 5 講、第 6 講從 ELBO 的角度講 VAE。

這一頁怎麼讀、記號

記號換了:前三講 \(z\) 是資料點。從這一講開始,\(x\) 是資料,\(z\) 是 latent,老師在 05:14 明確提醒。到了 latent diffusion,flow matching 的「資料」變成 latent,別被 \(x\) 和 \(z\) 搞混。
記號意思
\(x\in\mathbb R^d\)、\(z\in\mathbb R^k\)資料、latent,\(k\lt d\)
\(\mu_\phi,\sigma_\phi\)編碼器輸出的平均和標準差,參數 \(\phi\)
\(\mu_\theta\)解碼器輸出的平均,參數 \(\theta\)
\(\beta\)VAE 裡 prior loss 的權重。和排程 \(\beta_t\) 無關
\(N,S,L\)patch 數、提示詞長度、transformer 層數(投影片和講義的 \(N\) 有混用,見第 11 節)
\(P\)patch 的邊長

和 CS236 相同的地方:編碼器 \(\phi\)、解碼器 \(\theta\);Lai 的書相反。逐字稿是 YouTube 自動字幕,有疑問時以黑板和投影片為準。部分學生的提問麥克風沒收到,那些問答的標題是從老師的重述和回答推測的。

01為什麼需要 latent space(投影片 1–9)

開場老師先為週一因為暴風雪停課道歉 00:08。今天要放大前面的東西,還缺兩塊:latent space 和網路架構。

投影片 4–8 的圖:一個人的剪影在夕陽下跳過峽谷。文字:3 個色頻、高 600、寬 1000,維度是 \(3\times600\times1000=180\) 萬。問題:GPU 記憶體爆掉、學習問題很難、鄰近像素高度相關(冗餘)。

老師指著照片的黑色區域 02:10:這個像素是黑的,隔壁也是黑的,給你一半的像素,你就能補出另一半。我們想專注在語意上有意義的部分,不是之後可以補上的細節。

為什麼分類器沒這個問題?老師問大家 02:40,答案有兩個(投影片 9):
  1. 輸出也是高維:向量場 \(u_t^\theta:\mathbb R^d\to\mathbb R^d\),輸入輸出都是 180 萬維。ImageNet 分類器只輸出 1,000 維。
  2. 要呼叫很多次:取樣時要跑網路 50 到 100 次。

投影片筆誤:投影片 1 寫「IAP 2026 | Jan 28, 2025」,年份應該是 2026。

一句話帶走:向量場的輸出和輸入一樣高維,取樣又要跑 50 到 100 次,所以先把資料壓小。

02自編碼器(投影片 10–11)

xℝᵈ編碼 φzℝᵏ(k 小)解碼 θx′ℝᵈ訓練時要 x′ 接近 x,diffusion 在中間的 z 上做
自編碼器:編碼器壓縮,解碼器還原。
黑板:標準自編碼器
板書(38:20):Encoder \(\mu_\phi:\mathbb R^d\to\mathbb R^k\)、Decoder \(\mu_\theta:\mathbb R^k\to\mathbb R^d\)、Reconstruction loss;Analysis:✓ Compression ✓ Reconstruction;Latent distribution:\(x\sim p_{\text{data}},z=\mu_\phi(x)\Rightarrow z\sim p_{\text{latent}}\)。
自編碼器 編碼器 \(\mu_\phi:\mathbb R^d\to\mathbb R^k\),解碼器 \(\mu_\theta:\mathbb R^k\to\mathbb R^d\),\(k\lt d\)。 $$\begin{aligned}&L_{\text{Recon}}(\phi,\theta)\\&=\mathbb E_{x\sim p_{\text{data}}}\big[\Vert\mu_\theta(\mu_\phi(x))-x\Vert^2\big]\end{aligned}$$ 把資料點編碼再解碼,看和原本差多少 07:48。

板書筆誤:黑板和投影片 11 一開始寫 \(k\lt n\),學生指出來後老師改成 \(k\lt d\) 06:16。投影片的 \(n\) 沒有改。

會損失多少資訊?· 08:20損失當然可以寫下來,但會掉多少資訊,是要實際測試的經驗問題,取決於資料分佈。

03自編碼器的問題(投影片 12)

檢查一下 08:51:壓縮,有;重建,有。但老師強調:我們做這件事不是為了自編碼器本身,是為了之後在 latent 上訓練 diffusion model。

把所有資料編碼得到的分佈叫 latent 分佈:\(x\sim p_{\text{data}},\ z=\mu_\phi(x)\Rightarrow z\sim p_{\text{latent}}\)。重建損失完全沒有管它長什麼樣。

投影片 12 的圖:右上角「A bad latent space」:藍色的線條在一個方塊裡密密麻麻來回折返,是非常不平滑的玩具分佈。問題:可能壓縮了,卻讓分佈變得很難學。紅框目標:做出 latent 分佈「好」的自編碼器。

壓縮成功了,第二步卻變難了 10:57。學生後來問「可訓練」是什麼意思,老師說很難形式化,就是指:在這個 latent space 上訓練 diffusion model 會不會容易 33:07。

一句話帶走:只看重建,latent 分佈可能很難學;而我們要的是在它上面訓練生成模型。

04VAE:編碼變成機率

為了能討論 latent 的分佈,先把編碼和解碼都變成機率的 12:35。老師提醒:這裡只把 VAE 當成做 latent diffusion 的工具,不是當生成模型本身。

黑板:VAE 定義
板書(38:20):「6.2 Variational Autoencoders (VAE):deterministic encoding → stochastic encoding」;編碼器、解碼器(\(\sigma^2\) 標 fixed)、Encode、Decode;右邊列出 latent mean、latent variance、data mean。
VAE 編碼器:$$\begin{aligned}&q_\phi(z\mid x)\\&=\mathcal N\big(z;\mu_\phi(x),\sigma_\phi^2(x)I_k\big)\end{aligned}$$ 解碼器:$$\begin{aligned}&p_\theta(x\mid z)\\&=\mathcal N\big(x;\mu_\theta(z),\sigma^2I_d\big)\end{aligned}$$ 編碼時 \(z\sim q_\phi(\cdot\mid x)\),解碼時 \(x\sim p_\theta(\cdot\mid z)\)。\(\sigma^2\) 固定。

講義的一般形式是解碼器變異數 \(\sigma_\theta^2(z)\) 也能學,損失會多一項 \(\frac d2\log\sigma_\theta^2(z)\)(解碼器的信心);老師和 Lab 都把它固定。另外,如果兩個變異數都是 0,VAE 就退回標準的自編碼器。

重建損失變成什麼

現在要求:把 \(x\) 編碼成隨機的 \(z\) 之後,解碼器給原本的 \(x\) 高機率。寫成損失,就是負對數概似(概似 likelihood:資料固定時,模型給它的機率密度):

$$\begin{aligned}&L_{\text{Recon}}(\phi,\theta)\\&=\mathbb E_{x\sim p_{\text{data}},\,z\sim q_\phi(\cdot\mid x)}\\&\qquad\big[-\log p_\theta(x\mid z)\big]\end{aligned}$$

口誤:18:22 老師說「我們希望負對數概似要高」,應該是對數概似高、負對數概似低。損失是要最小化的,黑板上的式子沒錯。

代入高斯密度 18:53:

$$\begin{aligned}&-\log\mathcal N(x;\mu_\theta(z),\sigma^2I_d)\\&=\frac{\Vert x-\mu_\theta(z)\Vert^2}{2\sigma^2}+\frac d2\log(2\pi\sigma^2)\end{aligned}$$

第二項和參數無關。所以就是均方誤差,和自編碼器只差兩點:多一個係數,而且 \(z\) 是抽樣的。

手算\(d=2\),\(x=(1,0)\),\(\mu_\theta(z)=(0.8,0.1)\),\(\sigma^2=0.1\)。誤差平方和 \(0.04+0.01=0.05\),除以 \(2\sigma^2=0.2\),這一項是 \(0.25\)。

05KL 散度與 prior loss(投影片 13–16)

什麼叫好的分佈?老師問,學生答:高斯 20:57。於是要讓 latent 分佈接近高斯,用 KL 散度衡量「接近」。

黑板:prior loss
板書(38:20):Idea「Want latent distribution to be approx. Gaussian」;\(L_{\text{prior}}\);用 KL 公式代入之後的形式;Analysis:✓ Compression ✓ Trainability ✗ Reconstruction,也就是這一節最後說的問題。
KL 散度 $$D_{\text{KL}}(q\Vert p)=\mathbb E_{X\sim q}\Big[\log\frac{q(X)}{p(X)}\Big]$$ 性質:\(D_{\text{KL}}\ge0\),而且等於 0 若且唯若 \(q=p\)。

老師提醒它嚴格說不是距離 22:00;後來學生也提到它不對稱 36:55:一般來說 \(D_{\text{KL}}(q\Vert p)\neq D_{\text{KL}}(p\Vert q)\)。

Prior loss$$\begin{aligned}&L_{\text{prior}}(\phi)=\mathbb E_{x\sim p_{\text{data}}}\\&\quad\big[D_{\text{KL}}\big(q_\phi(\cdot\mid x)\,\Vert\,\mathcal N(0,I_k)\big)\big]\end{aligned}$$

高斯之間的 KL:推導

課堂直接給公式,講義有證明。先做 \(d=1\),\(q=\mathcal N(\mu_q,\sigma_q^2)\),\(p=\mathcal N(\mu_p,\sigma_p^2)\):

  1. 對數相減: $$\begin{aligned}&\log q(x)-\log p(x)\\&=\tfrac12\log\frac{\sigma_p^2}{\sigma_q^2}\\&\quad+\frac{(x-\mu_p)^2}{2\sigma_p^2}-\frac{(x-\mu_q)^2}{2\sigma_q^2}\end{aligned}$$
  2. 對 \(x\sim q\) 取期望值。最後一項:\(\mathbb E_q[(x-\mu_q)^2]=\sigma_q^2\),所以是 \(-\tfrac12\)。
  3. 中間那項用變異數的展開:\(\mathbb E_q[(x-\mu_p)^2]=\sigma_q^2+(\mu_q-\mu_p)^2\)。
  4. 合起來,令 \(\alpha=\sigma_q^2/\sigma_p^2\): $$\begin{aligned}D_{\text{KL}}=\frac12\Big(&\alpha-\log\alpha-1\\&+\frac{(\mu_q-\mu_p)^2}{\sigma_p^2}\Big)\end{aligned}$$

多維(對角)時每個座標各加一次:

高斯的 KL $$\begin{aligned}&D_{\text{KL}}(q\Vert p)\\&=\frac12\Big(\mathcal K\big(\tfrac{\sigma_q^2}{\sigma_p^2}\big)+\frac{\Vert\mu_q-\mu_p\Vert^2}{\sigma_p^2}\Big)\end{aligned}$$ $$\mathcal K(\alpha)=\sum_i\big(\alpha_i-\log\alpha_i-1\big)$$
最低點 α = 113αK(α)
投影片 15 的函數:\(\alpha=1\) 時最小,往兩邊都上升(微分是 \(1-\frac1\alpha\),\(\alpha=1\) 時為 0,左邊負、右邊正)。也就是變異數相同時這一項為 0。
投影片 13–16 的圖:投影片 13 是定義和兩個性質。投影片 14、16 是公式,紅框逐步標出 Dist. of mean 和 Dist. of variances。投影片 15 是 \(\mathcal K(\alpha)\) 的曲線,標 Minimum at 1。
手算(\(p=\mathcal N(0,1)\))
  • \(q=\mathcal N(1,1)\):\(\tfrac12(0+1)=0.5\)。
  • \(q=\mathcal N(0,4)\):\(\tfrac12(4-\ln4-1)\),約 \(0.807\)。
  • \(q=\mathcal N(0,1)\):0。

代入 \(p=\mathcal N(0,I_k)\),\(\sigma_p=1\)、\(\mu_p=0\) 26:18:

$$\begin{aligned}&L_{\text{prior}}(\phi)\\&=\mathbb E_x\Big[\tfrac12\mathcal K\big(\sigma_\phi^2(x)\big)+\tfrac12\Vert\mu_\phi(x)\Vert^2\Big]\end{aligned}$$

意思:\(\sigma_\phi^2\) 推向 1,\(\mu_\phi\) 推向 0。

單獨用它不行 28:23:最小值點是不管 \(x\) 是什麼,一律輸出 \(\mu=0,\sigma=1\)。這完全忽略資料,也就談不上重建。

一句話帶走:\(D_{\text{KL}}\) 量兩個分佈差多遠;prior loss 把 \(\mu_\phi\) 拉向 0、\(\sigma_\phi^2\) 拉向 1,但單獨用它會忽略資料。

06合併兩個損失

黑板:VAE 損失
板書(45:00):VAE loss,weight \(\beta\ge0\);Analysis:✓ Compression ✓ Reconstruction ✓ Trainable,\(z\sim q_\phi(\cdot\mid x)\) 那裡標註 depends on \(\phi\),也就是第 7 節的問題。
VAE 損失 $$\begin{aligned}&L_{\text{VAE}}(\phi,\theta)\\&=L_{\text{Recon}}(\phi,\theta)+\beta L_{\text{prior}}(\phi)\end{aligned}$$ $$\begin{aligned}=\mathbb E\Big[&\frac{1}{2\sigma^2}\Vert x-\mu_\theta(z)\Vert^2\\&+\frac\beta2\mathcal K(\sigma_\phi^2(x))\\&+\frac\beta2\Vert\mu_\phi(x)\Vert^2\Big]\end{aligned}$$ 其中 \(x\sim p_{\text{data}}\)、\(z\sim q_\phi(\cdot\mid x)\)。

\(\beta\) 在重建和分佈好不好之間取捨 34:19。老師說實務上 \(\beta\) 選得相當小,這是個經驗問題。講義也說,現代的自編碼器都 \(\beta\ll1\)。

每個 \(q_\phi(z\mid x)\) 都是高斯,但整體 latent 分佈不是。有學生問這一點 46:15。老師:對所有 \(x\) 平均,\(q_\phi(z)=\int q_\phi(z\mid x)p_{\text{data}}(x)\mathrm dx\) 是很多高斯的混合,可以是高度非高斯的分佈;高斯混合在相當一般的條件下幾乎能逼近任何分佈。prior loss 只是把它往好的方向推,所以還需要 diffusion model。

課堂問答

為什麼要接近標準高斯?· 45:42高斯只有一個峰,負對數概似是凸函數(只有一個谷底),是很好的分佈;如果 latent 接近它,之後建 diffusion model 會比較容易。不一定要標準高斯,用其他高斯也可以,那比較是慣例。
怎麼選對的 \(\beta\)?· 34:50沒有令人滿意的答案,只能實測。老師說這是自編碼器設計最大的問題之一:要驗證自編碼器的品質,唯一的辦法是在上面訓練一個 diffusion model,而那可能要花幾百萬美元。有一些粗略的指標,但不夠。
兩個損失合起來的最佳點?· 35:55各自的最小值點我們知道,加起來之後怎麼平衡取決於資料分佈和網路架構,事前不知道,甚至可能沒有一般的答案。
不會塌縮嗎?· 37:25老師說這是 VAE 已知的現象。實務上有很多工程技巧,例如把損失截斷(clip),這些比較沒有原則,也因模型而異。老師口頭用的詞是 mode collapse,說的是「把平均和變異數都設成零」;講義的說法更準確,稱為 posterior collapse:\(\beta\) 太大時,編碼器不管 \(x\),一律輸出接近 \(\mathcal N(0,I_k)\),也就是平均 0、變異數 1。Demo A 的 \(\beta=20\) 會看到。
講義的實務補充,以及 VAE 損失的另一種解讀

實務補充(講義 §6.2):KL warm-up,先用 \(\beta=0\),再慢慢調高;解碼器的變異數常常固定,學它在數值上很敏感;純像素的 MSE 容易過於平滑,實際會加 perceptual loss(在預訓練網路的特徵上比差異);也常加對抗損失(多訓練一個判別器)讓結果更銳利,代價是訓練不穩定。

另一種解讀(講義附錄):把編碼器和解碼器都看成 \((x,z)\) 的聯合分佈:\(q_\phi(x,z)=p_{\text{data}}(x)q_\phi(z\mid x)\)、\(p_\theta(x,z)=p_\theta(x\mid z)\mathcal N(z;0,I_k)\)。展開它們的 KL:

$$\begin{aligned}&D_{\text{KL}}(q_\phi\Vert p_\theta)=\mathbb E[\log p_{\text{data}}(x)]\\&+\mathbb E_x\big[D_{\text{KL}}(q_\phi(\cdot\mid x)\Vert\mathcal N(0,I_k))\big]\\&-\mathbb E[\log p_\theta(x\mid z)]\end{aligned}$$

第一項是常數,後兩項正是 \(\beta=1\) 的 VAE 損失。所以 VAE 是在讓兩個聯合分佈接近。CS236 的 第 6 講從 ELBO 得到同一個式子。

講義附錄:VAE 本身就能生成,為什麼還要 latent diffusion?

VAE 也是生成模型:抽 \(z\sim\mathcal N(0,I_k)\) 再解碼,得到 \(p_\theta(x)=\int p_\theta(x\mid z)\mathcal N(z;0,I_k)\mathrm dz\)。它學得好不好,可以用 KL 的 chain rule 看。聯合分佈等於邊際乘條件,取 log 再分開期望值:

$$\begin{aligned}&D_{\text{KL}}(q(x,z)\Vert p(x,z))\\&=D_{\text{KL}}(q(x)\Vert p(x))\\&\quad+\mathbb E_{x\sim q}\big[D_{\text{KL}}(q(z\mid x)\Vert p(z\mid x))\big]\end{aligned}$$

第二項 \(\ge0\),所以聯合的 KL 比邊際的 KL 大。\(q_\phi\) 對 \(x\) 的邊際就是 \(p_{\text{data}}\),所以 \(\beta=1\) 的 VAE 損失是 \(D_{\text{KL}}(p_{\text{data}}\Vert p_\theta)\) 的上界(差一個常數)。對 \(z\) 同樣拆,它也是 \(D_{\text{KL}}(q_\phi(z)\Vert\mathcal N(0,I_k))\) 的上界。

為什麼不停在 VAE:上界和真正的 KL 之間有差距,講義叫 amortization gap,只有 \(q_\phi(z\mid x)=p_\theta(z\mid x)\) 時才是 0。訓練結束時它通常還在,所以 \(q_\phi(z)\neq\mathcal N(0,I_k)\)。解碼器訓練時看的是 \(q_\phi(z)\),改從 \(\mathcal N(0,I_k)\) 抽等於走出訓練時的分佈。講義說這其實是好事:實務上 flow 和 diffusion 比 VAE 的解碼器能力強,把生成的難題交給 latent 上的模型比較合理。Demo A 的 \(\beta=0\) 可以看到這一點。

ELBO 和 variational:同一個損失也可以寫成 \(L_{\text{VAE}}=-\mathbb E_x[\text{ELBO}(x)]+\text{常數}\),其中 $$\begin{aligned}&\text{ELBO}(x)\\&=\mathbb E_{q_\phi}\Big[\log\frac{p_\theta(x\mid z)\mathcal N(z;0,I_k)}{q_\phi(z\mid x)}\Big]\\&\le\log p_\theta(x)\end{aligned}$$ 真正的後驗 \(p_\theta(z\mid x)\) 算不出來,因為分母 \(p_\theta(x)\) 算不出來,所以用 \(q_\phi\) 當替代品,這就是 variational 的意思。

重建和生成的拉鋸:FID 是衡量兩堆圖片分佈差多遠的分數,越小越好(CS236 第 15 講)。量「編碼再解碼」的叫 rFID,量「latent 模型生成再解碼」的叫 gFID。rFID 低代表 latent 留了很多資訊,latent 分佈也比較難學,gFID 往往變高;反過來也一樣。所以要找一個分工點:壓得夠多,又不會讓重建太差。

07Reparameterization trick(投影片 17)

老師問:這個損失還有什麼問題? 39:27 問題在期望值的抽樣分佈本身就依賴 \(\phi\)。深度學習的慣例是抽樣後對固定的樣本微分,這裡這樣做不是損失的正確梯度。

黑板:reparameterization trick
板書(46:00):\(\epsilon\sim\mathcal N(0,I_k)\),\(z=\mu_\phi(x)+\sigma_\phi(x)\epsilon\Rightarrow z\sim q_\phi(\cdot\mid x)\);\(L_{\text{VAE}}\) 把 \(z\) 換掉,期望值下面只剩 \(x\) 和 \(\epsilon\),旁邊標 no parameter。
Reparameterization trick $$\begin{gathered}\epsilon\sim\mathcal N(0,I_k)\\z=\mu_\phi(x)+\sigma_\phi(x)\epsilon\\\Rightarrow\ z\sim q_\phi(\cdot\mid x)\end{gathered}$$ 抽樣的隨機性移到和 \(\phi\) 無關的 \(\epsilon\) 上,\(\mu_\phi,\sigma_\phi\) 變成確定的函數,可以 backprop(反向傳播,自動算梯度)。
手算:不這樣做會錯在哪(轉述者補充) \(q_\mu=\mathcal N(\mu,1)\),\(f(z)=z^2\)。真正的值是 \(\mathbb E_q[z^2]=\mu^2+1\),梯度是 \(2\mu\)。
  • 天真的做法:先抽 \(z\),再對 \(\mu\) 微分 \(z^2\)。\(z\) 當常數,得到 0。錯了。
  • 換參數:\(z=\mu+\epsilon\),\(\frac{\partial}{\partial\mu}(\mu+\epsilon)^2=2(\mu+\epsilon)\)。平均是 \(2\mu\)。正確。
為什麼不能直接 backprop?· 50:26老師強調這不是算不算得出來的問題,而是數學上不正確:計算上可以做,但你最小化的不是這個損失。抽樣那一步不是對參數可微的運算,寫成 \(\mu_\phi+\sigma_\phi\epsilon\) 之後,就只是函數運算,PyTorch 可以直接微分。
換參數有代價嗎?· 54:21沒有,這只是抽樣的另一種寫法,非常便宜。老師順帶提到,強化學習的 REINFORCE 也有「期望值依賴參數」的相同問題 49:56。
投影片 17 的圖(\(\odot\) 是逐元素相乘):Algorithm 7 \(\beta\)-VAE:編碼得 \(\mu_i,\log\sigma_i^2\),抽 \(\epsilon_i\),\(z_i=\mu_i+\sigma_i\odot\epsilon_i\),解碼;重建損失 \(\frac1B\sum\frac{1}{2\sigma^2}\Vert x_i-\hat x_i\Vert^2\);KL 損失 \(\frac1B\sum\frac12\sum_j(\mu_{i,j}^2+\sigma_{i,j}^2-\log\sigma_{i,j}^2-1)\);總損失相加後更新。
一句話帶走:VAE = 重建 + \(\beta\)×(拉向高斯),靠 \(z=\mu+\sigma\epsilon\) 才能訓練。

Demo AVAE 加 latent diffusion

真的跑一次整條流程:8×8 手寫數字(\(d=64\),1,797 張),VAE 壓到 \(k=2\),再用第 2 講的 flow matching 在 latent 上訓練,最後解碼。電腦上大約 5 秒跑完,手機可能更久。固定 \(\sigma^2=0.1\),latent 訓練前先標準化。

怎麼看:左圖是所有資料的 \(\mu_\phi(x)\),顏色是數字類別,虛線圈是 \(\mathcal N(0,I)\) 的 2 倍標準差。右邊四列:原圖、重建、直接解碼 \(\mathcal N(0,I)\) 的 \(z\)、latent flow matching 生成。選一個 \(\beta\),按開始訓練。
  • \(\beta=0\):純自編碼器。重建誤差 0.0938(只猜平均圖是 0.1334),編碼器的 \(\sigma\) 只有 0.024,幾乎是確定性的。\(\mu\) 的平均在 (−0.921, 0.133),沒有對準原點,所以直接解碼 \(\mathcal N(0,I)\) 的樣本很差(到最近訓練圖的誤差 0.2475),但 latent flow matching 仍然有 0.0581:它學的是實際的 latent 分佈,不在乎是不是高斯。
  • \(\beta=1\)、\(\beta=5\):KL 從 3.554 降到 0.999,\(\mu\) 的平均從 (−0.544, 0.161) 回到原點附近的 (0.022, 0.077),直接解碼的誤差降到 0.1137、0.0668。代價在 \(\beta=5\) 才看得出來:\(\beta=1\) 的重建還是 0.0938,\(\beta=5\) 變差到 0.1039。\(\beta=5\) 時 latent 已經接近高斯,latent flow matching(0.0686)和直接解碼差不多。
  • \(\beta=20\):posterior collapse。KL 只剩 0.010,\(\sigma\) 平均 0.981,\(\mu\) 的標準差不到 0.09:編碼器幾乎不管輸入。重建誤差 0.1362,比只猜平均圖還差,重建那一列都是同一張模糊的圖。注意最近訓練圖的誤差是 0.0812,看起來不算差:模糊的平均圖本來就不會離每張圖太遠。所以這個數字只能當參考,要一起看圖。

08Latent diffusion(投影片 18–19)

Latent diffusion 的步驟(投影片 18)
  1. 資料:\(x_1,\dots,x_N\)。
  2. 編碼:全部轉成 latent(VAE 直接取平均 \(\mu_\phi(x)\))。
  3. Latent 資料:得到 \(z_1,\dots,z_N\),小得多。
  4. Latent diffusion model:對這份資料訓練 diffusion model。
  5. 解碼:取樣後,把 latent 解回資料空間。
紅框:和之前完全一樣的配方,只是資料集換了。

講義的補充:訓練時從 \(q_\phi(z\mid x)\) 抽樣,解碼時取平均而不抽樣,避免雜訊造成的瑕疵。投影片和老師說的編碼是取平均。兩者略有差別,都是常見做法。

投影片 19 的圖:三張生成圖。紅框:Stable Diffusion:[3,256,256] → [4,32,32];FLUX 2.0:[3,1024,1024] → [32,64,64]。標題:幾乎所有 AI 生成的圖和影片都是在 latent space 生成的。
手算:壓縮多少
  • Stable Diffusion:\(3\times256^2=196{,}608\) 變成 \(4\times32^2=4{,}096\),48 倍。
  • FLUX 2.0:\(3\times1024^2=3{,}145{,}728\) 變成 \(32\times64^2=131{,}072\),24 倍。
latent 還保留了 channel、高、寬的形狀,所以下一節仍然可以切 patch 62:00。
會掉資訊嗎?· 56:26會,問題是掉的資訊重不重要。實際看編碼再解碼的結果,幾乎分不出差異。但老師提醒,現在自編碼器和 diffusion model 一樣是成敗關鍵,大公司有專門的團隊做自編碼器。他說就他看得到的範圍,幾乎大家都這樣做:公開的模型他很確定都在 latent space,封閉的模型他無從得知。

延伸:CS236 第 17 講的 latent diffusion。

一句話帶走:把資料集換成 latent,配方完全不變,最後多一步解碼。

09網路的三個輸入(投影片 20–23)

投影片 21 的圖:\(u_t^\theta(x\mid y)\) 大字,箭頭分別標 Parameters、Time、Latent image、Prompt。

輸出呢?老師問,答案是另一個 latent,和 \(x\) 同形狀 58:29。三個輸入形狀各不相同,要先都變成向量序列。

講義說,低維的玩具例子把 \(x,y,t\) 接起來丟進 MLP 就夠了,這頁 Demo A 的 latent flow matching 也是用 MLP。影像、影片、蛋白質這類高維資料才需要專門的架構。

時間:一個數字變成高維向量

\(t\) 只有一維,其他輸入都很高維。為了讓它「有份量」,用不同頻率的 sin、cos 把它展開,講義稱為 Fourier features 58:59:

時間嵌入 $$\begin{aligned}&\text{TimeEmb}(t)=\sqrt{\tfrac2d}\,\big[\\&\ \cos(2\pi w_1t),\dots,\cos(2\pi w_{d/2}t),\\&\ \sin(2\pi w_1t),\dots,\sin(2\pi w_{d/2}t)\big]\end{aligned}$$ $$w_i=w_{\min}\Big(\frac{w_{\max}}{w_{\min}}\Big)^{\frac{i-1}{d/2-1}}$$
投影片筆誤:投影片 22 把係數寫成 \(1/\sqrt d\),又說 \(\Vert\text{TimeEmb}(t)\Vert=1\)。這兩者矛盾:每一對 \(\cos^2+\sin^2=1\),共 \(d/2\) 對,所以長度平方是 \(\text{係數}^2\times d/2\)。要長度 1,係數必須是 \(\sqrt{2/d}\),也就是講義的寫法。\(1/\sqrt d\) 的長度是 \(1/\sqrt2\)。
手算 \(d=4\),\(w_1=1\)、\(w_2=2\),\(t=0.25\):\(\cos(\pi/2)=0\)、\(\cos\pi=-1\)、\(\sin(\pi/2)=1\)、\(\sin\pi=0\)。乘 \(\sqrt{2/4}\approx0.707\),得到 \((0,-0.707,0.707,0)\),長度是 1。

老師說這有各種寫法,重點是得到一個 \(d\) 維、長度固定的向量 58:59。頻率取等比數列,讓它同時有慢和快的變化(轉述者的解讀)。

提示詞

投影片 23 的圖:例句「A dog running on grass in a park at sunshine in an Italian city.」。用預訓練的語言嵌入:CLIP、T5,也可以用 LLM。結果是 \(\text{PromptEmbed}(y_{\text{raw}})\in\mathbb R^{S\times k}\),長度 \(S\) 的向量序列。

這些模型別人已經訓練好了,直接拿來用 59:59。CLIP 是 OpenAI 的對比學習模型,給出和影像相關的文字嵌入。對比學習是讓配對的圖片和文字嵌入靠近、不配對的遠離(這句是轉述者補充)。如果條件只是類別標籤,就更簡單:每個類別學一個嵌入向量(講義 §6.1)。

一句話帶走:時間變成 sin、cos 的向量,提示詞用預訓練模型變成向量序列。

Demo B時間嵌入

怎麼看:橫軸是 \(t\),縱軸是 32 維嵌入的每一維,藍色正、橘色負。下半部是 16 個 cos,上半部是 16 個 sin;每一半都是由下往上頻率變高,所以下面變化慢、上面變化快。粗線是目前的 \(t\)。
  • \(t\) 只差 0.01,內積就從 1 掉到 0.477;差 0.05 時是 0.147,差 0.2 時是 −0.189;差 0.001 時才是 0.988。也就是很接近的時間,嵌入已經明顯不同,網路比較容易分辨。內積只和時間差有關,因為 \(\cos a\cos b+\sin a\sin b=\cos(a-b)\)。
  • 不管 \(t\) 是多少,長度都是 1.000;用投影片的 \(1/\sqrt d\) 會是 0.707。

10Patchify(投影片 24)

影像(或 latent)是 \(C\times H\times W\) 的陣列,transformer(把向量序列變成向量序列的網路)要的是向量序列。做法和 vision transformer 一樣,切成小方塊,每塊攤平 61:30:

Patchify $$\begin{gathered}\text{Patchify}(x)\in\mathbb R^{N\times C'}\\N=\frac HP\cdot\frac WP,\quad C'=CP^2\end{gathered}$$ 再乘一個可學習的矩陣,得到 \(\text{PatchEmb}(x)\in\mathbb R^{N\times d}\)。
投影片 24 的圖:一張機器人卡通圖切成小方格,下方排成一列,就是向量序列。紅框:L is the sequence length。投影片在這裡用 \(L\),下一張和講義用 \(N\),是同一個東西。
手算 Stable Diffusion 的 latent \(4\times32\times32\),\(P=2\):\(N=16\times16=256\) 個 patch,每個 \(C'=4\times4=16\) 維。總數 \(256\times16=4{,}096\),一個數字也沒少,只是換排法。
一句話帶走:切 patch 只是換排法,數字總數不變;\(P\) 越大序列越短。

Demo Cpatch 的數量

怎麼看:選一個影像形狀和 \(P\)。格子太多時只畫一部分線。Stable Diffusion 的 latent 取 \(P=2\):256 個 patch,每個 16 維。\(P\) 加倍時 \(N\) 變成 1/4,每個 patch 的維度變 4 倍,總數不變。self-attention 要比較 \(N^2\) 對,所以 \(P\) 加倍時少 16 倍。原始影像 \(P=2\) 要比較 225 億對,latent 只要 65,536 對:這也是要先進 latent space 的原因。

11Attention 與 DiT(投影片 25–28)

時間 tTimeEmbℝᵈ提示詞 yPromptEmbS 個向量x(latent)PatchEmbN 個向量DiTBlock × L 層Unpatchify → 速度 u
投影片 26 的架構:三種輸入都變成 \(d\) 維向量,再經過多層 DiT 區塊。
投影片 25–26 的圖:投影片 25 是 DiT 論文(Peebles & Xie)的生成圖。投影片 26:Inputs \(\tilde t,\tilde y,\tilde x_0\);Attention loop \(\tilde x_{i+1}=\text{DiTBlock}(\tilde x_i,\tilde t,\tilde y)\);Unpatchify。
投影片和講義的 \(N\) 撞名:投影片 26 的迴圈寫 \(i=0,\dots,N-1\),Unpatchify 那行是 \(\tilde z_N\),所以 \(N\) 同時是 patch 數和層數。講義的迴圈已經寫成 \(i=0,\dots,L-1\),但緊接著又寫「\(N\) 是層數」,Depatchify 也用 \(\tilde x_N\)。應該分開:patch 數 \(N\)、層數 \(L\),最後一層是 \(\tilde x_L\)。投影片 26 還把向量維度寫成 \(k\),講義是 \(d\),本頁用 \(d\)。

Scaled dot-product attention

老師舉手調查,多數人學過,所以講得快 64:35。它把向量序列變成向量序列。輸入三樣:queries、keys、values。

Attention $$\begin{aligned}&\text{Attn}(Q,K,V)\\&=\text{softmax}\Big(\frac{QK^\top}{\sqrt{d_h}}\Big)V\end{aligned}$$ \(Q\in\mathbb R^{N\times d_h}\),\(K,V\in\mathbb R^{M\times d_h}\),softmax 逐列做。

\(d_h\) 從哪裡來:實際用的是 multi-head attention(講義)。把 \(d\) 維的向量投影成 \(h\) 組 \(d_h=d/h\) 維的 Q、K、V,各做一次 Attn,接起來再乘一個矩陣回到 \(d\) 維。這樣每一組可以看不同的關聯。

怎麼讀:每個 query 和所有 key 算內積,內積大代表「相關」。softmax 把它變成權重,輸出就是 values 的加權平均。除以 \(\sqrt{d_h}\) 避免維度高時內積太大,讓 softmax 塌成只有一個(轉述者補充,出自 Vaswani et al.)。

手算 一個 query \(Q=(1,0)\),兩個 key \(K_1=(1,0)\)、\(K_2=(0,1)\),values 取 10 和 20(這裡用純量),\(d_h=2\)。
  1. 內積:1 和 0。除以 \(\sqrt2\):0.707 和 0。
  2. softmax:\(e^{0.707}=2.028\)、\(e^0=1\),得到權重 0.670、0.330。
  3. 輸出:\(0.670\times10+0.330\times20\),約 13.30。

DiT 區塊

投影片 28 的圖:影像用 self-attention(Q、K、V 都是影像);文字用 cross-attention(Q 是影像,K、V 是文字);時間用 adaptive layer normalization(scale 和 offset 由時間決定)。全部加起來。紅框:要理解 transformer 最好的方式是實作,見 Lab 3。
輸入怎麼進去意思
影像 \(x\)self-attention,\(Q=K=V=x\)patch 之間互相看
提示詞 \(y\)cross-attention,\(Q=x\),\(K=V=y\)每個 patch 去看相關的文字
時間 \(t\)AdaLN正規化(把數值調成固定的平均和尺度)後的縮放和平移由時間決定

講義的形式:\((\gamma,\beta)=g(\tilde t)\),\(\text{AdaNorm}_{\tilde t}(x)=(1+\gamma)\odot\text{Norm}(x)+\beta\)(這裡 \(\beta\) 又是另一個東西)。講義的式子印成 Norm(H),應是 Norm(x)。\(\odot\) 是逐元素相乘。一個區塊依序做 self-attention、cross-attention、MLP,每一步都是殘差(把輸出加回原本的 \(x\)):\(x\leftarrow x+g(\tilde t)\cdot(\cdots)\)。

最後一步:每個向量乘 \(\tilde W\in\mathbb R^{d\times C'}\) 變回 \(C'\) 維,再拼回 \(C\times H\times W\),就是輸出的速度 \(u\)。Lab 裡的類別條件 DiT 更簡單,沒有 cross-attention,時間和類別都走 AdaNorm(講義)。

老師說他相信只有實作才算懂,所以這裡只給總覽 66:36。

U-Net(講義有,課堂沒講)

DiT 之前的主流。它是摺積網路(用同一組小窗口掃過整張圖的網路),輸入輸出都是影像形狀:編碼器把長寬縮小、channel 增加,例如 \(3\times256\times256\to512\times32\times32\);中間處理;解碼器還原;對應層之間有殘差連接,整體形狀像 U。原本是做影像分割的,因為輸入輸出同形狀,很適合表示向量場。CS236 的 第 17 講也提到它。

一句話帶走:影像看自己(self-attention)、看文字(cross-attention),時間調正規化(AdaLN)。

Demo Dattention

怎麼看:沒有上色的細箭頭是 query,三個彩色箭頭是 key,粗細代表權重。三個 value 固定是 10、20、30。\(d_h=2\)、query 在 20° 時對準第一個 key,權重 0.572、0.249、0.179,輸出 16.07。轉到 70°,兩個 key 一樣近,權重 0.432、0.432、0.135。轉到 120°、\(d_h=1\),第二個 key 拿到 0.665。\(d_h=64\) 時權重變成 0.322、0.373、0.304,接近平均。這裡的向量固定是 2 維,\(d_h\) 只當除數,用來看「分數變小,softmax 就變平」。真正的高維向量內積本身會變大,除以 \(\sqrt{d_h}\) 就是把它拉回來。

12兩個實際模型(投影片 29–33)

Stable Diffusion 3Meta MovieGen
資料影像(資料集 LAION)影片
訓練flow matching,直線排程(第 2 講)相同
GuidanceCFG,\(w\) 在 2.0–5.0(第 3 講)CFG
Latent預訓練 VAE預訓練的 temporal autoencoder,時間和長寬各縮 8 倍(講義)
架構MM-DiT適應影片的 DiT,patch 是 3D 的
文字嵌入CLIP(粗略)、T5-XXL(細節);講義說共 3 種UL2、ByT5、MetaCLIP(講義)
參數量80 億300 億
取樣50 步—
硬體—6,144 張 H100 GPU
投影片 30–33 的圖:投影片 30:SD3 的條列和三張圖。投影片 31:MM-DiT 架構圖,文字和影像一路一起通過網路。投影片 32–33:MovieGen 的猴子和無尾熊影片截圖,以及條列。投影片 33 問「DiT 要怎麼改?」,右上角的圖片來源標成 SD3 論文,應該是貼錯。

老師的重點:這些模型用的就是前幾講的東西 68:08。SD3 的 MM-DiT 差別在:文字序列不只被影像看,也會在網路裡一路被處理 69:39。

影片的 DiT 要改什麼?學生提到時間一致性,老師說都對,也是很大的挑戰,但他想講的是最直接的一點:patch 要從 2D 變成 3D,也就是連時間一起切 72:12。他也提醒,這裡的「時間」是影片的時間軸,和 flow matching 的 \(t\) 是兩回事 71:42。

影片的 latent 特別關鍵,所有東西都要再乘上影格數,這也是現在影片通常很短的原因 70:41。

手算每 8 影格縮成 1 格、長寬各縮 8 倍,位置總數就少 \(8^3=512\) 倍(channel 數另計)。
訓練多久?· 72:42老師不記得確切天數,猜至少兩、三週,說可以去查論文。背後有龐大的計算資源和網路上的資料。

講義的補充:SD3 論文試過多種 flow 和 diffusion 的做法,flow matching 表現最好;取樣用 Euler 法。CLIP 給整句粗略的嵌入,T5 給逐字的序列,所以 MM-DiT 讓影像 patch 也去看文字序列。MovieGen 為了長影片會把影片切段分別編碼再接起來(temporal tiling),三種文字嵌入的用途分別是細節理解(UL2)、字元層級(ByT5,例如要求畫面出現特定文字)和圖文共享空間(MetaCLIP)。

一句話帶走:SD3 和 MovieGen 用的就是這幾講的東西,差別主要在規模和影片的 3D patch。

13文獻導覽(投影片 34–39)

讀論文時你會遇到不一樣的寫法,老師說它們本質上是同一件事 73:13。這一節就是第 3 講投影片 38–43 留下來的內容。

主題這門課其他文獻
時間資料 \(t=1\),雜訊 \(t=0\)(flow matching、rectified flow、stochastic interpolant)Score SDE:資料 \(t=0\),雜訊 \(t\to\infty\)
離散ODE/SDEDDPM:離散的 Markov chain,損失用 ELBO(真正目標的一個下界);DDIM 大致是 probability flow ODE
加雜訊機率路徑 \(\mathcal N(\alpha_tz,\beta_t^2I_d)\)內插函數 \(I_t(\epsilon,z)=\alpha_t\epsilon+\beta_tz\);或 forward SDE \(\mathrm dX_t=a_t(X_t)\mathrm dt+\sigma_t\mathrm dW_t\)
目標連續方程、Fokker–Planckforward SDE 的 time reversal,需要 score
投影片 35–37 的圖:投影片 35 列出三種時間慣例。投影片 36 列出三種加雜訊的方式,並註明高斯路徑下三者等價。投影片 37 是常見的圖:上面 forward SDE 從資料走到雜訊,下面 reverse SDE 走回來,中間的 score 用框標出。紅字:time-reversed SDE 是 SDE 擴充技巧在特定雜訊強度下的一個解,實務上通常不是最好的。

符號不一致:投影片 36 的內插寫成 \(\alpha_t\epsilon+\beta_tz\),\(\alpha,\beta\) 和這門課的排程相反(這門課是 \(\alpha_tz+\beta_t\epsilon\))。它是在描述 stochastic interpolant 的一般形式,看的時候要注意。

講義附錄的細節:forward process 和 time reversal

離散時間的缺點:要事先決定離散化,損失是 ELBO,只是下界。Song 等人(2020)指出離散版本近似連續的 SDE;連續時間時下界變緊,第 2、3 講的定理都是等式。兩者用的其實是同樣的損失。

Forward process 就是一種機率路徑:SDE \(\mathrm d\bar X_t=a_t\bar X_t\mathrm dt+\bar\sigma_t\mathrm d\bar W_t\),條件分佈是高斯,也就是高斯路徑。但要在訓練時不模擬,必須有閉式解,所以漂移一定是線性的;而且要 \(t\to\infty\) 才真的變高斯,有限時間到不了 \(p_{\text{init}}\)。閉式解是 \(\alpha_t=\exp\int_0^ta_r\mathrm dr\)、\(\beta_t^2=\alpha_t^2\int_0^t\bar\sigma_r^2/\alpha_r^2\mathrm dr\)。

Time reversal(Anderson 1982):反向 SDE 的漂移是 \(-u_t+\sigma_t^2\nabla\log p_t\)。對生成來說我們只用最後一點,是不是「真的」時間反轉並不重要,所以不必用它,probability flow ODE 常常更好。CS236 的 第 16 講、補充課 F 用的就是這個角度。

為什麼這門課選 flow matching

投影片 38–39 的圖:投影片 38:可以說是最簡單的演算法、可以只談 flow、可以從任意 \(p_{\text{init}}\) 到任意 \(p_{\text{data}}\)。投影片 39(Michael Albergo 的圖):連接任意分佈的例子:無聲影片到有聲影片、低解析到高解析、未受擾動的細胞到受擾動的細胞;旁邊是部分遮蔽的影像被補回來。

老師自認有偏見:他喜歡這個框架,因為簡單,SDE 只是選項;而且推導從頭到尾沒有用到起點必須是高斯 76:50。講義也說 diffusion model 只能用高斯起點,這是 flow matching 和 stochastic interpolant 的優勢。

一句話帶走:時間方向、加雜訊的說法和推導不同,但高斯路徑下訓練的是同一件事。

14總結與下一講(投影片 40)

丟標籤的機率 \(p\) 怎麼選?· 78:53老師在黑板畫結果好壞對 \(p\) 的曲線。總是丟,提示詞那一項學不好;從不丟,\(u(x\mid\varnothing)\) 就沒有學過。所以中間有個最佳點,經驗上大家用約 20%。
黑板:丟標籤機率的曲線
板書(79:50):上面是 \(\tilde u=w\,u(x\mid y)+(1-w)\,u(x\mid\varnothing)\),兩項旁邊分別標 acc. 和 inacc.,指「從不丟時第一項準、第二項不準」。曲線的縱軸寫 Acc,但老師說「高是不好」,所以其實是誤差,最低點標在約 0.2。
部件出處這一講怎麼放大
訓練目標第 2 講flow matching,直線排程,不變
提示詞第 3 講CFG;文字用預訓練嵌入
資料—先用 VAE 壓到 latent space
網路—DiT:patch、attention、AdaLN
取樣第 1 講Euler 法約 50 步,再解碼
投影片 40 的圖:下一堂課週五 12:30pm–2pm,E25-111,主題 Discrete diffusion models。

老師預告 79:53:週五是加分課,把 diffusion 的原理用到語言模型,通過這門課不需要它。那堂課的複習頁是第 5 講。

Lab 3:實作 DiT、CFG,並訓練自己的潛在模型。可以到課程網站取得。

和其他頁面的關聯

常見誤解

  • 「VAE 是這裡的生成模型。」在 latent diffusion 裡,VAE 只負責壓縮和還原,生成是 latent 上的 flow 或 diffusion。
  • 「prior loss 讓 latent 分佈變成高斯。」它只是拉向高斯,\(\beta\) 通常很小;整體 latent 分佈是混合,不是高斯。所以才要 diffusion。
  • 「\(\beta\) 越大,latent 越好。」太大會 posterior collapse,編碼器不管輸入(Demo A 的 \(\beta=20\))。
  • 「Reparameterization 是讓計算變快。」它是讓梯度正確。不做的話梯度是錯的,不是慢。
  • 「Latent 就是一條普通向量。」它通常保留 channel × 高 × 寬的形狀,所以還能切 patch。
  • 「影片 DiT 的時間就是 \(t\)。」影片時間軸是資料的一個維度;\(t\) 是 flow 的時間,兩者無關。
  • 「Patchify 會壓縮資料。」它只是換排法,數字總數不變。真正壓縮的是 VAE。
  • 「DDPM、Score SDE 和 flow matching 是三種不同的模型。」高斯路徑下,差別主要是時間慣例和推導方式,訓練的損失相同。

自我測驗

1. Diffusion model 比分類器更怕高維的兩個原因?
輸出也和輸入一樣高維;取樣要呼叫網路 50 到 100 次。
2. 只有重建損失的自編碼器缺什麼?
沒有控制 latent 分佈,可能壓縮後變得更難學,而我們之後要在 latent 上訓練 diffusion model。
3. 為什麼高斯解碼器的負對數概似是 MSE?
取負對數後是 \(\Vert x-\mu_\theta(z)\Vert^2/(2\sigma^2)\) 加常數,\(\sigma^2\) 固定時常數和參數無關。
4. \(q=\mathcal N(2,1)\)、\(p=\mathcal N(0,1)\),KL 是多少?\(q=\mathcal N(0,0.25)\) 呢?
\(\tfrac12(0+4)=2\)。\(\tfrac12(0.25-\ln0.25-1)\),約 \(0.318\)。
5. 只用 prior loss 訓練,最小值點是什麼?
不管 \(x\),一律 \(\mu_\phi=0\)、\(\sigma_\phi=1\)。完全忽略資料,無法重建。
6. 為什麼需要 reparameterization trick?舉一個數字例子。
抽樣分佈依賴參數,對固定樣本微分是錯的梯度。\(z\sim\mathcal N(\mu,1)\),\(f=z^2\):真梯度 \(2\mu\);對固定 \(z\) 微分得 0;\(z=\mu+\epsilon\) 得 \(2(\mu+\epsilon)\),平均 \(2\mu\)。
7. Latent diffusion 的五個步驟?
收集資料;全部編碼;得到 latent 資料集;在上面訓練 diffusion model;取樣後解碼。
8. 投影片 22 的 \(1/\sqrt d\) 哪裡錯?
\(d/2\) 對 \(\cos^2+\sin^2=1\),長度平方是係數平方乘 \(d/2\)。要長度 1,係數要是 \(\sqrt{2/d}\)。
9. \(16\times64\times64\) 的 latent,\(P=4\),\(N\) 和 \(C'\) 是多少?
\(N=16\times16=256\),\(C'=16\times16=256\)。
10. \(Q=(0,1)\)、\(K_1=(1,0)\)、\(K_2=(0,1)\)、values 為 10、20、\(d_h=1\),手算 attention。
內積 0、1;softmax:\(1/(1+e)=0.269\)、\(0.731\);輸出 \(2.69+14.62=17.31\)。
11. Self-attention 和 cross-attention 差在哪?
Q、K、V 都是影像是 self;Q 是影像、K 和 V 是文字是 cross。
12. 影片的 DiT 最直接的改動是什麼?這裡的時間是 \(t\) 嗎?
patch 從 2D 變 3D。那是影片時間軸,不是 flow 的 \(t\)。
13. 讀到一篇 data at \(t=0\)、用 forward SDE、目標是 score 的論文,要怎麼對應回這門課?
時間反過來;forward SDE 給出高斯機率路徑;高斯路徑下 score 可以和向量場換算(第 3 講)。

延伸閱讀