L0.2 15 分鐘閱讀 2026年9月

L0.2 台北的房仲去台中:風險與經驗風險

本篇重用M1.1從鞋子猜身高:Conditional Expectation·M3.4每條路徑對,還是最後的分佈對:Weak 與 Strong Convergence

起點:換一個城市就不準了

那位在台北看過幾百間房子的房仲,被派到台中。同樣站三分鐘,同樣的自信,這次誤差大得離譜——不是差 2%,是差 30%。

他的本領壞掉了嗎?沒有。他學到的東西是對的,只是對的對象換了。 台北的「捷運站走路五分鐘」值多少,跟台中的不是同一個數字;台北幾乎沒有的透天厝,在台中是主流。

這裡有兩件不同的事,值得分開:

  1. 就算他留在台北,他的實際誤差也會比「他回顧自己過去估過的那些房子」的誤差大。因為那些房子是他調整自己感覺時用過的。
  2. 換到台中,是連「同一個分佈」這個前提都沒了。

第一件事是估計誤差,是有限資料的必然,可以量、可以控制。第二件事是分佈偏移,多少資料都救不了,只能偵測與重新蒐集。實務上兩者常被混成一句「模型泛化不好」,然後開錯處方。

訓練時螢幕上那個數字,
和上線之後真正的表現,差多少?
這個落差是有限資料的必然,還是我做錯了什麼?

課堂提問Q1

把「他實際上會多準」與「他回顧自己的紀錄會覺得多準」翻成兩個數學物件。大數法則說它們會靠攏——這個保證的前提是什麼?ERM 挑出來的那個規則滿足這個前提嗎?

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

兩個數字。 母體風險 R(f)=E(X,Y)p[(f(X),Y)]R(f)=\mathbb E_{(X,Y)\sim p}[\ell(f(X),Y)] 是「面對從 pp 抽出的新房子,平均扣多少分」。經驗風險 R^n(f)=1ni(f(xi),yi)\widehat R_n(f)=\frac1n\sum_i \ell(f(x_i),y_i) 是同一件事在手上這 nn 筆上的平均。

大數法則的前提。 固定一個規則 ff,那 nn 個扣分 (f(xi),yi)\ell(f(x_i),y_i) 是 iid 的隨機變數,期望正是 R(f)R(f)。所以 R^n(f)R(f)\widehat R_n(f)\to R(f),而且是無偏的:E[R^n(f)]=R(f)\mathbb E[\widehat R_n(f)]=R(f)。關鍵字是固定——ff 必須在看到資料之前就決定。

f^\hat f 不滿足這個前提。 ERM 的 f^\hat f 是從這 nn 筆資料裡挑出來的:它被挑中,正是因為它在這些點上看起來好。挑「在這份資料上最低」的那個,本身就是往下偏的取樣——R^n(f^)\widehat R_n(\hat f) 是一個樂觀的估計,而且假設空間越大(可挑的候選越多),偏得越多。

挑選這個動作把統計獨立性用掉了。

大數法則保證的是「這個數字對這個規則是準的」,不是「這個數字對我挑規則的過程是準的」。

(順帶一提,這裡關心的是「一堆隨機扣分的平均會不會逼近期望」——是分佈層次的收斂,不是逐條路徑的收斂,正是 每條路徑對,還是最後的分佈對:Weak 與 Strong Convergence 區分的那兩件事裡的前者。)

兩層落差,兩種病

把你在螢幕上看到的數字,和你真正在意的數字之間的距離拆成兩段:

R^n(f^)訓練誤差  挑選帶來的樂觀  Rp(f^)同分佈的真實表現  分佈偏移  Rq(f^)上線後的真實表現.\underbrace{\widehat R_n(\hat f)}_{\text{訓練誤差}} \ \xrightarrow{\ \text{挑選帶來的樂觀}\ }\ \underbrace{R_p(\hat f)}_{\text{同分佈的真實表現}} \ \xrightarrow{\ \text{分佈偏移}\ }\ \underbrace{R_q(\hat f)}_{\text{上線後的真實表現}}.

第一段是估計誤差:資料有限、而且被用來挑規則。它隨 nn 變大而縮小、隨假設空間變大而擴大——這是可以控制的旋鈕,也是下一個 class 整章的內容。

第二段是分佈偏移:訓練分佈 pp 與上線分佈 qq 不同。它和 nn 沒有關係——在台北蒐集一億筆資料,對台中的預測不會變好一點。

兩種病的徵狀不同:估計誤差大時,模型在同分佈的留出資料上就會露餡;分佈偏移時,同分佈的留出資料一切正常,上線才出事。

留出集看起來很好、上線才出事,幾乎一定是偏移,不是過擬合。

為什麼挑選會讓訓練誤差偏低

