數學工具箱:只學過微積分也能讀懂的前置數學
後面幾堂補充課和第 7–18 講的推導,反覆用到同一小組數學:Taylor 展開、梯度、矩陣、Jacobian、散度、Hessian、√n、摺積,以及高斯分佈的運算。這一頁假設你只學過單變數微積分,從頭把它們講清楚。每個工具都會寫出為什麼需要它、一個可以手算的例子,以及完整的推導。
讀完這頁你應該能夠
- 用 Taylor 展開把函數在一點附近近似成直線或拋物線,並說明 \(O(h^2)\) 是什麼意思。
- 算出偏導和梯度,說明 score \(\nabla_{\mathbf x}\log p(\mathbf x)\) 為什麼指向高機率區,以及為什麼不需要歸一化常數。
- 把矩陣看成平面的變換;手算 2×2 矩陣的行列式、trace、特徵值與特徵向量,並說出三者的關係。
- 寫出 Jacobian,說明它為什麼是非線性函數的局部線性近似,以及 \(|\det J|\) 的意義。
- 用兩種方法推導「散度 = Jacobian 的 trace = 面積的相對變化率」,並區分向量場的散度和 KL divergence。
- 說出 Jacobian 和 Hessian 的行列式、trace 各自的意義。
- 說明獨立隨機變數相加時為什麼是變異數相加,所以 \(n\) 步隨機漫步的寬度是 \(\sqrt n\)。
- 解釋摺積是什麼,為什麼「隨機變數相加」對應「密度摺積」。
- 用配方推導高斯密度相乘的結果,並用同一個工具算出去雜訊的最佳猜測,說明它為什麼會往平均收縮。
00怎麼讀這一頁
補充課共七堂,順序是 A(本頁)→ B 微分方程 → C 連續方程 → D Markov 鏈與 MCMC → E 布朗運動與 SDE → F Fokker–Planck 與 Langevin → G 連續時間 Markov 鏈。
這一頁的目標是讓你每一步都跟得上,不是追求數學上的嚴謹。所以函數一律假設夠平滑,極限也不特別討論。讀的時候可以這樣做:
- 綠色線標示的「手算」區塊,拿紙筆算一次。公式是從這些例子長出來的。
- 每個 demo 前面都寫了要看什麼。先猜結果,再動手拖。
- 每節最後有一句話摘要,和一題附答案的小練習。答得出來再往下讀。
- 「背景補充」框是選讀,跳過也不影響後面。
後面幾節有依賴關係:第 3 節(矩陣)→ 第 4 節(特徵值)→ 第 5 節(Jacobian)→ 第 6 節(散度)→ 第 7 節(Hessian)。如果只是回來查某個工具,可以直接跳到那一節。
01導數與 Taylor 展開:把曲線在一點附近看成直線
為什麼需要它
幾乎所有推導都有同一個動作:函數太複雜,但我們只走一小步,所以把它在附近換成一條直線或拋物線。Euler 法、Itô 公式、Tweedie 公式都是這樣來的。
一階:切線
導數 \(f'(x_0)\) 是函數在 \(x_0\) 的斜率。斜率的意思是「往右走 1,函數大約變多少」,所以往右走一小步 \(h\),函數大約改變 \(f'(x_0)\,h\):
$$f(x_0 + h)\approx f(x_0) + f'(x_0)\,h$$右邊就是切線。這不是新的公式,只是把導數的定義 \(f'(x_0)\approx\frac{f(x_0+h)-f(x_0)}{h}\) 移項。
\(f(x) = x^2\),\(x_0 = 3\),所以 \(f(3) = 9\)、\(f'(3) = 6\)。
- \(h = 0.1\):切線給 \(9 + 6\times0.1 = 9.6\),真值 \(3.1^2 = 9.61\),誤差 \(0.01\)。
- \(h = 0.05\):切線給 \(9.3\),真值 \(9.3025\),誤差 \(0.0025\)。
\(h\) 減半,誤差變成 \(1/4\)。這裡的誤差剛好是 \(h^2\),因為 \((3+h)^2 = 9 + 6h + h^2\)。
大 O 記號
像上面這樣「誤差大約和 \(h^2\) 成正比」的情況,寫成 \(O(h^2)\),讀作「\(h^2\) 量級的東西」。我們不在乎前面的係數,只在乎 \(h\) 縮小時它掉得多快:
| 誤差 | \(h\) 減半時,誤差變成 | \(h = 0.01\) 時大約 |
|---|---|---|
| \(O(h)\) | \(1/2\) | \(0.01\) |
| \(O(h^2)\) | \(1/4\) | \(0.0001\) |
| \(O(h^3)\) | \(1/8\) | \(0.000001\) |
\(h\) 是小於 1 的小量,所以指數越大,東西越小。
二階:加上「斜率本身也在變」
切線假設斜率不變,但斜率其實在變,變化率是 \(f''\)。加一個 \(h^2\) 的項來修正,得到拋物線:
$$\begin{aligned}f(x_0 + h) ={}& f(x_0) + f'(x_0)\,h\\&+ \tfrac12 f''(x_0)\,h^2 + O(h^3)\end{aligned}$$係數為什麼是 \(\tfrac12\)?設 \(g(h) = f(x_0) + f'(x_0)h + ch^2\),要讓 \(g\) 在 \(h = 0\) 的二階導數和 \(f\) 一樣。微分兩次得 \(g''(h) = 2c\),所以 \(2c = f''(x_0)\),也就是 \(c = \tfrac12f''(x_0)\)。繼續做下去,第 \(k\) 項就是 \(\frac{1}{k!}f^{(k)}(x_0)h^k\)。
\(f(x) = e^x\),\(x_0 = 0\)。\(e^x\) 微分後還是自己,所以 \(f(0) = f'(0) = f''(0) = 1\),得到 \(e^h\approx1 + h + \tfrac12h^2\)。
| \(h\) | \(e^h\) | 一階的誤差 | 二階的誤差 |
|---|---|---|---|
| 0.2 | 1.22140 | 0.02140 | 0.00140 |
| 0.1 | 1.10517 | 0.00517 | 0.00017 |
\(h\) 減半時,一階的誤差變成約 \(0.24\) 倍(接近 \(1/4\)),二階的誤差變成約 \(0.12\) 倍(接近 \(1/8\))。
Demo A1 · 切線(一階)與拋物線(二階)近似
選「log p(x)」時,雙峰密度的 log 在兩峰之間彎曲得很厲害,切線只在很近的地方才準。後面的 Langevin 取樣就是沿著這條曲線的斜率走小步,所以步長不能太大。
小練習:\(\sqrt{x}\) 在 \(x_0 = 4\) 的一階近似,估計 \(\sqrt{4.1}\)。
02多變數:偏導、梯度,以及 score
為什麼需要它
資料(例如一張圖)有很多個座標,所以要處理多變數函數。CS236 後半最重要的物件 score,就是一個梯度。
偏導:只動一個變數
兩個變數的函數 \(f(x, y)\) 可以想成地形圖,\(f\) 是高度。偏導 \(\partial f/\partial x\) 是「固定 \(y\)、只往 \(x\) 方向走」的斜率。算法就是把 \(y\) 當成常數,照平常微分。
\(f(x, y) = x^2 + 3xy\)。把 \(y\) 當常數,\(\partial f/\partial x = 2x + 3y\);把 \(x\) 當常數,\(\partial f/\partial y = 3x\)。在 \((1, 2)\) 得到 \(8\) 和 \(3\)。
驗算:\(f(1, 2) = 7\)。\(x\) 多走 0.01:\(f(1.01, 2) = 7.0801\),增加約 \(8\times0.01\)。\(y\) 多走 0.01:\(f(1, 2.01) = 7.03\),增加 \(3\times0.01\)。
梯度:把偏導排成向量
$$\nabla f(x,y) = \Big(\frac{\partial f}{\partial x},\ \frac{\partial f}{\partial y}\Big)$$同時往兩個方向走一小步 \(\mathbf h = (h_1, h_2)\) 時,兩邊的改變量加起來:
$$\begin{aligned}f(\mathbf x + \mathbf h)&\approx f(\mathbf x) + \frac{\partial f}{\partial x}h_1 + \frac{\partial f}{\partial y}h_2\\&= f(\mathbf x) + \nabla f(\mathbf x)\cdot\mathbf h\end{aligned}$$這就是多變數的一階 Taylor 展開,\(\cdot\) 是內積(對應座標相乘再相加)。上面的例子中,\(\mathbf h = (0.01, 0.01)\) 給出 \(7 + 0.08 + 0.03 = 7.11\),真值是 \(7.1104\)。
為什麼梯度指向上升最快的方向
內積也可以寫成 \(\nabla f\cdot\mathbf h = \Vert\nabla f\Vert\,\Vert\mathbf h\Vert\cos\theta\),\(\theta\) 是兩個向量的夾角。步長 \(\Vert\mathbf h\Vert\) 固定時,要讓 \(f\) 增加最多,就要讓 \(\cos\theta\) 最大,也就是 \(\theta = 0\):順著梯度走。這時每走一單位,\(f\) 增加 \(\Vert\nabla f\Vert\),所以梯度的長度就是最陡方向的斜率。\(\theta = 90°\) 時增加量是 0,所以等高線和梯度垂直。
score:log 密度的梯度
機率密度 \(p(\mathbf x)\) 也是一片地形:高機率的地方是山峰。它的 score 定義為
$$\mathbf s(\mathbf x) = \nabla_{\mathbf x}\log p(\mathbf x)$$它是一個向量場:空間裡每一點都有一支箭頭。下標 \(\mathbf x\) 提醒我們是對資料微分,不是對模型參數微分。
為什麼要取 log?有兩個原因。第一,由連鎖律 \(\frac{d}{dx}\log p = \frac{p'}{p}\),所以 score 的方向和 \(\nabla p\) 相同,同樣指向高機率區;除以 \(p\) 只是調整長度。第二,也是關鍵的一點:歸一化常數會消失。很多模型只能寫出 \(p(\mathbf x) = \tilde p(\mathbf x)/Z\),其中 \(Z\) 是算不出來的積分。取 log 後:
$$\begin{aligned}\nabla_{\mathbf x}\log\frac{\tilde p(\mathbf x)}{Z}&= \nabla_{\mathbf x}\big(\log\tilde p(\mathbf x) - \log Z\big)\\&= \nabla_{\mathbf x}\log\tilde p(\mathbf x)\end{aligned}$$\(\log Z\) 是不隨 \(\mathbf x\) 改變的常數,微分後是 0。所以不知道 \(Z\) 也能算 score。
\(p(x) = \frac{1}{\sigma\sqrt{2\pi}}\exp\!\big(-\frac{(x-\mu)^2}{2\sigma^2}\big)\)。取 log,指數和常數分開:
$$\log p(x) = -\frac{(x-\mu)^2}{2\sigma^2} - \log(\sigma\sqrt{2\pi})$$對 \(x\) 微分,第二項是常數,第一項用連鎖律:
$$s(x) = -\frac{2(x-\mu)}{2\sigma^2} = -\frac{x-\mu}{\sigma^2}$$在 \(\mu\) 右邊是負的(往左指),在 \(\mu\) 左邊是正的(往右指),永遠指向平均,離得越遠越大。\(\mathcal N(0,1)\) 在 \(x = 2\) 的 score 是 \(-2\),在 \(x = -1\) 是 \(+1\)。
Demo A2 · 三個高斯混合的 score 場(點一下畫布)
- 兩峰之間有一條「分水嶺」,箭頭在那裡分道揚鑣。橙色路徑會爬到最近的峰,不一定是最高的峰,而且爬上去就不會離開。第 12–13 講的 Langevin 取樣多加一點雜訊,就是為了解決這個問題(補充課 F)。
- 離所有峰很遠的地方 score 很大,和上面手算的 \(-(x-\mu)/\sigma^2\) 一致(畫面上的箭頭長度有壓縮過,看讀數才準)。
小練習:\(p(x)\propto e^{-x^4}\)。\(x = 1\) 的 score 是多少?需要知道歸一化常數嗎?
03向量與矩陣:矩陣是一個把平面變形的動作
為什麼需要它
後面的 Jacobian、特徵值、線性 ODE、Markov 鏈全都建立在矩陣上。如果只把矩陣當成一張數字表,這些東西會很難懂。所以要換一個看法:矩陣是一個動作,它把每個向量送到另一個向量。
矩陣乘向量
2×2 矩陣有兩列兩行。「列」(row)是橫的,「行」(column)是直的。矩陣乘向量的算法是:
$$\begin{aligned}A\mathbf x &= \begin{bmatrix}a&b\\c&d\end{bmatrix}\begin{bmatrix}x\\y\end{bmatrix} = \begin{bmatrix}ax + by\\cx + dy\end{bmatrix}\\[4pt]&= x\begin{bmatrix}a\\c\end{bmatrix} + y\begin{bmatrix}b\\d\end{bmatrix}\end{aligned}$$最右邊的寫法最重要:結果是 \(A\) 的兩行的組合,係數就是 \(x\) 和 \(y\)。特別地,\(\mathbf e_1 = (1,0)\) 被送到第一行,\(\mathbf e_2 = (0,1)\) 被送到第二行。所以只要看矩陣的兩行,就知道兩個基本方向被送到哪裡;其他向量都是它們的組合,也跟著決定了。
\(A = \begin{bmatrix}2&1\\0&1\end{bmatrix}\),\(\mathbf x = (1, 1)\)。逐列算:\(2\cdot1 + 1\cdot1 = 3\),\(0\cdot1 + 1\cdot1 = 1\),得到 \((3, 1)\)。
用行的組合算:\(1\cdot(2, 0) + 1\cdot(1, 1) = (3, 1)\)。答案相同。
這種「直線還是直線、原點不動」的變換叫線性變換,它把整個平面均勻地變形。常見的幾種:
| 矩陣 | 動作 |
|---|---|
| \(\begin{bmatrix}1&0\\0&1\end{bmatrix} = I\) | 什麼都不做(單位矩陣) |
| \(\begin{bmatrix}2&0\\0&0.5\end{bmatrix}\) | \(x\) 方向拉長 2 倍,\(y\) 方向壓成一半 |
| \(\begin{bmatrix}0&-1\\1&0\end{bmatrix}\) | 逆時針轉 90° |
| \(\begin{bmatrix}1&1\\0&1\end{bmatrix}\) | 剪切:像把一疊紙推斜,底不動 |
矩陣相乘就是連續做兩個動作:\(AB\mathbf x\) 是先做 \(B\),再做 \(A\)。所以反覆乘 \(A^k\) 是把同一個動作做 \(k\) 次。
小練習:\(A = \begin{bmatrix}0&-1\\1&0\end{bmatrix}\),\(A(2, 1)\) 是什麼?畫出來確認它是轉了 90°。
04行列式、特徵值、trace:從矩陣讀出三個數字
行列式:面積變成幾倍
線性變換把單位正方形(面積 1)送成平行四邊形。因為變形是均勻的,所有形狀的面積都乘上同一個倍數。這個倍數就是行列式:
$$\det A = ad - bc$$推導:平行四邊形的兩邊是兩行 \((a,c)\) 和 \((b,d)\)。用一個大矩形把它框起來,再減掉多出來的部分:
圖上的 \(a = 3, c = 1, b = 1, d = 2\):\(12 - 3 - 2 - 2 = 5\),也等於 \(ad - bc = 6 - 1\)。
- 正負號:負的代表平面被翻面了,像照鏡子。面積倍數看絕對值 \(|\det A|\)。
- \(\det A = 0\):平行四邊形被壓成線或點,資訊消失了,變換無法倒回去(矩陣不可逆)。Normalizing flow 的每一層都必須避開這種情況。
- \(\det(AB) = \det A\,\det B\):先放大 2 倍再放大 3 倍,總共 6 倍。
更高維度的行列式公式比較長,但意義一樣:體積變成幾倍。
特徵向量:不會轉彎的方向
一般的向量被 \(A\) 作用後方向會改變,但有些特別的方向不會:
$$A\mathbf v = \lambda\mathbf v\qquad(\mathbf v\neq\mathbf 0)$$\(\mathbf v\) 叫特徵向量,數字 \(\lambda\) 叫特徵值。沿著這個方向,矩陣的作用只是把長度乘上 \(\lambda\),就像一維的乘法。這正是特徵值有用的原因:複雜的二維變形,沿著特徵方向會變回簡單的一維乘法。
怎麼算特徵值
- 把 \(A\mathbf v = \lambda\mathbf v\) 移項,得到 \((A - \lambda I)\mathbf v = \mathbf 0\)。
- 也就是說,矩陣 \(A - \lambda I\) 把一個不是零的向量壓成了零。一個方向被壓扁,面積當然變成 0,所以 \(\det(A - \lambda I) = 0\)。
- 把行列式寫開: $$\begin{aligned}&\det\begin{bmatrix}a-\lambda&b\\c&d-\lambda\end{bmatrix}\\={}&(a-\lambda)(d-\lambda) - bc\\={}&\lambda^2 - (a+d)\lambda + (ad-bc) = 0\end{aligned}$$
- 這是 \(\lambda\) 的一元二次方程式,叫特徵方程。用公式解:
$$\lambda = \frac{\operatorname{tr}\pm\sqrt{\operatorname{tr}^2 - 4\det}}{2}$$
其中 \(\operatorname{tr} = a + d\)、\(\det = ad - bc\)。
- 每個 \(\lambda\) 代回 \((A-\lambda I)\mathbf v = \mathbf 0\),解出方向 \(\mathbf v\)。\(\mathbf v\) 的長度不重要,任何倍數都還是特徵向量。
\(A = \begin{bmatrix}2&1\\1&2\end{bmatrix}\)。特徵方程是 \(\lambda^2 - 4\lambda + 3 = (\lambda-3)(\lambda-1) = 0\),所以 \(\lambda_1 = 3\)、\(\lambda_2 = 1\)。
\(\lambda_1 = 3\):\(A - 3I = \begin{bmatrix}-1&1\\1&-1\end{bmatrix}\),第一列要求 \(-v_1 + v_2 = 0\),也就是 \(v_1 = v_2\),取 \(\mathbf v_1 = (1, 1)\)。
\(\lambda_2 = 1\):\(A - I = \begin{bmatrix}1&1\\1&1\end{bmatrix}\),要求 \(v_1 + v_2 = 0\),取 \(\mathbf v_2 = (1, -1)\)。
驗算:\(A(1,1) = (3,3) = 3\cdot(1,1)\) ✓,\(A(1,-1) = (1,-1) = 1\cdot(1,-1)\) ✓。對照組 \(A(1,0) = (2,1)\) 就轉彎了。
trace、行列式、特徵值三者的關係
trace 是對角線的和:\(\operatorname{tr}A = a + d\)。為什麼它值得單獨取名?因為特徵方程的兩個根是 \(\lambda_1, \lambda_2\),所以它一定能分解成:
$$\begin{aligned}&\lambda^2 - (a+d)\lambda + (ad-bc)\\={}&(\lambda-\lambda_1)(\lambda-\lambda_2)\\={}&\lambda^2 - (\lambda_1+\lambda_2)\lambda + \lambda_1\lambda_2\end{aligned}$$比較兩邊的係數,就得到這一節最重要的結論:
上面的例子:\(3 + 1 = 4 = 2 + 2\);\(3\times1 = 3 = 4 - 1\)。更高維度也一樣:trace 是所有特徵值的和,行列式是所有特徵值的積。
幾何上很好理解:沿著兩個特徵方向分別拉長 \(\lambda_1\) 和 \(\lambda_2\) 倍,面積當然是 \(\lambda_1\lambda_2\) 倍。trace 的幾何意義比較不明顯,要到第 6 節才會看到:它是連續流動時面積的變化率。先記住這個對照:
| 行列式 | trace | |
|---|---|---|
| 由特徵值決定 | 積 | 和 |
| 什麼時候用 | 做一次完整的變換,面積變成幾倍 | 做一個極短的流動,面積以多快的速率變化 |
| 在 CS236 | normalizing flow 每一層的 \(\log|\det J|\) | 連續時間 flow(CNF、PF-ODE)的 \(\nabla\cdot\mathbf v\) |
特徵值是複數時
如果公式解的根號裡是負數,特徵值就是複數。例如 90° 旋轉 \(\begin{bmatrix}0&-1\\1&0\end{bmatrix}\):\(\lambda^2 + 1 = 0\),\(\lambda = \pm i\)。這符合直覺:旋轉會讓每個方向都轉彎,所以平面上根本沒有「不轉彎的方向」。複數特徵值代表矩陣帶有旋轉。
反覆乘同一個矩陣
因為特徵方向上的作用只是乘法,所以把起點拆成特徵方向的組合,就能直接算出 \(A^k\mathbf x\)。
同樣的 \(A\),起點 \((1, 0) = \tfrac12(1,1) + \tfrac12(1,-1)\)。每乘一次 \(A\),第一部分乘 3,第二部分乘 1:
$$A^k(1, 0) = \tfrac12\cdot3^k(1, 1) + \tfrac12(1, -1)$$\(k = 3\):\(13.5(1,1) + 0.5(1,-1) = (14, 13)\)。\(3^k\) 增長得比另一項快得多,所以方向越來越接近 \((1,1)\)。
結論:反覆乘同一個矩陣,方向會靠向絕對值最大的特徵值的特徵向量。補充課 D 用這件事解釋 Markov 鏈為什麼會收斂到穩態。
Demo A3 · 拖動矩陣的四個數字
- \(a = d = 0,\ b = -1,\ c = 1\):特徵值變成複數,綠線消失,正方形只是轉了 90°。
- 調到 \(ad = bc\)(例如 \(a = 1, b = 1, c = 1, d = 1\)):行列式是 0,平行四邊形壓成一條線。
- 看紫色箭頭:它是 \(\mathbf x, A\mathbf x, A^2\mathbf x, \dots\) 的方向,顏色越深越後面,會逐漸轉向某一條綠線。
小練習:\(A = \begin{bmatrix}3&1\\0&2\end{bmatrix}\) 的特徵值和特徵向量是什麼?用 trace 和行列式驗算。
05Jacobian:非線性函數在一點附近就是一個矩陣
為什麼需要它
神經網路和速度場都不是線性的,直線會被彎掉。但第 1 節說過,函數在一點附近可以看成直線。多變數也一樣:把一個彎曲的變換放大到足夠小的區域,它看起來就是線性變換,也就是一個矩陣。這個矩陣就是 Jacobian。
定義
函數 \(\mathbf v(x, y) = (v_1(x,y),\ v_2(x,y))\) 有兩個輸出。對每個輸出用第 2 節的一階 Taylor 展開:
$$\begin{aligned}v_1(\mathbf x + \mathbf h)&\approx v_1(\mathbf x) + \frac{\partial v_1}{\partial x}h_1 + \frac{\partial v_1}{\partial y}h_2\\v_2(\mathbf x + \mathbf h)&\approx v_2(\mathbf x) + \frac{\partial v_2}{\partial x}h_1 + \frac{\partial v_2}{\partial y}h_2\end{aligned}$$這正好是「矩陣乘向量」的形式,把係數排起來:
記法:第 \(i\) 列是第 \(i\) 個輸出,第 \(j\) 行是對第 \(j\) 個輸入微分。一維時 \(J\) 就是導數 \(f'\),所以 Jacobian 是導數的多變數版本。如果 \(\mathbf v = A\mathbf x\) 本身是線性的,那麼 \(J\) 處處等於 \(A\)。
\(\mathbf v(x, y) = (x^2 - y,\ xy)\)。四個偏導是 \(2x,\ -1,\ y,\ x\),所以
$$J(x, y) = \begin{bmatrix}2x&-1\\y&x\end{bmatrix}$$$$J(1, 2) = \begin{bmatrix}2&-1\\2&1\end{bmatrix}$$驗算:\(\mathbf v(1, 2) = (-1, 2)\)。走一小步 \(\mathbf h = (0.01, 0.01)\),近似給 \(J\mathbf h = (0.01, 0.03)\)。真實的 \(\mathbf v(1.01, 2.01) = (-0.9899,\ 2.0301)\),差是 \((0.0101, 0.0301)\),很接近。
注意 \(J\) 會隨位置改變:非線性函數在不同地方,對應不同的矩陣。
Jacobian 行列式的意義
結合第 4 節:\(J\) 是這一點附近的線性變換,而線性變換會把面積乘上 \(|\det J|\)。所以
\(|\det J(\mathbf x)|\) = 變換把 \(\mathbf x\) 附近一小塊面積(體積)變成幾倍。
這就是 normalizing flow 的核心。機率質量不會憑空增減,所以一小塊區域的面積變成 3 倍時,那裡的機率密度必須變成 \(1/3\):
$$p_Y(T(\mathbf x)) = \frac{p_X(\mathbf x)}{|\det J_T(\mathbf x)|}$$最簡單的例子:\(T(x) = 2x\) 把數線拉長 2 倍,所以密度變成一半。補充課 C 第 3 節會詳細推導這個公式。
小練習:\(T(x, y) = (2x,\ y + x^2)\)。寫出 Jacobian,它把每一小塊面積變成幾倍?
06散度:一個流動把一小塊區域撐大還是擠小
| 向量場的散度 \(\nabla\cdot\mathbf v\) | KL 散度 \(D_{\mathrm{KL}}(p\Vert q)\) | |
|---|---|---|
| 輸入 | 一個速度場 | 兩個機率分佈 |
| 輸出 | 每個位置一個數字(可正可負) | 整體一個數字(\(\ge0\)) |
| 意義 | 那裡的流動是往外撐開還是往內擠 | 兩個分佈差多遠 |
為什麼需要它
把機率想成一群粒子。如果粒子跟著速度場 \(\mathbf v(\mathbf x)\) 流動,某個地方的粒子被撐開,密度就下降;被擠在一起,密度就上升。所以要知道密度怎麼變,就要知道流動在每個位置「撐開多快」。這個數字就是散度。連續方程、probability flow ODE 算 likelihood、Fokker–Planck 都建立在它上面。
定義與直覺
$$\nabla\cdot\mathbf v = \frac{\partial v_1}{\partial x} + \frac{\partial v_2}{\partial y}$$記號 \(\nabla\cdot\mathbf v\) 可以想成「\(\nabla = (\partial_x, \partial_y)\) 和 \(\mathbf v\) 做內積」。它有三個等價的讀法,本節會一一推導:
- 淨流出量:單位面積、單位時間,從一小塊區域流出去的量。
- 面積的相對變化率:跟著流動的一小塊區域,面積每單位時間增加的比例。
- Jacobian 的 trace:\(\nabla\cdot\mathbf v = \operatorname{tr}J\),因為 \(J\) 的對角線正是 \(\partial v_1/\partial x\) 和 \(\partial v_2/\partial y\)。
推導一:盤點一個小方塊的進出量
取一個邊長 \(\varepsilon\) 的小方塊,左下角在 \((x, y)\)。流體穿過一條邊的流量是「垂直那條邊的速度 × 邊長」,因為每單位時間會有一條寬度等於「速度」的帶子穿過去。
- 水平方向的淨流出 = 右邊流出 − 左邊流入 = \(\big[v_1(x+\varepsilon, y) - v_1(x, y)\big]\,\varepsilon\)。
- 由一階 Taylor 展開,\(v_1(x+\varepsilon, y) - v_1(x, y)\approx\frac{\partial v_1}{\partial x}\varepsilon\),所以這一項約是 \(\frac{\partial v_1}{\partial x}\varepsilon^2\)。
- 垂直方向同樣得到 \(\frac{\partial v_2}{\partial y}\varepsilon^2\)。
- 總淨流出 = \(\big(\frac{\partial v_1}{\partial x} + \frac{\partial v_2}{\partial y}\big)\varepsilon^2\)。除以面積 \(\varepsilon^2\),就是散度。
這也解釋了為什麼只有對角線的偏導會出現:\(v_1\) 是水平速度,只有它沿著水平方向的變化才會造成左右兩邊流量不同。\(\partial v_1/\partial y\) 只代表上下層的水平速度不同(像推一疊紙),不會讓流進和流出的量不一樣。
\(\mathbf v = (x, y)\),方塊以原點為中心、半邊長 \(\varepsilon\),四條邊長都是 \(2\varepsilon\)。右邊的向外速度是 \(\varepsilon\),流出量 \(\varepsilon\cdot2\varepsilon = 2\varepsilon^2\)。根據對稱性,四條邊都一樣,總流出 \(8\varepsilon^2\)。除以面積 \(4\varepsilon^2\) 得到 \(2\),和公式 \(1 + 1\) 相同。
推導二:為什麼是 trace(和行列式的關係)
換個看法:跟著流動走,看小方塊的面積怎麼變。這個推導會告訴我們,為什麼一次變換用行列式,連續流動卻變成 trace。
把 Jacobian 記成 \(J = \begin{bmatrix}a&b\\c&d\end{bmatrix}\)。方塊的角落各自以當地的速度移動,走了極短的時間 \(dt\) 之後,兩條邊的向量變成:
$$\varepsilon\begin{bmatrix}1\\0\end{bmatrix}\to\varepsilon\begin{bmatrix}1 + a\,dt\\c\,dt\end{bmatrix}$$$$\varepsilon\begin{bmatrix}0\\1\end{bmatrix}\to\varepsilon\begin{bmatrix}b\,dt\\1 + d\,dt\end{bmatrix}$$這一步的變換矩陣是 \(I + dt\,J\),新面積由它的行列式決定:
$$\begin{aligned}\frac{\text{新面積}}{\varepsilon^2} &= \det(I + dt\,J)\\&= (1 + a\,dt)(1 + d\,dt) - (b\,dt)(c\,dt)\end{aligned}$$乘開:
$$\begin{aligned}&\det(I + dt\,J)\\={}&1 + (a + d)\,dt + (ad - bc)\,dt^2\end{aligned}$$\(dt\) 極小,\(dt^2\) 可以忽略,於是:
這就是整件事的關鍵:非對角元素 \(b, c\) 只出現在 \(dt^2\) 那一項。所以時間很短時,面積的變化只由對角線決定。行列式的公式裡有乘積,但一個極短的流動接近單位矩陣,乘積項都是高階小量,只剩下加法。「乘法變加法」就是 trace 出現的原因。
也可以用特徵值來看:\(I + dt\,J\) 的特徵值是 \(1 + dt\,\lambda_i\),行列式是它們的積,乘開後是 \(1 + dt(\lambda_1 + \lambda_2) + \cdots\),一階項正是特徵值的和。這個寫法在任意維度都成立。
\(J = \begin{bmatrix}0.5&0.3\\-0.2&0.5\end{bmatrix}\),\(dt = 0.01\)。精確值是 \(1.005^2 - (0.003)(-0.002) = 1.010031\)。只用 trace:\(1 + 0.01\times1 = 1.01\)。差別只有 \(0.00003\),是 \(dt^2\) 量級。
從「一小步」到「一段時間」
現在看一段有限的時間。設面積是 \(S(t)\),如果散度 \(c = \nabla\cdot\mathbf v\) 是常數,一小步是 \(S(t + dt) = S(t)(1 + c\,dt)\)。移項、除以 \(dt\):
$$\frac{dS}{dt} = c\,S\quad\Rightarrow\quad S(t) = S(0)\,e^{ct}$$可以直接驗算:\(\frac{d}{dt}S(0)e^{ct} = c\,S(0)e^{ct}\),確實滿足。這種方程式怎麼解,補充課 B 會從頭講。線性流動 \(\mathbf v = A\mathbf x\) 的 Jacobian 處處是 \(A\),所以面積照 \(e^{t\operatorname{tr}A}\) 精確地變化。
一般的速度場,散度隨位置改變,例如 \(\mathbf v = (x^2,\ y)\) 的散度是 \(2x + 1\)。這時跟著粒子走,面積的 log 的變化率等於粒子當下所在位置的散度:
$$\frac{d}{dt}\log S(t) = \nabla\cdot\mathbf v(\mathbf x_t)$$因為機率質量不變,面積變大多少,密度就變小多少,所以 \(\frac{d}{dt}\log p = -\nabla\cdot\mathbf v\)。補充課 C 會完整推導這個公式,它就是 diffusion model 能算 likelihood 的原因。
Demo A4 · 跟著流動的一小塊正方形
| 流動 | \(\operatorname{tr}A\) | 形狀 | 面積 |
|---|---|---|---|
| 往外擴張 | 1 | 放大 | 照 \(e^{t}\) 變大 |
| 純旋轉 | 0 | 轉動 | 不變 |
| 剪切 | 0 | 被推斜 | 不變(底和高都沒變) |
| 一軸拉、一軸壓 | 0 | 變細長 | 不變(拉長多少就壓扁多少) |
| 往內螺旋 | \(-0.6\) | 邊轉邊縮 | 照 \(e^{-0.6t}\) 變小 |
散度為 0 不代表沒有流動,只代表面積不變,形狀可以被扭得很厲害。
小練習:\(\mathbf v = (xy,\ -y^2/2)\) 的散度是多少?這個流動會改變面積嗎?
07Hessian,以及四個量的總表
為什麼需要它
Jacobian 描述一個向量場的一階變化。對一個純量函數(一個高度)\(f\),一階變化是梯度,二階變化就是 Hessian,它描述地形怎麼彎曲。第 12 講的 score matching 目標裡就有 Hessian 的 trace。
定義
$$H = \nabla^2f = \begin{bmatrix}\partial^2f/\partial x^2&\partial^2f/\partial x\partial y\\\partial^2f/\partial y\partial x&\partial^2f/\partial y^2\end{bmatrix}$$平滑的函數微分順序可以交換,所以 \(H\) 是對稱矩陣,特徵值一定是實數。多變數的二階 Taylor 展開是一維版本的直接推廣:
$$f(\mathbf x + \mathbf h)\approx f(\mathbf x) + \nabla f\cdot\mathbf h + \tfrac12\,\mathbf h^\top H\,\mathbf h$$Hessian 和 Jacobian 的關係很簡單:Hessian 就是梯度的 Jacobian。把 \(\mathbf v = \nabla f\) 這個向量場拿去算 Jacobian,得到的就是 \(H\)。
幾何意義:曲率
\(H\) 的特徵向量是地形彎得最多和最少的兩個方向,特徵值是沿著那兩個方向的彎曲程度(二階導數):正的往上彎(像碗),負的往下彎(像倒過來的碗)。在梯度為 0 的點,特徵值的正負決定了這是什麼地形:
\(f = x^2 + xy + 2y^2\)。\(\nabla f = (2x + y,\ x + 4y)\),再微分一次得 \(H = \begin{bmatrix}2&1\\1&4\end{bmatrix}\)。\(\operatorname{tr}H = 6\),\(\det H = 7\),特徵方程 \(\lambda^2 - 6\lambda + 7 = 0\),\(\lambda = 3\pm\sqrt2\),都是正的,所以原點是谷底。
Hessian 的 trace:Laplacian,和四周平均的差
\(\operatorname{tr}H = \frac{\partial^2f}{\partial x^2} + \frac{\partial^2f}{\partial y^2}\) 有專門的名字:Laplacian,記作 \(\Delta f\)。它是「\(\nabla f\) 這個向量場的散度」。它的意義很直觀:中心比四周低多少。
推導:把四個點都展開到二階。一維的展開是 \(f(x\pm h) = f(x)\pm f'h + \tfrac12f''h^2\),把正負兩式相加,一階項抵銷:
$$\begin{aligned}&f(x+h, y) + f(x-h, y)\\={}&2f + \frac{\partial^2f}{\partial x^2}h^2\end{aligned}$$\(y\) 方向也一樣。四式相加再除以 4,減去中心值:
$$\underbrace{\tfrac14\big[f(x{+}h,y)+f(x{-}h,y)+f(x,y{+}h)+f(x,y{-}h)\big]}_{\text{四周平均}}$$$$\text{四周平均} - f(x,y)\approx\frac{h^2}{4}\Delta f$$- \(\Delta f > 0\):四周平均比中心高,中心是凹下去的。
- \(\Delta f \lt 0\):四周平均比中心低,中心是凸起來的。
- \(\Delta f = 0\):中心就是四周的平均,例如鞍點 \(x^2 - y^2\)。
這解釋了熱傳導和擴散的方程 \(\partial_tp = \tfrac{\sigma^2}{2}\Delta p\):溫度會往四周的平均移動,所以尖峰(\(\Delta p \lt 0\))會下降,低谷(\(\Delta p > 0\))會上升。補充課 C 和 F 會用到。
Demo A5 · Hessian 決定地形
- \(a, c\) 都是正的、\(b = 0\):谷底。把 \(a, c\) 調成不同的值,等高線變成橢圓,綠線是長短軸。
- 把 \(b\) 慢慢調大,看什麼時候 \(\det H\) 變成負的,谷底變成鞍點。
- 調到 \(a = -c\)、\(b = 0\):trace 是 0,讀數裡的「四周平均 − 中心」也是 0。
總表:四個量各是什麼意思
| 量 | 物件 | 意義 | 在 CS236 |
|---|---|---|---|
| \(\det J\) | 一個變換或向量場 | 做完變換後,局部面積(體積)變成幾倍;負號代表翻面 | normalizing flow 的 \(\log|\det J|\)(第 7–8 講) |
| \(\operatorname{tr}J\) | 一個速度場 | 散度:跟著流動時,面積的相對變化率 | CNF 與 probability flow ODE 的 likelihood(第 14、17 講) |
| \(\operatorname{tr}H\) | 一個純量函數 | Laplacian:中心和四周平均的差,地形平均的彎曲程度 | score matching 的 \(\operatorname{tr}(\nabla_{\mathbf x}^2\log p)\)(第 12 講);擴散方程 |
| \(\det H\) | 一個純量函數 | 主方向曲率的乘積;在二維、梯度為 0 的點可以分辨鞍點(負的就是鞍點) | 這門課幾乎不會直接用到 |
score 把這些量連在一起。score 是 \(\mathbf s = \nabla\log p\),所以它的 Jacobian 就是 \(\log p\) 的 Hessian,它的散度就是 \(\log p\) 的 Laplacian:
$$\begin{aligned}\frac{\partial\mathbf s}{\partial\mathbf x} &= \nabla^2\log p\\\nabla\cdot\mathbf s &= \operatorname{tr}(\nabla^2\log p) = \Delta\log p\end{aligned}$$例如 \(d\) 維高斯 \(\mathcal N(\boldsymbol\mu, \sigma^2I)\):\(\mathbf s = -(\mathbf x - \boldsymbol\mu)/\sigma^2\),它的 Jacobian 是 \(-I/\sigma^2\),散度是 \(-d/\sigma^2\),處處是負的:往峰頂的向量場到處都在往內收。
為什麼算 trace 比算行列式便宜
\(d\) 維矩陣的行列式一般要 \(O(d^3)\) 次運算,所以 normalizing flow 才要特別設計三角形的 Jacobian。trace 只需要對角線,但神經網路的 \(J\) 不是現成的,一次反向傳播只能得到 \(J\) 的一列,要 \(d\) 次才能得到整條對角線。
Hutchinson 估計更省:取隨機向量 \(\boldsymbol\epsilon\)(\(\mathbb E[\boldsymbol\epsilon\boldsymbol\epsilon^\top] = I\)),則 \(\mathbb E[\boldsymbol\epsilon^\top J\boldsymbol\epsilon] = \operatorname{tr}J\)。推導:\(\boldsymbol\epsilon^\top J\boldsymbol\epsilon = \sum_{ij}\epsilon_iJ_{ij}\epsilon_j\),取期望時只有 \(i = j\) 的項留下。一次反向傳播就能算出 \(\boldsymbol\epsilon^\top J\),再和 \(\boldsymbol\epsilon\) 內積即可。第 12 講的 sliced score matching 用的就是這個想法。
小練習:\(f = x^2 - 3xy + y^2\),原點是山頂、谷底還是鞍點?
08期望、變異數,以及為什麼是 √n
為什麼需要它
Diffusion model 每一步都在加雜訊。要知道加了很多步之後雜訊有多大,就要知道獨立雜訊相加的規則。答案是一個容易弄錯的事實:寬度不是相加,而是平方相加。
期望與變異數
期望 \(\mathbb E[X]\) 是平均值;變異數 \(\operatorname{Var}(X) = \mathbb E\big[(X - \mathbb E[X])^2\big]\) 是「離平均多遠」的平方的平均,它的平方根叫標準差,也就是分佈的典型寬度。為什麼要平方?不平方的話,正負會互相抵銷,平均永遠是 0。
\(\mathbb E[X] = (1+2+\cdots+6)/6 = 3.5\)。離平均的距離平方是 \(6.25, 2.25, 0.25, 0.25, 2.25, 6.25\),平均是 \(\operatorname{Var}(X) = 35/12\approx2.917\),標準差約 \(1.708\)。
三條規則(\(a\) 是常數):
$$\begin{aligned}\mathbb E[aX + Y] &= a\,\mathbb E[X] + \mathbb E[Y]\\\operatorname{Var}(aX) &= a^2\operatorname{Var}(X)\end{aligned}$$ $$\operatorname{Var}(X + Y) = \operatorname{Var}(X) + \operatorname{Var}(Y)$$最後一條只在 \(X, Y\) 獨立時成立。
第二條:\(X\) 放大 \(a\) 倍,距離也放大 \(a\) 倍,距離的平方就是 \(a^2\) 倍。第三條的推導:假設平均都是 0(平移不影響變異數),
$$\begin{aligned}\operatorname{Var}(X + Y) &= \mathbb E[(X+Y)^2]\\&= \mathbb E[X^2] + 2\,\mathbb E[XY] + \mathbb E[Y^2]\end{aligned}$$獨立時 \(\mathbb E[XY] = \mathbb E[X]\,\mathbb E[Y] = 0\),中間的交叉項消失,只剩 \(\mathbb E[X^2] + \mathbb E[Y^2]\)。直覺上,兩個獨立的雜訊有時同向、有時反向,會互相抵銷一部分,所以總寬度比「寬度直接相加」小。
變異數 \(2\times2.917 = 5.833\),標準差 \(\sqrt{5.833}\approx2.415\)。不是 \(2\times1.708 = 3.416\)。
隨機漫步與 √n
每步隨機 \(\pm1\)(平均 0、變異數 1),走 \(n\) 步。\(n\) 個獨立變數相加,變異數是 \(n\),標準差是 \(\sqrt n\)。走 100 步,典型只離原點 10 步遠。
反過來,如果想在固定的時間 1 內走 \(n\) 步,終點寬度維持是 1,每步大小 \(s\) 要滿足 \(ns^2 = 1\),也就是 \(s = 1/\sqrt n\)。一步的時間是 \(\Delta t = 1/n\),所以每步的雜訊大小是 \(\sqrt{\Delta t}\),而不是 \(\Delta t\)。這就是補充課 E 裡布朗運動的 \(\sqrt{\Delta t}\) 的由來。
同樣的規則也說明 Monte Carlo 估計的誤差:\(n\) 個獨立樣本的平均,變異數是 \(n\cdot\frac{1}{n^2}\sigma^2 = \sigma^2/n\),所以誤差是 \(\sigma/\sqrt n\)。想把誤差減半,要 4 倍的樣本。
Demo A6 · 隨機漫步的寬度是 √n
直方圖和平均 0、變異數 \(n\) 的常態分佈幾乎重合。每步明明只是 \(\pm1\),加起來卻變成鐘形,這就是中央極限定理。\(n\to\infty\) 的縮放極限就是布朗運動。
小練習:\(X\sim\mathcal N(0, 9)\)、\(Y\sim\mathcal N(0, 16)\),兩者獨立。\(X + Y\) 的標準差是多少?
09摺積(convolution):兩個隨機變數相加後的分佈
為什麼需要它
上一節只算出相加後的變異數。但 diffusion 要知道的是整個分佈:資料加上高斯雜訊之後,密度長什麼樣子?答案是資料密度和雜訊密度的摺積。
從骰子開始
兩顆骰子的總和 \(S = a + b\)。總和是 7 的機率是多少?把所有組合列出來:
把這個計算寫成公式:要讓總和等於 \(s\),第一顆選定 \(a\) 之後,第二顆就只能是 \(s - a\)。把所有可能的 \(a\) 加起來:
$$P(S = s) = \sum_a p(a)\,q(s - a)$$這就是摺積,記作 \((p * q)(s)\)。\(q(s-a)\) 的「\(s-a\)」不是什麼神祕的技巧,只是說「兩個數的和要等於 \(s\)」。\(p(a)\,q(s-a)\) 相乘是因為兩者獨立。
第一顆骰子改成只有 \(0, 1\),機率各 \(0.5\);第二顆有 \(0, 1, 2\),機率 \(0.2, 0.3, 0.5\)。
- \(P(S = 0) = p(0)q(0) = 0.1\)
- \(P(S = 1) = p(0)q(1) + p(1)q(0)\)\(\ = 0.15 + 0.1 = 0.25\)
- \(P(S = 2) = p(0)q(2) + p(1)q(1)\)\(\ = 0.25 + 0.15 = 0.4\)
- \(P(S = 3) = p(1)q(2) = 0.25\)
加起來是 \(1\),正確。
連續版本:滑動與重疊
隨機變數是連續的時候,加總換成積分,機率換成密度:
\(X\sim p,\ Y\sim q\) 獨立時,這就是 \(X + Y\) 的密度。
把 \(a\) 當成橫軸來看,\(q(s - a)\) 是把 \(q\) 左右翻轉,再平移到 \(s\)。所以算摺積的畫面是:把翻轉後的 \(q\) 滑過 \(p\),每個位置 \(s\) 算兩者乘積下的面積。
檢查一下三角形:\(s = 0\) 時完全重疊,寬度 2,高度 \(2\times\tfrac14 = \tfrac12\);\(s = 2\) 時剛好不重疊,高度 0。三角形面積 \(\tfrac12\times4\times\tfrac12 = 1\),確實是機率密度。
Demo A7 · 看摺積怎麼算出來
- 「方塊+指數」:\(q\) 不對稱,可以清楚看到它被左右翻轉了。
- 「雙峰+高斯」:這就是資料加雜訊。兩個尖峰被抹成平滑的一團,雜訊越大(調 \(\sigma\)),兩峰越糊。
幾個重要的事實
- 寬度變大:平均相加、變異數相加(第 8 節)。摺積會把分佈抹開。
- 高斯配高斯還是高斯:平均和變異數都相加,形狀仍是高斯。下一節會用配方證明。這是 DDPM 能一步跳到任意時刻的原因。
- 資料加雜訊就是摺積:\(x_t = x_0 + \sigma\epsilon\) 的密度是 \(p_t = p_0 * \mathcal N(0, \sigma^2)\)。所以 \(p_t\) 永遠是平滑的,就算 \(p_0\) 是尖銳的。Diffusion 的前向過程就是不斷地把資料分佈和高斯做摺積。
小練習:資料只有兩個點 \(x_0 = \pm2\),機率各半,加上雜訊 \(\mathcal N(0, 1)\)。寫出 \(p_1(x)\)。
10高斯的四種運算,以及配方
為什麼需要它
CS236 後半幾乎所有的閉式公式,都來自高斯分佈的幾個性質。而這些性質都來自同一個代數技巧:配方。
高斯密度的每一部分
$$\mathcal N(x;\mu,\sigma^2) = \underbrace{\frac{1}{\sigma\sqrt{2\pi}}}_{\text{面積調成 1}}\exp\Big(\underbrace{-\frac{(x-\mu)^2}{2\sigma^2}}_{\text{決定形狀}}\Big)$$形狀全部在 exponent 裡:它是 \(x\) 的開口向下的二次式,最高點在 \(x = \mu\),越窄(\(\sigma\) 越小)彎得越厲害。前面的常數只是為了讓面積等於 1。所以:只要 exponent 是開口向下的二次式,這個函數就是高斯,平均和變異數可以從係數讀出來。
四種運算的總覽
| 運算 | 結果 | 在哪裡用到 |
|---|---|---|
| 線性變換 \(aX + b\) | \(\mathcal N(a\mu + b,\ a^2\sigma^2)\) | reparameterization \(z = \mu + \sigma\epsilon\)(第 6 講) |
| 獨立相加 \(X + Y\) | \(\mathcal N(\mu_1 + \mu_2,\ \sigma_1^2 + \sigma_2^2)\) | DDPM 的 \(q(\mathbf x_t\mid\mathbf x_0)\) 閉式(第 16 講) |
| 密度相乘 \(p_1(x)\,p_2(x)\) | 正比於 \(\mathcal N(\mu,\sigma^2)\),\(\frac1{\sigma^2} = \frac1{\sigma_1^2} + \frac1{\sigma_2^2}\),\(\mu = \sigma^2\big(\frac{\mu_1}{\sigma_1^2} + \frac{\mu_2}{\sigma_2^2}\big)\) | prior × likelihood = 後驗;DDPM 的 \(q(\mathbf x_{t-1}\mid\mathbf x_t,\mathbf x_0)\) |
| 取條件(二維高斯) | \(X_2\mid X_1 = x\ \sim\ \mathcal N(\rho x,\ 1 - \rho^2)\) | Tweedie、去雜訊、VAE 的後驗(第 11 節) |
「相加」和「相乘」最容易搞混。相加是兩個隨機變數加起來,對應密度的摺積,結果變寬。相乘是兩個密度函數乘起來,對應「兩個資訊來源合併」,結果變窄。
配方:同一個二次式的兩種寫法
配方不是在改變函數,只是把同一個二次式換一種寫法。國中學過的例子:
$$\begin{aligned}(x - 3)^2 - 4 &= x^2 - 6x + 9 - 4\\&= x^2 - 6x + 5\end{aligned}$$從左到右是展開,從右到左就是配方。兩種寫法各有用處:
- \(x^2 - 6x + 5\):好處是容易相加。兩個二次式相加,只要對應的係數相加。
- \((x-3)^2 - 4\):好處是一眼看出最低點在 \(x = 3\)。
高斯相乘時,我們需要這兩種寫法都用:先展開成 \(x^2, x, 1\) 三項(才能相加),再配回 \((x-\mu)^2\) 的形式(才能看出新的平均和變異數)。
配方的規則:\(x^2 - 2\mu x\) 要配成 \((x-\mu)^2\),就取 \(x\) 係數的一半當 \(\mu\),補上 \(\mu^2\) 再減掉。一般公式:
驗算(把右邊的平方展開):\(-\frac A2\big(x^2 - \frac{2B}{A}x + \frac{B^2}{A^2}\big) = -\frac A2x^2 + Bx - \frac{B^2}{2A}\),最後一項正好和 \(+\frac{B^2}{2A}\) 抵銷,剩下的就是左邊。
再和高斯的 exponent \(-\frac{(x-\mu)^2}{2\sigma^2}\) 對照,就能讀出答案:
exponent 是 \(-\tfrac12Ax^2 + Bx + C\),就表示分佈是高斯,而且 \(\sigma^2 = \dfrac1A\),\(\mu = \dfrac BA\)。
多出來的常數 \(\frac{B^2}{2A} + C\) 呢?\(e^{\text{二次式}+\text{常數}} = e^{\text{常數}}\cdot e^{\text{二次式}}\),所以它只影響整體的高度,不影響形狀。機率密度的面積必須是 1,歸一化時這個高度會被調整,所以可以不管它。「正比於」(\(\propto\))就是在說這件事。
完整的數字例子:兩個高斯相乘
\(\mathcal N(0, 1)\) 和 \(\mathcal N(2, 1)\) 相乘。指數相乘時 exponent 相加,常數先不管:
- 相加:\(-\frac{x^2}{2} - \frac{(x-2)^2}{2}\)
- 展開:\(-\frac{x^2}{2} - \frac{x^2 - 4x + 4}{2} = -x^2 + 2x - 2\)
- 對照 \(-\tfrac12Ax^2 + Bx + C\):\(A = 2,\ B = 2,\ C = -2\)
- 讀答案:\(\sigma^2 = \frac12\),\(\mu = \frac22 = 1\)
- 驗算:\(-(x-1)^2 - 1 = -x^2 + 2x - 2\) ✓
結果是 \(\mathcal N(1, \tfrac12)\):平均落在 0 和 2 的正中間,變異數比兩者都小。
一般的推導
現在把數字換成符號,步驟完全相同。
- 相加:\(-\dfrac{(x-\mu_1)^2}{2\sigma_1^2} - \dfrac{(x-\mu_2)^2}{2\sigma_2^2}\)
- 展開第一項:$$\begin{aligned}&-\frac{x^2 - 2\mu_1x + \mu_1^2}{2\sigma_1^2}\\={}&-\frac12\cdot\frac{1}{\sigma_1^2}x^2 + \frac{\mu_1}{\sigma_1^2}x - \frac{\mu_1^2}{2\sigma_1^2}\end{aligned}$$第二項同理。
- 合併同類項: $$\begin{aligned}&-\frac12\Big(\frac1{\sigma_1^2} + \frac1{\sigma_2^2}\Big)x^2\\&+ \Big(\frac{\mu_1}{\sigma_1^2} + \frac{\mu_2}{\sigma_2^2}\Big)x + \text{常數}\end{aligned}$$
- 對照:\(A = \frac1{\sigma_1^2} + \frac1{\sigma_2^2}\),\(B = \frac{\mu_1}{\sigma_1^2} + \frac{\mu_2}{\sigma_2^2}\)。
- 讀答案:\(\dfrac{1}{\sigma^2} = \dfrac1{\sigma_1^2} + \dfrac1{\sigma_2^2}\),\(\mu = \sigma^2\Big(\dfrac{\mu_1}{\sigma_1^2} + \dfrac{\mu_2}{\sigma_2^2}\Big)\)。
\(1/\sigma^2\) 叫精確度(precision),代表「這個資訊來源有多確定」。把精確度寫成 \(\tau_i = 1/\sigma_i^2\),結果就很好記:
$$\tau = \tau_1 + \tau_2,\qquad\mu = \frac{\tau_1\mu_1 + \tau_2\mu_2}{\tau_1 + \tau_2}$$合併兩個資訊來源時,精確度相加,所以結果比任何一個都窄;新的平均是兩個平均的加權平均,越確定的權重越大。例如 \(\mathcal N(0, 1)\) 和 \(\mathcal N(2, \tfrac14)\):\(\tau_1 = 1,\ \tau_2 = 4\),所以 \(\tau = 5\)、\(\sigma^2 = 0.2\)、\(\mu = (0 + 4\times2)/5 = 1.6\),靠近比較確定的那一個。
另一個看法:兩條拋物線相加
不展開也能理解這個結果。\(\log\mathcal N\) 就是一條向下的拋物線,二階導數是 \(-1/\sigma^2\),一階導數(score)在 \(\mu\) 等於 0。密度相乘等於 log 相加,所以:
- 二階導數相加:\(-1/\sigma^2 = -1/\sigma_1^2 - 1/\sigma_2^2\),這就是「精確度相加」。
- 新的峰是 score 之和為 0 的位置:\(-\tau_1(x - \mu_1) - \tau_2(x - \mu_2) = 0\),解出來就是加權平均。
Demo A8 · 相加 vs. 相乘
用同一個公式證明「高斯配高斯還是高斯」
第 9 節說過,\(\mathcal N(0, s^2)\) 和 \(\mathcal N(0, t^2)\) 的摺積在 \(z\) 的值,是對 \(a\) 積分 \(\mathcal N(a; 0, s^2)\,\mathcal N(z-a; 0, t^2)\)。把被積函數的 exponent 當成 \(a\) 的二次式:
$$\begin{aligned}&-\frac{a^2}{2s^2} - \frac{(z-a)^2}{2t^2}\\={}&-\frac12\underbrace{\Big(\frac1{s^2} + \frac1{t^2}\Big)}_{A}a^2 + \underbrace{\frac{z}{t^2}}_{B}a\ \underbrace{-\frac{z^2}{2t^2}}_{C}\end{aligned}$$用配方公式。\(a\) 的二次式部分對 \(a\) 積分後是一個和 \(z\) 無關的常數,留下的是 \(\exp\big(\frac{B^2}{2A} + C\big)\),算出來:
$$\begin{aligned}\frac{B^2}{2A} + C &= \frac{z^2}{2t^2}\cdot\frac{s^2}{s^2+t^2} - \frac{z^2}{2t^2}\\&= -\frac{z^2}{2(s^2+t^2)}\end{aligned}$$這正是 \(\mathcal N(0, s^2 + t^2)\) 的 exponent。這裡用到 \(\frac1A = \frac{s^2t^2}{s^2+t^2}\)。平均不是 0 的情況,只要先平移即可。
小練習:\(p(x)\propto\exp(-2x^2 + 6x)\) 是哪一個高斯?
11取條件與去雜訊:為什麼最佳猜測會往平均收縮
為什麼需要它
Diffusion model 的核心任務是:看到一張帶雜訊的圖,猜原圖是什麼。這一節用最簡單的高斯例子,把這件事完全算出來。結論是:最佳猜測不是你看到的值,而是往平均收縮一些。這和統計學的「回歸平均」是同一件事。
相關的兩個變數
兩個標準常態變數 \(X_1, X_2\) 的相關係數是 \(\rho\),可以直接這樣造出來:
$$X_2 = \rho\,X_1 + \sqrt{1-\rho^2}\,\epsilon$$其中 \(X_1, \epsilon\sim\mathcal N(0, 1)\) 互相獨立。
驗算:\(\operatorname{Var}(X_2) = \rho^2 + (1-\rho^2) = 1\),確實是標準常態。\(\mathbb E[X_1X_2] = \rho\,\mathbb E[X_1^2] + 0 = \rho\),確實是相關係數。
這個寫法讓答案一目了然。如果已經知道 \(X_1 = x\),那麼 \(\rho x\) 是定值,只有 \(\epsilon\) 還是隨機的,所以由第 8 節的規則:
- 條件平均 \(\rho x\) 比 \(x\) 更靠近 0(\(|\rho| \lt 1\)、\(x\neq0\) 時)。父母特別高,小孩通常也高,但沒有父母那麼高,這就是「回歸平均」。
- 條件變異數 \(1 - \rho^2\) 比 1 小,而且和 \(x\) 無關:知道 \(X_1\) 之後,不確定性變小了。
- 例如 \(\rho = 0.8,\ x = 1.2\):條件平均 \(0.96\),條件標準差 \(\sqrt{0.36} = 0.6\)。
Demo A9 · 二維高斯切一刀
去雜訊:訊號加雜訊
現在換成 diffusion 的情境。真實訊號 \(x\sim\mathcal N(0, s^2)\),我們看到的是 \(y = x + n\),其中雜訊 \(n\sim\mathcal N(0, \tau^2)\) 和 \(x\) 獨立。看到 \(y\) 之後,\(x\) 最可能是多少?
用貝氏定理(\(p(x\mid y)\propto p(x)\,p(y\mid x)\)):\(p(x)\) 是 \(\mathcal N(0, s^2)\);給定 \(x\),\(y\) 是 \(\mathcal N(x, \tau^2)\),把它看成 \(x\) 的函數,就是以 \(y\) 為中心的高斯。這正好是第 10 節的相乘:
- 資訊來源一(先驗):中心 \(0\),精確度 \(1/s^2\)。
- 資訊來源二(觀測):中心 \(y\),精確度 \(1/\tau^2\)。
精確度加權平均,分子分母同乘 \(s^2\tau^2\) 化簡:
係數 \(k = \frac{s^2}{s^2+\tau^2}\) 永遠小於 1,所以猜測一定比 \(y\) 更靠近先驗平均。為什麼?因為一個很大的 \(y\),有一部分很可能是雜訊貢獻的,不能全部算在訊號上。
| 雜訊 \(\tau\)(\(s = 1\)) | 收縮係數 \(k\) | 看到 \(y = 2\),猜 | 意思 |
|---|---|---|---|
| 0.1 | 0.990 | 1.98 | 雜訊很小,幾乎相信觀測 |
| 1 | 0.500 | 1.00 | 各佔一半 |
| 3 | 0.100 | 0.20 | 雜訊很大,幾乎只能猜平均 |
如果先驗平均不是 0 而是 \(m\),公式變成 \(\mathbb E[x\mid y] = m + k(y - m)\)。\(k\to0\) 時答案就是 \(m\)。這正是第 16 講課堂問答說的「雜訊很大時,最好的去雜訊就是平均影像」。
這兩件事為什麼是同一件事
「回歸平均」和「去雜訊」看起來不同,其實只差標準化。把 \(x\) 和 \(y\) 都除以自己的標準差:
$$X_2 = \frac{x}{s},\qquad X_1 = \frac{y}{\sqrt{s^2+\tau^2}}$$兩者都變成標準常態。因為 \(\mathbb E[xy] = \mathbb E[x^2] + \mathbb E[xn] = s^2\),它們的相關係數是
$$\rho = \mathbb E[X_1X_2] = \frac{s^2}{s\sqrt{s^2+\tau^2}} = \frac{s}{\sqrt{s^2+\tau^2}}$$套用取條件的公式再換回原單位:
$$\begin{aligned}\mathbb E[x\mid y] &= s\cdot\rho X_1\\&= s\cdot\frac{s}{\sqrt{s^2+\tau^2}}\cdot\frac{y}{\sqrt{s^2+\tau^2}}\\&= \frac{s^2}{s^2+\tau^2}\,y\end{aligned}$$和用精確度算的結果一模一樣。所以去雜訊就是在一個相關的高斯裡取條件,而收縮就是回歸平均。雜訊越大,\(y\) 和 \(x\) 的相關係數 \(\rho\) 越小,回歸得越厲害。
\(s = \tau = 1,\ y = 2\)。第一種算法:\(k = \tfrac12\),猜 \(1\)。第二種算法:\(\rho = 1/\sqrt2\approx0.707\),\(X_1 = 2/\sqrt2\approx1.414\),\(\rho X_1 = 1\),乘上 \(s = 1\),也是 \(1\)。
Demo A10 · 看到帶雜訊的 y,x 該猜多少
不是高斯時:Tweedie 公式
上面的 \(s^2/(s^2+\tau^2)\) 只有在訊號是高斯時才成立,真實資料不是高斯。但有一個對任何資料分佈都成立的公式,叫 Tweedie 公式,它把去雜訊和 score 連起來:
白話:從 \(y\) 出發,沿著帶雜訊分佈的 score(往高機率區)走一步。先檢查高斯的情況:\(y\sim\mathcal N(0, s^2+\tau^2)\),由第 2 節,score 是 \(-y/(s^2+\tau^2)\),代入得
$$y - \frac{\tau^2y}{s^2+\tau^2} = \frac{s^2}{s^2+\tau^2}\,y$$和上面完全一致。原來收縮的方向,就是 score 的方向。
Tweedie 公式的推導(對任何先驗 \(p(x)\) 都成立)
- \(y\) 的密度是把所有 \(x\) 的可能性加起來:\(p(y) = \int p(x)\,\mathcal N(y; x, \tau^2)\,dx\)。
- 對 \(y\) 微分。高斯的導數是 \(\partial_y\mathcal N(y; x, \tau^2) = \mathcal N(y; x, \tau^2)\cdot\frac{x - y}{\tau^2}\)(第 2 節的 score),所以 $$p'(y) = \int p(x)\,\mathcal N(y; x, \tau^2)\,\frac{x-y}{\tau^2}\,dx$$
- 由貝氏定理,\(p(x)\,\mathcal N(y; x, \tau^2) = p(y)\,p(x\mid y)\)。代入: $$\begin{aligned}p'(y) &= p(y)\int p(x\mid y)\,\frac{x-y}{\tau^2}\,dx\\&= p(y)\,\frac{\mathbb E[x\mid y] - y}{\tau^2}\end{aligned}$$
- 兩邊除以 \(p(y)\),左邊是 \(p'/p = \nabla_y\log p(y)\)。移項即得 Tweedie 公式。
小練習:\(s = 2,\ \tau = 1\),看到 \(y = 5\)。最佳猜測是多少?後驗的變異數呢?
12在 CS236 哪裡用到(速查表)
| 工具 | 出現的地方 | 後續補充課 |
|---|---|---|
| Taylor 展開、\(O(h^k)\) | Euler 法、Itô 公式、Tweedie、DDPM ≈ 反向 SDE | B、E、F |
| 梯度、score | 第 12–16 講的 score matching、Langevin、diffusion | D、F |
| 矩陣、行列式、特徵值 | 第 7–8 講的變數變換、Markov 鏈收斂、線性 ODE、\(e^{tQ}\) | B、D、G |
| Jacobian | normalizing flow 的 \(\log|\det J|\) | C |
| 散度、trace | CNF 與 PF-ODE 的 likelihood、Hutchinson | C、F |
| Hessian、Laplacian | score matching 的 \(\operatorname{tr}(\nabla^2\log p)\)、擴散方程 | C、F |
| 變異數相加、√n | Monte Carlo 誤差、布朗運動、DDPM 每步的 \(\sqrt{\beta_t}\) | E |
| 摺積 | 資料加雜訊後的密度 \(q_\sigma\)(第 13 講)、DDPM 的 \(q(\mathbf x_t)\) | C、E |
| 高斯運算、配方 | reparameterization、\(q(\mathbf x_t\mid\mathbf x_0)\)、\(q(\mathbf x_{t-1}\mid\mathbf x_t,\mathbf x_0)\) | E、F |
| 取條件、去雜訊、Tweedie | 第 13 講的 Tweedie、第 16 講的 \(\boldsymbol\epsilon\) 預測 | F |
常見誤解
自我測驗
1. 把 \(e^x\) 在 \(x_0 = 0\) 展開到二階。用它估計 \(e^{0.2}\),誤差大約多少?
2. 一維高斯 \(\mathcal N(\mu,\sigma^2)\) 的 score 是什麼?它指向哪裡?
3. 線性流動 \(\mathbf v = A\mathbf x\),\(A = \begin{bmatrix}-1&2\\0&-1\end{bmatrix}\)。一小塊面積經過時間 1 之後變成原來的幾倍?
4. \(A = \begin{bmatrix}2&0\\0&0.5\end{bmatrix}\) 的行列式、trace、特徵值各是多少?反覆乘 \(A\),一般的向量會轉向哪個方向?
5. 這個 \(A\) 的行列式是 1,但流動 \(\mathbf v = A\mathbf x\) 的面積會變。為什麼兩者不矛盾?
6. 想在時間 1 內走 400 步隨機漫步,終點的標準差要是 1,每一步要多大?
7. 把兩個 \([0, 1]\) 上的均勻分佈相加,\(X + Y\) 落在哪個範圍?密度最高的地方在哪裡?
8. prior \(\mathcal N(0, 1)\),觀測到 \(y = 2\),觀測雜訊 \(\mathcal N(0, 1)\)。後驗是什麼?
延伸閱讀
- Lai et al. (2026) 附錄 B.1:從變數變換到連續方程,裡面用到 \(\det(I + \Delta t A) = 1 + \Delta t\operatorname{tr}A + O(\Delta t^2)\)(本頁第 6 節的根據);§3.3 的 Tweedie 公式(本頁第 11 節)。
- Holderrieth & Erives (2026) 附錄「A Reminder on Probability Theory」:隨機向量、條件密度與條件期望。
- 3Blue1Brown 的〈Essence of Linear Algebra〉系列:行列式、特徵向量的幾何直覺,和本頁第 3–4 節的看法相同。