搜尋課程與筆記

搜尋筆記

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

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

    L0.2 14 分鐘閱讀 2026年10月

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

    本篇重用2 篇

    換一個城市就不準了

    那位在台北看過幾百間房子的房仲,被派到台中。同樣站三分鐘,同樣的自信,這次誤差大得離譜——不是差 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)=1n∑iℓ(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 是資料選出來的。 它被挑中,正是因為在這些點上看起來好。不能直接把固定 ff 的大數法則套在它身上;下面會證明精確 ERM 的訓練風險在期望上偏樂觀。更大的候選集合可能增加選擇偏差,但不是每個問題都有單調關係。

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

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

    這裡是 sample average 的收斂問題;不要把它直接等同 SDE numerical approximation 的 weak 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{上線後的真實表現}}.

    第一段叫 generalization gap,是 Rp(f^)−R^n(f^)R_p(\hat f)-\widehat R_n(\hat f);它與上一篇的 estimation error Rp(f^)−Rp(f†)R_p(\hat f)-R_p(f^\dagger) 不是同一個量。第二段是 Rq(f^)−Rp(f^)R_q(\hat f)-R_p(\hat f),反映評估分布改變;它可以正也可以負。多蒐集來源資料可能有幫助,但不能只靠增加 nn 保證目標分布上的表現。

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

    留出集好、上線差時,先確認資料、評估與部署是否真的對得上。

    訓練誤差、同分佈風險、上線風險:兩段落差

    圖說: 訓練誤差只描述看過的區域;挑選造成的樂觀與上線分布偏移,是兩段不同的落差。

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

    對事先固定的 ff:ED[R^n(f)]=R(f)\mathbb E_D[\widehat R_n(f)]=R(f),無偏。

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

    ED[R^n(f^)] ≤ min⁡f∈FED[R^n(f)] = min⁡f∈FR(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 ⁣(log⁡∣F∣+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 的機率成立。要記的不是常數,是兩個依賴方向:分子隨假設空間變大而變大(log⁡∣F∣\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(y∣x)p(y\mid x) 不變的 covariate shift;只有標籤比例變的 label shift;等等)。沒有假設就沒有保證,這句話在這裡是字面意思。

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

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

    這就是「一致(uniform)」的意思:sup⁡f∈F∣R^n(f)−R(f)∣\sup_{f\in\mathcal F}|\widehat R_n(f)-R(f)| 小。這個 sup⁡\sup 隨 F\mathcal F 變大而變大,於是「假設空間的大小」自然出現在界裡。把 F\mathcal F 設成所有函數,sup⁡\sup 不會收斂到 00,於是沒有任何保證——上一篇 d=n−1d=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.0094→0.0130→0.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 那個數字——一個誠實而且正確的估計,對即將發生的災難完全沒有預警力,因為留出集也只有左邊七成。這是分佈偏移最危險的地方:所有你習慣的檢查都會通過。

    例如只看白天照片的模型遇到夜景,來源資料就未必能代表新情境。外推的函數值仍有定義,但準確性缺少資料支持;需要新資料、結構假設或適當的不確定性處理。

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

    互動 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 上值多少個百分點。)