L5.3 19 分鐘閱讀 2026年9月

L5.3 一個生成模型好不好,該用哪一個數字回答?

本篇重用M5.1用錯的機率表下注一年會多輸多少:KL Divergence 與 Cross-Entropy·M6.1兩個城市的人口分佈差多少:W₂ 距離

起點:一個被悄悄做掉的化約

要怎麼替「這個模型有多符合資料」打一個分數?當那個要加總的量算不出來,可以退到哪裡?一個高維的機率,能不能拆成一串一維的機率? 三篇做的是同一件事:把「模型好不好」化約成一個數字——似然,或者它的一個下界。

這個化約有很好的理由。似然等於到經驗分布的 KL 加一個常數,而 KL 為零表示分布完全相同。所以理論上,似然夠高就等於模型夠對。

但「理論上」這三個字在這裡做了很多工作。 前面幾個 class 一直在強調同一件事:一個指標在數學上正確,不代表它在你的實際數量級上有用(同一個實驗跑三次結果都不同,該報哪一個?29%29\% 抖動、該收資料、換模型,還是多訓幾輪:學習曲線 的不可約誤差地板都是這個主題)。這一篇要問的是:在真實的維度與真實的模型差距下,似然的解析度夠不夠?

一個模型的每維 log-likelihood 只比另一個低 0.007%0.007\%
它抽出來的樣本卻有百分之一是純雜訊——
這時候哪一個數字在說謊?

課堂提問Q1

先不要問「用哪個指標」,問一個更前面的問題:我們到底要求一個生成模型做到什麼? 列出至少三件互相獨立的事,並且對每一件,造一個把其他兩件都做滿分、卻在這一件上完全失敗的模型。如果造得出來,那就證明了一個數字蓋不住。

先想一想,再展開看整理後的答案

三件事。

  1. 保真度(fidelity):抽出來的東西要像真的——落在真實分布有質量的地方。
  2. 涵蓋度(coverage):真實分布的每一塊都要抽得到,不能只會生一種。
  3. 新穎性(novelty):抽出來的不能是訓練資料本身

三個反例,每一個都在兩項滿分、一項零分。

  • 失去保真度:把一個完美的模型與一點點純雜訊混起來,p=(1ε)p+εnoisep'=(1-\varepsilon)p+\varepsilon\,\text{noise}。涵蓋度完美(真模型的部分原封不動),新穎性完美(雜訊當然不是訓練資料),但每抽一百次就有一張是垃圾。第二節量這個。
  • 失去涵蓋度:只學會真實分布的一個 mode。保真度完美(生出來的每一張都在高密度區),新穎性完美(不是背的),但整個分布錯了。第三節量這個。
  • 失去新穎性:把訓練集存起來,抽樣時隨機吐一筆。保真度滿分(生出來的每一筆都是真的資料),涵蓋度在訓練集上滿分,但它什麼都沒學到。第四節量這個。

三個反例都存在,所以任何單一數字都一定會在某一個方向上瞎掉。 剩下的問題只是:哪一個數字對哪一個方向瞎? 而這比「哪個指標最好」有用得多,因為它決定了你該搭配哪幾個數字。

先猜一下似然的答案。 似然算的是「模型在真實資料點上給多少密度」。所以:

  • 模型漏掉真實分布的一塊 → 那一塊的資料點密度很低 → logp-\log p 很大 → 抓得到
  • 模型在真實資料以外的地方亂放密度 → 真實資料點上的密度只被正規化稀釋一點點 → 幾乎抓不到

似然是不對稱的,而第二、三節就是把這個不對稱量出來。

似然對「生出垃圾」幾乎是盲的

把第一個反例做成實測。真模型是 dd 維的 N(0,I)\mathcal N(0,I),壞模型是

p=(1ε)N(0,I)+εN(0,100I),p'=(1-\varepsilon)\,\mathcal N(0,I)+\varepsilon\,\mathcal N(0,100\,I),

