L0.2 台北的房仲去台中:風險與經驗風險
本篇重用M1.1從鞋子猜身高:Conditional Expectation·M3.4每條路徑對,還是最後的分佈對:Weak 與 Strong Convergence
起點:換一個城市就不準了
那位在台北看過幾百間房子的房仲,被派到台中。同樣站三分鐘,同樣的自信,這次誤差大得離譜——不是差 2%,是差 30%。
他的本領壞掉了嗎?沒有。他學到的東西是對的,只是對的對象換了。 台北的「捷運站走路五分鐘」值多少,跟台中的不是同一個數字;台北幾乎沒有的透天厝,在台中是主流。
這裡有兩件不同的事,值得分開:
- 就算他留在台北,他的實際誤差也會比「他回顧自己過去估過的那些房子」的誤差大。因為那些房子是他調整自己感覺時用過的。
- 換到台中,是連「同一個分佈」這個前提都沒了。
第一件事是估計誤差,是有限資料的必然,可以量、可以控制。第二件事是分佈偏移,多少資料都救不了,只能偵測與重新蒐集。實務上兩者常被混成一句「模型泛化不好」,然後開錯處方。
訓練時螢幕上那個數字,
和上線之後真正的表現,差多少?
這個落差是有限資料的必然,還是我做錯了什麼?
課堂提問Q1
把「他實際上會多準」與「他回顧自己的紀錄會覺得多準」翻成兩個數學物件。大數法則說它們會靠攏——這個保證的前提是什麼?ERM 挑出來的那個規則滿足這個前提嗎?
先想一想,再展開看整理後的答案
兩個數字。 母體風險 是「面對從 抽出的新房子,平均扣多少分」。經驗風險 是同一件事在手上這 筆上的平均。
大數法則的前提。 固定一個規則 ,那 個扣分 是 iid 的隨機變數,期望正是 。所以 ,而且是無偏的:。關鍵字是固定—— 必須在看到資料之前就決定。
不滿足這個前提。 ERM 的 是從這 筆資料裡挑出來的:它被挑中,正是因為它在這些點上看起來好。挑「在這份資料上最低」的那個,本身就是往下偏的取樣—— 是一個樂觀的估計,而且假設空間越大(可挑的候選越多),偏得越多。
挑選這個動作把統計獨立性用掉了。
大數法則保證的是「這個數字對這個規則是準的」,不是「這個數字對我挑規則的過程是準的」。
(順帶一提,這裡關心的是「一堆隨機扣分的平均會不會逼近期望」——是分佈層次的收斂,不是逐條路徑的收斂,正是 每條路徑對,還是最後的分佈對:Weak 與 Strong Convergence 區分的那兩件事裡的前者。)
兩層落差,兩種病
把你在螢幕上看到的數字,和你真正在意的數字之間的距離拆成兩段:
第一段是估計誤差:資料有限、而且被用來挑規則。它隨 變大而縮小、隨假設空間變大而擴大——這是可以控制的旋鈕,也是下一個 class 整章的內容。
第二段是分佈偏移:訓練分佈 與上線分佈 不同。它和 沒有關係——在台北蒐集一億筆資料,對台中的預測不會變好一點。
兩種病的徵狀不同:估計誤差大時,模型在同分佈的留出資料上就會露餡;分佈偏移時,同分佈的留出資料一切正常,上線才出事。
留出集看起來很好、上線才出事,幾乎一定是偏移,不是過擬合。
為什麼挑選會讓訓練誤差偏低
對事先固定的 :,無偏。
對 ERM 選出的 :對任意固定的 都有 ,取期望得
左端是你看到的數字的期望,右端是你真正拿到的表現的期望——不等式的方向是固定的:訓練誤差在期望上永遠不高於真實風險。 樂觀不是運氣不好,是結構性的。
落差有多大?直覺的量級是「 裡有多少個實質不同的候選」。若 是有限集合、損失有界,一致收斂給
以至少 的機率成立。要記的不是常數,是兩個依賴方向:分子隨假設空間變大而變大(,連續空間換成 VC 維或 Rademacher 複雜度),分母隨資料變多而變大()。這正是上一篇「approximation vs estimation 對衝」的定量版本。
分佈偏移則完全在這個框架之外。 與 之間沒有任何不等式——除非你另外假設偏移的形式(只有 變、 不變的 covariate shift;只有標籤比例變的 label shift;等等)。沒有假設就沒有保證,這句話在這裡是字面意思。
補充為什麼「一致收斂」這個詞裡有『一致』
對單一個 , 靠近 是大數法則。但我們需要的是:同時對 裡所有的 都靠近——因為 是哪一個,要看資料才知道,我們必須先對所有候選都有保證,才敢對「事後才知道是誰」的那一個下結論。
這就是「一致(uniform)」的意思: 小。這個 隨 變大而變大,於是「假設空間的大小」自然出現在界裡。把 設成所有函數, 不會收斂到 ,於是沒有任何保證——上一篇 的內插災難就是這句話的具體樣子。
回到情境:房仲的兩種失準
留在台北。 他回顧自己過去的紀錄,覺得平均誤差 3%。實際帶客戶看新案子,誤差是 5%。差的那 2% 不是他退步了——是他當初調整自己的「感覺」時用過那些房子。想知道真實的 5%,唯一的辦法是拿一批他調整時沒用過的成交案例來考他。這是下一個 class 「為什麼要切資料」的全部動機。
去台中。 留出集也救不了他,因為留出集也是台北的。他需要的是台中的資料,或至少一個偵測機制:輸入的分佈變了嗎? 房型組成、單價區間、屋齡分佈——這些不需要標籤就能比較,這是實務上最便宜的預警。
這一切依賴什麼。 一,訓練資料真的是從 獨立抽的。時間序列、同一棟樓的多筆成交、同一個攝影師拍的多張照片,都會讓「獨立」失效,於是 筆資料的有效樣本數遠小於 。二, 在訓練與評估期間不變。三,損失有界或至少尾巴不太重,否則平均值本身就不穩(差一度與差十度:損失函數是一種宣告 已經看過厚尾把 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
三件事按理論預測發生了。固定規則的落差是 ——實質為零,大數法則如期兌現,而且不隨 degree 改變(它從頭到尾沒被挑過)。ERM 選出的規則落差恆為正,這就是那個方向固定的不等式。落差隨假設空間變大而變大:(中位數)。degree 9 的平均是 而中位數只有 ,說明少數幾次抽樣災難性地過擬合把平均拉走了——估計誤差不只變大,還變得不穩,這件事在 十個房仲各看一百間房:Bias 與 Variance 會被拆成 bias 與 variance 兩塊。
第二段:刻意違反同分佈假設。 只在 上蒐集資料,模型上線後卻會遇到整個 :
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
第一段落差是 倍,第二段是 28 萬倍。而且注意:如果你從那 30 筆裡切一份留出集來評估,你會看到 那個數字——一個誠實而且正確的估計,對即將發生的災難完全沒有預警力,因為留出集也只有左邊七成。這是分佈偏移最危險的地方:所有你習慣的檢查都會通過。
真實版本的這個實驗到處都是:只在白天照片上訓練的視覺模型、只在成年男性資料上驗證的醫療模型、用 2019 年之前的資料訓練的需求預測模型。外推的部分不是「準確度稍低」,是沒有定義。
拖動資料量與空間大小,看落差怎麼長
互動 demo:加資料只關得掉「估計」那一段;要關掉「近似」那一段,得換假設空間。
先消化一下
參考文獻
- Shalev-Shwartz, S., Ben-David, S. Understanding Machine Learning. Cambridge University Press 2014, Ch. 2–4.(ERM 的樂觀偏差、一致收斂、假設空間大小如何進入界裡。)
- Quiñonero-Candela, J. et al. (eds.) Dataset Shift in Machine Learning. MIT Press 2009.(covariate shift、label shift 等偏移型態的分類與各自需要的假設。)
- Recht, B. et al. Do ImageNet Classifiers Generalize to ImageNet? ICML 2019.(用同樣流程重新蒐集測試集,量出「留出集乾淨與否」在真實 benchmark 上值多少個百分點。)