🌏 English version
影片狀態:已附影片。 這篇依官方 MOOC 講義 15_handout.pdf 與這堂四支官方影片的機器轉錄逐字稿寫成,公式以講義為準;逐字稿未經人工校對。每一節開頭附該節的官方影片與大致的時間區段。文中的頁碼指投影片右下角的編號(0/22 到 22/22),寫「課堂上」的地方是轉述影片裡的說法。
這是台大林軒田 機器學習基石與技法 導讀 裡的基石第 15 堂。講義第 1 頁的 Roadmap 把基石分成四個問題,這堂屬於第四個 How Can Machines Learn Better?。上一堂基石第 14 堂:正則化 在同一頁上只剩一行:最小化 augmented error,加上去的正則化項會限制模型複雜度。那一堂留下一個沒回答的問題:正則化的強度 λ \lambda λ 要多大,看的是雜訊有多少,可是雜訊多少事先不知道。這堂的驗證(validation)就是用來做這類選擇的工具。
先備有三樣:基石第 4 堂 有限個假說的 Hoeffding 不等式、基石第 9 堂 的線性迴歸與學習曲線、基石第 12 堂 的多項式轉換。期望值的線性性質會用到一次;本文自擬的驗算另外用到「兩個獨立的隨機變數相減,變異數相加」。
讀完之後,你應該能說明為什麼 E in E_{\text{in}} E in 與 E test E_{\text{test}} E test 都不能拿來選模型,寫出驗證的完整流程與它的保證,自己推一遍 leave-one-out 的期望值為什麼等於 E out ‾ ( N − 1 ) \overline{E_{\text{out}}}(N-1) E out ( N − 1 ) ,並對一組小資料手算 E val E_{\text{val}} E val 、E loocv E_{\text{loocv}} E loocv 與 E cv E_{\text{cv}} E cv 。
這麼多種組合,憑什麼挑:模型選擇問題
YouTube:Validation :: Model Selection Problem @ Machine Learning Foundations (機器學習基石)
(影片 00:18–01:14 複習上一堂,01:14–03:20 是組合表,03:20–06:17 定義模型選擇問題,06:17–09:57 談用 E in E_{\text{in}} E in 選,09:57–12:40 談用 E test E_{\text{test}} E test 選,12:40–15:06 引出驗證資料,之後是 Fun Time。)
選擇多到要用乘的
講義第 2 頁把前面十四堂教過的東西排成一張表。光是二元分類,就有六件事要決定:
要決定的事 講義列的選項 演算法 A \mathcal{A} A PLA、pocket、linear regression、logistic regression 迭代次數 T T T 100、1000、10000 每一步走多大 η \eta η 1、0.01、0.0001 特徵轉換 Φ \boldsymbol{\Phi} Φ linear、quadratic、poly-10、Legendre-poly-10 正則化項 Ω ( w ) \Omega(\mathbf{w}) Ω ( w ) L2、L1、symmetry regularizer 正則化強度 λ \lambda λ 0、0.01、1
表上每兩列之間畫了一個乘號。本文把它乘出來:4 × 3 × 3 × 4 × 3 × 3 = 1296 4 \times 3 \times 3 \times 4 \times 3 \times 3 = 1296 4 × 3 × 3 × 4 × 3 × 3 = 1296 種組合,而且每一列都還能再加選項。課堂上的說法是,教的方法愈多,要做的選擇就愈多,而且這些選擇是組合起來的。每個人都有自己最喜歡的組合,就像有最喜歡吃的東西;但永遠用同一種,不會在所有的資料上都表現好。講義頁尾也是這句話:除了你最喜歡的組合,可能得試試別的,才拿得到好的 g g g 。
把問題寫清楚
第 3 頁給了正式的定義,叫模型選擇問題(model selection problem):
給定: M M M 個模型 H 1 , H 2 , … , H M \mathcal{H}_1, \mathcal{H}_2, \dots, \mathcal{H}_M H 1 , H 2 , … , H M ,各有對應的演算法 A 1 , A 2 , … , A M \mathcal{A}_1, \mathcal{A}_2, \dots, \mathcal{A}_M A 1 , A 2 , … , A M 。
目標: 選出 H m ∗ \mathcal{H}_{m^*} H m ∗ ,讓 g m ∗ = A m ∗ ( D ) g_{m^*} = \mathcal{A}_{m^*}(\mathcal{D}) g m ∗ = A m ∗ ( D ) 的 E out ( g m ∗ ) E_{\text{out}}(g_{m^*}) E out ( g m ∗ ) 低。
困難: E out E_{\text{out}} E out 算不出來,因為 P ( x ) P(\mathbf{x}) P ( x ) 與 P ( y ∣ x ) P(y \mid \mathbf{x}) P ( y ∣ x ) 未知。講義加了一句 as always。
這裡的「模型」指的是一組假說集合加上在它上面跑的演算法,上面那張表的每一種組合都算一個。m ∗ m^* m ∗ 上的星號代表被選中的那一個;課堂上舉的例子是有 100 種組合,從裡面選出第 37 個,後面整堂課都用「37 號」來稱呼被選中的模型。
講義說這可以算是機器學習最重要的實務問題。課堂上的理由是:實務上不可能靠單一模型、單一演算法走天下,一定得做選擇。
用眼睛挑不行
第 3 頁上方放了兩張圖,問你喜歡哪一個:左邊 H 1 \mathcal{H}_1 H 1 是一條直線,分錯了幾個點;右邊 H 2 \mathcal{H}_2 H 2 是彎曲的邊界,一個點都沒分錯。頁尾自問自答:用看的選?不行,記得第 12 堂嗎。
課堂上把基石第 12 堂 講過的兩個理由重說了一次。第一,資料的維度一高就畫不出來,沒辦法用看的。第二,用眼睛做選擇,你腦袋裡那個強大的模型、它的 VC 維度也要算進代價裡,不見得划算。
用訓練誤差挑:永遠選到最複雜的
手上只有資料 D \mathcal{D} D ,最直接的做法是每個模型都跑一次,挑 E in E_{\text{in}} E in 最小的(第 4 頁):
m ∗ = argmin 1 ≤ m ≤ M ( E m = E in ( A m ( D ) ) ) m^* = \operatorname*{argmin}_{1 \le m \le M} \big(E_m = E_{\text{in}}(\mathcal{A}_m(\mathcal{D}))\big) m ∗ = 1 ≤ m ≤ M argmin ( E m = E in ( A m ( D )) )
講義指出兩個問題。
第一個問題:結果事先就知道了。 講義寫 Φ 1126 \boldsymbol{\Phi}_{1126} Φ 1126 永遠比 Φ 1 \boldsymbol{\Phi}_1 Φ 1 受歡迎,λ = 0 \lambda = 0 λ = 0 永遠比 λ = 0.1 \lambda = 0.1 λ = 0.1 受歡迎。原因是這兩組選項之間有包含關係。高次轉換的假說集合包含低次的,在比較大的集合裡找 E in E_{\text{in}} E in 最小的假說,結果不會比在小集合裡找的差。λ = 0 \lambda = 0 λ = 0 是直接最小化 E in E_{\text{in}} E in ,λ > 0 \lambda > 0 λ > 0 最小化的是 E in E_{\text{in}} E in 加上正則化項,後者得到的 E in E_{\text{in}} E in 不可能比前者低。課堂上說得很白:照這樣選,上一堂的正則化就都不用看了,直接把 E in E_{\text{in}} E in 做到最小就好,這可能讓你陷入過擬合的危險。
第二個問題:付出的複雜度代價變大。 就算候選之間沒有包含關係也一樣。假設只有兩個模型,A 1 \mathcal{A}_1 A 1 在 H 1 \mathcal{H}_1 H 1 裡找 E in E_{\text{in}} E in 最小的假說,A 2 \mathcal{A}_2 A 2 在 H 2 \mathcal{H}_2 H 2 裡找 E in E_{\text{in}} E in 最小的假說,再從兩個裡面挑 E in E_{\text{in}} E in 小的。兩個集合各自的最小值再取比較小的,就是聯集上的最小值:
min ( min h ∈ H 1 E in ( h ) , min h ∈ H 2 E in ( h ) ) = min h ∈ H 1 ∪ H 2 E in ( h ) \min\Big(\min_{h \in \mathcal{H}_1} E_{\text{in}}(h),\ \min_{h \in \mathcal{H}_2} E_{\text{in}}(h)\Big) = \min_{h \in \mathcal{H}_1 \cup \mathcal{H}_2} E_{\text{in}}(h) min ( h ∈ H 1 min E in ( h ) , h ∈ H 2 min E in ( h ) ) = h ∈ H 1 ∪ H 2 min E in ( h )
所以「模型選擇加學習」整套流程,實際上是在 H 1 ∪ H 2 \mathcal{H}_1 \cup \mathcal{H}_2 H 1 ∪ H 2 裡最小化 E in E_{\text{in}} E in ,付的是 d VC ( H 1 ∪ H 2 ) d_{\text{VC}}(\mathcal{H}_1 \cup \mathcal{H}_2) d VC ( H 1 ∪ H 2 ) 的代價,泛化可能變差。課堂上的比喻是兩個班:每個演算法從自己班上選出 E in E_{\text{in}} E in 最小的學生,模型選擇再讓兩個班的第一名比一場,整體看來就是在兩個班合起來的學生裡選一個最好的。
講義的結論是 selecting by E in E_{\text{in}} E in is dangerous。
六筆資料:訓練誤差會選誰
以下是本文自擬的例子,不在講義上,後面三節會繼續用它。資料是六筆一維的迴歸資料,誤差用平方誤差:
n n n 1 2 3 4 5 6 x n x_n x n 0 1 2 3 4 5 y n y_n y n 1 1 2.5 3 3 3
這六筆是本文用 f ( x ) = 1 + 0.5 x f(x) = 1 + 0.5x f ( x ) = 1 + 0.5 x 加上手選的雜訊 ( 0 , − 0.5 , + 0.5 , + 0.5 , 0 , − 0.5 ) (0, -0.5, +0.5, +0.5, 0, -0.5) ( 0 , − 0.5 , + 0.5 , + 0.5 , 0 , − 0.5 ) 編出來的,所以正確答案是一條直線。光看 y y y 的數字,前面在爬、後面持平,很容易覺得該用一條會彎的曲線。
候選模型有三個,都用基石第 9 堂 的最小平方法訓練:常數 h ( x ) = w 0 h(x) = w_0 h ( x ) = w 0 、直線 h ( x ) = w 0 + w 1 x h(x) = w_0 + w_1 x h ( x ) = w 0 + w 1 x 、二次曲線 h ( x ) = w 0 + w 1 x + w 2 x 2 h(x) = w_0 + w_1 x + w_2 x^2 h ( x ) = w 0 + w 1 x + w 2 x 2 。三者一個包一個。用全部六筆訓練的結果:
模型 用全部六筆訓練出的 g g g E in E_{\text{in}} E in 常數 2.25 2.25 2.25 13 / 16 ≈ 0.8125 13/16 \approx 0.8125 13/16 ≈ 0.8125 直線 1.0714 + 0.4714 x 1.0714 + 0.4714x 1.0714 + 0.4714 x 23 / 140 ≈ 0.1643 23/140 \approx 0.1643 23/140 ≈ 0.1643 二次 0.7143 + 1.0071 x − 0.1071 x 2 0.7143 + 1.0071x - 0.1071x^2 0.7143 + 1.0071 x − 0.1071 x 2 13 / 140 ≈ 0.0929 13/140 \approx 0.0929 13/140 ≈ 0.0929
常數模型的解就是六個 y y y 的平均 13.5 / 6 = 2.25 13.5/6 = 2.25 13.5/6 = 2.25 ,E in E_{\text{in}} E in 是 1 6 ( 1.25 2 + 1.25 2 + 0.25 2 + 0.75 2 + 0.75 2 + 0.75 2 ) = 4.875 / 6 = 0.8125 \frac{1}{6}(1.25^2 + 1.25^2 + 0.25^2 + 0.75^2 + 0.75^2 + 0.75^2) = 4.875/6 = 0.8125 6 1 ( 1.2 5 2 + 1.2 5 2 + 0.2 5 2 + 0.7 5 2 + 0.7 5 2 + 0.7 5 2 ) = 4.875/6 = 0.8125 。另外兩個照最小平方法解,篇末附了一小段 Python 可以重算。
E in E_{\text{in}} E in 由上往下愈來愈小,照 E in E_{\text{in}} E in 選就是二次曲線。這個結果不需要看資料就能預測,因為二次模型包含直線、直線包含常數;如果候選裡還有五次多項式,它會穿過全部六個點,E in = 0 E_{\text{in}} = 0 E in = 0 ,被選中的就是它。
用測試誤差挑:保證很好,資料拿不到
換一個想法(第 5 頁):去找一份沒用過的測試資料 D test \mathcal{D}_{\text{test}} D test ,看每個模型學到的 g m g_m g m 在上面的表現,挑 E test E_{\text{test}} E test 最小的。
m ∗ = argmin 1 ≤ m ≤ M ( E m = E test ( A m ( D ) ) ) m^* = \operatorname*{argmin}_{1 \le m \le M} \big(E_m = E_{\text{test}}(\mathcal{A}_m(\mathcal{D}))\big) m ∗ = 1 ≤ m ≤ M argmin ( E m = E test ( A m ( D )) )
這樣選有理論保證。g 1 , … , g M g_1, \dots, g_M g 1 , … , g M 在看到 D test \mathcal{D}_{\text{test}} D test 之前就已經固定了,所以這是在 M M M 個固定的假說裡選一個,適用基石第 4 堂 有限個假說的 Hoeffding 不等式(講義稱為 finite-bin Hoeffding):
E out ( g m ∗ ) ≤ E test ( g m ∗ ) + O ( log M N test ) E_{\text{out}}(g_{m^*}) \le E_{\text{test}}(g_{m^*}) + O\bigg(\sqrt{\frac{\log M}{N_{\text{test}}}}\bigg) E out ( g m ∗ ) ≤ E test ( g m ∗ ) + O ( N test log M )
講義的評語是 yes! strong guarantee。課堂上拿 100 個模型當例子:取 log \log log 、開根號,還要除以測試資料的筆數,是很小的代價,不像 E in E_{\text{in}} E in 那樣要付整個聯集的模型複雜度。這個式子怎麼來的,「留 K 筆當驗證集」那一節會把它推一遍。
問題在 D test \mathcal{D}_{\text{test}} D test 在哪裡。講義寫的是 your boss's safe(老闆的保險箱),課堂上說的是鎖在老闆的櫃子裡。課堂上的比喻是老師的考卷:考前就把考卷發給同學帶回去寫,考出來的分數就不準了。真的拿得到測試資料,多半是偷出來的,課堂上說這是自欺欺人。講義的結論是 selecting by E test E_{\text{test}} E test is infeasible and cheating。
折衷:從手上的資料留一塊
第 6 頁把兩種做法並排:
E in E_{\text{in}} E in E test E_{\text{test}} E test E val E_{\text{val}} E val 用哪份資料算 D \mathcal{D} D D test \mathcal{D}_{\text{test}} D test D val ⊂ D \mathcal{D}_{\text{val}} \subset \mathcal{D} D val ⊂ D 拿得到嗎 在手上 在老闆的保險箱裡 在手上 乾淨嗎 被污染:A m \mathcal{A}_m A m 已經用 D \mathcal{D} D 選出 g m g_m g m 乾淨:之前沒被用來做任何選擇 乾淨,前提是 A m \mathcal{A}_m A m 沒用過 D val \mathcal{D}_{\text{val}} D val
「污染」是這堂課的關鍵字。D \mathcal{D} D 已經被每個演算法用來決定 g 1 , g 2 , … g_1, g_2, \dots g 1 , g 2 , … ,再用同一份資料在它們之間做選擇,就是重複使用。D test \mathcal{D}_{\text{test}} D test 像一份新出的考題,能乾淨地測出程度。
中間那條路是從手上的資料留一塊下來,先鎖著不用,等要做選擇時才拿出來,算出來的誤差叫 E val E_{\text{val}} E val 。講義把這稱為 legal cheating(合法的作弊)。課堂上的比喻是寫參考書:不要每一題都做,留一些題目,考前拿來測自己。
Fun Time:第一個權重的正負各一班
題目(第 7 頁): 輸入空間 X = R d \mathcal{X} = \mathbb{R}^d X = R d 。考慮兩個假說集合:H + \mathcal{H}_+ H + 是所有 w 1 ≥ 0 w_1 \ge 0 w 1 ≥ 0 的感知器,H − \mathcal{H}_- H − 是所有 w 1 ≤ 0 w_1 \le 0 w 1 ≤ 0 的感知器。g + g_+ g + 與 g − g_- g − 分別是兩個集合裡 E in E_{\text{in}} E in 最小的假說。下列哪一項正確?
如果 E in ( g + ) < E in ( g − ) E_{\text{in}}(g_+) < E_{\text{in}}(g_-) E in ( g + ) < E in ( g − ) ,那麼 g + g_+ g + 是 R d \mathbb{R}^d R d 上所有感知器裡 E in E_{\text{in}} E in 最小的。
如果 E test ( g + ) < E test ( g − ) E_{\text{test}}(g_+) < E_{\text{test}}(g_-) E test ( g + ) < E test ( g − ) ,那麼 g + g_+ g + 是 R d \mathbb{R}^d R d 上所有感知器裡 E test E_{\text{test}} E test 最小的。
這兩個假說集合沒有交集。
以上皆非。
答案:1。 任何感知器的 w 1 w_1 w 1 不是大於等於 0 就是小於等於 0,所以 H + ∪ H − \mathcal{H}_+ \cup \mathcal{H}_- H + ∪ H − 是全部的感知器。套用剛才那條式子:兩個集合各自的最小 E in E_{\text{in}} E in 再取小的,就是聯集上的最小 E in E_{\text{in}} E in 。g + g_+ g + 的比較小,它就是所有感知器裡 E in E_{\text{in}} E in 最小的。這題其實是把第 4 頁的第二個問題換個樣子再問一次。
選項 2 錯在 g + g_+ g + 與 g − g_- g − 是照 E in E_{\text{in}} E in 挑出來的。比較它們兩個的 E test E_{\text{test}} E test ,只知道兩個之中誰好,其他感知器的 E test E_{\text{test}} E test 可能更低。選項 3 講義的解答有說明:w 1 = 0 w_1 = 0 w 1 = 0 的感知器同時屬於兩邊,兩個集合有交集。
留 K 筆當驗證集:保證是什麼、選完為什麼要重訓、K 取多大
YouTube:Validation :: Validation @ Machine Learning Foundations (機器學習基石)
(影片 00:00–04:01 是驗證集的切法與保證,04:01–07:36 是選模型的流程與重訓,07:36–09:38 看實驗圖,09:38–11:59 談 K K K 的兩難,之後是經驗值與 Fun Time。)
切法與記號
第 8 頁把 D \mathcal{D} D 切成兩塊:
D ⏟ size N → D train ⏟ size N − K ∪ D val ⏟ size K \underbrace{\mathcal{D}}_{\text{size } N} \ \rightarrow\ \underbrace{\mathcal{D}_{\text{train}}}_{\text{size } N-K} \ \cup\ \underbrace{\mathcal{D}_{\text{val}}}_{\text{size } K} size N D → size N − K D train ∪ size K D val
原本的做法 驗證的做法 交給演算法的資料 D \mathcal{D} D (N N N 筆)D train \mathcal{D}_{\text{train}} D train (N − K N-K N − K 筆)得到的假說 g m = A m ( D ) g_m = \mathcal{A}_m(\mathcal{D}) g m = A m ( D ) g m − = A m ( D train ) g_m^- = \mathcal{A}_m(\mathcal{D}_{\text{train}}) g m − = A m ( D train ) 拿來選模型的誤差 E in E_{\text{in}} E in ,在 D \mathcal{D} D 上算E val E_{\text{val}} E val ,在 D val \mathcal{D}_{\text{val}} D val 上算
D val \mathcal{D}_{\text{val}} D val 叫驗證集(validation set),講義說它是測試資料在手上的模擬(on-hand simulation of test set)。g m − g_m^- g m − 上面那個減號,課堂上解釋是提醒它用了比較少的資料:原本有 1000 筆、留 100 筆驗證,演算法就只看到 900 筆,學出來的假說可能跟用 1000 筆的不一樣。
切的時候有兩個規矩,各自保證一件事。
隨機抽。 D \mathcal{D} D 本來就是從 P ( x , y ) P(\mathbf{x}, y) P ( x , y ) 獨立同分布(iid)抽出來的,從裡面均勻隨機抽 K K K 筆,D val \mathcal{D}_{\text{val}} D val 也還是 iid 來自同一個 P P P 。這把 E val E_{\text{val}} E val 和 E out E_{\text{out}} E out 接了起來。
演算法只看 D train \mathcal{D}_{\text{train}} D train 。 這保證 D val \mathcal{D}_{\text{val}} D val 是乾淨的。
課堂上把這個安排講成角色分工:原本 D \mathcal{D} D 一個人扮兩個角色,既要拿去訓練出 g g g ,又要拿來算 E in E_{\text{in}} E in 做選擇,資料因此被污染。現在兩個角色分給兩塊資料,一塊負責訓練出 g − g^- g − ,一塊負責回報 g − g^- g − 表現得多好。
保證從哪裡來
講義在第 8 頁直接寫出結論:
E out ( g m − ) ≤ E val ( g m − ) + O ( log M K ) E_{\text{out}}(g_m^-) \le E_{\text{val}}(g_m^-) + O\bigg(\sqrt{\frac{\log M}{K}}\bigg) E out ( g m − ) ≤ E val ( g m − ) + O ( K log M )
課堂上只說這跟剛才用 E test E_{\text{test}} E test 的情形一樣,是自己切一小塊出來當測試資料,用的是有限個假說的 Hoeffding。下面的推導是本文補的,用的全是基石第 4 堂 的結果,適用於 0/1 這類有界的誤差。
第一步:單一個假說。 先把 D train \mathcal{D}_{\text{train}} D train 固定下來。g m − g_m^- g m − 只由 D train \mathcal{D}_{\text{train}} D train 決定,對 D val \mathcal{D}_{\text{val}} D val 來說它是一個事先定好的假說。E val ( g m − ) E_{\text{val}}(g_m^-) E val ( g m − ) 是它在 K K K 筆 iid 資料上的平均誤差,這 K K K 筆每一筆的誤差期望值都是 E out ( g m − ) E_{\text{out}}(g_m^-) E out ( g m − ) 。這正是 Hoeffding 的情境,只是筆數從 N N N 換成 K K K :
P [ ∣ E val ( g m − ) − E out ( g m − ) ∣ > ϵ ] ≤ 2 exp ( − 2 ϵ 2 K ) P\Big[\big\lvert E_{\text{val}}(g_m^-) - E_{\text{out}}(g_m^-)\big\rvert > \epsilon\Big] \le 2\exp(-2\epsilon^2 K) P [ E val ( g m − ) − E out ( g m − ) > ϵ ] ≤ 2 exp ( − 2 ϵ 2 K )
第二步:M M M 個假說一起。 我們要的是「不管最後選到誰都成立」,所以要求 M M M 個假說沒有一個出事。任何一個出事的機率,不會超過各自出事的機率加起來:
P [ some m : ∣ E val ( g m − ) − E out ( g m − ) ∣ > ϵ ] ≤ 2 M exp ( − 2 ϵ 2 K ) P\Big[\text{some } m:\ \big\lvert E_{\text{val}}(g_m^-) - E_{\text{out}}(g_m^-)\big\rvert > \epsilon\Big] \le 2M\exp(-2\epsilon^2 K) P [ some m : E val ( g m − ) − E out ( g m − ) > ϵ ] ≤ 2 M exp ( − 2 ϵ 2 K )
第三步:解出 ϵ \epsilon ϵ 。 令右邊等於 δ \delta δ ,取對數移項:
2 M exp ( − 2 ϵ 2 K ) = δ ⟹ ϵ = 1 2 K ln 2 M δ 2M\exp(-2\epsilon^2 K) = \delta \quad\Longrightarrow\quad \epsilon = \sqrt{\frac{1}{2K}\ln\frac{2M}{\delta}} 2 M exp ( − 2 ϵ 2 K ) = δ ⟹ ϵ = 2 K 1 ln δ 2 M
所以至少有 1 − δ 1 - \delta 1 − δ 的機率,每一個 m m m 都滿足 E out ( g m − ) ≤ E val ( g m − ) + 1 2 K ln 2 M δ E_{\text{out}}(g_m^-) \le E_{\text{val}}(g_m^-) + \sqrt{\frac{1}{2K}\ln\frac{2M}{\delta}} E out ( g m − ) ≤ E val ( g m − ) + 2 K 1 ln δ 2 M ,被選中的 m ∗ m^* m ∗ 當然也滿足。把常數收進 O ( ⋅ ) O(\cdot) O ( ⋅ ) 就是講義的式子。E test E_{\text{test}} E test 那條保證是同一個推導,把 K K K 換成 N test N_{\text{test}} N test 。
代幾個數字看看,取 M = 100 M = 100 M = 100 、δ = 0.05 \delta = 0.05 δ = 0.05 :
驗證集大小 K K K 1 2 K ln 2 M δ \sqrt{\frac{1}{2K}\ln\frac{2M}{\delta}} 2 K 1 ln δ 2 M 200 0.144 20 0.455 1 2.04
K = 200 K = 200 K = 200 時誤差範圍是 14 個百分點左右;K = 1 K = 1 K = 1 時算出來超過 1,對 0/1 誤差來說等於什麼都沒保證。M M M 的影響小得多:K = 200 K = 200 K = 200 時把 M M M 從 100 換成前面組合表乘出來的 1296,數字只從 0.144 變成 0.165,因為 M M M 在對數裡面。
這個推導成立的關鍵在第一步:g m − g_m^- g m − 不能跟 D val \mathcal{D}_{\text{val}} D val 有關。只要演算法偷看過驗證集,g m − g_m^- g m − 就不是事先定好的假說,Hoeffding 用不上,這就是「乾淨」在數學上的意思。
選模型的流程,以及最後那次重訓
第 9 頁把選擇的式子換成 E val E_{\text{val}} E val :
m ∗ = argmin 1 ≤ m ≤ M ( E m = E val ( A m ( D train ) ) ) m^* = \operatorname*{argmin}_{1 \le m \le M} \big(E_m = E_{\text{val}}(\mathcal{A}_m(\mathcal{D}_{\text{train}}))\big) m ∗ = 1 ≤ m ≤ M argmin ( E m = E val ( A m ( D train )) )
同一頁右邊有一張流程圖,內容如下:
把 D \mathcal{D} D 切成 D train \mathcal{D}_{\text{train}} D train 與 D val \mathcal{D}_{\text{val}} D val 。
D train \mathcal{D}_{\text{train}} D train 分別送進 H 1 , H 2 , … , H M \mathcal{H}_1, \mathcal{H}_2, \dots, \mathcal{H}_M H 1 , H 2 , … , H M ,得到 g 1 − , g 2 − , … , g M − g_1^-, g_2^-, \dots, g_M^- g 1 − , g 2 − , … , g M − 。
用 D val \mathcal{D}_{\text{val}} D val 算每個 g m − g_m^- g m − 的驗證誤差 E 1 , E 2 , … , E M E_1, E_2, \dots, E_M E 1 , E 2 , … , E M 。
挑最小的,得到 ( H m ∗ , E m ∗ ) (\mathcal{H}_{m^*}, E_{m^*}) ( H m ∗ , E m ∗ ) 。
把完整的 D \mathcal{D} D 送進 H m ∗ \mathcal{H}_{m^*} H m ∗ 重新訓練,輸出 g m ∗ g_{m^*} g m ∗ 。
第 5 步是容易漏掉的。選出 37 號模型之後,回傳的是用全部資料重訓的 g 37 g_{37} g 37 ,不是選模型時用的 g 37 − g_{37}^- g 37 − 。理由寫成一條不等式:
E out ( g m ∗ ⏟ A m ∗ ( D ) ) ≤ E out ( g m ∗ − ⏟ A m ∗ ( D train ) ) E_{\text{out}}\big(\underbrace{g_{m^*}}_{\mathcal{A}_{m^*}(\mathcal{D})}\big) \le E_{\text{out}}\big(\underbrace{g_{m^*}^-}_{\mathcal{A}_{m^*}(\mathcal{D}_{\text{train}})}\big) E out ( A m ∗ ( D ) g m ∗ ) ≤ E out ( A m ∗ ( D train ) g m ∗ − )
講義在旁邊寫的是 learning curve, remember?:資料愈多,E out E_{\text{out}} E out 通常愈低,這是基石第 9 堂 與基石第 13 堂 看過的學習曲線。
這條不等式和「保證從哪裡來」推出的那條地位不同。講義把它叫 heuristic gain,印成灰色。課堂上特別交代:這一段不是理論上的保證,比較像實務上的經驗;加上一堆限制條件或許證得出來,但這堂課的重點是把手上的資料盡量用完。兩條接起來就是第 9 頁頁尾的式子:
E out ( g m ∗ ) ≤ E out ( g m ∗ − ) ≤ E val ( g m ∗ − ) + O ( log M K ) E_{\text{out}}(g_{m^*}) \le E_{\text{out}}(g_{m^*}^-) \le E_{\text{val}}(g_{m^*}^-) + O\bigg(\sqrt{\frac{\log M}{K}}\bigg) E out ( g m ∗ ) ≤ E out ( g m ∗ − ) ≤ E val ( g m ∗ − ) + O ( K log M )
左邊的不等號靠經驗,右邊的靠 Hoeffding。
講義上的實驗:四條線
第 10 頁用驗證在五次多項式 H Φ 5 \mathcal{H}_{\boldsymbol{\Phi}_5} H Φ 5 與十次多項式 H Φ 10 \mathcal{H}_{\boldsymbol{\Phi}_{10}} H Φ 10 之間做選擇。圖的橫軸是驗證集大小 K K K (刻度標 5、15、25,曲線從 5 的左邊就開始畫),縱軸是期望的 E out E_{\text{out}} E out (刻度標 0.48、0.52、0.56),愈低愈好。圖上有四條線:
線 做法 在圖上的樣子 in-sample(黑色水平實線) 用 E in E_{\text{in}} E in 選 不隨 K K K 變,高度大約 0.545 optimal(黑色虛線,右邊對應的說明文字印成灰色) 作弊,用 E test E_{\text{test}} E test 選 最低,大約 0.47,在 0.48 的刻度下方 sub-g(紅線) 用 E val E_{\text{val}} E val 選,回傳 g m ∗ − g_{m^*}^- g m ∗ − 最左邊在黑線下方(大約 0.535),之後一路往上,K K K 大約 8 到 9 時穿過黑線,K K K 大約 11 時已經超出圖的上緣 0.56 full-g(藍線) 用 E val E_{\text{val}} E val 選,回傳 g m ∗ g_{m^*} g m ∗ 和紅線從差不多的高度出發,之後一直在黑線與紅線下方;最低點大約在 K = 17 K = 17 K = 17 (大約 0.52),到 K = 25 K = 25 K = 25 略微回升到大約 0.53
上表「在圖上的樣子」那一欄的數值都是本文從圖上目測的大約值,講義沒有印出數字。課堂上逐條說明。用 E in E_{\text{in}} E in 選,每次都會選到十次多項式,因為它的 E in E_{\text{in}} E in 一定比較小,所以是一條水平線。這條線畫成虛線、說明用灰色,表示實際上做不到,要作弊才做得到。藍線始終比紅線低,印證 g g g 比 g − g^- g − 好;藍線也比黑線低,表示用驗證來選確實比用 E in E_{\text{in}} E in 選安全。
頁尾留了一個問題:為什麼 sub-g 有時候比 in-sample 還差?講義沒寫答案,課堂上回答了:K K K 變大,D train \mathcal{D}_{\text{train}} D train 就變小,g m − g_m^- g m − 是用比較少的資料學出來的,表現比較差。就算在這些 g m − g_m^- g m − 裡選對了模型,回傳的東西還是可能輸給用了全部資料的 g g g ,即使後者是照 E in E_{\text{in}} E in 選的。
K 的兩難
第 11 頁把驗證的推理寫成一條近似鏈:
E out ( g ) ≈ small K E out ( g − ) ≈ large K E val ( g − ) E_{\text{out}}(g) \underset{\text{small } K}{\approx} E_{\text{out}}(g^-) \underset{\text{large } K}{\approx} E_{\text{val}}(g^-) E out ( g ) small K ≈ E out ( g − ) large K ≈ E val ( g − )
我們是用最右邊的 E val ( g − ) E_{\text{val}}(g^-) E val ( g − ) 做選擇,心裡想選到的是最左邊 E out ( g ) E_{\text{out}}(g) E out ( g ) 最好的那個。兩個近似要的 K K K 方向相反:
K K K 大: 每個 E val E_{\text{val}} E val 都接近 E out E_{\text{out}} E out (右邊的近似好),但所有的 g m − g_m^- g m − 都比 g m g_m g m 差很多(左邊的近似壞)。這是圖上右半邊紅線與藍線分得很開的地方。
K K K 小: 每個 g m − g_m^- g m − 都接近 g m g_m g m (左邊好),但 E val E_{\text{val}} E val 離 E out E_{\text{out}} E out 很遠(右邊壞)。「保證從哪裡來」那張表的 K = 1 K = 1 K = 1 就是這種情形。
講義給的經驗值(practical rule of thumb)是
K = N 5 K = \frac{N}{5} K = 5 N
課堂上補充,也有人用十分之一或二十分之一,五分之一是很常見的數字。
六筆資料:切一次驗證集
回到本文自擬的六筆資料。N / 5 = 1.2 N/5 = 1.2 N /5 = 1.2 不是整數,這裡取 K = 2 K = 2 K = 2 。假設隨機抽到第 2 筆與第 5 筆當驗證集:
D val = { ( 1 , 1 ) , ( 4 , 3 ) } , D train = { ( 0 , 1 ) , ( 2 , 2.5 ) , ( 3 , 3 ) , ( 5 , 3 ) } \mathcal{D}_{\text{val}} = \{(1, 1),\ (4, 3)\},\qquad \mathcal{D}_{\text{train}} = \{(0, 1),\ (2, 2.5),\ (3, 3),\ (5, 3)\} D val = {( 1 , 1 ) , ( 4 , 3 )} , D train = {( 0 , 1 ) , ( 2 , 2.5 ) , ( 3 , 3 ) , ( 5 , 3 )}
常數模型。 g 0 − g_0^- g 0 − 是訓練集四個 y y y 的平均:( 1 + 2.5 + 3 + 3 ) / 4 = 2.375 (1 + 2.5 + 3 + 3)/4 = 2.375 ( 1 + 2.5 + 3 + 3 ) /4 = 2.375 。在驗證集上,( 1 − 2.375 ) 2 = 1.8906 (1 - 2.375)^2 = 1.8906 ( 1 − 2.375 ) 2 = 1.8906 、( 3 − 2.375 ) 2 = 0.3906 (3 - 2.375)^2 = 0.3906 ( 3 − 2.375 ) 2 = 0.3906 ,平均 E val = 1.1406 E_{\text{val}} = 1.1406 E val = 1.1406 。
直線模型。 一維的最小平方法就是斜率公式。訓練集的 x ˉ = 2.5 \bar{x} = 2.5 x ˉ = 2.5 、y ˉ = 2.375 \bar{y} = 2.375 y ˉ = 2.375 :
w 1 = ∑ ( x n − x ˉ ) ( y n − y ˉ ) ∑ ( x n − x ˉ ) 2 = 3.4375 − 0.0625 + 0.3125 + 1.5625 6.25 + 0.25 + 0.25 + 6.25 = 5.25 13 ≈ 0.4038 w_1 = \frac{\sum (x_n - \bar{x})(y_n - \bar{y})}{\sum (x_n - \bar{x})^2} = \frac{3.4375 - 0.0625 + 0.3125 + 1.5625}{6.25 + 0.25 + 0.25 + 6.25} = \frac{5.25}{13} \approx 0.4038 w 1 = ∑ ( x n − x ˉ ) 2 ∑ ( x n − x ˉ ) ( y n − y ˉ ) = 6.25 + 0.25 + 0.25 + 6.25 3.4375 − 0.0625 + 0.3125 + 1.5625 = 13 5.25 ≈ 0.4038
w 0 = y ˉ − w 1 x ˉ = 2.375 − 0.4038 × 2.5 = 1.3654 w_0 = \bar{y} - w_1\bar{x} = 2.375 - 0.4038 \times 2.5 = 1.3654 w 0 = y ˉ − w 1 x ˉ = 2.375 − 0.4038 × 2.5 = 1.3654 ,所以 g 1 − ( x ) = 1.3654 + 0.4038 x g_1^-(x) = 1.3654 + 0.4038x g 1 − ( x ) = 1.3654 + 0.4038 x 。它在 x = 1 x = 1 x = 1 預測 1.7692 1.7692 1.7692 ,誤差平方 0.5917 0.5917 0.5917 ;在 x = 4 x = 4 x = 4 預測 2.9808 2.9808 2.9808 ,誤差平方 0.0004 0.0004 0.0004 。E val = 0.2960 E_{\text{val}} = 0.2960 E val = 0.2960 。
二次模型。 解出來是 g 2 − ( x ) = 0.9904 + 1.0288 x − 0.125 x 2 g_2^-(x) = 0.9904 + 1.0288x - 0.125x^2 g 2 − ( x ) = 0.9904 + 1.0288 x − 0.125 x 2 。它在 x = 1 x = 1 x = 1 預測 1.8942 1.8942 1.8942 、在 x = 4 x = 4 x = 4 預測 3.1058 3.1058 3.1058 ,誤差平方是 0.7996 0.7996 0.7996 與 0.0112 0.0112 0.0112 ,E val = 0.4054 E_{\text{val}} = 0.4054 E val = 0.4054 。
模型 在 D train \mathcal{D}_{\text{train}} D train 上的誤差 E val E_{\text{val}} E val 常數 0.6719 1.1406 直線 0.1418 0.2960 二次 0.0012 0.4054
二次模型幾乎穿過訓練集的四個點(誤差 0.0012),到了沒看過的兩筆卻輸給直線。E val E_{\text{val}} E val 最小的是直線,被選中的就是直線模型。照流程的第 5 步,用全部六筆重訓,回傳的是前面算過的 g ( x ) = 1.0714 + 0.4714 x g(x) = 1.0714 + 0.4714x g ( x ) = 1.0714 + 0.4714 x 。
這個結果代表什麼。 這份資料是編的,所以可以對答案。假設 x x x 在 [ 0 , 5 ] [0, 5] [ 0 , 5 ] 上均勻分布、雜訊的平均是 0,那麼 E out ( g ) E_{\text{out}}(g) E out ( g ) 等於 1 5 ∫ 0 5 ( g ( x ) − f ( x ) ) 2 d x \frac{1}{5}\int_0^5 (g(x) - f(x))^2\,dx 5 1 ∫ 0 5 ( g ( x ) − f ( x ) ) 2 d x 加上雜訊的變異數;後者每個假說都一樣,只要比前者:
回傳的假說 與 f f f 的平均平方差距 常數,全部六筆 0.5208 直線,全部六筆(g g g ) 0.0017 二次,全部六筆 0.0495 直線,只用四筆(g − g^- g − ) 0.0349
三個模型裡直線離 f f f 最近,E val E_{\text{val}} E val 選對了,E in E_{\text{in}} E in 選到的二次曲線差了將近 30 倍。最後兩列對照的是重訓:同樣是直線,用六筆的 g g g 比用四筆的 g − g^- g − 近得多,這個例子裡 E out ( g m ∗ ) ≤ E out ( g m ∗ − ) E_{\text{out}}(g_{m^*}) \le E_{\text{out}}(g_{m^*}^-) E out ( g m ∗ ) ≤ E out ( g m ∗ − ) 成立。
換一種切法呢。 六筆裡留兩筆共有 ( 6 2 ) = 15 \binom{6}{2} = 15 ( 2 6 ) = 15 種切法,本文全部算過:7 種選到直線,2 種是直線與二次平手(訓練出來的二次項係數剛好是 0),5 種選到二次,1 種選到常數。選到常數的那一種是留下最後兩筆(第 5、6 筆):訓練集只剩 x = 0 x = 0 x = 0 到 3 3 3 的四筆,y y y 一路往上,直線與二次曲線都往右上延伸過頭,三個 E val E_{\text{val}} E val 是 1.2656、1.4062、5.0781,常數反而最小。
K = 2 K = 2 K = 2 的驗證誤差只是兩個數字的平均,換一種切法結論就可能不同。這是下一節的出發點。
Fun Time:驗證要花多少時間
題目(第 12 頁): 某個學習模型用 N N N 筆資料訓練要花 N 2 N^2 N 2 秒。取 K = N 5 K = \frac{N}{5} K = 5 N ,對 25 個參數不同的這種模型跑完整個驗證流程、得到最後的 g m ∗ g_{m^*} g m ∗ ,總共要幾秒?
6 N 2 6N^2 6 N 2
17 N 2 17N^2 17 N 2
25 N 2 25N^2 25 N 2
26 N 2 26N^2 26 N 2
答案:2。 流程裡有兩種訓練。先是 25 個模型各在 D train \mathcal{D}_{\text{train}} D train 上訓練一次,D train \mathcal{D}_{\text{train}} D train 有 N − N 5 = 4 N 5 N - \frac{N}{5} = \frac{4N}{5} N − 5 N = 5 4 N 筆,每次花 ( 4 N 5 ) 2 = 16 25 N 2 \big(\frac{4N}{5}\big)^2 = \frac{16}{25}N^2 ( 5 4 N ) 2 = 25 16 N 2 秒,25 次共 16 N 2 16N^2 16 N 2 秒。再來是選中的模型用全部 N N N 筆重訓一次,N 2 N^2 N 2 秒。合計 17 N 2 17N^2 17 N 2 。
25 N 2 25N^2 25 N 2 是 25 個模型各用全部資料訓練一次的時間,也就是照 E in E_{\text{in}} E in 選的成本;26 N 2 26N^2 26 N 2 是在那之後又多訓練一次。6 N 2 6N^2 6 N 2 太小,光是第一階段就要 16 N 2 16N^2 16 N 2 。
課堂上從這題多帶出一件事:17 N 2 17N^2 17 N 2 比 25 N 2 25N^2 25 N 2 小。驗證不見得比較慢,因為訓練 g m − g_m^- g m − 時丟進去的資料比較少。
把 K 推到 1:leave-one-out 交叉驗證
YouTube:Validation :: Leave-One-Out Cross Validation @ Machine Learning Foundations (機器學習基石)
(影片 00:00–03:53 是 K = 1 K = 1 K = 1 與 E loocv E_{\text{loocv}} E loocv 的定義,03:53–07:27 用三個點示範並拿來選模型,07:27–12:57 是理論保證,12:57–15:24 看手寫數字的實驗,之後是 Fun Time。)
一筆驗證資料不夠,就輪流當
K K K 又要大又要小,兩邊很難同時滿足。第 13 頁先看一個極端:K = 1 K = 1 K = 1 。這時 g − g^- g − 用了 N − 1 N - 1 N − 1 筆,跟 g g g 幾乎一樣,近似鏈左邊那一段沒問題。麻煩在右邊:只有一筆驗證資料。
假設留下的是第 n n n 筆。記號上,驗證集是 D val ( n ) = { ( x n , y n ) } \mathcal{D}_{\text{val}}^{(n)} = \{(\mathbf{x}_n, y_n)\} D val ( n ) = {( x n , y n )} ,用其餘 N − 1 N - 1 N − 1 筆訓練出來的假說是 g n − g_n^- g n − ,驗證誤差只有一項:
E val ( n ) ( g n − ) = err ( g n − ( x n ) , y n ) = e n E_{\text{val}}^{(n)}(g_n^-) = \text{err}\big(g_n^-(\mathbf{x}_n), y_n\big) = e_n E val ( n ) ( g n − ) = err ( g n − ( x n ) , y n ) = e n
單獨一個 e n e_n e n 說明不了什麼。課堂上的例子是二元分類:e n e_n e n 不是 0 就是 1,看不出真正的 E out E_{\text{out}} E out 是 32% 還是 27%。講義的辦法是把每一筆都輪流留下來一次,得到 e 1 , e 2 , … , e N e_1, e_2, \dots, e_N e 1 , e 2 , … , e N ,再平均:
E loocv ( H , A ) = 1 N ∑ n = 1 N e n = 1 N ∑ n = 1 N err ( g n − ( x n ) , y n ) E_{\text{loocv}}(\mathcal{H}, \mathcal{A}) = \frac{1}{N}\sum_{n=1}^{N} e_n = \frac{1}{N}\sum_{n=1}^{N} \text{err}\big(g_n^-(\mathbf{x}_n), y_n\big) E loocv ( H , A ) = N 1 n = 1 ∑ N e n = N 1 n = 1 ∑ N err ( g n − ( x n ) , y n )
這叫 leave-one-out cross validation。課堂上拆開名字解釋:leave-one-out 是留一筆下來當驗證資料;cross(交叉)是指同一筆資料有時候當訓練資料、有時候當驗證資料。
注意 E loocv E_{\text{loocv}} E loocv 的引數是 ( H , A ) (\mathcal{H}, \mathcal{A}) ( H , A ) ,不是某一個假說。N N N 個 e n e_n e n 來自 N N N 個不同的 g n − g_n^- g n − ,課堂上說,它回報的不是單一個 g − g^- g − 好不好,而是這個演算法在這份資料上表現得好不好。我們希望的是 E loocv ( H , A ) ≈ E out ( g ) E_{\text{loocv}}(\mathcal{H}, \mathcal{A}) \approx E_{\text{out}}(g) E loocv ( H , A ) ≈ E out ( g ) 。
三個點的圖:直線還是常數
第 14 頁用三個點畫了兩排圖。上排是直線模型:每次拿掉一個點,剩下兩個點決定一條直線,e n e_n e n 是被拿掉的點到這條線的鉛直距離的平方,三張小圖分別標出 e 1 e_1 e 1 、e 2 e_2 e 2 、e 3 e_3 e 3 。下排是常數模型:兩個點的最佳常數是它們 y y y 值的平均(課堂上說是兩個點的中間值),e n e_n e n 一樣是被拿掉的點到這條水平線的距離平方。
E loocv ( linear ) = 1 3 ( e 1 + e 2 + e 3 ) , E loocv ( constant ) = 1 3 ( e 1 + e 2 + e 3 ) E_{\text{loocv}}(\text{linear}) = \frac{1}{3}(e_1 + e_2 + e_3),\qquad E_{\text{loocv}}(\text{constant}) = \frac{1}{3}(e_1 + e_2 + e_3) E loocv ( linear ) = 3 1 ( e 1 + e 2 + e 3 ) , E loocv ( constant ) = 3 1 ( e 1 + e 2 + e 3 )
上排第一張圖裡,剩下的兩個點靠得很近、高度不同,連出來的線很陡,被拿掉的點離它很遠。課堂上指出,誤差取了平方,這一項非常大,所以上排的平均比下排高。leave-one-out 在這裡告訴你:只有三個點的時候,用常數就好,直線對這份資料已經太複雜。
講義的圖沒有標數字,本文自擬三個形狀類似的點來算一次:( 0 , 0 ) (0, 0) ( 0 , 0 ) 、( 3 , 1 ) (3, 1) ( 3 , 1 ) 、( 4 , 3 ) (4, 3) ( 4 , 3 ) 。
拿掉的點 直線:剩下兩點連成的線 直線的 e n e_n e n 常數:剩下兩點的平均 常數的 e n e_n e n ( 0 , 0 ) (0, 0) ( 0 , 0 ) y = 2 x − 5 y = 2x - 5 y = 2 x − 5 ,在 x = 0 x = 0 x = 0 是 − 5 -5 − 5 25 25 25 2 2 2 4 4 4 ( 3 , 1 ) (3, 1) ( 3 , 1 ) y = 3 4 x y = \frac{3}{4}x y = 4 3 x ,在 x = 3 x = 3 x = 3 是 2.25 2.25 2.25 1.5625 1.5625 1.5625 1.5 1.5 1.5 0.25 0.25 0.25 ( 4 , 3 ) (4, 3) ( 4 , 3 ) y = 1 3 x y = \frac{1}{3}x y = 3 1 x ,在 x = 4 x = 4 x = 4 是 4 3 \frac{4}{3} 3 4 2.7778 2.7778 2.7778 0.5 0.5 0.5 6.25 6.25 6.25 平均 ≈ 9.78 \approx 9.78 ≈ 9.78 3.5 3.5 3.5
E loocv ( linear ) ≈ 9.78 E_{\text{loocv}}(\text{linear}) \approx 9.78 E loocv ( linear ) ≈ 9.78 ,E loocv ( constant ) = 3.5 E_{\text{loocv}}(\text{constant}) = 3.5 E loocv ( constant ) = 3.5 ,選常數。直線輸在第一列那個 25。
拿它來選模型,就是把「選模型的流程,以及最後那次重訓」裡的 E val E_{\text{val}} E val 換成 E loocv E_{\text{loocv}} E loocv (第 14 頁頁尾):
m ∗ = argmin 1 ≤ m ≤ M ( E m = E loocv ( H m , A m ) ) m^* = \operatorname*{argmin}_{1 \le m \le M} \big(E_m = E_{\text{loocv}}(\mathcal{H}_m, \mathcal{A}_m)\big) m ∗ = 1 ≤ m ≤ M argmin ( E m = E loocv ( H m , A m ) )
選出來之後一樣用全部資料訓練一次,得到 g m ∗ g_{m^*} g m ∗ 。
為什麼說它幾乎無偏
第 15 頁問:E loocv ( H , A ) E_{\text{loocv}}(\mathcal{H}, \mathcal{A}) E loocv ( H , A ) 能不能告訴我們 E out ( g ) E_{\text{out}}(g) E out ( g ) 的事?答案是可以,對象是「用 N − 1 N - 1 N − 1 筆資料訓練時的平均 E out E_{\text{out}} E out 」。
先說清楚要證什麼。課堂上的講法是:拿一個演算法,對 1000 筆資料做 leave-one-out,再對各式各樣不同的 1000 筆資料都做一次、取平均。這個平均值,會等於把 999 筆資料餵給同一個演算法、得到的 g − g^- g − 的 E out E_{\text{out}} E out 的平均。後者記成 E out ‾ ( N − 1 ) \overline{E_{\text{out}}}(N-1) E out ( N − 1 ) ,也就是學習曲線在 N − 1 N - 1 N − 1 那一點的高度。期望值 E D \mathcal{E}_{\mathcal{D}} E D 是對所有大小為 N N N 的資料集取的。
E D E loocv ( H , A ) = E D 1 N ∑ n = 1 N e n = 1 N ∑ n = 1 N E D e n = 1 N ∑ n = 1 N E D n E ( x n , y n ) err ( g n − ( x n ) , y n ) = 1 N ∑ n = 1 N E D n E out ( g n − ) = 1 N ∑ n = 1 N E out ‾ ( N − 1 ) = E out ‾ ( N − 1 ) \begin{aligned}
\mathop{\mathcal{E}}_{\mathcal{D}} E_{\text{loocv}}(\mathcal{H}, \mathcal{A}) = \mathop{\mathcal{E}}_{\mathcal{D}} \frac{1}{N}\sum_{n=1}^{N} e_n
&= \frac{1}{N}\sum_{n=1}^{N} \mathop{\mathcal{E}}_{\mathcal{D}} e_n \\
&= \frac{1}{N}\sum_{n=1}^{N} \mathop{\mathcal{E}}_{\mathcal{D}_n} \mathop{\mathcal{E}}_{(\mathbf{x}_n, y_n)} \text{err}\big(g_n^-(\mathbf{x}_n), y_n\big) \\
&= \frac{1}{N}\sum_{n=1}^{N} \mathop{\mathcal{E}}_{\mathcal{D}_n} E_{\text{out}}(g_n^-) \\
&= \frac{1}{N}\sum_{n=1}^{N} \overline{E_{\text{out}}}(N-1) = \overline{E_{\text{out}}}(N-1)
\end{aligned} E D E loocv ( H , A ) = E D N 1 n = 1 ∑ N e n = N 1 n = 1 ∑ N E D e n = N 1 n = 1 ∑ N E D n E ( x n , y n ) err ( g n − ( x n ) , y n ) = N 1 n = 1 ∑ N E D n E out ( g n − ) = N 1 n = 1 ∑ N E out ( N − 1 ) = E out ( N − 1 )
講義只列了式子。每一步的理由課堂上都講了,整理如下。
第一行: 最左邊的等號只是把 E loocv E_{\text{loocv}} E loocv 的定義代進去。對齊的那個等號用到的是:期望值是線性的,加總也是線性的,兩者可以交換。
第二行: 把 D \mathcal{D} D 拆成兩部分,被留下的那一筆 ( x n , y n ) (\mathbf{x}_n, y_n) ( x n , y n ) ,以及其餘 N − 1 N - 1 N − 1 筆,記成 D n \mathcal{D}_n D n 。資料是 iid 抽的,這兩部分互相獨立,對 D \mathcal{D} D 的期望值可以寫成先對 ( x n , y n ) (\mathbf{x}_n, y_n) ( x n , y n ) 、再對 D n \mathcal{D}_n D n 取期望值。同時把 e n e_n e n 的定義代進去。
第三行: 看裡面那一層。g n − g_n^- g n − 只跟 D n \mathcal{D}_n D n 有關,在裡面那一層它是固定的。一個固定的假說,在從 P P P 抽出來的新資料上的平均誤差,就是 E out E_{\text{out}} E out 的定義。課堂上說,這筆資料叫 ( x n , y n ) (\mathbf{x}_n, y_n) ( x n , y n ) 或 ( x , y ) (\mathbf{x}, y) ( x , y ) 都沒差。本文補充:這一步和「保證從哪裡來」的第一步靠的是同一件事,假說沒看過這筆資料。
第四行的第一個等號: D n \mathcal{D}_n D n 是 N − 1 N - 1 N − 1 筆 iid 資料。對所有這種資料集把 E out ( g n − ) E_{\text{out}}(g_n^-) E out ( g n − ) 平均,就是 E out ‾ ( N − 1 ) \overline{E_{\text{out}}}(N-1) E out ( N − 1 ) 的定義。這個數跟 n n n 無關。
第四行的最後一個等號: N N N 個相同的常數取平均,還是它自己。
講義頁尾的結論是:E loocv ( H , A ) E_{\text{loocv}}(\mathcal{H}, \mathcal{A}) E loocv ( H , A ) 的期望值說出了 E out ( g − ) E_{\text{out}}(g^-) E out ( g − ) 的期望值,常被稱為 almost unbiased estimate of E out ( g ) E_{\text{out}}(g) E out ( g ) 。「almost」是因為等號右邊是 N − 1 N - 1 N − 1 筆的平均表現,我們要的是 N N N 筆的;課堂上說一個用 999 筆、一個用 1000 筆,幾乎一樣。
本文補充兩個讀這條式子時要留意的地方。第一,它講的是期望值,是對很多份資料集平均之後的事;手上只有一份資料,那一次算出來的 E loocv E_{\text{loocv}} E loocv 可以離 E out ‾ ( N − 1 ) \overline{E_{\text{out}}}(N-1) E out ( N − 1 ) 很遠。第二,N N N 個 e n e_n e n 彼此不獨立,因為任兩個 g n − g_n^- g n − 的訓練資料有 N − 2 N - 2 N − 2 筆重複,所以不能把 E loocv E_{\text{loocv}} E loocv 當成 N N N 筆獨立測試資料的平均、直接套 Hoeffding。
用平均值預測驗算一次
以下是本文自擬的驗算,不在講義上。取最簡單的演算法:不看 x \mathbf{x} x ,一律用訓練資料 y y y 的平均值預測,誤差用平方誤差。假設 y y y 是 iid 抽的,平均 μ \mu μ 、變異數 σ 2 \sigma^2 σ 2 。
先算 E out ‾ ( N ) \overline{E_{\text{out}}}(N) E out ( N ) 。 用 N N N 筆訓練得到 y ˉ N \bar{y}_N y ˉ N ,新的一筆 y y y 跟它獨立,兩者的期望值都是 μ \mu μ 。獨立的隨機變數相減,變異數相加:
E out ‾ ( N ) = E [ ( y − y ˉ N ) 2 ] = σ 2 + σ 2 N = σ 2 ( 1 + 1 N ) \overline{E_{\text{out}}}(N) = \mathcal{E}\big[(y - \bar{y}_N)^2\big] = \sigma^2 + \frac{\sigma^2}{N} = \sigma^2\Big(1 + \frac{1}{N}\Big) E out ( N ) = E [ ( y − y ˉ N ) 2 ] = σ 2 + N σ 2 = σ 2 ( 1 + N 1 )
這和基石第 9 堂 線性迴歸的學習曲線 noise level ⋅ ( 1 + d + 1 N ) \text{noise level} \cdot \big(1 + \frac{d+1}{N}\big) noise level ⋅ ( 1 + N d + 1 ) 在 d = 0 d = 0 d = 0 時一致。
再算 E loocv E_{\text{loocv}} E loocv 的期望值。 e n = ( y n − y ˉ − n ) 2 e_n = (y_n - \bar{y}_{-n})^2 e n = ( y n − y ˉ − n ) 2 ,其中 y ˉ − n \bar{y}_{-n} y ˉ − n 是其餘 N − 1 N - 1 N − 1 筆的平均,跟 y n y_n y n 獨立。同樣的算法:
E [ e n ] = σ 2 + σ 2 N − 1 = σ 2 ( 1 + 1 N − 1 ) = E out ‾ ( N − 1 ) \mathcal{E}[e_n] = \sigma^2 + \frac{\sigma^2}{N-1} = \sigma^2\Big(1 + \frac{1}{N-1}\Big) = \overline{E_{\text{out}}}(N-1) E [ e n ] = σ 2 + N − 1 σ 2 = σ 2 ( 1 + N − 1 1 ) = E out ( N − 1 )
每個 e n e_n e n 的期望值都是這個數,平均之後也是。定理成立,而且看得到「almost」差在哪裡:
N N N E [ E in ] \mathcal{E}[E_{\text{in}}] E [ E in ] E [ E loocv ] = E out ‾ ( N − 1 ) \mathcal{E}[E_{\text{loocv}}] = \overline{E_{\text{out}}}(N-1) E [ E loocv ] = E out ( N − 1 ) E out ‾ ( N ) \overline{E_{\text{out}}}(N) E out ( N ) 3 0.667 σ 2 0.667\sigma^2 0.667 σ 2 1.5 σ 2 1.5\sigma^2 1.5 σ 2 1.333 σ 2 1.333\sigma^2 1.333 σ 2 1000 0.999 σ 2 0.999\sigma^2 0.999 σ 2 1.001001 σ 2 1.001001\sigma^2 1.001001 σ 2 1.001 σ 2 1.001\sigma^2 1.001 σ 2
E in E_{\text{in}} E in 那一欄用的是基石第 9 堂的另一條式子 noise level ⋅ ( 1 − d + 1 N ) \text{noise level} \cdot \big(1 - \frac{d+1}{N}\big) noise level ⋅ ( 1 − N d + 1 ) 。N = 3 N = 3 N = 3 時 E loocv E_{\text{loocv}} E loocv 的期望值比真正要的 E out ‾ ( 3 ) \overline{E_{\text{out}}}(3) E out ( 3 ) 高了一些,方向是偏悲觀;E in E_{\text{in}} E in 則只有一半。N N N 一大,差距就消失。本文另外用 Python 做了模擬:N = 3 N = 3 N = 3 、σ = 1 \sigma = 1 σ = 1 ,抽 20 萬份資料,E in E_{\text{in}} E in 、E loocv E_{\text{loocv}} E loocv 、E out ( g − ) E_{\text{out}}(g^-) E out ( g − ) 、E out ( g ) E_{\text{out}}(g) E out ( g ) 的平均分別是 0.666、1.499、1.500、1.334,和上表吻合。
六筆資料的 leave-one-out
回到六筆資料。每個模型要訓練六次,每次留一筆。以留下第 1 筆 ( 0 , 1 ) (0, 1) ( 0 , 1 ) 為例:
常數:其餘五個 y y y 的平均是 12.5 / 5 = 2.5 12.5/5 = 2.5 12.5/5 = 2.5 ,e 1 = ( 1 − 2.5 ) 2 = 2.25 e_1 = (1 - 2.5)^2 = 2.25 e 1 = ( 1 − 2.5 ) 2 = 2.25 。
直線:其餘五筆的最小平方解是 1.15 + 0.45 x 1.15 + 0.45x 1.15 + 0.45 x ,在 x = 0 x = 0 x = 0 預測 1.15 1.15 1.15 ,e 1 = 0.0225 e_1 = 0.0225 e 1 = 0.0225 。
二次:其餘五筆的解是 − 0.6 + 1.95 x − 0.25 x 2 -0.6 + 1.95x - 0.25x^2 − 0.6 + 1.95 x − 0.25 x 2 ,在 x = 0 x = 0 x = 0 預測 − 0.6 -0.6 − 0.6 ,e 1 = 2.56 e_1 = 2.56 e 1 = 2.56 。
二次曲線為了貼合右邊五個點,往左延伸時掉到 − 0.6 -0.6 − 0.6 ,離真正的 y 1 = 1 y_1 = 1 y 1 = 1 很遠。六次都做完:
留下的點 常數的 e n e_n e n 直線的 e n e_n e n 二次的 e n e_n e n 第 1 筆 ( 0 , 1 ) (0, 1) ( 0 , 1 ) 2.2500 0.0225 2.5600 第 2 筆 ( 1 , 1 ) (1, 1) ( 1 , 1 ) 2.2500 0.5933 0.7861 第 3 筆 ( 2 , 2.5 ) (2, 2.5) ( 2 , 2.5 ) 0.0900 0.3517 0.1012 第 4 筆 ( 3 , 3 ) (3, 3) ( 3 , 3 ) 0.8100 0.3943 0.1322 第 5 筆 ( 4 , 3 ) (4, 3) ( 4 , 3 ) 0.8100 0.0037 0.0017 第 6 筆 ( 5 , 3 ) (5, 3) ( 5 , 3 ) 0.8100 0.8100 0.1600 E loocv E_{\text{loocv}} E loocv 1.1700 0.3626 0.6235
E loocv E_{\text{loocv}} E loocv 選直線。和切一次驗證集相比,這裡沒有「剛好抽到哪兩筆」的問題,每一筆都當過一次驗證資料。二次模型在中間四筆其實比直線準,它輸在兩端,尤其是第 1 筆。
手寫數字的實驗
第 16 頁回到前幾堂用過的手寫數字資料,分辨「是 1」與「不是 1」,原始特徵是平均強度(average intensity)與對稱性(symmetry)兩個。對這兩個特徵做多項式轉換,要決定的是用多少個轉換後的特徵。
左下的圖橫軸是使用的特徵數(刻度標 5、10、15、20,曲線從 5 的左邊開始),縱軸是誤差(刻度標 0.01、0.02、0.03),有三條線。圖上沒有印數值,下面的數字都是本文從圖上目測的大約值:
E in E_{\text{in}} E in (藍): 特徵愈多愈低,像階梯一樣一段一段往下,從大約 0.008 降到接近 0。
E out E_{\text{out}} E out (紅): 特徵數少的時候比較低(大約 0.014 到 0.017),超過十個左右之後一下子升到大約 0.027。
E cv E_{\text{cv}} E cv (黑,這裡是 leave-one-out 的結果): 最低的地方在特徵數少的那一段(5 個與 7 個附近各碰到大約 0.008),之後跟著紅線升高,而且上下跳動。
課堂上說明,這是實際的資料,所以曲線不像之前那些平均過的圖那麼平滑,但看得出好的特徵數落在中間偏少的地方,不是愈多愈好;黑線跟紅線比較接近。照 E in E_{\text{in}} E in 選會選到特徵最多的那個,照 E loocv E_{\text{loocv}} E loocv 選,課堂上說會選到五個或七個左右。
上排右邊兩張圖是兩種選法得到的分類邊界:select by E in E_{\text{in}} E in 的邊界彎彎曲曲,select by E loocv E_{\text{loocv}} E loocv 的邊界平滑得多。講義的結論是 E loocv E_{\text{loocv}} E loocv much better than E in E_{\text{in}} E in 。
Fun Time:1、5、7 三個數
題目(第 17 頁): 三筆資料 ( x 1 , y 1 ) (\mathbf{x}_1, y_1) ( x 1 , y 1 ) 、( x 2 , y 2 ) (\mathbf{x}_2, y_2) ( x 2 , y 2 ) 、( x 3 , y 3 ) (\mathbf{x}_3, y_3) ( x 3 , y 3 ) ,其中 y 1 = 1 y_1 = 1 y 1 = 1 、y 2 = 5 y_2 = 5 y 2 = 5 、y 3 = 7 y_3 = 7 y 3 = 7 。某個演算法一律用資料集裡 y y y 的平均值預測,這是平方誤差下最佳的常數預測。用平方誤差算它的 E loocv E_{\text{loocv}} E loocv ,是多少?
0 0 0
56 9 \frac{56}{9} 9 56
60 9 \frac{60}{9} 9 60
14 14 14
答案:4。 每次留一筆,用另外兩筆的平均預測它:
留 y 1 = 1 y_1 = 1 y 1 = 1 :另外兩筆平均 5 + 7 2 = 6 \frac{5+7}{2} = 6 2 5 + 7 = 6 ,e 1 = ( 1 − 6 ) 2 = 25 e_1 = (1 - 6)^2 = 25 e 1 = ( 1 − 6 ) 2 = 25 。
留 y 2 = 5 y_2 = 5 y 2 = 5 :另外兩筆平均 1 + 7 2 = 4 \frac{1+7}{2} = 4 2 1 + 7 = 4 ,e 2 = ( 5 − 4 ) 2 = 1 e_2 = (5 - 4)^2 = 1 e 2 = ( 5 − 4 ) 2 = 1 。
留 y 3 = 7 y_3 = 7 y 3 = 7 :另外兩筆平均 1 + 5 2 = 3 \frac{1+5}{2} = 3 2 1 + 5 = 3 ,e 3 = ( 7 − 3 ) 2 = 16 e_3 = (7 - 3)^2 = 16 e 3 = ( 7 − 3 ) 2 = 16 。
E loocv = 25 + 1 + 16 3 = 14 E_{\text{loocv}} = \frac{25 + 1 + 16}{3} = 14 E loocv = 3 25 + 1 + 16 = 14 。課堂上說,這題就是第 14 頁下排那三張圖的計算。
選項 2 的 56 9 \frac{56}{9} 9 56 是 E in E_{\text{in}} E in :三筆的平均是 13 3 \frac{13}{3} 3 13 ,1 3 [ ( 1 − 13 3 ) 2 + ( 5 − 13 3 ) 2 + ( 7 − 13 3 ) 2 ] = 1 3 ⋅ 168 9 = 56 9 \frac{1}{3}\big[(1 - \frac{13}{3})^2 + (5 - \frac{13}{3})^2 + (7 - \frac{13}{3})^2\big] = \frac{1}{3} \cdot \frac{168}{9} = \frac{56}{9} 3 1 [ ( 1 − 3 13 ) 2 + ( 5 − 3 13 ) 2 + ( 7 − 3 13 ) 2 ] = 3 1 ⋅ 9 168 = 9 56 。忘記把被測的那一筆從平均裡拿掉,就會算出它。E loocv = 14 E_{\text{loocv}} = 14 E loocv = 14 是 E in ≈ 6.22 E_{\text{in}} \approx 6.22 E in ≈ 6.22 的兩倍多,和「用平均值預測驗算一次」表中 N = 3 N = 3 N = 3 那一列的方向一致。選項 1 的 0 不可能,三個 y y y 不一樣,常數怎麼猜都有誤差。選項 3 講義沒有說明來源。本文找到一個對得上的算式:拿三個 y y y 的中位數 5 當常數預測、在三筆資料上直接算平方誤差,是 1 3 [ ( 1 − 5 ) 2 + ( 5 − 5 ) 2 + ( 7 − 5 ) 2 ] = 20 3 = 60 9 \frac{1}{3}\big[(1-5)^2 + (5-5)^2 + (7-5)^2\big] = \frac{20}{3} = \frac{60}{9} 3 1 [ ( 1 − 5 ) 2 + ( 5 − 5 ) 2 + ( 7 − 5 ) 2 ] = 3 20 = 9 60 。這既沒有用平均值,也沒有把被測的那一筆留下來,不是題目問的 E loocv E_{\text{loocv}} E loocv 。
本文補充:題目沒給 x \mathbf{x} x ,因為常數模型用不到。如果補上 x = 1 , 2 , 3 x = 1, 2, 3 x = 1 , 2 , 3 再讓直線模型來比,三個 e n e_n e n 是 4 4 4 、1 1 1 、4 4 4 ,E loocv ( linear ) = 3 E_{\text{loocv}}(\text{linear}) = 3 E loocv ( linear ) = 3 ,遠低於常數的 14。這三筆幾乎在一條直線上,leave-one-out 這次選直線。它不會固定偏向簡單的模型,看的是資料。
算得起又夠穩的版本:V-fold 交叉驗證
YouTube:Validation :: V-Fold Cross Validation @ Machine Learning Foundations (機器學習基石)
(影片 00:00–02:28 是 leave-one-out 的兩個缺點,02:28–05:25 是 V-fold,05:25–08:28 是對驗證的總結提醒,08:28–08:59 是 Fun Time,之後是整堂的總結與下一堂預告。)
leave-one-out 的兩個缺點
第 18 頁列了兩項。
計算量(computation)。 每個模型要多訓練 N N N 次。課堂上的數字是 1000 筆資料就要訓練 1000 次,每次丟 999 筆進去,很多時候實務上不可行。講義提到例外:線性迴歸這類有解析解的特殊情形。課堂上說,線性迴歸的 leave-one-out 誤差也有公式解,可以很快算出來,但多數模型沒有這種捷徑。
穩定性(stability)。 講義寫的原因是 variance of single-point estimates,並把第 16 頁那張圖再放一次。課堂上解釋:每個 e n e_n e n 只在一個點上量。以二元分類來說,它不是 0 就是 1,跳動很大,想靠平均把這些跳動消掉並不容易,所以圖上那條黑線會跳動。這對選擇是壞事:我們不希望選中某個模型,只是因為它的曲線剛好在那裡往下跳了一格。
講義的結論是 E loocv E_{\text{loocv}} E loocv : not often used practically。
切成 V 份
第 19 頁先換個角度看 leave-one-out:它是把 D \mathcal{D} D 切成 N N N 份,輪流拿 N − 1 N - 1 N − 1 份訓練、1 份驗證。計算量大,就是因為切得太細。
那就切粗一點。V-fold cross validation 把 D \mathcal{D} D 隨機切成 V V V 等份,輪流拿其中 1 份驗證、其餘 V − 1 V - 1 V − 1 份訓練。講義的圖是 V = 10 V = 10 V = 10 :D \mathcal{D} D 切成 D 1 \mathcal{D}_1 D 1 到 D 10 \mathcal{D}_{10} D 10 ,圖上畫的是輪到 D 4 \mathcal{D}_4 D 4 當驗證(validate),其餘九份訓練(train)的那一次。第 v v v 次得到的假說記成 g v − g_v^- g v − ,在第 v v v 份上算出 E val ( v ) ( g v − ) E_{\text{val}}^{(v)}(g_v^-) E val ( v ) ( g v − ) ,V V V 次平均:
E cv ( H , A ) = 1 V ∑ v = 1 V E val ( v ) ( g v − ) E_{\text{cv}}(\mathcal{H}, \mathcal{A}) = \frac{1}{V}\sum_{v=1}^{V} E_{\text{val}}^{(v)}(g_v^-) E cv ( H , A ) = V 1 v = 1 ∑ V E val ( v ) ( g v − )
選模型的式子只是再換一次誤差:
m ∗ = argmin 1 ≤ m ≤ M ( E m = E cv ( H m , A m ) ) m^* = \operatorname*{argmin}_{1 \le m \le M} \big(E_m = E_{\text{cv}}(\mathcal{H}_m, \mathcal{A}_m)\big) m ∗ = 1 ≤ m ≤ M argmin ( E m = E cv ( H m , A m ) )
課堂上說,leave-one-out 就是 cross validation 的一個極端例子(V = N V = N V = N )。1000 筆資料切 10 份,只要花訓練 10 次的力氣,不必花 1000 次。
講義的經驗值是
V = 10 V = 10 V = 10
課堂上補充,要切 5 份、20 份或 2 份都是你的選擇,常見的是 10 份。
本文把它放回 K K K 的兩難來看。V-fold 每次的驗證集有 K = N / V K = N/V K = N / V 筆,訓練集有 N ( 1 − 1 V ) N(1 - \frac{1}{V}) N ( 1 − V 1 ) 筆。V = 10 V = 10 V = 10 時每個 g v − g_v^- g v − 用了九成的資料,離 g g g 不遠;每一輪的驗證誤差是 N / 10 N/10 N /10 筆的平均,比單一個 e n e_n e n 穩;而且輪完之後每一筆資料都當過一次驗證資料。它用 V V V 倍的訓練次數換來這些。
六筆資料的 3-fold 與四種選法的總表
六筆資料切 3 份,每份 2 筆。假設隨機分成 { 1 , 4 } \{1, 4\} { 1 , 4 } 、{ 2 , 5 } \{2, 5\} { 2 , 5 } 、{ 3 , 6 } \{3, 6\} { 3 , 6 } (數字是資料的編號)。第二份當驗證集的那一輪,就是「六筆資料:切一次驗證集」算過的那一次。
驗證的那一份 常數 直線 二次 第 1、4 筆 1.1406 0.1956 1.2800 第 2、5 筆 1.1406 0.2960 0.4054 第 3、6 筆 0.6250 0.4450 0.4450 E cv E_{\text{cv}} E cv 0.9688 0.3122 0.7101
第三列直線與二次的數字相同,因為那一輪訓練出來的二次項係數剛好是 0。E cv E_{\text{cv}} E cv 選直線。把四種選法放在一起:
選法 常數 直線 二次 選到 訓練次數(含最後重訓) E in E_{\text{in}} E in 0.8125 0.1643 0.0929 二次 3 E val E_{\text{val}} E val ,留第 2、5 筆1.1406 0.2960 0.4054 直線 3 + 1 E val E_{\text{val}} E val ,留第 5、6 筆1.2656 1.4062 5.0781 常數 3 + 1 E loocv E_{\text{loocv}} E loocv 1.1700 0.3626 0.6235 直線 18 + 1 E cv E_{\text{cv}} E cv ,3-fold0.9688 0.3122 0.7101 直線 9 + 1 重訓後與 f f f 的平均平方差距 0.5208 0.0017 0.0495
這張表對應講義的幾個結論。E in E_{\text{in}} E in 選到最複雜的模型。切一次驗證集可能選對,也可能因為抽到的那兩筆而選錯。leave-one-out 與 3-fold 都選對,3-fold 只花一半的訓練次數。這只是六筆資料的一個例子,不能證明什麼,但每一格你都可以自己算。
下面這段純 Python 會印出三個模型的 E in E_{\text{in}} E in 、留第 2、5 筆的 E val E_{\text{val}} E val 、E loocv E_{\text{loocv}} E loocv 與 3-fold 的 E cv E_{\text{cv}} E cv (每列第一個數字是多項式的次數):
from fractions import Fraction as F
def fit (pts, deg): # 最小平方法:建立 normal equation,再用高斯消去法解
n = deg + 1
A = [[ sum (F(x) ** (i + j) for x, _ in pts) for j in range (n)]
+ [ sum (y * F(x) ** i for x, y in pts)] for i in range (n)]
for i in range (n):
p = next (r for r in range (i, n) if A[r][i] != 0 )
A[i], A[p] = A[p], A[i]
A[i] = [v / A[i][i] for v in A[i]]
for r in range (n):
if r != i:
A[r] = [a - A[r][i] * c for a, c in zip (A[r], A[i])]
return [row[n] for row in A]
def err (w, pts): # 平均平方誤差
return sum (( sum (c * F(x) ** i for i, c in enumerate (w)) - y) ** 2
for x, y in pts) / len (pts)
def cv (pts, deg, folds): # folds 的每一項是一份驗證集的索引(從 0 起算)
total = 0
for fold in folds:
train = [p for i, p in enumerate (pts) if i not in fold]
total += err(fit(train, deg), [pts[i] for i in fold])
return total / len (folds)
D = list ( zip ( range ( 6 ), [F( 1 ), F( 1 ), F( 5 , 2 ), F( 3 ), F( 3 ), F( 3 )]))
for deg in range ( 3 ):
print (deg,
round ( float (err(fit(D, deg), D)), 4 ), # E_in
round ( float (cv(D, deg, [[ 1 , 4 ]])), 4 ), # 留第 2、5 筆
round ( float (cv(D, deg, [[i] for i in range ( 6 )])), 4 ), # leave-one-out
round ( float (cv(D, deg, [[ 0 , 3 ], [ 1 , 4 ], [ 2 , 5 ]])), 4 )) # 3-fold
最後的提醒:驗證也是在選
第 20 頁叫 Final Words on Validation,分兩塊。
怎麼選驗證工具:
計算量允許的話,V-fold 通常比只切一次驗證集好。課堂上的理由是有平均的動作,比較穩定,代價是多出來的計算。
5-fold 或 10-fold 通常就表現得不錯,不需要為了 leave-one-out 多付計算量。
驗證的本質:
階段 講義的說法 課堂上的比喻 訓練 select among hypotheses 初賽:每個班自己選出第一名 驗證 select among finalists 複賽:再出一份考題,看這些選手誰表現好 測試 just evaluate 選出來之後只是衡量,沒有在選了
因為驗證也是在做選擇,資料的污染與模型複雜度的代價同樣會出現,只是比訓練輕。講義的說法是 validation still more optimistic than testing:你選的是眼前看起來最好的那個,它送出去測的時候未必還是最好。
所以講義頁尾的話是 do not fool yourself and others,report test result, not best validation result。課堂上說,有些論文會從所有參數裡挑驗證結果最好的一個,把那個數字當成結果報告,這樣的數字沒有那麼準確;驗證做得再好,都只是手上的資料告訴你的表現。
驗證為什麼還是樂觀:一個算得出來的例子
以下是本文自擬的例子,不在講義上。假設有 M M M 個分類器,全部都是亂猜的,真正的 E out E_{\text{out}} E out 都是 1 2 \frac{1}{2} 2 1 。拿 K K K 筆驗證資料選出 E val E_{\text{val}} E val 最小的,再把那個最小的 E val E_{\text{val}} E val 當成它的效能報告出去,平均會報出多少?
先看 M = 2 M = 2 M = 2 、K = 2 K = 2 K = 2 。每個分類器在兩筆上的 E val E_{\text{val}} E val 可能是 0 0 0 、1 2 \frac{1}{2} 2 1 、1 1 1 ,機率是 1 4 \frac{1}{4} 4 1 、1 2 \frac{1}{2} 2 1 、1 4 \frac{1}{4} 4 1 。兩個分類器互相獨立,取比較小的那個:
最小值是 1 1 1 :兩個都要是 1 1 1 ,機率 1 4 × 1 4 = 1 16 \frac{1}{4} \times \frac{1}{4} = \frac{1}{16} 4 1 × 4 1 = 16 1 。
最小值至少 1 2 \frac{1}{2} 2 1 :兩個都不能是 0 0 0 ,機率 3 4 × 3 4 = 9 16 \frac{3}{4} \times \frac{3}{4} = \frac{9}{16} 4 3 × 4 3 = 16 9 ;所以最小值恰好是 1 2 \frac{1}{2} 2 1 的機率是 9 16 − 1 16 = 8 16 \frac{9}{16} - \frac{1}{16} = \frac{8}{16} 16 9 − 16 1 = 16 8 。
最小值是 0 0 0 :剩下的 7 16 \frac{7}{16} 16 7 。
期望值是 1 2 × 8 16 + 1 × 1 16 = 5 16 ≈ 0.31 \frac{1}{2} \times \frac{8}{16} + 1 \times \frac{1}{16} = \frac{5}{16} \approx 0.31 2 1 × 16 8 + 1 × 16 1 = 16 5 ≈ 0.31 。兩個都是丟銅板的分類器,挑過之後報出來的平均誤差是 0.31,真正的誤差是 0.5。
同樣的算法用 Python 精確算到 M = 25 M = 25 M = 25 、K = 20 K = 20 K = 20 ,最小 E val E_{\text{val}} E val 的期望值是 0.284。候選愈多、驗證資料愈少,這個落差愈大,和保證式裡的 log M / K \sqrt{\log M / K} log M / K 是同一個方向。只有 M = 1 M = 1 M = 1 、不做任何選擇的時候,E val E_{\text{val}} E val 的期望值才剛好是 0.5,那就是測試。
Fun Time:10-fold 要花多少時間
題目(第 21 頁): 沿用第 12 頁的設定:某個學習模型用 N N N 筆資料訓練要花 N 2 N^2 N 2 秒。對 25 個參數不同的這種模型跑 10-fold cross validation、得到最後的 g m ∗ g_{m^*} g m ∗ ,總共要幾秒?
47 2 N 2 \frac{47}{2}N^2 2 47 N 2
47 N 2 47N^2 47 N 2
407 2 N 2 \frac{407}{2}N^2 2 407 N 2
407 N 2 407N^2 407 N 2
答案:3。 每一輪的訓練集是九份,9 N 10 \frac{9N}{10} 10 9 N 筆,花 ( 9 N 10 ) 2 = 81 100 N 2 \big(\frac{9N}{10}\big)^2 = \frac{81}{100}N^2 ( 10 9 N ) 2 = 100 81 N 2 秒。每個模型要 10 輪,25 個模型共 250 輪:
81 100 N 2 × 10 × 25 = 405 2 N 2 \frac{81}{100}N^2 \times 10 \times 25 = \frac{405}{2}N^2 100 81 N 2 × 10 × 25 = 2 405 N 2
選出 m ∗ m^* m ∗ 之後用全部資料重訓一次,再加 N 2 N^2 N 2 ,合計 405 2 N 2 + N 2 = 407 2 N 2 \frac{405}{2}N^2 + N^2 = \frac{407}{2}N^2 2 405 N 2 + N 2 = 2 407 N 2 。選項 4 是答案的兩倍;選項 1 與 2 都遠小於光是 250 輪訓練就要的 202.5 N 2 202.5N^2 202.5 N 2 。
本文補充,把三種做法放在一起(25 個模型,訓練時間 N 2 N^2 N 2 ):
做法 總時間 N = 1000 N = 1000 N = 1000 時切一次,K = N / 5 K = N/5 K = N /5 17 N 2 17N^2 17 N 2 1.7 × 10 7 1.7 \times 10^7 1.7 × 1 0 7 秒10-fold 203.5 N 2 203.5N^2 203.5 N 2 2.035 × 10 8 2.035 \times 10^8 2.035 × 1 0 8 秒leave-one-out 25 N ( N − 1 ) 2 + N 2 25N(N-1)^2 + N^2 25 N ( N − 1 ) 2 + N 2 約 2.5 × 10 10 2.5 \times 10^{10} 2.5 × 1 0 10 秒
10-fold 是切一次的 12 倍左右,leave-one-out 又是 10-fold 的 120 多倍,而且這個倍數會隨 N N N 增加。這就是第 20 頁說不必換成 leave-one-out 的原因。
這堂課的四句話
第 22 頁的總結把四節各收成一句:
Model Selection Problem: 用 E in E_{\text{in}} E in 選危險,用 E test E_{\text{test}} E test 選不誠實(dangerous by E in E_{\text{in}} E in and dishonest by E test E_{\text{test}} E test )。
Validation: 用 E val ( A m ( D train ) ) E_{\text{val}}(\mathcal{A}_m(\mathcal{D}_{\text{train}})) E val ( A m ( D train )) 選,回傳 A m ∗ ( D ) \mathcal{A}_{m^*}(\mathcal{D}) A m ∗ ( D ) 。
Leave-One-Out Cross Validation: 計算量很大,換來幾乎無偏的估計。
V-Fold Cross Validation: 計算量與表現都合理。
下一堂的預告只有一行:something 'up my sleeve'。課堂上說,核心的工具到這裡講完了,下一次要講的像是一些小祕密:使用機器學習時還有哪些要注意的事,然後替整門課做總結。
自我檢查
1. 四筆資料的 y y y 是 2 , 4 , 6 , 12 2, 4, 6, 12 2 , 4 , 6 , 12 。演算法一律用訓練資料 y y y 的平均預測,誤差用平方誤差。算 E in E_{\text{in}} E in 、E loocv E_{\text{loocv}} E loocv ,以及把資料分成 { 2 , 4 } \{2, 4\} { 2 , 4 } 與 { 6 , 12 } \{6, 12\} { 6 , 12 } 兩份的 2-fold E cv E_{\text{cv}} E cv 。
答案:全部的平均是 6 6 6 ,E in = 16 + 4 + 0 + 36 4 = 14 E_{\text{in}} = \frac{16 + 4 + 0 + 36}{4} = 14 E in = 4 16 + 4 + 0 + 36 = 14 。leave-one-out:留 2 2 2 時其餘平均 22 3 \frac{22}{3} 3 22 ,e = 256 9 e = \frac{256}{9} e = 9 256 ;留 4 4 4 時其餘平均 20 3 \frac{20}{3} 3 20 ,e = 64 9 e = \frac{64}{9} e = 9 64 ;留 6 6 6 時其餘平均 6 6 6 ,e = 0 e = 0 e = 0 ;留 12 12 12 時其餘平均 4 4 4 ,e = 64 e = 64 e = 64 。E loocv = 1 4 ⋅ 896 9 = 224 9 ≈ 24.9 E_{\text{loocv}} = \frac{1}{4} \cdot \frac{896}{9} = \frac{224}{9} \approx 24.9 E loocv = 4 1 ⋅ 9 896 = 9 224 ≈ 24.9 。2-fold:用 { 6 , 12 } \{6, 12\} { 6 , 12 } 訓練得 9 9 9 ,在 { 2 , 4 } \{2, 4\} { 2 , 4 } 上是 49 + 25 2 = 37 \frac{49 + 25}{2} = 37 2 49 + 25 = 37 ;用 { 2 , 4 } \{2, 4\} { 2 , 4 } 訓練得 3 3 3 ,在 { 6 , 12 } \{6, 12\} { 6 , 12 } 上是 9 + 81 2 = 45 \frac{9 + 81}{2} = 45 2 9 + 81 = 45 ;E cv = 41 E_{\text{cv}} = 41 E cv = 41 。E in E_{\text{in}} E in 最小,是因為被測的資料自己也在訓練資料裡;後兩個的差別來自訓練資料從 3 筆降到 2 筆,g − g^- g − 變差了。
2. 你有 M = 20 M = 20 M = 20 個候選模型(0/1 誤差),驗證集 K = 500 K = 500 K = 500 筆。照本文的推導,在 95% 的信心下,被選中模型的 E out ( g m ∗ − ) E_{\text{out}}(g_{m^*}^-) E out ( g m ∗ − ) 最多比 E val E_{\text{val}} E val 高多少?如果希望這個差距不超過 0.05,K K K 至少要多少?
答案:1 2 × 500 ln 2 × 20 0.05 = ln 800 1000 = 0.006685 ≈ 0.082 \sqrt{\frac{1}{2 \times 500}\ln\frac{2 \times 20}{0.05}} = \sqrt{\frac{\ln 800}{1000}} = \sqrt{0.006685} \approx 0.082 2 × 500 1 ln 0.05 2 × 20 = 1000 l n 800 = 0.006685 ≈ 0.082 。要壓到 0.05,需要 K ≥ ln 800 2 × 0.05 2 = 6.685 0.005 ≈ 1337 K \ge \frac{\ln 800}{2 \times 0.05^2} = \frac{6.685}{0.005} \approx 1337 K ≥ 2 × 0.0 5 2 l n 800 = 0.005 6.685 ≈ 1337 。
3. 同事的流程是:25 組參數各用全部的 D \mathcal{D} D 訓練出 g m g_m g m ,再從 D \mathcal{D} D 隨機抽五分之一算每個 g m g_m g m 的誤差,挑最小的。這跟驗證差在哪裡?
判準:答案要指出抽出來的那五分之一已經被每個 A m \mathcal{A}_m A m 用來訓練過,不乾淨;在它上面算的誤差是 E in E_{\text{in}} E in 的一部分,g m g_m g m 也不是對這些資料事先固定的假說,Hoeffding 的保證不成立。結果會跟用 E in E_{\text{in}} E in 選一樣偏向最複雜的模型。正確的順序是先切出 D val \mathcal{D}_{\text{val}} D val ,只用 D train \mathcal{D}_{\text{train}} D train 訓練。
4. 選完模型之後,為什麼要用全部資料重訓?這一步有沒有理論保證?有人選完直接回傳 g m ∗ − g_{m^*}^- g m ∗ − ,在什麼情況下損失最大?
判準:要說出學習曲線(資料愈多 E out E_{\text{out}} E out 通常愈低);要說出講義把它標成 heuristic,課堂上明講這不是理論保證而是實務經驗;要說出 K K K 愈大、D train \mathcal{D}_{\text{train}} D train 愈小時損失愈大,並能連到第 10 頁的紅線(sub-g)在 K K K 大時比用 E in E_{\text{in}} E in 選的黑線還高。
5. 三個亂猜的分類器(真正的 E out E_{\text{out}} E out 都是 1 2 \frac{1}{2} 2 1 ),只用 K = 1 K = 1 K = 1 筆驗證資料選出 E val E_{\text{val}} E val 最小的,並回報那個最小的 E val E_{\text{val}} E val 。回報值的期望值是多少?這說明了什麼?
答案:每個分類器的 E val E_{\text{val}} E val 是 0 或 1,各 1 2 \frac{1}{2} 2 1 。最小值是 1 只發生在三個都猜錯,機率 1 8 \frac{1}{8} 8 1 ,所以期望值是 1 8 \frac{1}{8} 8 1 ,遠低於真正的 1 2 \frac{1}{2} 2 1 。挑過之後的驗證誤差是偏樂觀的估計,要報告的是測試結果。
練習與對應閱讀
兩個學期的對應。 Fall 2024 課程頁 把基石第 15、16 堂排在同一週(W8,10/21),這堂的投影片是 15u_handout.pdf 。Fall 2026 課程頁 同樣排在 W8(10/28),2026-10-13 查的時候這一週的投影片連結還是 404,所以本文只用 MOOC 版講義。這堂的四支影片是基石 YouTube 播放清單的第 58 到 61 支。
教科書。 兩份課程頁都把這堂對到 Learning from Data (LFD)的 4.3 節。
作業。 相關的題目在 Fall 2024 HW5 (2024-11-04 發布、11-18 截止,共 12 題加 1 題 bonus;Q1–4 自動批改,Q5–12 由助教批改),沒有官方解答。
題號 內容 對應這堂的哪裡 Q2 線性可分資料上,取正負最近兩點的中點當門檻的 decision stump,求 leave-one-out 誤差最緊的上界 leave-one-out Q7 前 N − K N - K N − K 筆算平均、後 K K K 筆驗證,求期望的驗證誤差 驗證集與 K K K Q8 證明常數迴歸的 E loocv = ( N N − 1 ) 2 E in E_{\text{loocv}} = \big(\frac{N}{N-1}\big)^2 E_{\text{in}} E loocv = ( N − 1 N ) 2 E in ,說明 E in E_{\text{in}} E in 比 E loocv E_{\text{loocv}} E loocv 樂觀 leave-one-out Q11 mnist.scale 的 2 對 6 子問題:切 8000 筆當 sub-training set,用 E val E_{\text{val}} E val 選 λ \lambda λ 後在全部訓練資料上重訓,重複 1126 次,與 Q10(用 E in E_{\text{in}} E in 選)比較 E out E_{\text{out}} E out 的分布 驗證加重訓 Q12 同上,改用 3-fold cross validation 選 λ \lambda λ ,與 Q11 比較 V-fold
Q8 沒有官方解答,可以先用數字對:第 17 頁 Fun Time 的 y = 1 , 5 , 7 y = 1, 5, 7 y = 1 , 5 , 7 有 E in = 56 9 E_{\text{in}} = \frac{56}{9} E in = 9 56 、E loocv = 14 E_{\text{loocv}} = 14 E loocv = 14 ,而 ( 3 2 ) 2 × 56 9 = 14 \big(\frac{3}{2}\big)^2 \times \frac{56}{9} = 14 ( 2 3 ) 2 × 9 56 = 14 ;自我檢查第 1 題的 ( 4 3 ) 2 × 14 = 224 9 \big(\frac{4}{3}\big)^2 \times 14 = \frac{224}{9} ( 3 4 ) 2 × 14 = 9 224 也對得上。Q7 可以拿「用平均值預測驗算一次」的算法當起點。
Q10 到 Q12 三題用公開的 LIBLINEAR 與 mnist.scale ,共用同一套 λ \lambda λ 候選(log 10 λ ∈ { − 2 , … , 3 } \log_{10}\lambda \in \{-2, \dots, 3\} log 10 λ ∈ { − 2 , … , 3 } )與「平手選最大的 λ \lambda λ 」的規則,所以最好寫成同一支程式、只換選擇的準則,直接看三種選法的 E out E_{\text{out}} E out 分布差多少。Q10 的 L1 正則化在上一堂 。整份作業的導讀在基石作業導讀 。
動手做。 看第二支影片時,把驗證流程的五個步驟自己寫一遍,圈出「用全部 D \mathcal{D} D 重訓」那一步。看完後兩支,用你熟悉的工具(例如 scikit-learn)在同一份小資料上各跑一次 5-fold 與 leave-one-out,比較花的時間,以及換一個隨機切法時估計值變動多少。
延伸閱讀。 同一個主題的其他講法:Stanford CS229 第 6 堂:偏差與變異、正規化與模型選擇 。
下一堂。 基石第 16 堂:三個學習原則 是基石的最後一堂,不再教新的演算法,講的是前面這些保證在哪些情況下會失效;這堂的「污染」在那裡會有正式的名字。
課程影片來源
原始影片:Model Selection Problem 、Validation 、Leave-One-Out Cross Validation 、V-Fold Cross Validation
查核日期:2026-10-13。影片 ID、標題與長度於當天從官方播放清單取得;YouTube 上沒有字幕軌,本文的課堂說法來自自行轉錄的逐字稿。
更新紀錄
2026-10-13:原本與第 16 堂合為一篇,改為一堂一篇,依講義與影片逐字稿重寫。
2026-10-10:標註影片狀態,核對錄影來源與取得方式。
2026-10-10:重查影片狀態。嵌入影片與官方播放清單的講次相符。
參考資料