事先固定ffED[R^n(f)]=R(f)\mathbb E_D[\widehat R_n(f)]=R(f),無偏。

對 ERM 選出的 f^=argminfFR^n(f)\hat f=\arg\min_{f\in\mathcal F}\widehat R_n(f):對任意固定的 fFf\in\mathcal F 都有 R^n(f^)R^n(f)\widehat R_n(\hat f)\le \widehat R_n(f),取期望得

ED[R^n(f^)]  minfFED[R^n(f)] = minfFR(f)  ED[R(f^)].\mathbb E_D\big[\widehat R_n(\hat f)\big]\ \le\ \min_{f\in\mathcal F}\mathbb E_D\big[\widehat R_n(f)\big]\ =\ \min_{f\in\mathcal F}R(f)\ \le\ \mathbb E_D\big[R(\hat f)\big].

左端是你看到的數字的期望,右端是你真正拿到的表現的期望——不等式的方向是固定的:訓練誤差在期望上永遠不高於真實風險。 樂觀不是運氣不好,是結構性的。

落差有多大?直覺的量級是「F\mathcal F 裡有多少個實質不同的候選」。若 F\mathcal F 是有限集合、損失有界,一致收斂給

R(f^)  R^n(f^)+O ⁣(logF+log(1/δ)n)R(\hat f)\ \le\ \widehat R_n(\hat f)+O\!\left(\sqrt{\tfrac{\log|\mathcal F|+\log(1/\delta)}{n}}\right)

以至少 1δ1-\delta 的機率成立。要記的不是常數,是兩個依賴方向:分子隨假設空間變大而變大(logF\log|\mathcal F|,連續空間換成 VC 維或 Rademacher 複雜度),分母隨資料變多而變大(n\sqrt n)。這正是上一篇「approximation vs estimation 對衝」的定量版本。

分佈偏移則完全在這個框架之外。Rq(f)=Eq[(f(X),Y)]R_q(f)=\mathbb E_{q}[\ell(f(X),Y)]RpR_p 之間沒有任何不等式——除非你另外假設偏移的形式(只有 p(x)p(x) 變、p(yx)p(y\mid x) 不變的 covariate shift;只有標籤比例變的 label shift;等等)。沒有假設就沒有保證,這句話在這裡是字面意思。

補充為什麼「一致收斂」這個詞裡有『一致』

對單一個 ffR^n(f)\widehat R_n(f) 靠近 R(f)R(f) 是大數法則。但我們需要的是:同時F\mathcal F 裡所有的 ff 都靠近——因為 f^\hat f 是哪一個,要看資料才知道,我們必須先對所有候選都有保證,才敢對「事後才知道是誰」的那一個下結論。

這就是「一致(uniform)」的意思:supfFR^n(f)R(f)\sup_{f\in\mathcal F}|\widehat R_n(f)-R(f)| 小。這個 sup\supF\mathcal F 變大而變大,於是「假設空間的大小」自然出現在界裡。把 F\mathcal F 設成所有函數,sup\sup 不會收斂到 00,於是沒有任何保證——上一篇 d=n1d=n-1 的內插災難就是這句話的具體樣子。

回到情境:房仲的兩種失準

留在台北。 他回顧自己過去的紀錄,覺得平均誤差 3%。實際帶客戶看新案子,誤差是 5%。差的那 2% 不是他退步了——是他當初調整自己的「感覺」時用過那些房子。想知道真實的 5%,唯一的辦法是拿一批他調整時沒用過的成交案例來考他。這是下一個 class 「為什麼要切資料」的全部動機。

去台中。 留出集也救不了他,因為留出集也是台北的。他需要的是台中的資料,或至少一個偵測機制:輸入的分佈變了嗎? 房型組成、單價區間、屋齡分佈——這些不需要標籤就能比較,這是實務上最便宜的預警。

這一切依賴什麼。 一,訓練資料真的是從 pp 獨立抽的。時間序列、同一棟樓的多筆成交、同一個攝影師拍的多張照片,都會讓「獨立」失效,於是 nn 筆資料的有效樣本數遠小於 nn。二,pp 在訓練與評估期間不變。三,損失有界或至少尾巴不太重,否則平均值本身就不穩(差一度與差十度:損失函數是一種宣告 已經看過厚尾把 mean 拉走的樣子)。

回到情境:把兩段落差量出來

第一段:挑選帶來的樂觀。 對每個 degree,重抽 200 份訓練資料,比較兩件事——一個事先固定的規則(在另一份大資料上先擬好,與後面的抽樣無關),以及每次都從這份資料重新 ERM 選出的規則:

import numpy as np, warnings; warnings.filterwarnings("ignore")
from numpy.polynomial import Polynomial
from ml_toy import toy_1d, truth, NOISE

xs, ys = truth()
risk = lambda f: ((f(xs) - ys)**2).mean() + NOISE**2      # 母體風險(近似)

