搜尋課程與筆記

搜尋筆記

輸入主題、關鍵字或單元編號,例如 Flow Matching、U4。

    按 Esc 關閉 · ⌘ / Ctrl K 開啟搜尋

    L5.0 19 分鐘閱讀 2026年10月

    L5.0 要怎麼替「這個模型有多符合資料」打一個分數?

    本篇重用2 篇

    沒有真實分布,怎麼比較機率模型?

    前面五個 class 都在做同一件事:給一個 xx,猜一個 yy,然後用某個損失檢查那個猜測有多準。台北的房仲去台中:風險與經驗風險 把「準」定義成風險,老師用考古題教學又出題:為什麼要切資料 說明那個數字要在哪份資料上讀,同一個實驗跑三次結果都不同,該報哪一個? 說明它自己也會抖。

    現在換一個目標。想像要預測明天會收到哪一類訂單,我們不只報出最可能的類別,還想給每一類一個機率。模型給出的就是一個分布 pθp_\theta。

    這個換法會立刻遇到一個問題。猜 yy 的時候,「猜得準不準」有現成的意思:yy 就在那裡,比一下就知道。但一個分布要怎麼跟資料比?資料只是一堆點,它沒有附上一條密度曲線讓你對照。

    一個模型說「這件事的機率是 0.70.7」,另一個說 0.90.9,
    而這件事發生了——後者一定比較好嗎?
    如果有一個模型說機率是 00,它該被扣多少分?

    課堂提問Q1

    先用模型給這整份資料的 likelihood 比較模型。如果還希望把乘積轉成可加、且不改變大小排序的分數,取對數為什麼是自然的做法?

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

    從可加性開始。 如果 x1,…,xnx_1,\dots,x_n 獨立,模型給這整份資料的機率是乘積:

    pθ(x1,…,xn)=∏i=1npθ(xi).p_\theta(x_1,\dots,x_n)=\prod_{i=1}^n p_\theta(x_i).

    這個量叫似然(likelihood)。它已經是一個合理的分數了——模型給實際發生的事越高的機率,這個乘積越大。但它有兩個毛病。

    第一個毛病是數值。 一千筆資料、每筆機率 0.10.1,乘起來是 10−100010^{-1000},浮點數直接變成 00。任何比較都做不下去。

    第二個毛病是形狀。 我們想要的是可加的分數,這樣它才能跟 台北的房仲去台中:風險與經驗風險 的經驗風險長得一樣、才能用 民調只問一千人:小批次與噪聲 的小批次無偏估計、才能丟給 霧中下山,一步該走多大:梯度下降的一頁。

    兩個毛病同一個解法:取對數。乘積變加總,10−100010^{-1000} 變成 −2302.6-2302.6:

    log⁡pθ(x1:n)=∑i=1nlog⁡pθ(xi).\log p_\theta(x_{1:n})=\sum_{i=1}^n \log p_\theta(x_i).

    更具體地說,如果對 likelihood 的連續轉換 ff 要滿足 f(ab)=f(a)+f(b)f(ab)=f(a)+f(b),它就是 f(t)=clog⁡tf(t)=c\log t;要保持大小排序,再取 c>0c>0。這是對「likelihood 如何轉換」的限制,不代表所有逐筆相加的評分方式都只能是 log loss。

    最後加一個負號與除以 nn,把它變成一個要最小化的、和樣本數無關的量——平均負對數似然(average negative log-likelihood,NLL):

    L(θ)=−1n∑i=1nlog⁡pθ(xi).\mathcal L(\theta)=-\frac1n\sum_{i=1}^n \log p_\theta(x_i).

    回到 Ask 的第三問。 對離散事件,模型若給觀測到的類別零機率,那一項就是 −log⁡0=+∞-\log0=+\infty。Log loss 對這種「把會發生的事判成不可能」的預測給出無限懲罰。

    補充連續情況代入的是 density,不是某一點的機率

    若 XX 連續,P(X=x)=0P(X=x)=0 並不代表模型出錯;likelihood 代入的是 density pθ(x)p_\theta(x)。它描述附近小區間的機率約為 pθ(x) dxp_\theta(x)\,\mathrm dx,可以大於 11,所以連續資料的 NLL 也可以是負的。比較時要使用相同的變數與單位。

    那個數字其實是兩個數字

    平均 NLL 有一個分解,而那個分解把「模型好不好」拆成兩件可以分開讀的事。

    先看離散資料。把資料寫成經驗分布 p^\hat p,也就是各類別出現的比例。加上再減掉 ∑xp^(x)log⁡p^(x)\sum_x\hat p(x)\log\hat p(x),得到

    L(θ)=−∑xp^(x)log⁡pθ(x)=−∑xp^(x)log⁡p^(x)⏟經驗分布的熵 H(p^)+∑xp^(x)log⁡p^(x)pθ(x)⏟KL(p^ ∥ pθ).\mathcal L(\theta)=-\sum_x \hat p(x)\log p_\theta(x) =\underbrace{-\sum_x \hat p(x)\log \hat p(x)}_{\text{經驗分布的熵 } H(\hat p)} +\underbrace{\sum_x \hat p(x)\log\frac{\hat p(x)}{p_\theta(x)}}_{\mathrm{KL}(\hat p\,\Vert\,p_\theta)}.

    左邊是你能算的、會拿去最小化的數字。右邊拆成兩項:

    實測。六個符號、真實機率 (0.05,0.10,0.15,0.20,0.22,0.28)(0.05,0.10,0.15,0.20,0.22,0.28),抽 nn 筆之後算三個數字:

    n=  30   MLE 的平均 NLL 1.4752 = 經驗分布的熵 1.4752
             均勻模型的平均 NLL 1.7918 = 熵 1.4752 + KL(經驗‖均勻) 0.3165 = 1.7918
    n= 300   MLE 的平均 NLL 1.6942 = 經驗分布的熵 1.6942
             均勻模型的平均 NLL 1.7918 = 熵 1.6942 + KL(經驗‖均勻) 0.0975 = 1.7918
    n=3000   MLE 的平均 NLL 1.6782 = 經驗分布的熵 1.6782
             均勻模型的平均 NLL 1.7918 = 熵 1.6782 + KL(經驗‖均勻) 0.1136 = 1.7918

    MLE 那一列的 KL 恰好是零。 因為六個符號的模型族包含所有分布,所以「模型族裡 KL 最近的成員」就是經驗分布本身,NLL 就等於經驗熵,一位小數都不差。

    均勻模型的 NLL 永遠是 log⁡6=1.7918\log 6=1.7918,和 nn 完全無關。 它不看資料,所以資料再多也不會變。

    這三次抽樣的經驗熵逐漸接近真實熵 1.67841.6784,但單次抽樣的數值不必隨 nn 單調上升。有限樣本的 plug-in entropy 在期望下偏低:它把機率估計的波動也算成了資料的集中程度。

    最大似然不是在找「對的分布」,而是在模型族裡找一個離經驗分布 KL 最近的成員。

    這句話在上面的離散模型中成立,也提醒我們兩個限制:模型族能表達什麼,以及這批資料能代表真實分布到什麼程度。兩者分別對應模型限制與抽樣誤差,但不等於直接完成了一個 bias–variance decomposition。

    補充連續資料要分清 population 與 empirical objective

    對有共同基準測度、且各項有限的真實 density pp,仍有

    EX∼p[−log⁡pθ(X)]=H(p)+KL(p∥pθ).\mathbb E_{X\sim p}[-\log p_\theta(X)] =H(p)+\mathrm{KL}(p\Vert p_\theta).

    樣本平均 NLL 是左邊的估計。但連續資料的 empirical distribution 是點質量,而 pθp_\theta 通常有連續 density;兩者之間的 KL 是無限大。因此不能把有限的 sample NLL 直接寫成「連續 empirical entropy 加 empirical KL」。

    一個數字,兩個部分

    圖說: 均勻模型的 NLL 總高固定;MLE 把 KL 壓成零,也會完整吸收有限樣本造成的經驗熵誤差。

    Gaussian 假設就是最小平方

    差一度與差十度:損失函數是一種宣告 說過:選一個損失就是在宣告你在乎什麼。那一篇把這句話停在直覺的層次。似然把它講完整了——那個宣告有一個具體的身分:你假設噪聲長什麼樣。

    回到監督式的設定。假設

    y=fθ(x)+ε,ε∼N(0,σ2),y = f_\theta(x)+\varepsilon,\qquad \varepsilon\sim\mathcal N(0,\sigma^2),

    那麼 pθ(y∣x)=N(y;fθ(x),σ2)p_\theta(y\mid x)=\mathcal N(y;f_\theta(x),\sigma^2),把負對數似然寫開(兩台體重計:Gaussian 的線性組合):

    −log⁡pθ(y∣x)=(y−fθ(x))22σ2+12log⁡(2πσ2).-\log p_\theta(y\mid x)=\frac{(y-f_\theta(x))^2}{2\sigma^2}+\frac12\log(2\pi\sigma^2).

    若 σ2>0\sigma^2>0 固定,第二項不含 θ\theta,所以最小化這個 NLL 和最小化平方誤差是同一件事。這給 MSE 一個 likelihood 解釋,但不是使用 MSE 的必要前提:只要二次動差有限,即使噪聲不是 Gaussian,L2 的理想最佳解仍是 conditional mean。

    換一個噪聲假設就換一個損失。拉普拉斯分布 p(ε)∝e−∣ε∣/bp(\varepsilon)\propto e^{-|\varepsilon|/b} 給出

    −log⁡pθ(y∣x)=∣y−fθ(x)∣b+const,-\log p_\theta(y\mid x)=\frac{|y-f_\theta(x)|}{b}+\text{const},

    也就是最小絕對值誤差。而最小平方的解是平均數、最小絕對值的解是中位數——兩個大家都知道、看起來只是「不同的統計量」的東西,在這裡變成同一個框架下的兩個不同宣告。

    實測。這次要估的是未受污染那群資料的中心 00;觀測資料則是 95%95\% 的 N(0,1)\mathcal N(0,1) 加上 5%5\% 位於 +20+20 的離群點。取 n=200n=200,重複 2000 次:

    95% N(0,1) + 5% 離群點 :
      Gaussian 假設 → 最小平方 → 平均數 :   估計 +0.9965 ± 0.3165   均方誤差 1.0932
      拉普拉斯假設 → 最小絕對值 → 中位數 : 估計 +0.0661 ± 0.0965   均方誤差 0.0137
    
    純 N(0,1),沒有離群點 :
      平均數  均方誤差 0.005007
      中位數  均方誤差 0.007799      (比值 1.5578,理論 π/2 = 1.5708)

    上半的平均數接近 11,因為污染後的分布平均就是 0.95×0+0.05×20=10.95\times0+0.05\times20=1。它沒有算錯,而是在估另一個量。若目標是原來那群人的中心 00,中位數受少數離群點的影響較小。

    下半是「假設對了」的回報:沒有離群點時,反而是最小平方比較好,比值 1.55781.5578 幾乎正中理論值 π/2\pi/2。那 57%57\% 的額外均方誤差是你為了防範離群點而付的保險費。

    選 loss 時,要先決定想估哪個量;likelihood 則讓我們看見這個選擇對應的機率模型。

    補充這也解釋了為什麼分類用交叉熵而不是 MSE

    分類的輸出是一個類別分布。把「模型給正確類別的機率」取負對數,就是大家熟知的交叉熵損失——它就是本篇的平均 NLL,只是換了一個名字。

    MSE 配 one-hot 也可以用:對機率向量而言,它就是 Brier score,理想最佳解同樣是真實類別機率,不必把標籤解讀成 Gaussian。差別之一在最佳化:softmax 配交叉熵對 logit 的梯度是 p^−y\hat p-y;配 MSE 則多乘 softmax Jacobian。模型信心很高卻答錯時,後者的梯度可能很小,前者仍保留明顯的修正訊號。

    展開細節softmax + 交叉熵對 logit 的梯度

    設 logit 為 z∈RKz\in\mathbb R^K,p^k=ezk/∑jezj\hat p_k=e^{z_k}/\sum_j e^{z_j},標籤是類別 cc。損失 L=−log⁡p^c\mathcal L=-\log\hat p_c。

    ∂L∂zk=−∂∂zk(zc−log⁡∑jezj)=−(1[k=c]−p^k)=p^k−1[k=c].\frac{\partial \mathcal L}{\partial z_k} =-\frac{\partial}{\partial z_k}\Big(z_c-\log\textstyle\sum_j e^{z_j}\Big) =-\big(\mathbb 1[k=c]-\hat p_k\big)=\hat p_k-\mathbb 1[k=c].

    也就是 ∇zL=p^−y\nabla_z\mathcal L=\hat p-y(yy 是 one-hot)。這個式子沒有任何會飽和的因子:預測錯得越多,梯度越大。生產線出了瑕疵,怎麼知道是哪一站的責任? 提到的「把 softmax 和交叉熵合成一個節點」指的就是直接實作這一行,而不是分兩層各自微分——後者在數值上會經過 log⁡\log 和除法,容易溢位。

    沒看過,不代表不會發生

    想像只問過五位顧客,沒有人選某一道餐點。我們能因此說,下一位顧客也絕對不會選嗎?把觀測比例直接當成機率,就可能遇到這個問題。

    第一個實驗:一枚真實機率 p=0.3p=0.3 的硬幣。 MLE 就是樣本比例。丟 nn 次,重複很多次:

    n=   5   MLE 說「這枚硬幣永遠不會出正面」的比例  16.61%    MLE 的標準差 0.2043
    n=  10   MLE 說「這枚硬幣永遠不會出正面」的比例   2.79%    MLE 的標準差 0.1445
    n=  50   MLE 說「這枚硬幣永遠不會出正面」的比例   0.00%    MLE 的標準差 0.0652
    n= 500   MLE 說「這枚硬幣永遠不會出正面」的比例   0.00%    MLE 的標準差 0.0205

    五次都沒有正面的機率是 0.75=16.807%0.7^5=16.807\%;表中的 16.61%16.61\% 是模擬比例。這時 MLE 給出 p^=0\hat p=0,下一次若看到正面,log loss 就是無限大。

    這不是 MLE 沒算好。00 確實是那五次資料的最大似然解——如果五次都是反面,「正面機率為零」給那份資料的似然是 11,任何其他值都更低。問題在於「最符合手上的資料」和「最接近真相」是兩件不同的事,而這正是 背考古題的學生:過擬合與欠擬合 的主題換一個場景出現。

    第二個實驗:模型離真相有多遠。 同一枚硬幣,量 KL(真實∥MLE)\mathrm{KL}(\text{真實}\Vert\text{MLE}) 的中位數:

    n=   10   KL 中位數 0.08015
    n=  100   KL 中位數 0.00732
    n= 1000   KL 中位數 0.00070
    n=10000   KL 中位數 0.00007

    表中量的是 KL 的中位數。在內部真值 p=0.3p=0.3 附近,p^−p=Op(n−1/2)\hat p-p=O_p(n^{-1/2}),而

    KL(Bern⁡(p)∥Bern⁡(p+δ))=δ22p(1−p)+O(δ3).\mathrm{KL}(\operatorname{Bern}(p)\Vert\operatorname{Bern}(p+\delta)) =\frac{\delta^2}{2p(1-p)}+O(\delta^3).

    因此典型 KL 的尺度是 Op(1/n)O_p(1/n)。但這不是期望 KL 的結論:任何有限 nn 都有正機率抽到全反面或全正面,令這個 KL 無限大,所以未平滑 MLE 的期望 KL 仍是無限大。

    第三個實驗:系統性的偏誤。 估計 N(0,1)\mathcal N(0,1) 的變異數,MLE 是 σ^2=1n∑(xi−xˉ)2\hat\sigma^2=\frac1n\sum(x_i-\bar x)^2:

    n=  3   E[σ²_MLE] = 0.6646    理論 (n-1)/n = 0.6667
    n=  5   E[σ²_MLE] = 0.8014    理論 (n-1)/n = 0.8000
    n= 10   E[σ²_MLE] = 0.9042    理論 (n-1)/n = 0.9000
    n=100   E[σ²_MLE] = 0.9915    理論 (n-1)/n = 0.9900

    當均值也由資料估計時,MLE 會系統性低估變異數。用

    ∑i(xi−xˉ)2=∑i(xi−μ)2−n(xˉ−μ)2\sum_i(x_i-\bar x)^2=\sum_i(x_i-\mu)^2-n(\bar x-\mu)^2

    取期望,右邊是 nσ2−σ2n\sigma^2-\sigma^2,因此 Eσ^2=(n−1)σ2/n\mathbb E\hat\sigma^2=(n-1)\sigma^2/n。少掉的部分來自先用資料估計均值;這和拿 validation 反覆選模型並不是同一個程序。

    注意偏誤與抖動是兩件事,而且縮得不一樣快

    把上面三個實驗的縮放整理成一張表,會看到三個不同的速度:

    量n=10n=10n=100n=100速度
    MLE 的標準差0.14450.1445≈0.046\approx0.046O(1/n)O(1/\sqrt n)
    變異數估計的偏誤10%10\%1%1\%O(1/n)O(1/n)
    KL(真∥MLE)\mathrm{KL}(\text{真}\Vert\text{MLE}) 的中位數0.080150.080150.007320.00732典型尺度 O(1/n)O(1/n)

    在這些固定維度、正則的例子裡,偏誤可比標準差縮得更快;這不是所有 MLE 的通則。是否修正偏誤、限制模型或加入先驗,仍要依目標、樣本數與評估 loss 決定。

    (把 nn 換成 n−1n-1 的那個「無偏變異數估計」確實存在,但它不是 MLE,而且它無偏的只有 σ2\sigma^2——⋅\sqrt{\cdot} 之後的 σ\sigma 仍然有偏。無偏性不是在函數變換下保持的性質。)

    似然曲面、樣本數,與零機率的懸崖

    互動 demo:母體交叉熵與 KL 永遠平行、最小值同一個 μ;你手上只有抖動的那條經驗 NLL。

    零機率在訓練裡長什麼樣

    第一節那個「−log⁡0=+∞-\log 0=+\infty」看起來像一個理論上的邊角,但它是實務上最常見的幾個 NaN 來源之一。

    零機率可能來自計數模型把未出現的類別設為零,或浮點運算把極小的 softmax 機率壓成零。有限 logit 的 softmax 在數學上仍給每個類別正機率;「token 沒出現過」不會自動令它的機率為零。另一種方向相反的問題,是過度靈活的連續模型讓 density 無限集中,例如 Gaussian mixture 的一個 component 縮在單一觀測點上,sample NLL 就可能往 −∞-\infty 跑。

    三個標準對策,各自在宣告什麼。

    • 平滑(Laplace / add-α\alpha):在 KK 個類別的計數各加 α>0\alpha>0,得到 (nk+α)/(n+Kα)(n_k+\alpha)/(n+K\alpha)。它是對稱 Dirichlet prior 下的 posterior predictive probability,不是一般的 MAP 公式;即使某一類沒出現,預測機率仍是正的。
    • 在 log 空間算:不要先算出機率再取對數,直接用 log_softmax、logsumexp 這一類函式。這不改變數學,只是不讓浮點數在中途把一個很小的數變成零。
    • 限制模型族:不給模型表達「機率為零」的能力(例如輸出層加一個下界,或用一個尾巴夠厚的分布族)。這是三個裡最強的宣告,也最容易在別的地方付出代價。

    上面的乘積用到了 iid 假設;相依資料也能做 MLE,但應使用正確的 joint likelihood,不能直接當成 iid。MLE 的一致性還需要可識別性、適當正則條件與可求得的最佳解;若模型設定錯誤,在相應條件下可能收斂到 population KL 最近的成員,而不是真實分布。

    Likelihood 衡量模型如何解釋資料;要從有限樣本推到真實分布,還需要模型與統計上的條件。

    檢查理解

    想一想

    第二節的實測裡,均勻模型在 n=30n=30、300300、30003000 的平均 NLL 都是 1.79181.7918,完全沒有變。最能解釋這件事的是:

    想一想

    在 95%95\% Gaussian 加 5%5\% 離群點的資料上,最小平方給出 +0.9965+0.9965、最小絕對值給出 +0.0661+0.0661。下列哪一句最準確?

    想一想

    p=0.3p=0.3 的硬幣丟五次,有約 16.8%16.8\% 的機率 MLE 給出 p^=0\hat p=0。這代表:

    想一想

    下列哪一句不對?

    參考文獻

    1. Cover, T. & Thomas, J. Elements of Information Theory, 2nd ed. Wiley 2006, Ch. 2, 11.(熵、交叉熵與 KL 的標準處理,以及「NLL = 熵 + KL」這個分解的資訊論讀法。)
    2. Bishop, C. Pattern Recognition and Machine Learning. Springer 2006, Ch. 1.2, 2.3.(把最小平方還原成 Gaussian 似然,以及變異數 MLE 的偏誤來源。)
    3. Murphy, K. Probabilistic Machine Learning: An Introduction. MIT Press 2022, Ch. 4.(MLE 的一致性與漸近性質,以及平滑/先驗在小樣本的作用。)