🌏 English version
影片狀態:已附影片。 這篇依 Stanford Online 公開的 Spring 2026 第 12 堂錄影的英文字幕寫成,公式記號對照 2026 主講義第 14 章後段與第 15 章;沒看到板書畫面,板書上的式子是用講義還原的。
這堂課有兩個主題,中間沒有關聯,只是剛好排在同一天。前 34 分鐘把上一堂 沒講完的擴散模型損失函數收尾,結論是整個訓練目標可以寫成「讓網路猜出加進去的雜訊」。後 40 分鐘是接下來四、五堂大型語言模型課的開場:基礎模型(foundation model)的兩階段典範,以及手上有標註資料時怎麼把預訓練模型調到新任務上,包含 linear probe、finetune、LP-FT 和 LoRA。
YouTube 標題寫的是 Representation Learning。實際上表徵學習在這堂只出現一個定義(47:51 起),用來引出 linear probe;表徵怎麼訓練出來,講者兩次說留到下一堂 。所以標題比較像是這個單元的名字,不是這 76 分鐘的內容摘要。
先備:上一堂的前向過程與 ELBO、多變量高斯的條件分布、反向傳播。讀完之後,你應該能自己從後驗平均推到雜訊預測損失,手算一步訓練與一步取樣,並且說得出 LoRA 在運算、記憶體、多人共用三件事上各省了多少。課程全貌見 Stanford CS229 課程總覽 。
YouTube:Stanford CS229 Machine Learning | Spring 2026 | Lecture 12: Representation Learning
講者是 Tengyu Ma。開場兩分鐘(00:05–02:11)他先交代剩下的七、八堂怎麼排:一堂講 GPT 成為主流之前的做法,接著是自迴歸語言模型的訓練、語言模型的後訓練與強化學習,中間穿插強化學習基礎與機器人應用,另有一堂客座講機器學習系統。
前半堂:擴散模型的損失函數
上一堂停在哪裡(錄影 02:11–07:35)
先把記號擺好,全部沿用上一堂。前向過程 q q q 是固定的加噪鏈,x 0 x_0 x 0 是乾淨影像,x T x_T x T 接近標準高斯。令 α t = 1 − β t \alpha_t = 1-\beta_t α t = 1 − β t 、α ˉ t = ∏ s = 1 t α s \bar\alpha_t = \prod_{s=1}^{t}\alpha_s α ˉ t = ∏ s = 1 t α s ,上一堂得到一步到位的寫法:
x t = α ˉ t x 0 + 1 − α ˉ t ϵ ^ t , ϵ ^ t ∼ N ( 0 , I ) . x_t = \sqrt{\bar\alpha_t}\,x_0 + \sqrt{1-\bar\alpha_t}\,\hat\epsilon_t,\qquad \hat\epsilon_t\sim\mathcal N(0,I). x t = α ˉ t x 0 + 1 − α ˉ t ϵ ^ t , ϵ ^ t ∼ N ( 0 , I ) .
反向過程是要學的模型,每一步都是高斯,平均由神經網路輸出:
p θ ( x t − 1 ∣ x t ) = N ( μ θ ( x t , t ) , β ~ t I ) . p_\theta(x_{t-1}\mid x_t) = \mathcal N\big(\mu_\theta(x_t,t),\ \tilde\beta_t I\big). p θ ( x t − 1 ∣ x t ) = N ( μ θ ( x t , t ) , β ~ t I ) .
對 log p θ ( x 0 ) \log p_\theta(x_0) log p θ ( x 0 ) 取 ELBO 之後有三種項:
log p θ ( x 0 ) ≥ E q [ log p θ ( x 0 ∣ x 1 : T ) ] ⏟ 最後一步重建 − K L ( q ( x T ∣ x 0 ) ∥ p θ ( x T ) ) ⏟ L T ( 末端 ) − ∑ t = 2 T E q K L ( q ( x t − 1 ∣ x t , x 0 ) ∥ p θ ( x t − 1 ∣ x t ) ) ⏟ L t − 1 . \log p_\theta(x_0)\ \ge\ \underbrace{\mathbb E_q\big[\log p_\theta(x_0\mid x_{1:T})\big]}_{\text{最後一步重建}}\ -\ \underbrace{\mathrm{KL}\big(q(x_T\mid x_0)\,\Vert\,p_\theta(x_T)\big)}_{L_T\ (\text{末端})}\ -\ \sum_{t=2}^{T}\underbrace{\mathbb E_q\,\mathrm{KL}\big(q(x_{t-1}\mid x_t,x_0)\,\Vert\,p_\theta(x_{t-1}\mid x_t)\big)}_{L_{t-1}}. log p θ ( x 0 ) ≥ 最後一步重建 E q [ log p θ ( x 0 ∣ x 1 : T ) ] − L T ( 末端 ) KL ( q ( x T ∣ x 0 ) ∥ p θ ( x T ) ) − t = 2 ∑ T L t − 1 E q KL ( q ( x t − 1 ∣ x t , x 0 ) ∥ p θ ( x t − 1 ∣ x t ) ) .
上一堂只處理了最後那一串 L t − 1 L_{t-1} L t − 1 。真實後驗 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}\mid x_t,x_0) q ( x t − 1 ∣ x t , x 0 ) 是高斯 N ( μ ~ t ( x t , x 0 ) , β ~ t I ) \mathcal N(\tilde\mu_t(x_t,x_0),\tilde\beta_t I) N ( μ ~ t ( x t , x 0 ) , β ~ t I ) ,模型的變異數刻意選成同一個 β ~ t \tilde\beta_t β ~ t 。兩個共變異數相同的高斯,KL 只剩平均的差:
L t − 1 = E q [ 1 2 β ~ t ∥ μ ~ t ( x t , x 0 ) − μ θ ( x t , t ) ∥ 2 2 ] . L_{t-1} = \mathbb E_q\left[\frac{1}{2\tilde\beta_t}\big\lVert \tilde\mu_t(x_t,x_0)-\mu_\theta(x_t,t)\big\rVert_2^2\right]. L t − 1 = E q [ 2 β ~ t 1 μ ~ t ( x t , x 0 ) − μ θ ( x t , t ) 2 2 ] .
期望是對 x t x_t x t 取的:從 q q q 抽一個 x t x_t x t ,算出兩個平均,相減平方,再對 x t x_t x t 的隨機性平均。
剩下兩項:一項是零,一項長得跟其他項一樣(錄影 07:35–14:58)
末端那項 L T L_T L T 。 p θ ( x T ) p_\theta(x_T) p θ ( x T ) 規定是標準高斯;而 T T T 夠大時,雜訊把訊號洗掉,q ( x T ∣ x 0 ) q(x_T\mid x_0) q ( x T ∣ x 0 ) 也趨近標準高斯。兩個分布相同,KL 是零(嚴格說是隨 T T T 趨近零),直接當零。講義另外補了一個理由:這一項根本不含 θ \theta θ ,就算不是零也不影響訓練。
最後一步重建。 這一項講義記作 L 0 L_0 L 0 (字幕裡聽起來是「L1」,本文跟講義)。推導分四步。
第一步,反向模型是馬可夫鏈,給定 x 1 x_1 x 1 之後 x 2 , … , x T x_2,\dots,x_T x 2 , … , x T 不再提供資訊,所以 p θ ( x 0 ∣ x 1 : T ) = p θ ( x 0 ∣ x 1 ) p_\theta(x_0\mid x_{1:T}) = p_\theta(x_0\mid x_1) p θ ( x 0 ∣ x 1 : T ) = p θ ( x 0 ∣ x 1 ) 。
第二步,x 1 → x 0 x_1\to x_0 x 1 → x 0 這一步的模型之前沒指定過,就比照其他步設成高斯:p θ ( x 0 ∣ x 1 ) = N ( μ θ ( x 1 , 1 ) , σ 1 2 I ) p_\theta(x_0\mid x_1)=\mathcal N(\mu_\theta(x_1,1),\sigma_1^2 I) p θ ( x 0 ∣ x 1 ) = N ( μ θ ( x 1 , 1 ) , σ 1 2 I ) 。
第三步,高斯密度取 log,指數外面的東西變成常數,留下指數裡面的二次式:
log p θ ( x 0 ∣ x 1 ) = − 1 2 σ 1 2 ∥ x 0 − μ θ ( x 1 , 1 ) ∥ 2 2 + 常數 . \log p_\theta(x_0\mid x_1) = -\frac{1}{2\sigma_1^2}\big\lVert x_0-\mu_\theta(x_1,1)\big\rVert_2^2 + \text{常數}. log p θ ( x 0 ∣ x 1 ) = − 2 σ 1 2 1 x 0 − μ θ ( x 1 , 1 ) 2 2 + 常數 .
第四步是一個記號上的安排:定義 μ ~ 1 ( x 1 , x 0 ) : = x 0 \tilde\mu_1(x_1,x_0) := x_0 μ ~ 1 ( x 1 , x 0 ) := x 0 。這樣上式就變成 ∥ μ ~ 1 − μ θ ( x 1 , 1 ) ∥ 2 \lVert\tilde\mu_1-\mu_\theta(x_1,1)\rVert^2 ∥ μ ~ 1 − μ θ ( x 1 , 1 ) ∥ 2 乘一個係數,外型跟 t ≥ 2 t\ge 2 t ≥ 2 的 L t − 1 L_{t-1} L t − 1 一樣。
這個定義不能只是硬湊外型,要檢查它跟 t ≥ 2 t\ge 2 t ≥ 2 的 μ ~ t \tilde\mu_t μ ~ t 公式是否一致。把一步到位公式用在 t = 1 t=1 t = 1 (此時 α ˉ 1 = α 1 \bar\alpha_1=\alpha_1 α ˉ 1 = α 1 、1 − α ˉ 1 = β 1 1-\bar\alpha_1=\beta_1 1 − α ˉ 1 = β 1 ),解出 x 0 x_0 x 0 :
x 0 = x 1 − 1 − α ˉ 1 ϵ ^ 1 α ˉ 1 = 1 α 1 ( x 1 − β 1 ϵ ^ 1 ) . x_0 = \frac{x_1-\sqrt{1-\bar\alpha_1}\,\hat\epsilon_1}{\sqrt{\bar\alpha_1}} = \frac{1}{\sqrt{\alpha_1}}\big(x_1-\sqrt{\beta_1}\,\hat\epsilon_1\big). x 0 = α ˉ 1 x 1 − 1 − α ˉ 1 ϵ ^ 1 = α 1 1 ( x 1 − β 1 ϵ ^ 1 ) .
而下一節會推出 t ≥ 2 t\ge 2 t ≥ 2 時 μ ~ t = 1 α t ( x t − β t 1 − α ˉ t ϵ ^ t ) \tilde\mu_t = \frac{1}{\sqrt{\alpha_t}}\big(x_t-\frac{\beta_t}{\sqrt{1-\bar\alpha_t}}\hat\epsilon_t\big) μ ~ t = α t 1 ( x t − 1 − α ˉ t β t ϵ ^ t ) 。把 t = 1 t=1 t = 1 代進去,β 1 1 − α ˉ 1 = β 1 β 1 = β 1 \frac{\beta_1}{\sqrt{1-\bar\alpha_1}}=\frac{\beta_1}{\sqrt{\beta_1}}=\sqrt{\beta_1} 1 − α ˉ 1 β 1 = β 1 β 1 = β 1 ,正好就是上面那條。所以同一條公式從 t = 1 t=1 t = 1 用到 t = T t=T t = T 都成立。講者的評語是:背後有比較根本的理由,但你也可以當成邊界上記號不同造成的巧合。
到這裡,要最大化的 ELBO 等於 − ∑ t = 0 T − 1 L t -\sum_{t=0}^{T-1} L_t − ∑ t = 0 T − 1 L t (講義式 (14.17),L T L_T L T 已經丟掉),也就是最小化所有時間步的平方誤差加總。下標的對應是:L 0 L_0 L 0 管 x 1 → x 0 x_1\to x_0 x 1 → x 0 ,L t − 1 L_{t-1} L t − 1 管 x t → x t − 1 x_t\to x_{t-1} x t → x t − 1 ,名字永遠比它用到的 x t x_t x t 少一格。
丟掉係數,再看一次這個損失在比什麼(錄影 14:58–19:09)
講者接著提了一個實務上的細節:每一項前面的係數(1 2 β ~ t \frac{1}{2\tilde\beta_t} 2 β ~ t 1 、1 2 σ 1 2 \frac{1}{2\sigma_1^2} 2 σ 1 2 1 ),實作上大家直接丟掉,只留
L t − 1 = E q ∥ μ ~ t ( x t , x 0 ) − μ θ ( x t , t ) ∥ 2 2 . L_{t-1} = \mathbb E_q\,\big\lVert \tilde\mu_t(x_t,x_0)-\mu_\theta(x_t,t)\big\rVert_2^2 . L t − 1 = E q μ ~ t ( x t , x 0 ) − μ θ ( x t , t ) 2 2 .
然後他把兩個平均各自的意思重講一遍,這段值得停下來想:
μ θ ( x t , t ) \mu_\theta(x_t,t) μ θ ( x t , t ) 是模型只看 x t x_t x t 時,對 x t − 1 x_{t-1} x t − 1 平均值的猜測。
μ ~ t ( x t , x 0 ) \tilde\mu_t(x_t,x_0) μ ~ t ( x t , x 0 ) 是真實過程在同時知道 x t x_t x t 與 x 0 x_0 x 0 時,對 x t − 1 x_{t-1} x t − 1 的重建。上一堂算出它是 x 0 x_0 x 0 與 x t x_t x t 的線性組合。
損失要模型的重建去貼近後者。這是可以直接實作的演算法:抽 x 0 x_0 x 0 ,跑前向過程得到 x t x_t x t ,用公式算 μ ~ t \tilde\mu_t μ ~ t ,把 x t x_t x t 餵進網路得到 μ θ \mu_\theta μ θ ,算平方誤差,反向傳播。
這裡補一個課堂沒明講、自學時常卡住的點(本文的補充):模型看不到 x 0 x_0 x 0 ,怎麼可能貼近一個含 x 0 x_0 x 0 的目標?答案在期望。平方誤差在期望下的最小解是條件平均,所以最佳的 μ θ ( x t , t ) \mu_\theta(x_t,t) μ θ ( x t , t ) 是 E [ μ ~ t ∣ x t ] \mathbb E[\tilde\mu_t\mid x_t] E [ μ ~ t ∣ x t ] ,也就是對所有「可能產生這個 x t x_t x t 的 x 0 x_0 x 0 」取平均。模型不必猜中單一筆資料的 x 0 x_0 x 0 。
後驗平均怎麼來,以及改成預測雜訊(錄影 19:09–26:34)
講到這裡講者不確定上一堂有沒有把 μ ~ t \tilde\mu_t μ ~ t 的來源交代清楚,回頭補了思路:條件在 x 0 x_0 x 0 上時,x t − 1 x_{t-1} x t − 1 與 x t x_t x t 是聯合高斯,而聯合高斯的任何條件分布仍是高斯,講義附錄有現成公式可以代。課堂只講了路線,下面的計算是本文依講義 Lemma A.1.2 補上的。上一堂的導讀走的是貝氏定理配方那條路,這裡換講義的走法,兩條路會得到同一組 μ ~ t \tilde\mu_t μ ~ t 與 β ~ t \tilde\beta_t β ~ t 。
給定 x 0 x_0 x 0 ,各維度獨立,只看一維:
x t − 1 x_{t-1} x t − 1 的平均是 α ˉ t − 1 x 0 \sqrt{\bar\alpha_{t-1}}x_0 α ˉ t − 1 x 0 ,變異數是 1 − α ˉ t − 1 1-\bar\alpha_{t-1} 1 − α ˉ t − 1 。
x t = α t x t − 1 + β t ϵ t x_t=\sqrt{\alpha_t}x_{t-1}+\sqrt{\beta_t}\epsilon_t x t = α t x t − 1 + β t ϵ t ,平均是 α ˉ t x 0 \sqrt{\bar\alpha_t}x_0 α ˉ t x 0 ,變異數是 1 − α ˉ t 1-\bar\alpha_t 1 − α ˉ t 。
兩者的共變異數是 C o v ( x t − 1 , α t x t − 1 + β t ϵ t ) = α t V a r ( x t − 1 ) = α t ( 1 − α ˉ t − 1 ) \mathrm{Cov}(x_{t-1},\sqrt{\alpha_t}x_{t-1}+\sqrt{\beta_t}\epsilon_t)=\sqrt{\alpha_t}\,\mathrm{Var}(x_{t-1})=\sqrt{\alpha_t}(1-\bar\alpha_{t-1}) Cov ( x t − 1 , α t x t − 1 + β t ϵ t ) = α t Var ( x t − 1 ) = α t ( 1 − α ˉ t − 1 ) ,因為 ϵ t \epsilon_t ϵ t 與 x t − 1 x_{t-1} x t − 1 獨立。
條件高斯公式 E [ A ∣ B ] = μ A + C o v ( A , B ) V a r ( B ) ( B − μ B ) \mathbb E[A\mid B]=\mu_A+\frac{\mathrm{Cov}(A,B)}{\mathrm{Var}(B)}(B-\mu_B) E [ A ∣ B ] = μ A + Var ( B ) Cov ( A , B ) ( B − μ B ) ,令 A = x t − 1 A=x_{t-1} A = x t − 1 、B = x t B=x_t B = x t :
μ ~ t = α ˉ t − 1 x 0 + α t ( 1 − α ˉ t − 1 ) 1 − α ˉ t ( x t − α ˉ t x 0 ) . \tilde\mu_t = \sqrt{\bar\alpha_{t-1}}x_0+\frac{\sqrt{\alpha_t}(1-\bar\alpha_{t-1})}{1-\bar\alpha_t}\big(x_t-\sqrt{\bar\alpha_t}x_0\big). μ ~ t = α ˉ t − 1 x 0 + 1 − α ˉ t α t ( 1 − α ˉ t − 1 ) ( x t − α ˉ t x 0 ) .
x 0 x_0 x 0 的係數是 α ˉ t − 1 − α t ( 1 − α ˉ t − 1 ) 1 − α ˉ t α ˉ t \sqrt{\bar\alpha_{t-1}}-\frac{\sqrt{\alpha_t}(1-\bar\alpha_{t-1})}{1-\bar\alpha_t}\sqrt{\bar\alpha_t} α ˉ t − 1 − 1 − α ˉ t α t ( 1 − α ˉ t − 1 ) α ˉ t 。用 α ˉ t = α t α ˉ t − 1 \sqrt{\bar\alpha_t}=\sqrt{\alpha_t}\sqrt{\bar\alpha_{t-1}} α ˉ t = α t α ˉ t − 1 提出 α ˉ t − 1 \sqrt{\bar\alpha_{t-1}} α ˉ t − 1 ,括號裡通分後的分子是 ( 1 − α ˉ t ) − α t ( 1 − α ˉ t − 1 ) = 1 − α ˉ t − α t + α ˉ t = β t (1-\bar\alpha_t)-\alpha_t(1-\bar\alpha_{t-1})=1-\bar\alpha_t-\alpha_t+\bar\alpha_t=\beta_t ( 1 − α ˉ t ) − α t ( 1 − α ˉ t − 1 ) = 1 − α ˉ t − α t + α ˉ t = β t 。變異數用同一個引理的另一半,V a r ( A ∣ B ) = V a r ( A ) − C o v ( A , B ) 2 V a r ( B ) \mathrm{Var}(A\mid B)=\mathrm{Var}(A)-\frac{\mathrm{Cov}(A,B)^2}{\mathrm{Var}(B)} Var ( A ∣ B ) = Var ( A ) − Var ( B ) Cov ( A , B ) 2 :
β ~ t = ( 1 − α ˉ t − 1 ) − α t ( 1 − α ˉ t − 1 ) 2 1 − α ˉ t = ( 1 − α ˉ t − 1 ) [ ( 1 − α ˉ t ) − α t ( 1 − α ˉ t − 1 ) ] 1 − α ˉ t = 1 − α ˉ t − 1 1 − α ˉ t β t . \tilde\beta_t=(1-\bar\alpha_{t-1})-\frac{\alpha_t(1-\bar\alpha_{t-1})^2}{1-\bar\alpha_t}=\frac{(1-\bar\alpha_{t-1})\big[(1-\bar\alpha_t)-\alpha_t(1-\bar\alpha_{t-1})\big]}{1-\bar\alpha_t}=\frac{1-\bar\alpha_{t-1}}{1-\bar\alpha_t}\beta_t . β ~ t = ( 1 − α ˉ t − 1 ) − 1 − α ˉ t α t ( 1 − α ˉ t − 1 ) 2 = 1 − α ˉ t ( 1 − α ˉ t − 1 ) [ ( 1 − α ˉ t ) − α t ( 1 − α ˉ t − 1 ) ] = 1 − α ˉ t 1 − α ˉ t − 1 β t .
合起來:
μ ~ t ( x t , x 0 ) = α ˉ t − 1 β t 1 − α ˉ t x 0 + α t ( 1 − α ˉ t − 1 ) 1 − α ˉ t x t , β ~ t = 1 − α ˉ t − 1 1 − α ˉ t β t . \tilde\mu_t(x_t,x_0)=\frac{\sqrt{\bar\alpha_{t-1}}\,\beta_t}{1-\bar\alpha_t}x_0+\frac{\sqrt{\alpha_t}(1-\bar\alpha_{t-1})}{1-\bar\alpha_t}x_t,\qquad \tilde\beta_t=\frac{1-\bar\alpha_{t-1}}{1-\bar\alpha_t}\beta_t . μ ~ t ( x t , x 0 ) = 1 − α ˉ t α ˉ t − 1 β t x 0 + 1 − α ˉ t α t ( 1 − α ˉ t − 1 ) x t , β ~ t = 1 − α ˉ t 1 − α ˉ t − 1 β t .
係數看起來複雜,但就是兩個純量。接下來是課堂的主線。x t x_t x t 、x 0 x_0 x 0 、ϵ ^ t \hat\epsilon_t ϵ ^ t 三者由一步到位公式線性綁在一起,知道任兩個就知道第三個,所以可以把 x 0 x_0 x 0 換掉。代入 x 0 = 1 α ˉ t ( x t − 1 − α ˉ t ϵ ^ t ) x_0=\frac{1}{\sqrt{\bar\alpha_t}}(x_t-\sqrt{1-\bar\alpha_t}\hat\epsilon_t) x 0 = α ˉ t 1 ( x t − 1 − α ˉ t ϵ ^ t ) :
x t x_t x t 的係數:β t α t ( 1 − α ˉ t ) + α t ( 1 − α ˉ t − 1 ) 1 − α ˉ t = β t + α t − α ˉ t α t ( 1 − α ˉ t ) = 1 α t \frac{\beta_t}{\sqrt{\alpha_t}(1-\bar\alpha_t)}+\frac{\sqrt{\alpha_t}(1-\bar\alpha_{t-1})}{1-\bar\alpha_t}=\frac{\beta_t+\alpha_t-\bar\alpha_t}{\sqrt{\alpha_t}(1-\bar\alpha_t)}=\frac{1}{\sqrt{\alpha_t}} α t ( 1 − α ˉ t ) β t + 1 − α ˉ t α t ( 1 − α ˉ t − 1 ) = α t ( 1 − α ˉ t ) β t + α t − α ˉ t = α t 1 。
ϵ ^ t \hat\epsilon_t ϵ ^ t 的係數:− β t α t ( 1 − α ˉ t ) 1 − α ˉ t = − β t α t 1 − α ˉ t -\frac{\beta_t}{\sqrt{\alpha_t}(1-\bar\alpha_t)}\sqrt{1-\bar\alpha_t}=-\frac{\beta_t}{\sqrt{\alpha_t}\sqrt{1-\bar\alpha_t}} − α t ( 1 − α ˉ t ) β t 1 − α ˉ t = − α t 1 − α ˉ t β t 。
於是
μ ~ t = 1 α t ( x t − β t 1 − α ˉ t ϵ ^ t ) . \tilde\mu_t=\frac{1}{\sqrt{\alpha_t}}\left(x_t-\frac{\beta_t}{\sqrt{1-\bar\alpha_t}}\,\hat\epsilon_t\right). μ ~ t = α t 1 ( x t − 1 − α ˉ t β t ϵ ^ t ) .
現在目標只含 x t x_t x t 與 ϵ ^ t \hat\epsilon_t ϵ ^ t 。x t x_t x t 是網路的輸入,本來就知道。講者的說法是:已經知道的部分何必讓網路去學,把它寫死在公式裡,只讓網路負責未知的那一塊。所以把模型的平均也照同一個外型參數化,網路 ϵ θ \epsilon_\theta ϵ θ 只輸出雜訊的估計:
μ θ ( x t , t ) = 1 α t ( x t − β t 1 − α ˉ t ϵ θ ( x t , t ) ) . \mu_\theta(x_t,t)=\frac{1}{\sqrt{\alpha_t}}\left(x_t-\frac{\beta_t}{\sqrt{1-\bar\alpha_t}}\,\epsilon_\theta(x_t,t)\right). μ θ ( x t , t ) = α t 1 ( x t − 1 − α ˉ t β t ϵ θ ( x t , t ) ) .
兩式相減,x t x_t x t 那一項完全消掉:
μ ~ t − μ θ = − β t α t 1 − α ˉ t ( ϵ ^ t − ϵ θ ( x t , t ) ) , \tilde\mu_t-\mu_\theta=-\frac{\beta_t}{\sqrt{\alpha_t}\sqrt{1-\bar\alpha_t}}\big(\hat\epsilon_t-\epsilon_\theta(x_t,t)\big), μ ~ t − μ θ = − α t 1 − α ˉ t β t ( ϵ ^ t − ϵ θ ( x t , t ) ) ,
平方後乘回原本的 1 2 β ~ t \frac{1}{2\tilde\beta_t} 2 β ~ t 1 :
L t − 1 = β t 2 2 β ~ t α t ( 1 − α ˉ t ) E ∥ ϵ ^ t − ϵ θ ( x t , t ) ∥ 2 2 . L_{t-1}=\frac{\beta_t^2}{2\tilde\beta_t\,\alpha_t(1-\bar\alpha_t)}\ \mathbb E\,\big\lVert\hat\epsilon_t-\epsilon_\theta(x_t,t)\big\rVert_2^2 . L t − 1 = 2 β ~ t α t ( 1 − α ˉ t ) β t 2 E ϵ ^ t − ϵ θ ( x t , t ) 2 2 .
"So basically, you turn this reconstruction into a noise prediction problem."(25:31)
ϵ ^ t \hat\epsilon_t ϵ ^ t 是當初為了造出 x t x_t x t 加進去的雜訊,網路的工作是看著 x t x_t x t 把它猜回來。然後前面的係數再丟一次,只留 ∥ ϵ ^ t − ϵ θ ∥ 2 \lVert\hat\epsilon_t-\epsilon_\theta\rVert^2 ∥ ϵ ^ t − ϵ θ ∥ 2 。
兩次「丟係數」要分清楚(這一段是本文的補充,課堂上兩次都只說把係數丟掉)。在 μ \mu μ 的形式下丟掉 1 2 β ~ t \frac{1}{2\tilde\beta_t} 2 β ~ t 1 ,和在 ϵ \epsilon ϵ 的形式下丟掉整個係數,得到的是兩個不同的加權,中間差一個隨 t t t 變的因子 β t 2 α t ( 1 − α ˉ t ) \frac{\beta_t^2}{\alpha_t(1-\bar\alpha_t)} α t ( 1 − α ˉ t ) β t 2 。課堂最後採用、也是講義 (14.28) 寫的,是 ϵ \epsilon ϵ 形式下不加權的版本。
訓練五步,取樣一個迴圈(錄影 26:34–32:04)
訓練 (對應講義 p.187–188):
從訓練集抽一筆 x 0 x_0 x 0 。
從 1 1 1 到 T T T 均勻抽一個時間步 t t t 。原本的目標是 T T T 項加總,這裡每次隨機挑一項來算,跟隨機梯度下降每次抽一筆資料是同樣的想法。
抽雜訊 ϵ ∼ N ( 0 , I ) \epsilon\sim\mathcal N(0,I) ϵ ∼ N ( 0 , I ) 。
造出 x t = α ˉ t x 0 + 1 − α ˉ t ϵ x_t=\sqrt{\bar\alpha_t}x_0+\sqrt{1-\bar\alpha_t}\,\epsilon x t = α ˉ t x 0 + 1 − α ˉ t ϵ 。
對 L t ( θ ) = ∥ ϵ − ϵ θ ( x t , t ) ∥ 2 2 L_t(\theta)=\lVert\epsilon-\epsilon_\theta(x_t,t)\rVert_2^2 L t ( θ ) = ∥ ϵ − ϵ θ ( x t , t ) ∥ 2 2 算梯度,更新 θ \theta θ 。
多數教材把 ϵ ^ t \hat\epsilon_t ϵ ^ t 直接寫成 ϵ \epsilon ϵ 。講者的說法是,反正它是一個隨機變數,叫什麼名字都一樣。講義把理由寫得比較完整:不同 t t t 的 ϵ ^ t \hat\epsilon_t ϵ ^ t 彼此相關、不是獨立同分布,但每次訓練只用到一個時間步,只需要它的邊際分布是標準高斯,下標就沒有用處了。第 5 步的損失名字跟著講義式 (14.28) 寫成 L t ( θ ) L_t(\theta) L t ( θ ) ,下標是抽到的時間步;它對應 ELBO 分解裡的 L t − 1 L_{t-1} L t − 1 ,差的那一格只是命名。
取樣 :
抽 x T ∼ N ( 0 , I ) x_T\sim\mathcal N(0,I) x T ∼ N ( 0 , I ) 。
對 t = T , T − 1 , … , 1 t=T,T-1,\dots,1 t = T , T − 1 , … , 1 :算 ϵ θ ( x t , t ) \epsilon_\theta(x_t,t) ϵ θ ( x t , t ) ,代進上面的公式得到 μ θ ( x t , t ) \mu_\theta(x_t,t) μ θ ( x t , t ) ,再取 x t − 1 = μ θ ( x t , t ) + σ t ξ x_{t-1}=\mu_\theta(x_t,t)+\sigma_t\xi x t − 1 = μ θ ( x t , t ) + σ t ξ ,ξ ∼ N ( 0 , I ) \xi\sim\mathcal N(0,I) ξ ∼ N ( 0 , I ) 。
反向過程每一步自己也帶雜訊,所以要加 σ t ξ \sigma_t\xi σ t ξ ;前面選了 σ t 2 = β ~ t \sigma_t^2=\tilde\beta_t σ t 2 = β ~ t ,所以 σ t = β ~ t \sigma_t=\sqrt{\tilde\beta_t} σ t = β ~ t 。講義多一個課堂沒提的細節:最後一步(t = 1 t=1 t = 1 )令 ξ = 0 \xi=0 ξ = 0 ,不再加雜訊。
把一步訓練與一步取樣算一遍
以下是本文自擬的例子,不是課堂內容。資料是一維的,取 β 1 = 0.1 \beta_1=0.1 β 1 = 0.1 、β 2 = 0.2 \beta_2=0.2 β 2 = 0.2 ,看 t = 2 t=2 t = 2 這一步。
先算排程量。 α 1 = 0.9 \alpha_1=0.9 α 1 = 0.9 、α 2 = 0.8 \alpha_2=0.8 α 2 = 0.8 ,α ˉ 1 = 0.9 \bar\alpha_1=0.9 α ˉ 1 = 0.9 、α ˉ 2 = 0.72 \bar\alpha_2=0.72 α ˉ 2 = 0.72 ,β ~ 2 = 1 − 0.9 1 − 0.72 × 0.2 = 0.0714 \tilde\beta_2=\frac{1-0.9}{1-0.72}\times0.2=0.0714 β ~ 2 = 1 − 0.72 1 − 0.9 × 0.2 = 0.0714 。
造 x 2 x_2 x 2 。 取 x 0 = 1 x_0=1 x 0 = 1 、抽到雜訊 ϵ ^ = 0.5 \hat\epsilon=0.5 ϵ ^ = 0.5 :
x 2 = 0.72 × 1 + 0.28 × 0.5 = 0.8485 + 0.2646 = 1.1131. x_2=\sqrt{0.72}\times1+\sqrt{0.28}\times0.5=0.8485+0.2646=1.1131 . x 2 = 0.72 × 1 + 0.28 × 0.5 = 0.8485 + 0.2646 = 1.1131.
用兩種寫法算後驗平均。 含 x 0 x_0 x 0 的寫法:x 0 x_0 x 0 的係數是 0.9 × 0.2 0.28 = 0.6776 \frac{\sqrt{0.9}\times0.2}{0.28}=0.6776 0.28 0.9 × 0.2 = 0.6776 ,x 2 x_2 x 2 的係數是 0.8 × 0.1 0.28 = 0.3194 \frac{\sqrt{0.8}\times0.1}{0.28}=0.3194 0.28 0.8 × 0.1 = 0.3194 ,所以 μ ~ 2 = 0.6776 × 1 + 0.3194 × 1.1131 = 1.0332 \tilde\mu_2=0.6776\times1+0.3194\times1.1131=1.0332 μ ~ 2 = 0.6776 × 1 + 0.3194 × 1.1131 = 1.0332 。含雜訊的寫法:β 2 1 − α ˉ 2 = 0.2 0.5292 = 0.3780 \frac{\beta_2}{\sqrt{1-\bar\alpha_2}}=\frac{0.2}{0.5292}=0.3780 1 − α ˉ 2 β 2 = 0.5292 0.2 = 0.3780 ,μ ~ 2 = 1 0.8 ( 1.1131 − 0.3780 × 0.5 ) = 1.1180 × 0.9241 = 1.0332 \tilde\mu_2=\frac{1}{\sqrt{0.8}}(1.1131-0.3780\times0.5)=1.1180\times0.9241=1.0332 μ ~ 2 = 0.8 1 ( 1.1131 − 0.3780 × 0.5 ) = 1.1180 × 0.9241 = 1.0332 。兩條路得到同一個數,前一節的代換沒有算錯。
算損失。 假設網路這時輸出 ϵ θ ( x 2 , 2 ) = 0.3 \epsilon_\theta(x_2,2)=0.3 ϵ θ ( x 2 , 2 ) = 0.3 (真實是 0.5 0.5 0.5 )。雜訊預測損失是 ( 0.5 − 0.3 ) 2 = 0.04 (0.5-0.3)^2=0.04 ( 0.5 − 0.3 ) 2 = 0.04 。換成平均來看,μ θ = 1.1180 × ( 1.1131 − 0.3780 × 0.3 ) = 1.1177 \mu_\theta=1.1180\times(1.1131-0.3780\times0.3)=1.1177 μ θ = 1.1180 × ( 1.1131 − 0.3780 × 0.3 ) = 1.1177 ,μ ~ 2 − μ θ = − 0.0845 \tilde\mu_2-\mu_\theta=-0.0845 μ ~ 2 − μ θ = − 0.0845 ,平方是 0.00714 0.00714 0.00714 。兩者的比值 0.00714 / 0.04 = 0.1786 0.00714/0.04=0.1786 0.00714/0.04 = 0.1786 ,正是 β 2 2 α 2 ( 1 − α ˉ 2 ) = 0.04 0.8 × 0.28 \frac{\beta_2^2}{\alpha_2(1-\bar\alpha_2)}=\frac{0.04}{0.8\times0.28} α 2 ( 1 − α ˉ 2 ) β 2 2 = 0.8 × 0.28 0.04 。完整帶權重的 ELBO 項是 0.00714 2 × 0.0714 = 0.05 \frac{0.00714}{2\times0.0714}=0.05 2 × 0.0714 0.00714 = 0.05 ,等於 1.25 × 0.04 1.25\times0.04 1.25 × 0.04 。
走一步取樣。 若這是生成時的一步,抽到 ξ = − 1 \xi=-1 ξ = − 1 ,則 x 1 = 1.1177 + 0.0714 × ( − 1 ) = 1.1177 − 0.2673 = 0.8505 x_1=1.1177+\sqrt{0.0714}\times(-1)=1.1177-0.2673=0.8505 x 1 = 1.1177 + 0.0714 × ( − 1 ) = 1.1177 − 0.2673 = 0.8505 。
這組數字說明三件事。比較平均和比較雜訊是同一個誤差,只差一個由排程決定的倍數(這裡是 0.1786 0.1786 0.1786 )。丟掉係數等於把每個時間步的倍數都改成 1 1 1 。只看單一個 t t t 的話,損失乘上一個正的常數,最小值落在同一個 ϵ θ \epsilon_\theta ϵ θ ,最佳解不變;改變的是各時間步之間的相對比重,同一個網路要兼顧所有 t t t 、又不可能每一步都學到最佳解時,比重會決定它把誤差留在哪些時間步。還有,雜訊猜低了 0.2 0.2 0.2 ,模型的平均就偏高 0.0845 0.0845 0.0845 ,方向相反,因為公式裡雜訊前面是負號。
擴散模型為什麼好學,以及一個學生提問(錄影 32:04–36:40)
講者先聲明沒有很強的理論能證明一切,以下是直覺。第一,其中一個方向是固定的加噪函數,不必同時參數化前向與反向;以前有人試過兩邊都用可學的函數,最佳化比較難。第二,代價是時間軸拉得很長(一開始的做法 T T T 是 1,000),但拉長之後每一步的重建在局部上變簡單:從純白雜訊開始,先出輪廓與大致樣子,再逐步銳化、補細節。神經網路原則上什麼都表示得出來,但怎麼表示、怎麼學仍然有差,擴散模型的做法是把一個大的生成任務拆成許多好學的小步。
有學生問參數到底怎麼更新,講者的回答可以當成這門課後半的閱讀方式:損失函數定義好之後,剩下的都算得出來,在 PyTorch 裡寫好網路與損失,算梯度、走一步。新的應用或演算法多半是在損失這一層創新;最佳化器那一層也可以創新,而且換了之後擴散模型、語言模型、線性迴歸都能用。接下來的課主要談資料、架構、損失函數與訓練流程,不再談梯度怎麼算。
後半堂:基礎模型的典範與適應方法
預訓練加適應(錄影 36:40–46:51)
講者先講「foundation model」這個詞的來歷。GPT-3 在 2020 年夏天出來後,Stanford 的教授們聚在一個房間玩 OpenAI playground。當時沒有 ChatGPT,只有一個文字框,你寫的和模型生成的出現在同一格,可以調溫度之類的超參數,右邊有下拉選單選模型。後來 Percy Liang 帶隊研究這個新典範,寫了一篇綜述並取了這個名字。講者說他前一天去查,那篇綜述的摘要把它稱為 emergent paradigm,他自己的講義也這樣寫:
"But I think after three years, we probably should just not call it emergent paradigm. It's the new paradigm."(38:26)
他也提醒,五年前講這個典範時涵蓋的技術比較廣,其中一些現在已經過時;接下來一兩堂會講 2019 到 2022 年間流行的做法,再講 2022 年之後的主流。
典範分兩個階段。
預訓練(pretraining)。 用大量沒有標註的資料,量級比以前高出好幾個數量級,而且資料很雜:網路上抓得到的都抓,HTML 檔連標籤一起、Word 檔、其他格式的文件都收。早期幾個版本的訓練資料相當亂,後來才逐步清理。寫成式子很平凡,θ \theta θ 是參數,每筆資料有一個損失,取平均:
L pre ( θ ) = 1 n ∑ i = 1 n ℓ pre ( x ( i ) , θ ) . L_{\text{pre}}(\theta)=\frac{1}{n}\sum_{i=1}^{n}\ell_{\text{pre}}\big(x^{(i)},\theta\big). L pre ( θ ) = n 1 i = 1 ∑ n ℓ pre ( x ( i ) , θ ) .
跟監督式學習的差別只有兩個:沒有標籤,n n n 非常大。ℓ pre \ell_{\text{pre}} ℓ pre 具體是什麼,留到後面的課。最佳化得到的參數記作 θ ^ \hat\theta θ ^ 。
適應(adaptation)。 從一個好的基礎出發,調到各種下游任務。以前的做法是一個任務訓練一個模型,做多任務的人頂多同時訓練三個。現在任務數量幾乎沒有上限,講者說 GPT 的論文評估了大概一百個任務,到後來「任務」這個概念本身都變得不好定義。
適應要看兩件事:手上有多少、什麼樣的下游資料,以及用什麼技術。資料面,下游資料集是 n task n_{\text{task}} n task 組 ( x task ( i ) , y task ( i ) ) (x_{\text{task}}^{(i)},y_{\text{task}}^{(i)}) ( x task ( i ) , y task ( i ) ) :
n task n_{\text{task}} n task 很小,大約 5 到 10 筆,叫 few-shot 。
n task = 0 n_{\text{task}}=0 n task = 0 ,只用文字描述任務就請模型解,叫 zero-shot 。
講者說 GPT-3 的突破之一就是有時連 few-shot 都不必,而現在幾乎沒有人為了適應模型去蒐集下游標註了。但在 2019 到 2022 年,有標註的下游資料集仍是主流,例如蒐集一小份情感分類資料再去調模型。技術面,這堂與下一堂講「會更新參數」的適應方法,之後才講只靠提示(prompt)、不動參數的做法。
表徵與 linear probe(錄影 46:51–54:50)
要講有標註資料時的適應,得先有表徵學習這個概念。它是預訓練的一種:訓練的不是聊天模型,而是一個把資料變成向量的模型
ϕ θ : x ↦ ϕ θ ( x ) ∈ R m . \phi_\theta:\ x\ \mapsto\ \phi_\theta(x)\in\mathbb R^m . ϕ θ : x ↦ ϕ θ ( x ) ∈ R m .
這個向量叫表徵(representation),也叫特徵(feature)或嵌入(embedding)。訓練完得到 θ ^ \hat\theta θ ^ ,也就得到一個固定的函數 ϕ θ ^ \phi_{\hat\theta} ϕ θ ^ ,任何資料丟進去都會出來一個向量。訓練它用的損失是下一堂的內容。
Linear probe 是在這個固定的表徵上面加一個線性頭(linear head):一個 m m m 維向量 w w w ,預測值是內積 w ⊤ ϕ θ ^ ( x ) w^\top\phi_{\hat\theta}(x) w ⊤ ϕ θ ^ ( x ) ,分類時再接 softmax。以迴歸為例:
min w ∈ R m 1 n task ∑ i = 1 n task ( y task ( i ) − w ⊤ ϕ θ ^ ( x task ( i ) ) ) 2 . \min_{w\in\mathbb R^m}\ \frac{1}{n_{\text{task}}}\sum_{i=1}^{n_{\text{task}}}\Big(y_{\text{task}}^{(i)}-w^\top\phi_{\hat\theta}\big(x_{\text{task}}^{(i)}\big)\Big)^2 . w ∈ R m min n task 1 i = 1 ∑ n task ( y task ( i ) − w ⊤ ϕ θ ^ ( x task ( i ) ) ) 2 .
θ ^ \hat\theta θ ^ 固定,每筆資料的 ϕ θ ^ ( x ) \phi_{\hat\theta}(x) ϕ θ ^ ( x ) 就是一個固定的向量,變數只有 w w w 。這跟課程最前面學的線性迴歸是同一個問題,只是輸入特徵從原始的 x x x 換成了表徵。它比手工設計特徵、或直接在原始 x x x 上做線性模型好得多,原因是 y y y 通常不是 x x x 的線性函數,但表徵把語意上重要的資訊轉成可以線性取用的樣子。
講者順帶提到,linear probe 現在仍是語言模型機制可解釋性研究的工具:就算不用它解任務,也可以拿來探查模型內部表示了什麼。
這段有兩個學生提問。
一個問基礎模型是分領域做還是通用的。講者說三四年前視覺和語言各有各的表徵學法;現在大家要多模態能力,一個模型同時吃影像、文字甚至影片,所以方法得統一,2026 年許多模型被稱為 omni 或多模態模型。這堂講的表徵學習加線性分類比較常見於視覺,醫學影像仍在用:先取表徵,再針對每一種影像任務用一小份資料訓練一個小的線性頭。
另一個問得更尖:憑什麼假設下游任務對表徵是線性的?講者說這不算假設,預訓練的損失本身就在把表徵往「可以線性使用」的方向推,下一堂看到具體的損失就明白。
Finetune、初始化與 LP-FT(錄影 54:50–1:02:20)
Finetune 跟 linear probe 的差別只有一處:θ \theta θ 也變成變數。
min w , θ 1 n task ∑ i = 1 n task ℓ task ( y task ( i ) , w ⊤ ϕ θ ( x task ( i ) ) ) , θ ← θ ^ , w ← 隨機 . \min_{w,\theta}\ \frac{1}{n_{\text{task}}}\sum_{i=1}^{n_{\text{task}}}\ell_{\text{task}}\Big(y_{\text{task}}^{(i)},\ w^\top\phi_{\theta}\big(x_{\text{task}}^{(i)}\big)\Big),\qquad \theta\leftarrow\hat\theta,\quad w\leftarrow\text{隨機}. w , θ min n task 1 i = 1 ∑ n task ℓ task ( y task ( i ) , w ⊤ ϕ θ ( x task ( i ) ) ) , θ ← θ ^ , w ← 隨機 .
講者在這裡指出一件值得想的事。這個損失函數本身完全沒有預訓練的痕跡。你可以用一模一樣的損失,從隨機的 w w w 和隨機的 θ \theta θ 開始,那就是從頭訓練一個巨大的模型。預訓練唯一進入這個問題的地方是 θ \theta θ 的起點,而結果好很多。
"because it's the same loss function. Just initialization are different."(56:19)
他的推論是:這個損失有非常多個全域最小值,可能上百萬個,而且彼此不一樣。下游資料少,訓練損失幾乎一定能壓到零,所以「好壞」指的是測試表現。從隨機起點出發會落在某個訓練損失為零但測試表現差的解;從預訓練的 θ ^ \hat\theta θ ^ 出發,會落在另一個訓練損失同樣為零但測試表現好得多的解。
有學生追問預訓練的產出到底是什麼。答案是 θ ^ \hat\theta θ ^ ,一組在既定架構下的具體數字。架構要先定好,預訓練與適應必須用同一個架構,否則那組數字沒有辦法解讀。
LP-FT 是先 linear probe 再 finetune。記損失為 L ( w , θ ) L(w,\theta) L ( w , θ ) :
LP:固定 θ = θ ^ \theta=\hat\theta θ = θ ^ ,只對 w w w 最小化,得到 w 0 w_0 w 0 。
FT:從 ( w 0 , θ ^ ) (w_0,\hat\theta) ( w 0 , θ ^ ) 出發,同時對 w w w 與 θ \theta θ 最小化。
講者說如果要走這條路,LP-FT 大概是目前最主要的做法。至於為什麼比較好:
"I think we don't know exactly either."(1:01:27)
他說有一些理論在談這件事,自己給的粗略解釋是:直接 finetune 時,w w w 是隨機的,θ \theta θ 是預訓練好的,隨機的 w w w 有時會把表徵弄壞一點。先固定 θ ^ \hat\theta θ ^ 讓 w w w 配合表徵,再一起訓練,表徵仍會改變,但改變的幅度比用隨機頭時小。
LoRA:只在低秩方向上改(錄影 1:02:20–1:07:36)
LoRA(low-rank adaptation)跟你用什麼損失做適應無關,只要是在最小化某個損失、不是 zero-shot,就能套用。
動機是這樣:finetune 會改 θ \theta θ 裡所有參數,而預訓練模型有幾十億個參數,下游資料卻只有一點點。「適應」這個詞本身就意味著不必改太多。全部都改容易過度配適,也殺雞用牛刀。那只改一部分參數行不行?難處是你不知道該挑哪一部分。LoRA 的解法是每個參數都可以動,但限制「改變量」的自由度。
對一個權重矩陣,把模型重新參數化成
W = W 0 + A B , A ∈ R d × r , B ∈ R r × d , W = W_0 + AB,\qquad A\in\mathbb R^{d\times r},\quad B\in\mathbb R^{r\times d}, W = W 0 + A B , A ∈ R d × r , B ∈ R r × d ,
其中 W 0 W_0 W 0 是預訓練得到的矩陣,固定不動,只訓練 A A A 和 B B B 。原本的 finetune 是從 W 0 W_0 W 0 出發最小化 L ( W ) L(W) L ( W ) ;LoRA 是最小化 L ( W 0 + A B ) L(W_0+AB) L ( W 0 + A B ) ,變數是 A A A 、B B B 。
自由度。 d × d d\times d d × d 的矩陣有 d 2 d^2 d 2 個自由度,A A A 、B B B 合計 2 d r 2dr 2 d r 。課堂的數字是 d = 1000 d=1000 d = 1000 、r = 10 r=10 r = 10 :d 2 = 1,000,000 d^2=1{,}000{,}000 d 2 = 1 , 000 , 000 ,2 d r = 20,000 2dr=20{,}000 2 d r = 20 , 000 ,只有原本的 2%。
初始化。 令 A = 0 A=0 A = 0 、B B B 隨機。這樣 A B = 0 AB=0 A B = 0 ,起點的 W 0 + A B W_0+AB W 0 + A B 就是 W 0 W_0 W 0 ,模型在第一步之前的行為跟預訓練模型完全相同。
用一個極小的例子確認機制(本文自擬)。取 d = 2 d=2 d = 2 、r = 1 r=1 r = 1 ,
W 0 = ( 1 2 3 4 ) , A = ( 0 0 ) , B = ( 1 − 1 ) , x = ( 1 0 ) . W_0=\begin{pmatrix}1&2\\3&4\end{pmatrix},\quad A=\begin{pmatrix}0\\0\end{pmatrix},\quad B=\begin{pmatrix}1&-1\end{pmatrix},\quad x=\begin{pmatrix}1\\0\end{pmatrix}. W 0 = ( 1 3 2 4 ) , A = ( 0 0 ) , B = ( 1 − 1 ) , x = ( 1 0 ) .
初始時 A B AB A B 是零矩陣,輸出是 W 0 x = ( 1 , 3 ) ⊤ W_0x=(1,3)^\top W 0 x = ( 1 , 3 ) ⊤ 。假設訓練幾步後 A = ( 0.1 , 0.2 ) ⊤ A=(0.1,0.2)^\top A = ( 0.1 , 0.2 ) ⊤ ,則 A B = ( 0.1 − 0.1 0.2 − 0.2 ) AB=\begin{pmatrix}0.1&-0.1\\0.2&-0.2\end{pmatrix} A B = ( 0.1 0.2 − 0.1 − 0.2 ) ,輸出變成 ( 1.1 , 3.2 ) ⊤ (1.1,3.2)^\top ( 1.1 , 3.2 ) ⊤ 。更新量 A B AB A B 的兩列成比例,秩是 1,但 W 0 + A B W_0+AB W 0 + A B 本身仍是滿秩。低秩的是改變量,調整後的矩陣並不低秩,講義 p.195 特別強調這一點。另外這個例子的 2 d r = 4 2dr=4 2 d r = 4 等於 d 2 = 4 d^2=4 d 2 = 4 ,一個參數都沒省;r r r 要小於 d / 2 d/2 d /2 才開始省。
有學生問,為什麼不直接加一個 d × d d\times d d × d 的矩陣?因為那樣又回到 d 2 d^2 d 2 個自由度。又問 A B AB A B 這種乘積會不會帶進某種對稱的偏差?講者說 A A A 和 B B B 不相等,沒有額外的對稱性,限制就只是低秩;而低秩本身確實是一種偏差。
課堂的寫法跟講義有三處不同,查資料時要留意。講義把更新寫成 Δ W = B A \Delta W=BA Δ W = B A ,B ∈ R d out × r B\in\mathbb R^{d_{\text{out}}\times r} B ∈ R d out × r 、A ∈ R r × d in A\in\mathbb R^{r\times d_{\text{in}}} A ∈ R r × d in ,兩個字母的角色跟課堂對調。初始化為零的在兩邊其實是同一個因子,都是乘積左邊、形狀 d × r d\times r d × r 的那一個,只是課堂叫它 A A A 、講義叫它 B B B (講義舉的例子是 B = 0 B=0 B = 0 )。本文正文一律用課堂的 W 0 + A B W_0+AB W 0 + A B ;講義允許非方陣 W 0 ∈ R d out × d in W_0\in\mathbb R^{d_{\text{out}}\times d_{\text{in}}} W 0 ∈ R d out × d in ,可訓練參數是 r ( d out + d in ) r(d_{\text{out}}+d_{\text{in}}) r ( d out + d in ) ;講義還有一個縮放係數,h = W 0 x + α r B A x h=W_0x+\frac{\alpha}{r}BAx h = W 0 x + r α B A x ,課堂沒有提。
把這堂的四種適應方法並排(本文整理,W 0 W_0 W 0 指 θ ^ \hat\theta θ ^ 裡被 LoRA 改寫的權重矩陣):
方法 訓練哪些參數 起點 預訓練權重會不會變 Linear probe 只有 w w w w w w 隨機不變,固定在 θ ^ \hat\theta θ ^ Finetune w w w 與 θ \theta θ w w w 隨機、θ = θ ^ \theta=\hat\theta θ = θ ^ 全部都會變 LP-FT 先只有 w w w ,再 w w w 與 θ \theta θ 第二階段從 ( w 0 , θ ^ ) (w_0,\hat\theta) ( w 0 , θ ^ ) 出發 第二階段會變,幅度通常較小 LoRA 每個被改寫的矩陣只訓練 A A A 、B B B A = 0 A=0 A = 0 、B B B 隨機W 0 W_0 W 0 不變,實際使用的是 W 0 + A B W_0+AB W 0 + A B
前三種的差別在「哪些參數是變數、從哪裡出發」;LoRA 是另一個維度的選擇,規定權重的改變量長什麼樣,可以跟前面任何一種會更新 θ \theta θ 的做法搭配。
LoRA 省了什麼(錄影 1:07:36–1:15:45)
最後八分鐘是這堂後半最有用的部分。講者不直接給答案,而是一項一項檢查。
運算:幾乎沒省。 學生先回答「參數變少」,講者說對,但參數少不代表比較快。前向傳播每一層仍要算 ( W 0 + A B ) x (W_0+AB)x ( W 0 + A B ) x ,W 0 x W_0x W 0 x 這一塊省不掉,而它才是瓶頸,A B x ABx A B x 很便宜。反向傳播要把梯度往回傳,仍要乘 W 0 ⊤ W_0^\top W 0 ⊤ 。反向傳播裡有兩種導數:對 activation 的和對權重的。對 activation 的那條完全沒省;對權重的那條因為可訓練參數少,省了一點。
"So largely speaking, your compute don't really change much."(1:08:37)
記憶體:省一些,但不到天壤之別。 W 0 W_0 W 0 還是要放在記憶體裡。訓練時記憶體裡除了參數,還有梯度和最佳化器的狀態(一位學生提到 Adam 要追蹤動量)。這些只對可訓練參數存,所以 LoRA 只需要為 A A A 、B B B 存,這是省下來的部分。講者順口說梯度加最佳化器狀態比參數本身貴上「12 倍還是 6 倍」,自己也說記不清楚,這個倍數不要當成事實引用。接著他補了一個系統面的觀察,並說不期待每個人都懂:大規模多 GPU 訓練時,梯度與動量可以分片(shard)放在不同 GPU 上,本來就未必是記憶體的瓶頸。講義的寫法是:基底權重 W 0 W_0 W 0 ,以及反向傳播要保留的 activation,都不會因為低秩參數化而變少;當這兩樣佔記憶體的大宗時,LoRA 在訓練時省下的記憶體就有限。兩點合起來,記憶體有省,但講者的形容是稱不上天壤之別。
真正有差的兩個情境。 第一個是記憶體剛好卡在邊緣:省下一成就能從兩張 GPU 變成一張,這種時候任何節省都很重要,但只發生在 GPU 很少的情況。第二個是講者認為最主要的好處,多人共用同一個 W 0 W_0 W 0 :
"So in my opinion, that's probably the major benefit of LORA, which you can serve many, many users."(1:15:45)
每個使用者有自己的 ( A 1 , B 1 ) , ( A 2 , B 2 ) , … , ( A k , B k ) (A_1,B_1),(A_2,B_2),\dots,(A_k,B_k) ( A 1 , B 1 ) , ( A 2 , B 2 ) , … , ( A k , B k ) ,W 0 W_0 W 0 只存一份。推論時誰的請求進來就換上誰的低秩矩陣。可以把很大一部分使用者的 adapter 預先載入 GPU 記憶體,切換很快;沒預載的從 CPU 載入,小矩陣也比完整矩陣快得多。他舉商用模型的 finetune 服務為例(點名 GPT 與 Gemini),說這些服務給使用者的是 LoRA 式的 finetune,並認為原因就在這裡。這是講者在課堂上的說法與推測;各家服務內部怎麼做不一定有公開說明,不要把它當成已確認的事實引用。
他口頭給的數字是每人約 1 億個參數、1,000 個使用者、合計「大概 100 億」。照乘是 10 8 × 10 3 = 10 11 10^8\times10^3=10^{11} 1 0 8 × 1 0 3 = 1 0 11 ,也就是 1,000 億,口頭的數字對不起來。結論不受影響:對照組是每人存一整份完整權重,而每人一組低秩矩陣比它小得多。
講義 p.195 還有兩點課堂沒講到:同樣的共用想法也適用於多租戶訓練(多個訓練工作共用基底權重);以及 LoRA 是表達能力上的取捨,下游分布跟預訓練差很遠或需要大幅調整時,全參數訓練可能仍然比較好。
自我檢查
取 β 1 = 0.1 \beta_1=0.1 β 1 = 0.1 、β 2 = 0.2 \beta_2=0.2 β 2 = 0.2 、x 0 = 1 x_0=1 x 0 = 1 、ϵ ^ = 0.5 \hat\epsilon=0.5 ϵ ^ = 0.5 ,網路輸出改成 ϵ θ = 0.9 \epsilon_\theta=0.9 ϵ θ = 0.9 。雜訊預測損失、μ θ \mu_\theta μ θ 、帶權重的 L 1 L_1 L 1 各是多少?
答:損失是 ( 0.5 − 0.9 ) 2 = 0.16 (0.5-0.9)^2=0.16 ( 0.5 − 0.9 ) 2 = 0.16 。μ θ = 1.1180 × ( 1.1131 − 0.3780 × 0.9 ) = 0.8642 \mu_\theta=1.1180\times(1.1131-0.3780\times0.9)=0.8642 μ θ = 1.1180 × ( 1.1131 − 0.3780 × 0.9 ) = 0.8642 ,比 μ ~ 2 = 1.0332 \tilde\mu_2=1.0332 μ ~ 2 = 1.0332 低 0.1690 0.1690 0.1690 ;雜訊猜高,平均就偏低。帶權重的項是 1.25 × 0.16 = 0.2 1.25\times0.16=0.2 1.25 × 0.16 = 0.2 。判準:你算出的 ( μ ~ 2 − μ θ ) 2 (\tilde\mu_2-\mu_\theta)^2 ( μ ~ 2 − μ θ ) 2 除以 0.16 0.16 0.16 應該是 0.1786 0.1786 0.1786 。
為什麼要定義 μ ~ 1 ( x 1 , x 0 ) : = x 0 \tilde\mu_1(x_1,x_0):=x_0 μ ~ 1 ( x 1 , x 0 ) := x 0 ?這個定義跟 t ≥ 2 t\ge2 t ≥ 2 的公式一致嗎?
答:為了讓最後一步重建項 ∥ x 0 − μ θ ( x 1 , 1 ) ∥ 2 \lVert x_0-\mu_\theta(x_1,1)\rVert^2 ∥ x 0 − μ θ ( x 1 , 1 ) ∥ 2 跟其他項有同樣的外型。一致性的檢查是把 t = 1 t=1 t = 1 代進 1 α t ( x t − β t 1 − α ˉ t ϵ ^ t ) \frac{1}{\sqrt{\alpha_t}}(x_t-\frac{\beta_t}{\sqrt{1-\bar\alpha_t}}\hat\epsilon_t) α t 1 ( x t − 1 − α ˉ t β t ϵ ^ t ) ,用 1 − α ˉ 1 = β 1 1-\bar\alpha_1=\beta_1 1 − α ˉ 1 = β 1 得到 1 α 1 ( x 1 − β 1 ϵ ^ 1 ) \frac{1}{\sqrt{\alpha_1}}(x_1-\sqrt{\beta_1}\hat\epsilon_1) α 1 1 ( x 1 − β 1 ϵ ^ 1 ) ,而這正是從 x 1 = α 1 x 0 + β 1 ϵ ^ 1 x_1=\sqrt{\alpha_1}x_0+\sqrt{\beta_1}\hat\epsilon_1 x 1 = α 1 x 0 + β 1 ϵ ^ 1 解出的 x 0 x_0 x 0 。
訓練時為什麼可以把 ϵ ^ t \hat\epsilon_t ϵ ^ t 寫成沒有下標的 ϵ \epsilon ϵ ,明明不同 t t t 的 ϵ ^ t \hat\epsilon_t ϵ ^ t 是相關的?
答:每次更新只抽一個時間步,損失只用到那一個 ϵ ^ t \hat\epsilon_t ϵ ^ t ,只需要它的邊際分布是 N ( 0 , I ) \mathcal N(0,I) N ( 0 , I ) 。跨時間步的相關性在單一步的損失裡不出現。
Finetune 的損失函數裡看不到預訓練,預訓練是怎麼起作用的?
答:只透過 θ \theta θ 的初始值。下游資料少,損失有很多訓練誤差為零的最小值,它們的測試表現不同;起點決定最佳化落在哪一個。能說出「訓練損失都接近零,差別在測試表現」才算答對。
某一層是 4096 × 4096 4096\times4096 4096 × 4096 的矩陣,LoRA 取 r = 8 r=8 r = 8 。可訓練參數是完整 finetune 的幾分之幾?前向傳播的運算量大約省了多少?
答:2 d r = 65,536 2dr=65{,}536 2 d r = 65 , 536 ,d 2 = 16,777,216 d^2=16{,}777{,}216 d 2 = 16 , 777 , 216 ,約 0.39 % 0.39\% 0.39% ,也就是 1 / 256 1/256 1/256 。前向運算幾乎沒省,因為 W 0 x W_0x W 0 x 仍要算,還多了一點 A B x ABx A B x 。若回答「運算也省到 1/256」,就是把可訓練參數量和運算量混為一談。
對應閱讀
主講義 main_notes.pdf (2026 年 8 月版):
第 14.3 節 Training diffusion models by maximizing the ELBO (pp.184–188):ELBO 分解 (14.15)–(14.17)、後驗平均 (14.18)–(14.19)、改寫成雜訊 (14.22)–(14.24)、L 0 L_0 L 0 項 (14.25)–(14.26)、訓練與取樣演算法 (14.27)–(14.29)。條件高斯公式在附錄 Lemma A.1.2。
第 14.4 節 Continuous-time view of reverse diffusion (pp.188–190):用隨機微分方程與 score 解釋反向過程為什麼是高斯。這一節課堂完全沒講。
第 15 章 Foundation models overview (pp.191–195):15.1 節是 linear probe、finetune、LP-FT,15.2 節是 LoRA。
課堂與講義不同的地方:
末端那項,課堂說 T → ∞ T\to\infty T → ∞ 時是零;講義另外指出它不含 θ \theta θ ,所以可以直接從目標中拿掉。
取樣的最後一步,講義令 ξ = 0 \xi=0 ξ = 0 ;課堂沒提。
LP-FT 的原理,課堂說還不完全清楚;講義引用 Kumar et al. (2022),說這個方法是為了減少 finetune 對特徵的扭曲,在某些設定下能改善分布外的表現。
講義 15.1 節提到「繼續預訓練」(用預訓練的損失在新資料上接著訓練);課堂沒講。
LoRA 的記號、縮放係數 α / r \alpha/r α / r 、表達能力的取捨,如上一節所列。
系列導覽 :上一篇 第 11 堂:擴散模型 |下一篇 第 13 堂:對比學習與語意檢索
課程影片來源
原始影片:Stanford CS229 Machine Learning | Spring 2026 | Lecture 12: Representation Learning
查核日期:2026-10-12。
內容核對:已依字幕核對(2026-10-12):全篇依這支錄影的英文字幕逐段對照,時間區段取自字幕時間戳;未看板書畫面,公式依主講義第 14、15 章還原,字幕明顯聽錯的地方(例如把 linear head 聽成 linear hat)已照講義更正。
參考資料