for d in (3, 5, 9):
    fixed = Polynomial.fit(*toy_1d(n=2000, seed=999), d)  # 與下面的資料無關
    gap_fixed, gap_erm = [], []
    for s in range(200):
        x, y = toy_1d(seed=s)                             # 每次 30 筆新資料
        gap_fixed.append(risk(fixed) - ((fixed(x) - y)**2).mean())
        f = Polynomial.fit(x, y, d)                       # ERM:從這份資料挑
        gap_erm.append(risk(f) - ((f(x) - y)**2).mean())
    print(f"degree {d}:  固定規則的落差 {np.mean(gap_fixed):+.4f}"
          f" | ERM 選出的規則 平均 {np.mean(gap_erm):+.4f} 中位數 {np.median(gap_erm):+.4f}")
degree 3:  固定規則的落差 +0.0005 | ERM 選出的規則 平均 +0.0094 中位數 +0.0092
degree 5:  固定規則的落差 +0.0005 | ERM 選出的規則 平均 +0.0130 中位數 +0.0111
degree 9:  固定規則的落差 +0.0005 | ERM 選出的規則 平均 +0.7495 中位數 +0.0252

三件事按理論預測發生了。固定規則的落差是 0.00050.0005——實質為零,大數法則如期兌現,而且不隨 degree 改變(它從頭到尾沒被挑過)。ERM 選出的規則落差恆為正,這就是那個方向固定的不等式。落差隨假設空間變大而變大0.00940.01300.02520.0094\to0.0130\to0.0252(中位數)。degree 9 的平均0.750.75 而中位數只有 0.02520.0252,說明少數幾次抽樣災難性地過擬合把平均拉走了——估計誤差不只變大,還變得不穩,這件事在 十個房仲各看一百間房:Bias 與 Variance 會被拆成 bias 與 variance 兩塊。

第二段:刻意違反同分佈假設。 只在 x[0,0.7]x\in[0,0.7] 上蒐集資料,模型上線後卻會遇到整個 [0,1][0,1]

rng = np.random.default_rng(0)
x = np.sort(rng.uniform(0, .7, 30))                        # 訓練只看得到左邊七成
y = np.sin(2*np.pi*x) + NOISE*rng.standard_normal(30)
f = Polynomial.fit(x, y, 9)
m = xs <= .7
print(f"訓練誤差                        {((f(x) - y)**2).mean():.4f}")
print(f"母體風險(同分佈 x∈[0,0.7])  ≈ {((f(xs[m]) - ys[m])**2).mean() + NOISE**2:.4f}")
print(f"母體風險(上線遇到 x∈[0,1]) ≈ {((f(xs) - ys)**2).mean() + NOISE**2:.4f}")
訓練誤差                        0.0122
母體風險(同分佈 x∈[0,0.7])  ≈ 0.0286
母體風險(上線遇到 x∈[0,1]) ≈ 8113.2300

第一段落差是 2.32.3 倍,第二段是 28 萬倍。而且注意:如果你從那 30 筆裡切一份留出集來評估,你會看到 0.02860.0286 那個數字——一個誠實而且正確的估計,對即將發生的災難完全沒有預警力,因為留出集也只有左邊七成。這是分佈偏移最危險的地方:所有你習慣的檢查都會通過。

真實版本的這個實驗到處都是:只在白天照片上訓練的視覺模型、只在成年男性資料上驗證的醫療模型、用 2019 年之前的資料訓練的需求預測模型。外推的部分不是「準確度稍低」,是沒有定義。

拖動資料量與空間大小,看落差怎麼長

互動 demo:加資料只關得掉「估計」那一段;要關掉「近似」那一段,得換假設空間。

先消化一下

想一想

一個團隊在留出集上得到 92%92\% 準確率,上線後實際只有 71%71\%。他們的第一個假設是「過擬合了」,打算加正則化。最合理的評論是:

想一想

實驗裡「固定規則的落差是 +0.0005+0.0005,且不隨 degree 改變」說明了什麼?

想一想

關於偏移實驗裡「母體風險 81138113」這個數字,下列哪一句最準確?

參考文獻

  1. Shalev-Shwartz, S., Ben-David, S. Understanding Machine Learning. Cambridge University Press 2014, Ch. 2–4.(ERM 的樂觀偏差、一致收斂、假設空間大小如何進入界裡。)
  2. Quiñonero-Candela, J. et al. (eds.) Dataset Shift in Machine Learning. MIT Press 2009.(covariate shift、label shift 等偏移型態的分類與各自需要的假設。)
  3. Recht, B. et al. Do ImageNet Classifiers Generalize to ImageNet? ICML 2019.(用同樣流程重新蒐集測試集,量出「留出集乾淨與否」在真實 benchmark 上值多少個百分點。)