L5.3 一個生成模型好不好,該用哪一個數字回答?
本篇重用M5.1用錯的機率表下注一年會多輸多少:KL Divergence 與 Cross-Entropy·M6.1兩個城市的人口分佈差多少:W₂ 距離
起點:一個被悄悄做掉的化約
要怎麼替「這個模型有多符合資料」打一個分數?、當那個要加總的量算不出來,可以退到哪裡?、一個高維的機率,能不能拆成一串一維的機率? 三篇做的是同一件事:把「模型好不好」化約成一個數字——似然,或者它的一個下界。
這個化約有很好的理由。似然等於到經驗分布的 KL 加一個常數,而 KL 為零表示分布完全相同。所以理論上,似然夠高就等於模型夠對。
但「理論上」這三個字在這裡做了很多工作。 前面幾個 class 一直在強調同一件事:一個指標在數學上正確,不代表它在你的實際數量級上有用(同一個實驗跑三次結果都不同,該報哪一個? 的 抖動、該收資料、換模型,還是多訓幾輪:學習曲線 的不可約誤差地板都是這個主題)。這一篇要問的是:在真實的維度與真實的模型差距下,似然的解析度夠不夠?
一個模型的每維 log-likelihood 只比另一個低 ,
它抽出來的樣本卻有百分之一是純雜訊——
這時候哪一個數字在說謊?
課堂提問Q1
先不要問「用哪個指標」,問一個更前面的問題:我們到底要求一個生成模型做到什麼? 列出至少三件互相獨立的事,並且對每一件,造一個把其他兩件都做滿分、卻在這一件上完全失敗的模型。如果造得出來,那就證明了一個數字蓋不住。
先想一想,再展開看整理後的答案
三件事。
- 保真度(fidelity):抽出來的東西要像真的——落在真實分布有質量的地方。
- 涵蓋度(coverage):真實分布的每一塊都要抽得到,不能只會生一種。
- 新穎性(novelty):抽出來的不能是訓練資料本身。
三個反例,每一個都在兩項滿分、一項零分。
- 失去保真度:把一個完美的模型與一點點純雜訊混起來,。涵蓋度完美(真模型的部分原封不動),新穎性完美(雜訊當然不是訓練資料),但每抽一百次就有一張是垃圾。第二節量這個。
- 失去涵蓋度:只學會真實分布的一個 mode。保真度完美(生出來的每一張都在高密度區),新穎性完美(不是背的),但整個分布錯了。第三節量這個。
- 失去新穎性:把訓練集存起來,抽樣時隨機吐一筆。保真度滿分(生出來的每一筆都是真的資料),涵蓋度在訓練集上滿分,但它什麼都沒學到。第四節量這個。
三個反例都存在,所以任何單一數字都一定會在某一個方向上瞎掉。 剩下的問題只是:哪一個數字對哪一個方向瞎? 而這比「哪個指標最好」有用得多,因為它決定了你該搭配哪幾個數字。
先猜一下似然的答案。 似然算的是「模型在真實資料點上給多少密度」。所以:
- 模型漏掉真實分布的一塊 → 那一塊的資料點密度很低 → 很大 → 抓得到。
- 模型在真實資料以外的地方亂放密度 → 真實資料點上的密度只被正規化稀釋一點點 → 幾乎抓不到。
似然是不對稱的,而第二、三節就是把這個不對稱量出來。
似然對「生出垃圾」幾乎是盲的
把第一個反例做成實測。真模型是 維的 ,壞模型是
也就是 的機率完全正確、 的機率吐出一個標準差大一百倍的雜訊。、兩萬個測試樣本:
真模型 每維 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
差距是 nats/dim,也就是相對誤差 。 任何真實的模型比較裡,這個數字會被淹沒在 同一個實驗跑三次結果都不同,該報哪一個? 的種子抖動裡,讀都讀不出來。
而同一個模型抽出來的樣本:
真模型的樣本 範數 ≈ 10 (= √d)
混雜訊的樣本 99% 的範數 ≈ 10,1% 的範數 ≈ 100
每一百張圖裡有一張是純雜訊,而那件事在似然上值 。
這不是巧合,它有一個乾淨的界。因為 處處成立,
實測的 就精確地踩在這個上界上()。
在 維裡混進 比例的垃圾,每維的 log-likelihood 最多只掉 ;維度越高,這個代價越接近零。
注意這個界的結構:分子只跟垃圾的比例有關、分母是維度。所以維度越高,似然越瞎。在 的玩具上似然看起來很敏感,到了 的圖片上, 的垃圾只值 nats/dim。
注意反過來的方向會被抓到,而且抓得很兇
上面的界之所以成立,是因為加東西不會讓真實資料點的密度掉太多——最多被正規化稀釋 倍。
拿掉東西就完全不同。 如果模型在某一塊真實資料存在的地方把密度壓到 ,那些點的 直接變成 ,沒有上界。 時是 ,也就是 要怎麼替「這個模型有多符合資料」打一個分數? 第一節那個「宣告不可能的事發生了」。
所以似然的不對稱可以一句話講完:它對「多生了不該生的」幾乎免疫,對「漏掉了該生的」極度敏感。 而這剛好是很多人直覺的反面——大家看樣本,樣本只會告訴你前者。
反過來:樣本漂亮,分布全錯
第二個反例。同樣的一維雙峰資料(兩個 mode 在 ),三個模型:
- 誠實模型:真的學會了整個分布。
- 只學到一個 mode:——每一個樣本都落在真實資料的高密度區,而且比真實資料更集中。
- (第三個模型留到下一節。)
只學一個 mode 誠實模型
到最近訓練點的距離 0.0078 0.0157 ← 「看起來更真」
W1(模型, 測試集) 1.6929 0.0430 ← 分布整個錯
覆蓋率(測試點 0.3 內有樣本) 0.410 1.000
測試資料的 log-likelihood -43.325 -1.700
第一列是陷阱。 用「樣本離真實資料多近」來評分,這個壞模型贏了——它的樣本比誠實模型的樣本更接近訓練資料,因為它把所有質量堆在一個高密度的小區域裡。任何只看「生出來的東西像不像真的」的評估都會給它高分。
後三列把它抓出來,而且三個都抓得到。特別是 log-likelihood 從 掉到 ——這是第二節那個 Remark 說的「拿掉東西沒有上界」:另一個 mode 附近的測試資料在這個模型下密度幾乎是零,每一個那樣的點都貢獻一個巨大的 。
所以似然和樣本品質的關係是這樣的:
| 失敗模式 | 看樣本 | 看似然 |
|---|---|---|
| 多生了不該生的( 垃圾) | 看得見 | 幾乎看不見() |
| 漏掉了該生的(只學一個 mode) | 看不見(樣本更漂亮) | 看得非常清楚() |
看樣本與看似然不是同一件事的兩種做法,它們各自對另一種失敗瞎掉——所以兩個都要看。
展開細節這也解釋了「調低取樣溫度會讓樣本變好看」
把取樣分布換成 ()會把質量往高密度區集中。結果是:樣本的保真度上升(更少的意外),覆蓋度下降(罕見的模式抽不到了)。
這正是上表第二列的受控版本——只是程度可調。而它的評估後果很具體:只報樣本品質的比較,可以靠調低溫度贏,那不代表模型變好了。所以報告取樣的超參數(溫度、guidance 強度、top-)和報告種子數一樣,是結果的一部分而不是實作細節。
要同時看到兩面,做法是掃一條曲線而不是報一個點:把溫度從低掃到高,同時記錄保真度與涵蓋度兩個量,得到一條取捨曲線。兩個模型要比較,比的是整條曲線——一個模型的曲線如果整條在另一個外側,才是真的比較好;曲線交叉則表示它們各有擅長的操作點。
第三個失敗:它其實什麼都沒學
前兩節的兩個數字(樣本品質、似然)湊起來,已經擋掉了兩種失敗。但還有一種,而且它兩個都躲得過。
把訓練集存起來,抽樣時隨機吐一筆。 保真度滿分——生出來的每一筆都是真的資料。似然?如果用一個核密度估計去讀,它在訓練資料附近的密度極高。
實測。 的訓練集,比較三個東西:
W1(model, train) W1(model, test)
背訓練集的模型 0.0172 0.1249
誠實模型 0.0918 0.0430
兩欄的排序完全相反。 在訓練集上,背訓練集的模型好五倍;在測試集上,誠實模型好三倍。這是 老師用考古題教學又出題:為什麼要切資料 在生成模型上的版本,而且是逐字相同的教訓:任何對訓練集算出來的距離都不是評估。
值得注意的是誠實模型的 ——它對訓練集「比較差」,而那正是它學對了的證據:訓練集本身只是真實分布的一個 的抽樣,貼著它就是貼著抽樣噪聲。
但光換成測試集還不夠。 一個背了訓練集又加一點點抖動的模型,在測試集上的分布距離可以很不錯,卻仍然是在重放別人的資料。要抓它需要第三個數字:
平均「到最近訓練點的距離」
背訓練集的模型 0.00000
誠實模型 0.01568
真實的測試資料 0.01603 ← 參考點
最後一列是這張表的關鍵。 「樣本離訓練資料多近」這個量沒有一個理想值是零——零表示在背。它的理想值是真實的新資料離訓練資料多近,也就是 。誠實模型的 幾乎正中那個參考點。
「離訓練資料多近」的理想值不是零,是真實的新資料離訓練資料多近;比那個近就是在背,比那個遠就是還沒學會。
這件事在實務上不只是學術問題。 真實的生成模型確實會記住訓練資料的片段,而那牽涉到隱私與授權——一個把病歷或有版權的圖片原樣吐出來的模型,指標再漂亮也不能上線。所以這個檢查通常不是「錦上添花」,而是一個硬性的門檻。
三種失敗,三組數字
互動 demo:摻 1% 垃圾只多 0.0066 nat 卻毀掉樣本;塌成單一模式樣本好看卻多出 43.9 nats。
回到情境:一套可以照做的評估
把三節合成一份清單。
- 至少三個數字,每一個守一個方向。 一個分布距離(在held-out 上算:、FID 這一類)、一個似然或其下界、一個新穎性檢查(到最近訓練點的距離,與真實 held-out 資料的同一個量並排)。少一個就有一整類失敗看不見。
- 似然不能跨模型族比。 三個獨立的理由:ELBO 有大小不明的缺口(當那個要加總的量算不出來,可以退到哪裡?);連續模型的密度值依賴離散化/dequantization 的慣例,換一個慣例就換一個數字;而第二節已經證明它的解析度在高維度下對某些失敗根本不夠。
- 報取樣的超參數。 溫度、guidance 強度、top- 都會沿著保真度/涵蓋度的取捨曲線移動,所以「哪個模型比較好」在沒有指定操作點的情況下是沒有意義的問題。可以的話報整條曲線。
- 報種子數與抖動。 同一個實驗跑三次結果都不同,該報哪一個? 的規則在這裡不變,而且更重要——分布距離這類指標的估計本身就有抖動(它們是從有限樣本算出來的)。
- 人看一眼。 前面每一個數字都是一個 proxy,而 proxy 最危險的時候是模型找到了繞過它的路。隨機抽二十個樣本親自看,是唯一不會被繞過的檢查。
這一切依賴什麼。
一,held-out 資料真的沒被碰過。生成模型的訓練資料常常來自大規模的爬取,而測試集可能就在裡面——那時候所有的數字都在量記憶力。
二,特徵空間的選擇。FID 這類指標是在一個預訓練特徵抽取器的空間裡算距離的,所以它量的是「在那個特徵空間裡的差異」。對那個抽取器不敏感的缺陷,指標也不敏感。
三,「好」的定義本身依賴用途。做資料增強時涵蓋度最重要,做創作工具時保真度最重要,做醫療或法律應用時新穎性(不能重放訓練資料)是硬門檻。上面那份清單給的是三個方向都量到,怎麼加權是應用的問題,不是指標的問題。
先消化一下
參考文獻
- Theis, L., van den Oord, A. & Bethge, M. A note on the evaluation of generative models. ICLR 2016.(本篇第二節那個混雜訊的論證與 的界,以及似然與樣本品質可以任意脫鉤的建構。)
- Sajjadi, M., Bachem, O., Lucic, M., Bousquet, O. & Gelly, S. Assessing Generative Models via Precision and Recall. NeurIPS 2018.(把「保真度」與「涵蓋度」拆成兩個數字,並說明單一分數為何無法區分兩種失敗。)
- Carlini, N. et al. Extracting Training Data from Diffusion Models. USENIX Security 2023.(第四節那個新穎性檢查在真實模型上的後果。)