也就是 99%99\% 的機率完全正確、1%1\% 的機率吐出一個標準差大一百倍的雜訊。d=100d=100、兩萬個測試樣本:

  真模型    每維 log-likelihood = -1.418756 nats/dim
  混雜訊    每維 log-likelihood = -1.418856 nats/dim
  差距 = 0.000101 nats/dim   (整份 100 維總共 0.0101 nats)
  理論上界 = -ln(0.99)/d = 0.000101 nats/dim

差距是 0.00010.0001 nats/dim,也就是相對誤差 0.007%0.007\% 任何真實的模型比較裡,這個數字會被淹沒在 同一個實驗跑三次結果都不同,該報哪一個? 的種子抖動裡,讀都讀不出來。

而同一個模型抽出來的樣本:

  真模型的樣本   範數 ≈ 10   (= √d)
  混雜訊的樣本   99% 的範數 ≈ 10,1% 的範數 ≈ 100

每一百張圖裡有一張是純雜訊,而那件事在似然上值 0.007%0.007\%

這不是巧合,它有一個乾淨的界。因為 p(1ε)pp'\ge(1-\varepsilon)p 處處成立,

logp(x)  logp(x)+log(1ε)E[logp]E[logp]d  ln(1ε)d.\log p'(x)\ \ge\ \log p(x)+\log(1-\varepsilon) \quad\Longrightarrow\quad \frac{\mathbb E[\log p]-\mathbb E[\log p']}{d}\ \le\ \frac{-\ln(1-\varepsilon)}{d}.

實測的 0.0001010.000101 就精確地踩在這個上界上(ln0.99/100=0.0001005-\ln 0.99/100=0.0001005)。

dd 維裡混進 ε\varepsilon 比例的垃圾,每維的 log-likelihood 最多只掉 ln(1ε)/d-\ln(1-\varepsilon)/d;維度越高,這個代價越接近零。

注意這個界的結構:分子只跟垃圾的比例有關、分母是維度。所以維度越高,似然越瞎。在 d=1d=1 的玩具上似然看起來很敏感,到了 d=3072d=3072 的圖片上,10%10\% 的垃圾只值 0.00003430.0000343 nats/dim。

注意反過來的方向會被抓到,而且抓得很兇

上面的界之所以成立,是因為加東西不會讓真實資料點的密度掉太多——最多被正規化稀釋 (1ε)(1-\varepsilon) 倍。

拿掉東西就完全不同。 如果模型在某一塊真實資料存在的地方把密度壓到 δ\delta,那些點的 logp-\log p 直接變成 log(1/δ)\log(1/\delta),沒有上界。δ0\delta\to0 時是 ++\infty,也就是 要怎麼替「這個模型有多符合資料」打一個分數? 第一節那個「宣告不可能的事發生了」。

所以似然的不對稱可以一句話講完:它對「多生了不該生的」幾乎免疫,對「漏掉了該生的」極度敏感。 而這剛好是很多人直覺的反面——大家看樣本,樣本只會告訴你前者。

反過來:樣本漂亮,分布全錯

第二個反例。同樣的一維雙峰資料(兩個 mode 在 ±1.5\pm1.5),三個模型:

  • 誠實模型:真的學會了整個分布。
  • 只學到一個 modeN(1.5,0.22)\mathcal N(1.5,0.2^2)——每一個樣本都落在真實資料的高密度區,而且比真實資料更集中。
  • (第三個模型留到下一節。)
                          只學一個 mode    誠實模型
  到最近訓練點的距離          0.0078        0.0157      ← 「看起來更真」
  W1(模型, 測試集)            1.6929        0.0430      ← 分布整個錯
  覆蓋率(測試點 0.3 內有樣本) 0.410        1.000
  測試資料的 log-likelihood   -43.325       -1.700

第一列是陷阱。 用「樣本離真實資料多近」來評分,這個壞模型贏了——它的樣本比誠實模型的樣本更接近訓練資料,因為它把所有質量堆在一個高密度的小區域裡。任何只看「生出來的東西像不像真的」的評估都會給它高分。

後三列把它抓出來,而且三個都抓得到。特別是 log-likelihood 從 1.700-1.700 掉到 43.325-43.325——這是第二節那個 Remark 說的「拿掉東西沒有上界」:另一個 mode 附近的測試資料在這個模型下密度幾乎是零,每一個那樣的點都貢獻一個巨大的 logp-\log p

所以似然和樣本品質的關係是這樣的

失敗模式看樣本看似然
多生了不該生的(1%1\% 垃圾)看得見幾乎看不見(0.007%0.007\%
漏掉了該生的(只學一個 mode)看不見(樣本更漂亮)看得非常清楚1.743.3-1.7\to-43.3

看樣本與看似然不是同一件事的兩種做法,它們各自對另一種失敗瞎掉——所以兩個都要看。

展開細節這也解釋了「調低取樣溫度會讓樣本變好看」

把取樣分布換成 p1/Tp^{1/T}T<1T<1)會把質量往高密度區集中。結果是:樣本的保真度上升(更少的意外),覆蓋度下降(罕見的模式抽不到了)。

這正是上表第二列的受控版本——只是程度可調。而它的評估後果很具體:只報樣本品質的比較,可以靠調低溫度贏,那不代表模型變好了。所以報告取樣的超參數(溫度、guidance 強度、top-pp)和報告種子數一樣,是結果的一部分而不是實作細節。

要同時看到兩面,做法是掃一條曲線而不是報一個點:把溫度從低掃到高,同時記錄保真度與涵蓋度兩個量,得到一條取捨曲線。兩個模型要比較,比的是整條曲線——一個模型的曲線如果整條在另一個外側,才是真的比較好;曲線交叉則表示它們各有擅長的操作點。

第三個失敗:它其實什麼都沒學

前兩節的兩個數字(樣本品質、似然)湊起來,已經擋掉了兩種失敗。但還有一種,而且它兩個都躲得過。

把訓練集存起來,抽樣時隨機吐一筆。 保真度滿分——生出來的每一筆都是真的資料。似然?如果用一個核密度估計去讀,它在訓練資料附近的密度極高。

實測。n=200n=200 的訓練集,比較三個東西:

                          W1(model, train)   W1(model, test)
  背訓練集的模型              0.0172             0.1249
  誠實模型                    0.0918             0.0430

兩欄的排序完全相反。 在訓練集上,背訓練集的模型好五倍;在測試集上,誠實模型好三倍。這是 老師用考古題教學又出題:為什麼要切資料 在生成模型上的版本,而且是逐字相同的教訓:任何對訓練集算出來的距離都不是評估

值得注意的是誠實模型的 W1(,train)=0.0918W_1(\cdot,\text{train})=0.0918——它對訓練集「比較差」,而那正是它學對了的證據:訓練集本身只是真實分布的一個 n=200n=200 的抽樣,貼著它就是貼著抽樣噪聲。

但光換成測試集還不夠。 一個背了訓練集又加一點點抖動的模型,在測試集上的分布距離可以很不錯,卻仍然是在重放別人的資料。要抓它需要第三個數字:

  平均「到最近訓練點的距離」
    背訓練集的模型      0.00000
    誠實模型            0.01568
    真實的測試資料      0.01603   ← 參考點

最後一列是這張表的關鍵。 「樣本離訓練資料多近」這個量沒有一個理想值是零——零表示在背。它的理想值是真實的新資料離訓練資料多近,也就是 0.016030.01603。誠實模型的 0.015680.01568 幾乎正中那個參考點。

「離訓練資料多近」的理想值不是零,是真實的新資料離訓練資料多近;比那個近就是在背,比那個遠就是還沒學會。

這件事在實務上不只是學術問題。 真實的生成模型確實會記住訓練資料的片段,而那牽涉到隱私與授權——一個把病歷或有版權的圖片原樣吐出來的模型,指標再漂亮也不能上線。所以這個檢查通常不是「錦上添花」,而是一個硬性的門檻。

三種失敗,三組數字

互動 demo:摻 1% 垃圾只多 0.0066 nat 卻毀掉樣本;塌成單一模式樣本好看卻多出 43.9 nats。

回到情境:一套可以照做的評估

把三節合成一份清單。

  1. 至少三個數字,每一個守一個方向。 一個分布距離(在held-out 上算:W1W_1、FID 這一類)、一個似然或其下界、一個新穎性檢查(到最近訓練點的距離,與真實 held-out 資料的同一個量並排)。少一個就有一整類失敗看不見。
  2. 似然不能跨模型族比。 三個獨立的理由:ELBO 有大小不明的缺口(當那個要加總的量算不出來,可以退到哪裡?);連續模型的密度值依賴離散化/dequantization 的慣例,換一個慣例就換一個數字;而第二節已經證明它的解析度在高維度下對某些失敗根本不夠。
  3. 報取樣的超參數。 溫度、guidance 強度、top-pp 都會沿著保真度/涵蓋度的取捨曲線移動,所以「哪個模型比較好」在沒有指定操作點的情況下是沒有意義的問題。可以的話報整條曲線。
  4. 報種子數與抖動。 同一個實驗跑三次結果都不同,該報哪一個? 的規則在這裡不變,而且更重要——分布距離這類指標的估計本身就有抖動(它們是從有限樣本算出來的)。
  5. 人看一眼。 前面每一個數字都是一個 proxy,而 proxy 最危險的時候是模型找到了繞過它的路。隨機抽二十個樣本親自看,是唯一不會被繞過的檢查。

這一切依賴什麼。

一,held-out 資料真的沒被碰過。生成模型的訓練資料常常來自大規模的爬取,而測試集可能就在裡面——那時候所有的數字都在量記憶力。

二,特徵空間的選擇。FID 這類指標是在一個預訓練特徵抽取器的空間裡算距離的,所以它量的是「在那個特徵空間裡的差異」。對那個抽取器不敏感的缺陷,指標也不敏感。

三,「好」的定義本身依賴用途。做資料增強時涵蓋度最重要,做創作工具時保真度最重要,做醫療或法律應用時新穎性(不能重放訓練資料)是硬門檻。上面那份清單給的是三個方向都量到,怎麼加權是應用的問題,不是指標的問題

先消化一下

想一想

d=100d=100 的實測裡,混進 1%1\% 雜訊只讓每維 log-likelihood 掉 0.0001010.000101 nats。下列哪一句最準確地說明這件事?

想一想

「只學到一個 mode」的模型,樣本到最近訓練點的平均距離是 0.00780.0078,比誠實模型的 0.01570.0157 還小。這說明:

想一想

第四節的表裡,誠實模型的樣本到最近訓練點的距離是 0.015680.01568,真實測試資料是 0.016030.01603。如果有一個模型這個數字是 0.0040.004,最合理的判讀是:

想一想

下列哪一句不對

參考文獻

  1. Theis, L., van den Oord, A. & Bethge, M. A note on the evaluation of generative models. ICLR 2016.(本篇第二節那個混雜訊的論證與 log(1ε)-\log(1-\varepsilon) 的界,以及似然與樣本品質可以任意脫鉤的建構。)
  2. Sajjadi, M., Bachem, O., Lucic, M., Bousquet, O. & Gelly, S. Assessing Generative Models via Precision and Recall. NeurIPS 2018.(把「保真度」與「涵蓋度」拆成兩個數字,並說明單一分數為何無法區分兩種失敗。)
  3. Carlini, N. et al. Extracting Training Data from Diffusion Models. USENIX Security 2023.(第四節那個新穎性檢查在真實模型上的後果。)